diff --git a/DEPS b/DEPS
index 6378e4f..467140e8 100644
--- a/DEPS
+++ b/DEPS
@@ -195,11 +195,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'd7c4f9d06425d8ed5134475e94fb34f265fa1fbc',
+  'skia_revision': 'fcb7ba035aae4958edf9d298daa0e6f8c11f2b65',
   # 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': '759f70344a9a68576605324f760c5942981ea9fd',
+  'v8_revision': '5e336253ddc9a811d2336b79553403e82dbe5896',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -207,7 +207,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'be774187b1cefe94f4717cbd747ebdea0b349478',
+  'angle_revision': 'bd7cef282080f66873b066b629ad3569276d19e0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -258,7 +258,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '26d2e8aa289bffcc75aff7598285c3720148985d',
+  'catapult_revision': '2cd291aae824412377a3eb4cc76cb2ec7ee169c4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -266,7 +266,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': '3186e69eb7995747d51b2c7126b8fef05c5032d1',
+  'devtools_frontend_revision': '828c1805a64b1aeb3917d1648515efd8ed215f60',
   # 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.
@@ -545,7 +545,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'e310d3c31366815abf5dccf042a995a0d56f8cb5',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'd8463cb28eb365143777007f58917083561ed0d2',
       'condition': 'checkout_ios',
   },
 
@@ -831,7 +831,7 @@
   },
 
   'src/third_party/breakpad/breakpad':
-    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'a740aa2625df2c0ed21ed7118bd8ab5faec375b8',
+    Var('chromium_git') + '/breakpad/breakpad.git' + '@' + '2757a2c9c819fcae3784576aef0c8400c7ad06d7',
 
   'src/third_party/byte_buddy': {
       'packages': [
@@ -895,7 +895,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '343f63643b432ace2d2d4c253c6c327bb18c03ea',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '98b332f2dbbd25add6b0904cc9d01608ceeaa52d',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1120,7 +1120,7 @@
   },
 
   'src/third_party/libjpeg_turbo':
-    Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + '7e3ad79800a7945fb37173149842b494ab8982b2',
+    Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + '0241a1304fd183ee24fbdfe6891f18fdedea38f9',
 
   'src/third_party/liblouis/src': {
       'url': Var('chromium_git') + '/external/liblouis-github.git' + '@' + '03d7d72d983d47c17f7de95bbeae89fe33e41943',
@@ -1248,7 +1248,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '22b8657a5558de83e88093a85d302f0d0773bb9f',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'fce06b20005cdc2e98d266719088811c65eecf0f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1537,7 +1537,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@08057456d373475cd7e551639c334f360b1d4f92',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9aa97c0bd39e7f564a7408bcf2184efb2a0e8316',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 261a7b7..36d4a09 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -1136,6 +1136,7 @@
     }
   }
   if (cardified_state_) {
+    DCHECK(!background_cards_.empty());
     MaybeCreateGradientMask();
     // Make sure that the background cards render behind everything
     // else in the items container.
@@ -2311,6 +2312,7 @@
   // elements to their original positions.
   UpdateTilePadding();
   AnimateCardifiedState();
+  layer()->SetClipRect(gfx::Rect());
 }
 
 void AppsGridView::AnimateCardifiedState() {
@@ -2369,8 +2371,8 @@
     if (!cardified_state_) {
       animator.SetTransitionDuration(
           base::TimeDelta::FromMilliseconds(kEndCardifiedAnimationDuration));
-      animator.AddObserver(this);
     }
+    animator.AddObserver(this);
     ui::AnimationThroughputReporter reporter(
         background_card->GetAnimator(),
         metrics_util::ForSmoothness(
@@ -3031,6 +3033,14 @@
   background_cards_.pop_back();
 }
 
+void AppsGridView::MaskContainerToBackgroundBounds() {
+  DCHECK(!background_cards_.empty());
+  // Mask apps grid container layer to the background card width.
+  layer()->SetClipRect(gfx::Rect(background_cards_[0]->bounds().x(), 0,
+                                 background_cards_[0]->bounds().width(),
+                                 layer()->bounds().height()));
+}
+
 void AppsGridView::TotalPagesChanged(int previous_page_count,
                                      int new_page_count) {
   // Don't record from folder.
@@ -3217,8 +3227,10 @@
 void AppsGridView::OnImplicitAnimationsCompleted() {
   if (layer()->opacity() == 0.0f)
     SetVisible(false);
-  if (cardified_state_)
+  if (cardified_state_) {
+    MaskContainerToBackgroundBounds();
     return;
+  }
   while (!background_cards_.empty())
     RemoveBackgroundCard();
   DCHECK(background_cards_.empty());
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h
index 4acf06c..77841ce8 100644
--- a/ash/app_list/views/apps_grid_view.h
+++ b/ash/app_list/views/apps_grid_view.h
@@ -316,6 +316,8 @@
   void AppendBackgroundCard(float opacity);
   // Removes the background card at the end of |background_cards_|.
   void RemoveBackgroundCard();
+  // Masks the apps grid container to background cards bounds.
+  void MaskContainerToBackgroundBounds();
 
   // Return the view model.
   views::ViewModelT<AppListItemView>* view_model() { return &view_model_; }
diff --git a/ash/clipboard/clipboard_history.cc b/ash/clipboard/clipboard_history.cc
index bc0c044..053cbab 100644
--- a/ash/clipboard/clipboard_history.cc
+++ b/ash/clipboard/clipboard_history.cc
@@ -87,18 +87,7 @@
 void ClipboardHistory::CommitData(const AccountId& account_id,
                                   ui::ClipboardData data) {
   std::list<ui::ClipboardData>& items = items_by_account_id_[account_id];
-
-  // If |data| is already contained in |items|, at *most* we need to move it to
-  // the front to retain sort order by recency.
-  auto it = std::find(items.begin(), items.end(), data);
-  if (it != items.end()) {
-    if (it != items.begin())
-      items.splice(items.begin(), items, it, std::next(it));
-    return;
-  }
-
   items.push_front(std::move(data));
-
   if (items.size() > kMaxClipboardItemsShared)
     items.pop_back();
 }
diff --git a/ash/clipboard/clipboard_history_unittest.cc b/ash/clipboard/clipboard_history_unittest.cc
index 30e2bca3..8e6e5fd 100644
--- a/ash/clipboard/clipboard_history_unittest.cc
+++ b/ash/clipboard/clipboard_history_unittest.cc
@@ -145,15 +145,13 @@
   WriteAndEnsureTextHistory(input_strings, expected_strings);
 }
 
-// Tests that if the same (non bitmap) thing is copied, only one thing is saved.
+// Tests that if the same (non bitmap) thing is copied, both things are saved.
 TEST_F(ClipboardHistoryTest, DuplicateBasic) {
   std::vector<base::string16> input_strings{base::UTF8ToUTF16("test"),
                                             base::UTF8ToUTF16("test")};
-  // Because |input_strings| is the same string twice, history should detect the
-  // duplicate.
-  std::vector<base::string16> expected_strings{base::UTF8ToUTF16("test")};
+  std::vector<base::string16> expected_strings = input_strings;
 
-  // Test that only one thing is saved.
+  // Test that both things are saved.
   WriteAndEnsureTextHistory(input_strings, expected_strings);
 }
 
@@ -184,16 +182,17 @@
 }
 
 // Tests that when a duplicate is copied, the duplicate shows up in the proper
-// order, and the older version is not returned.
-TEST_F(ClipboardHistoryTest, DuplicateOverwritesPreviousRecord) {
+// order and that the older version is still returned.
+TEST_F(ClipboardHistoryTest, DuplicatePrecedesPreviousRecord) {
   // Input holds a unique string sandwiched by a copy.
-  std::vector<base::string16> input_strings{base::UTF8ToUTF16("test1"),
-                                            base::UTF8ToUTF16("test2"),
-                                            base::UTF8ToUTF16("test1")};
-  // The result should be a reversal of the last two elements. When a duplicate
-  // is copied, history will show the most recent version of that duplicate.
-  std::vector<base::string16> expected_strings{base::UTF8ToUTF16("test1"),
-                                               base::UTF8ToUTF16("test2")};
+  std::vector<base::string16> input_strings{
+      base::UTF8ToUTF16("test1"), base::UTF8ToUTF16("test2"),
+      base::UTF8ToUTF16("test1"), base::UTF8ToUTF16("test3")};
+  // The result should be a reversal of the copied elements. When a duplicate
+  // is copied, history will show all versions of the recent duplicate.
+  std::vector<base::string16> expected_strings{
+      base::UTF8ToUTF16("test3"), base::UTF8ToUTF16("test1"),
+      base::UTF8ToUTF16("test2"), base::UTF8ToUTF16("test1")};
 
   WriteAndEnsureTextHistory(input_strings, expected_strings);
 }
@@ -265,7 +264,7 @@
 
   std::vector<SkBitmap> input_bitmaps{test_bitmap_1, test_bitmap_2,
                                       test_bitmap_1};
-  std::vector<SkBitmap> expected_bitmaps{test_bitmap_1, test_bitmap_2};
+  std::vector<SkBitmap> expected_bitmaps = input_bitmaps;
   WriteAndEnsureBitmapHistory(input_bitmaps, expected_bitmaps);
 }
 
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc
index a3914f3..403c4d1 100644
--- a/ash/shelf/shelf.cc
+++ b/ash/shelf/shelf.cc
@@ -140,25 +140,19 @@
 };
 
 // An animation metrics reporter for the shelf navigation widget.
-class ASH_EXPORT NavigationWidgetAnimationMetricsReporter
-    : public ShelfLayoutManagerObserver {
+class ASH_EXPORT NavigationWidgetAnimationMetricsReporter {
  public:
-  explicit NavigationWidgetAnimationMetricsReporter(Shelf* shelf)
-      : shelf_(shelf) {
-    shelf_->shelf_layout_manager()->AddObserver(this);
-  }
+  NavigationWidgetAnimationMetricsReporter() = default;
 
-  ~NavigationWidgetAnimationMetricsReporter() override {
-    shelf_->shelf_layout_manager()->RemoveObserver(this);
-  }
+  ~NavigationWidgetAnimationMetricsReporter() = default;
 
   NavigationWidgetAnimationMetricsReporter(
       const NavigationWidgetAnimationMetricsReporter&) = delete;
   NavigationWidgetAnimationMetricsReporter& operator=(
       const NavigationWidgetAnimationMetricsReporter&) = delete;
 
-  void ReportSmoothness(int smoothness) {
-    switch (target_state_) {
+  void ReportSmoothness(HotseatState target_hotseat_state, int smoothness) {
+    switch (target_hotseat_state) {
       case HotseatState::kShownClamshell:
       case HotseatState::kShownHomeLauncher:
         UMA_HISTOGRAM_PERCENTAGE(
@@ -184,24 +178,15 @@
     }
   }
 
-  metrics_util::ReportCallback GetReportCallback() {
+  metrics_util::ReportCallback GetReportCallback(
+      HotseatState target_hotseat_state) {
+    DCHECK_NE(target_hotseat_state, HotseatState::kNone);
     return metrics_util::ForSmoothness(base::BindRepeating(
         &NavigationWidgetAnimationMetricsReporter::ReportSmoothness,
-        weak_ptr_factory_.GetWeakPtr()));
-  }
-
-  // ShelfLayoutManagerObserver:
-  void OnHotseatStateChanged(HotseatState old_state,
-                             HotseatState new_state) override {
-    target_state_ = new_state;
+        weak_ptr_factory_.GetWeakPtr(), target_hotseat_state));
   }
 
  private:
-  Shelf* const shelf_;
-
-  // The state to which the animation is transitioning.
-  HotseatState target_state_ = HotseatState::kShownHomeLauncher;
-
   base::WeakPtrFactory<NavigationWidgetAnimationMetricsReporter>
       weak_ptr_factory_{this};
 };
@@ -389,7 +374,7 @@
       this, hotseat_widget()->GetShelfView());
   navigation_widget_->Initialize(container);
   navigation_widget_metrics_reporter_ =
-      std::make_unique<NavigationWidgetAnimationMetricsReporter>(this);
+      std::make_unique<NavigationWidgetAnimationMetricsReporter>();
 }
 
 void Shelf::CreateHotseatWidget(aura::Window* container) {
@@ -685,9 +670,10 @@
       target_state);
 }
 
-metrics_util::ReportCallback
-Shelf::GetNavigationWidgetAnimationReportCallback() {
-  return navigation_widget_metrics_reporter_->GetReportCallback();
+metrics_util::ReportCallback Shelf::GetNavigationWidgetAnimationReportCallback(
+    HotseatState target_hotseat_state) {
+  return navigation_widget_metrics_reporter_->GetReportCallback(
+      target_hotseat_state);
 }
 
 void Shelf::WillDeleteShelfLayoutManager() {
diff --git a/ash/shelf/shelf.h b/ash/shelf/shelf.h
index 0fb0647..ec33d84a 100644
--- a/ash/shelf/shelf.h
+++ b/ash/shelf/shelf.h
@@ -237,7 +237,8 @@
   metrics_util::ReportCallback GetTranslucentBackgroundReportCallback(
       HotseatState target_state);
 
-  metrics_util::ReportCallback GetNavigationWidgetAnimationReportCallback();
+  metrics_util::ReportCallback GetNavigationWidgetAnimationReportCallback(
+      HotseatState target_hotseat_state);
 
  protected:
   // ShelfLayoutManagerObserver:
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 3606d23..1b73915 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -1318,7 +1318,7 @@
 
 HotseatState ShelfLayoutManager::CalculateHotseatState(
     ShelfVisibilityState visibility_state,
-    ShelfAutoHideState auto_hide_state) {
+    ShelfAutoHideState auto_hide_state) const {
   if (!IsHotseatEnabled() || !shelf_->IsHorizontalAlignment())
     return HotseatState::kShownClamshell;
 
@@ -1507,6 +1507,7 @@
     return false;
 
   dimmed_for_inactivity_ = dimmed;
+
   CalculateTargetBoundsAndUpdateWorkArea();
 
   const base::TimeDelta dim_animation_duration =
@@ -1519,7 +1520,7 @@
   if (animate) {
     navigation_widget_reporter.emplace(
         GetLayer(shelf_->navigation_widget())->GetAnimator(),
-        shelf_->GetNavigationWidgetAnimationReportCallback());
+        shelf_->GetNavigationWidgetAnimationReportCallback(hotseat_state()));
   }
 
   AnimateOpacity(GetLayer(shelf_->navigation_widget()), target_opacity_,
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h
index 2bcc0dd0..24ed5d8 100644
--- a/ash/shelf/shelf_layout_manager.h
+++ b/ash/shelf/shelf_layout_manager.h
@@ -295,7 +295,7 @@
   // Overview, Shelf, and any active gestures.
   // TODO(manucornet): Move this to the hotseat class.
   HotseatState CalculateHotseatState(ShelfVisibilityState visibility_state,
-                                     ShelfAutoHideState auto_hide_state);
+                                     ShelfAutoHideState auto_hide_state) const;
 
  private:
   class UpdateShelfObserver;
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc
index e9b36598..962e32f 100644
--- a/ash/shelf/shelf_navigation_widget.cc
+++ b/ash/shelf/shelf_navigation_widget.cc
@@ -145,8 +145,7 @@
 }  // namespace
 
 // An animation metrics reporter for the shelf navigation buttons.
-class ASH_EXPORT NavigationButtonAnimationMetricsReporter
-    : public ShelfLayoutManagerObserver {
+class ASH_EXPORT NavigationButtonAnimationMetricsReporter {
  public:
   // The different kinds of navigation buttons.
   enum class NavigationButtonType {
@@ -155,24 +154,19 @@
     // The Navigation Widget's home button.
     kHomeButton
   };
-  NavigationButtonAnimationMetricsReporter(
-      Shelf* shelf,
+  explicit NavigationButtonAnimationMetricsReporter(
       NavigationButtonType navigation_button_type)
-      : shelf_(shelf), navigation_button_type_(navigation_button_type) {
-    shelf_->shelf_layout_manager()->AddObserver(this);
-  }
+      : navigation_button_type_(navigation_button_type) {}
 
-  ~NavigationButtonAnimationMetricsReporter() override {
-    shelf_->shelf_layout_manager()->RemoveObserver(this);
-  }
+  ~NavigationButtonAnimationMetricsReporter() = default;
 
   NavigationButtonAnimationMetricsReporter(
       const NavigationButtonAnimationMetricsReporter&) = delete;
   NavigationButtonAnimationMetricsReporter& operator=(
       const NavigationButtonAnimationMetricsReporter&) = delete;
 
-  void ReportSmoothness(int smoothness) {
-    switch (target_state_) {
+  void ReportSmoothness(HotseatState target_hotseat_state, int smoothness) {
+    switch (target_hotseat_state) {
       case HotseatState::kShownClamshell:
       case HotseatState::kShownHomeLauncher:
         switch (navigation_button_type_) {
@@ -237,28 +231,18 @@
     }
   }
 
-  metrics_util::ReportCallback GetReportCallback() {
+  metrics_util::ReportCallback GetReportCallback(
+      HotseatState target_hotseat_state) {
+    DCHECK_NE(target_hotseat_state, HotseatState::kNone);
     return metrics_util::ForSmoothness(base::BindRepeating(
         &NavigationButtonAnimationMetricsReporter::ReportSmoothness,
-        weak_ptr_factory_.GetWeakPtr()));
-  }
-
-  // ShelfLayoutManagerObserver:
-  void OnHotseatStateChanged(HotseatState old_state,
-                             HotseatState new_state) override {
-    target_state_ = new_state;
+        weak_ptr_factory_.GetWeakPtr(), target_hotseat_state));
   }
 
  private:
-  // Owned by RootWindowController
-  Shelf* const shelf_;
-
   // The type of navigation button that is animated.
   const NavigationButtonType navigation_button_type_;
 
-  // The state to which the animation is transitioning.
-  HotseatState target_state_ = HotseatState::kShownHomeLauncher;
-
   base::WeakPtrFactory<NavigationButtonAnimationMetricsReporter>
       weak_ptr_factory_{this};
 };
@@ -455,12 +439,10 @@
                                                   /*use_transforms=*/true)),
       back_button_metrics_reporter_(
           std::make_unique<NavigationButtonAnimationMetricsReporter>(
-              shelf,
               NavigationButtonAnimationMetricsReporter::NavigationButtonType::
                   kBackButton)),
       home_button_metrics_reporter_(
           std::make_unique<NavigationButtonAnimationMetricsReporter>(
-              shelf,
               NavigationButtonAnimationMetricsReporter::NavigationButtonType::
                   kHomeButton)) {
   DCHECK(shelf_);
@@ -595,6 +577,10 @@
       animate ? ShelfConfig::Get()->shelf_animation_duration()
               : base::TimeDelta::FromMilliseconds(0);
 
+  const HotseatState target_hotseat_state =
+      layout_manager->CalculateHotseatState(layout_manager->visibility_state(),
+                                            layout_manager->auto_hide_state());
+
   const bool update_opacity = !animate || GetLayer()->GetTargetOpacity() !=
                                               layout_manager->GetOpacity();
   const bool update_bounds =
@@ -611,7 +597,8 @@
     base::Optional<ui::AnimationThroughputReporter> reporter;
     if (animate) {
       reporter.emplace(nav_animation_setter.GetAnimator(),
-                       shelf_->GetNavigationWidgetAnimationReportCallback());
+                       shelf_->GetNavigationWidgetAnimationReportCallback(
+                           target_hotseat_state));
     }
     if (update_opacity)
       GetLayer()->SetOpacity(layout_manager->GetOpacity());
@@ -624,11 +611,13 @@
 
   views::View* const back_button = delegate_->back_button();
   UpdateButtonVisibility(back_button, back_button_shown, animate,
-                         back_button_metrics_reporter_.get());
+                         back_button_metrics_reporter_.get(),
+                         target_hotseat_state);
 
   views::View* const home_button = delegate_->home_button();
   UpdateButtonVisibility(home_button, home_button_shown, animate,
-                         home_button_metrics_reporter_.get());
+                         home_button_metrics_reporter_.get(),
+                         target_hotseat_state);
 
   if (back_button_shown) {
     // TODO(https://crbug.com/1058205): Test this behavior.
@@ -647,13 +636,16 @@
                         : GetFirstButtonBounds(shelf_->IsHorizontalAlignment());
 
   if (animate) {
-    bounds_animator_->SetAnimationDuration(animation_duration);
-    bounds_animator_->AnimateViewTo(
-        home_button, home_button_bounds,
-        std::make_unique<BoundsAnimationReporter>(
-            home_button, home_button_metrics_reporter_->GetReportCallback()));
+    if (bounds_animator_->GetTargetBounds(home_button) != home_button_bounds) {
+      bounds_animator_->SetAnimationDuration(animation_duration);
+      bounds_animator_->AnimateViewTo(
+          home_button, home_button_bounds,
+          std::make_unique<BoundsAnimationReporter>(
+              home_button, home_button_metrics_reporter_->GetReportCallback(
+                               target_hotseat_state)));
+    }
   } else {
-    bounds_animator_->StopAnimatingView(home_button);
+    bounds_animator_->Cancel();
     home_button->SetBoundsRect(home_button_bounds);
   }
 
@@ -683,7 +675,8 @@
     views::View* button,
     bool visible,
     bool animate,
-    NavigationButtonAnimationMetricsReporter* metrics_reporter) {
+    NavigationButtonAnimationMetricsReporter* metrics_reporter,
+    HotseatState target_hotseat_state) {
   if (animate && button->layer()->GetTargetOpacity() == visible)
     return;
 
@@ -705,7 +698,7 @@
   base::Optional<ui::AnimationThroughputReporter> reporter;
   if (animate) {
     reporter.emplace(opacity_settings.GetAnimator(),
-                     metrics_reporter->GetReportCallback());
+                     metrics_reporter->GetReportCallback(target_hotseat_state));
   }
 
   if (!visible)
diff --git a/ash/shelf/shelf_navigation_widget.h b/ash/shelf/shelf_navigation_widget.h
index 28a94d23..d25943b 100644
--- a/ash/shelf/shelf_navigation_widget.h
+++ b/ash/shelf/shelf_navigation_widget.h
@@ -24,6 +24,7 @@
 namespace ash {
 class BackButton;
 class HomeButton;
+enum class HotseatState;
 class NavigationButtonAnimationMetricsReporter;
 class Shelf;
 class ShelfView;
@@ -98,7 +99,8 @@
       views::View* button,
       bool visible,
       bool animate,
-      NavigationButtonAnimationMetricsReporter* metrics_reporter);
+      NavigationButtonAnimationMetricsReporter* metrics_reporter,
+      HotseatState target_hotseat_state);
 
   // Returns the clip rectangle.
   gfx::Rect CalculateClipRect() const;
diff --git a/ash/shelf/shelf_view_test_api.cc b/ash/shelf/shelf_view_test_api.cc
index efbba3b..f3f3ac47 100644
--- a/ash/shelf/shelf_view_test_api.cc
+++ b/ash/shelf/shelf_view_test_api.cc
@@ -81,6 +81,9 @@
 
 void ShelfViewTestAPI::RunMessageLoopUntilAnimationsDone(
     views::BoundsAnimator* bounds_animator) {
+  if (!bounds_animator->IsAnimating())
+    return;
+
   std::unique_ptr<TestAPIAnimationObserver> observer(
       new TestAPIAnimationObserver());
 
diff --git a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
index d5ee982..84ec79d 100644
--- a/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
+++ b/ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.cc
@@ -651,6 +651,13 @@
        {{ui::VKEY_H, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
 
       {// |categories|
+       {ShortcutCategory::kAccessibility},
+       IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE,
+       IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
+       // |accelerator_ids|
+       {{ui::VKEY_7, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}}},
+
+      {// |categories|
        {ShortcutCategory::kSystemAndDisplay},
        IDS_KSV_DESCRIPTION_TOGGLE_MESSAGE_CENTER_BUBBLE,
        IDS_KSV_SHORTCUT_TWO_MODIFIERS_ONE_KEY,
diff --git a/ash/shortcut_viewer/shortcut_viewer_strings.grd b/ash/shortcut_viewer/shortcut_viewer_strings.grd
index 324a521a..516d075 100644
--- a/ash/shortcut_viewer/shortcut_viewer_strings.grd
+++ b/ash/shortcut_viewer/shortcut_viewer_strings.grd
@@ -811,6 +811,9 @@
   <message name="IDS_KSV_DESCRIPTION_PRIVACY_SCREEN_TOGGLE" desc="Description of the command in keyboard shortcut viewer.">
     Turn privacy screen on or off
   </message>
+  <message name="IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE" desc="Description of the command in keyboard shortcut viewer.">
+    Turn caret browsing on or off
+  </message>
     </messages>
   </release>
 </grit>
diff --git a/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE.png.sha1 b/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE.png.sha1
new file mode 100644
index 0000000..aa1942e
--- /dev/null
+++ b/ash/shortcut_viewer/shortcut_viewer_strings_grd/IDS_KSV_DESCRIPTION_CARET_BROWSING_TOGGLE.png.sha1
@@ -0,0 +1 @@
+12b01f419dc07b3bf2c0c71b743f8b78b0669bb9
\ No newline at end of file
diff --git a/ash/system/power/power_button_menu_view.cc b/ash/system/power/power_button_menu_view.cc
index 741a095..7edf56d4 100644
--- a/ash/system/power/power_button_menu_view.cc
+++ b/ash/system/power/power_button_menu_view.cc
@@ -189,11 +189,11 @@
                   user::GetLocalizedSignOutStringForStatus(login_status, false),
                   &sign_out_item_);
   add_remove_item(
-      create_lock_screen, kSystemPowerButtonMenuPowerOffIcon,
+      create_lock_screen, kSystemPowerButtonMenuLockScreenIcon,
       l10n_util::GetStringUTF16(IDS_ASH_POWER_BUTTON_MENU_LOCK_SCREEN_BUTTON),
       &lock_screen_item_);
   add_remove_item(
-      create_feedback, kSystemPowerButtonMenuPowerOffIcon,
+      create_feedback, kSystemPowerButtonMenuFeedbackIcon,
       l10n_util::GetStringUTF16(IDS_ASH_POWER_BUTTON_MENU_FEEDBACK_BUTTON),
       &feedback_item_);
 }
diff --git a/base/debug/stack_trace_win.cc b/base/debug/stack_trace_win.cc
index 0f71b95..222a3f9 100644
--- a/base/debug/stack_trace_win.cc
+++ b/base/debug/stack_trace_win.cc
@@ -118,6 +118,28 @@
   return FilePath(system_buffer);
 }
 
+bool SymInitializeCurrentProc() {
+  const HANDLE current_process = GetCurrentProcess();
+  if (SymInitialize(current_process, nullptr, TRUE))
+    return true;
+
+  g_init_error = GetLastError();
+  if (g_init_error != ERROR_INVALID_PARAMETER)
+    return false;
+
+  // SymInitialize() can fail with ERROR_INVALID_PARAMETER when something has
+  // already called SymInitialize() in this process. For example, when absl
+  // support for gtest is enabled, it results in absl calling SymInitialize()
+  // almost immediately after startup. In such a case, try to reinit to see if
+  // that succeeds.
+  SymCleanup(current_process);
+  if (SymInitialize(current_process, nullptr, TRUE))
+    return true;
+
+  g_init_error = GetLastError();
+  return false;
+}
+
 bool InitializeSymbols() {
   if (g_initialized_symbols) {
     // Force a reinitialization. Will ensure any modules loaded after process
@@ -131,10 +153,7 @@
   SymSetOptions(SYMOPT_DEFERRED_LOADS |
                 SYMOPT_UNDNAME |
                 SYMOPT_LOAD_LINES);
-  if (!SymInitialize(GetCurrentProcess(), NULL, TRUE)) {
-    g_init_error = GetLastError();
-    // TODO(awong): Handle error: SymInitialize can fail with
-    // ERROR_INVALID_PARAMETER.
+  if (!SymInitializeCurrentProc()) {
     // When it fails, we should not call debugbreak since it kills the current
     // process (prevents future tests from running or kills the browser
     // process).
diff --git a/base/metrics/sample_vector.cc b/base/metrics/sample_vector.cc
index a465fbd..ce1ea73 100644
--- a/base/metrics/sample_vector.cc
+++ b/base/metrics/sample_vector.cc
@@ -213,14 +213,29 @@
   }
 }
 
-// Use simple binary search.  This is very general, but there are better
-// approaches if we knew that the buckets were linearly distributed.
+// Uses simple binary search or calculates the index directly if it's an "exact"
+// linear histogram. This is very general, but there are better approaches if we
+// knew that the buckets were linearly distributed.
 size_t SampleVectorBase::GetBucketIndex(Sample value) const {
   size_t bucket_count = bucket_ranges_->bucket_count();
   CHECK_GE(bucket_count, 1u);
   CHECK_GE(value, bucket_ranges_->range(0));
   CHECK_LT(value, bucket_ranges_->range(bucket_count));
 
+  // For "exact" linear histograms, e.g. bucket_count = maximum + 1, their
+  // minimum is 1 and bucket sizes are 1. Thus, we don't need to binary search
+  // the bucket index. The bucket index for bucket |value| is just the |value|.
+  Sample maximum = bucket_ranges_->range(bucket_count - 1);
+  if (maximum == static_cast<Sample>(bucket_count - 1)) {
+    // |value| is in the underflow bucket.
+    if (value < 1)
+      return 0;
+    // |value| is in the overflow bucket.
+    if (value > maximum)
+      return bucket_count - 1;
+    return static_cast<size_t>(value);
+  }
+
   size_t under = 0;
   size_t over = bucket_count;
   size_t mid;
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index fa11f12..228cfcb4 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -1493,10 +1493,6 @@
   results_tracker_.AddGlobalTag("OS_MAC");
 #endif
 
-#if defined(OS_MACOSX)
-  results_tracker_.AddGlobalTag("OS_MACOSX");
-#endif
-
 #if defined(OS_NACL)
   results_tracker_.AddGlobalTag("OS_NACL");
 #endif
diff --git a/build/build_config.h b/build/build_config.h
index e8588e1..d2aa244c 100644
--- a/build/build_config.h
+++ b/build/build_config.h
@@ -3,15 +3,35 @@
 // found in the LICENSE file.
 
 // This file adds defines about the platform we're currently building on.
+//
 //  Operating System:
-//    OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
-//    OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
-//    OS_CHROMEOS is set by the build system
+//    OS_AIX / OS_ANDROID / OS_ASMJS / OS_FREEBSD / OS_FUCHSIA / OS_IOS /
+//    OS_LINUX / OS_MAC / OS_NACL (SFI or NONSFI) / OS_NETBSD / OS_OPENBSD /
+//    OS_QNX / OS_SOLARIS / OS_WIN
+//  Operating System family:
+//    OS_APPLE: IOS or MAC
+//    OS_BSD: FREEBSD or NETBSD or OPENBSD
+//    OS_POSIX: AIX or ANDROID or ASMJS or FREEBSD or IOS or LINUX or MAC or
+//              NACL or NETBSD or OPENBSD or QNX or SOLARIS
+//
+//  /!\ Note: OS_CHROMEOS is set by the build system, not this file
+//
 //  Compiler:
 //    COMPILER_MSVC / COMPILER_GCC
+//
 //  Processor:
-//    ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
-//    ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
+//    ARCH_CPU_ARM64 / ARCH_CPU_ARMEL / ARCH_CPU_MIPS / ARCH_CPU_MIPS64 /
+//    ARCH_CPU_MIPS64EL / ARCH_CPU_MIPSEL / ARCH_CPU_PPC64 / ARCH_CPU_S390 /
+//    ARCH_CPU_S390X / ARCH_CPU_X86 / ARCH_CPU_X86_64
+//  Processor family:
+//    ARCH_CPU_ARM_FAMILY: ARMEL or ARM64
+//    ARCH_CPU_MIPS_FAMILY: MIPS64EL or MIPSEL or MIPS64 or MIPS
+//    ARCH_CPU_PPC64_FAMILY: PPC64
+//    ARCH_CPU_S390_FAMILY: S390 or S390X
+//    ARCH_CPU_X86_FAMILY: X86 or X86_64
+//  Processor features:
+//    ARCH_CPU_31_BITS / ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
+//    ARCH_CPU_BIG_ENDIAN / ARCH_CPU_LITTLE_ENDIAN
 
 #ifndef BUILD_BUILD_CONFIG_H_
 #define BUILD_BUILD_CONFIG_H_
@@ -73,9 +93,6 @@
 // https://chromium.googlesource.com/chromium/src/+/master/docs/new_port_policy.md
 
 #if defined(OS_MAC) || defined(OS_IOS)
-// TODO(https://crbug.com/1105907): Migrate off of OS_MACOSX to an appropriate
-// combination of OS_MAC, OS_IOS, and OS_APPLE.
-#define OS_MACOSX 1
 #define OS_APPLE 1
 #endif
 
@@ -87,10 +104,10 @@
 
 // For access to standard POSIXish features, use OS_POSIX instead of a
 // more specific macro.
-#if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) ||    \
-    defined(OS_FREEBSD) || defined(OS_LINUX) || defined(OS_MACOSX) || \
-    defined(OS_NACL) || defined(OS_NETBSD) || defined(OS_OPENBSD) ||  \
-    defined(OS_QNX) || defined(OS_SOLARIS)
+#if defined(OS_AIX) || defined(OS_ANDROID) || defined(OS_ASMJS) || \
+    defined(OS_FREEBSD) || defined(OS_IOS) || defined(OS_LINUX) || \
+    defined(OS_MAC) || defined(OS_NACL) || defined(OS_NETBSD) ||   \
+    defined(OS_OPENBSD) || defined(OS_QNX) || defined(OS_SOLARIS)
 #define OS_POSIX 1
 #endif
 
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index e2de5d0..32172f8 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200731.1.1
+0.20200731.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index e2de5d0..32172f8 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200731.1.1
+0.20200731.2.1
diff --git a/build/lacros/test_runner.py b/build/lacros/test_runner.py
index 939fb6d0..67b0418 100755
--- a/build/lacros/test_runner.py
+++ b/build/lacros/test_runner.py
@@ -241,7 +241,7 @@
     # files (lock file + socket) have been created in the |XDG_RUNTIME_DIR|.
     # TODO(crbug.com/1107966): Figure out a more reliable hook to determine the
     # status of ash-chrome, likely through mojo connection.
-    time_to_wait = 5
+    time_to_wait = 20
     time_counter = 0
     while len(os.listdir(tmp_xdg_dir_name)) < 2:
       time.sleep(0.5)
diff --git a/build_overrides/build.gni b/build_overrides/build.gni
index fbfaa3e..0af420d3 100644
--- a/build_overrides/build.gni
+++ b/build_overrides/build.gni
@@ -27,8 +27,9 @@
   # TODO(crbug/1006769): Switch to perfetto's client library.
   use_perfetto_client_library = false
 
-  # Allows googletest to pretty-print various absl types.
-  gtest_enable_absl_printers = false
+  # Allows googletest to pretty-print various absl types.  Disabled for nacl due
+  # to lack of toolchain support.
+  gtest_enable_absl_printers = !is_nacl
 }
 
 # Allows different projects to specify their own suppression/ignore lists for
diff --git a/cc/metrics/begin_main_frame_metrics.h b/cc/metrics/begin_main_frame_metrics.h
index bcd4071..f30b08e 100644
--- a/cc/metrics/begin_main_frame_metrics.h
+++ b/cc/metrics/begin_main_frame_metrics.h
@@ -22,6 +22,8 @@
   base::TimeDelta layout_update;
   base::TimeDelta prepaint;
   base::TimeDelta composite;
+  base::TimeDelta compositing_assignments;
+  base::TimeDelta compositing_inputs;
   base::TimeDelta paint;
   base::TimeDelta scrolling_coordinator;
   base::TimeDelta composite_commit;
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index 215e7ad..bb46133 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -157,6 +157,12 @@
     case static_cast<int>(BlinkBreakdown::kComposite) +
         kBlinkBreakdownInitialIndex:
       return "SendBeginMainFrameToCommit.Composite";
+    case static_cast<int>(BlinkBreakdown::kCompositingInputs) +
+        kBlinkBreakdownInitialIndex:
+      return "SendBeginMainFrameToCommit.CompositingInputs";
+    case static_cast<int>(BlinkBreakdown::kCompositingAssignments) +
+        kBlinkBreakdownInitialIndex:
+      return "SendBeginMainFrameToCommit.CompositingAssignments";
     case static_cast<int>(BlinkBreakdown::kPaint) + kBlinkBreakdownInitialIndex:
       return "SendBeginMainFrameToCommit.Paint";
     case static_cast<int>(BlinkBreakdown::kScrollingCoordinator) +
@@ -946,6 +952,11 @@
       blink_breakdown_.prepaint;
   blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kComposite)] =
       blink_breakdown_.composite;
+  blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kCompositingInputs)] =
+      blink_breakdown_.compositing_inputs;
+  blink_breakdown_list_[static_cast<int>(
+      BlinkBreakdown::kCompositingAssignments)] =
+      blink_breakdown_.compositing_assignments;
   blink_breakdown_list_[static_cast<int>(BlinkBreakdown::kPaint)] =
       blink_breakdown_.paint;
   blink_breakdown_list_[static_cast<int>(
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h
index 2ff3b98..da9d9d86 100644
--- a/cc/metrics/compositor_frame_reporter.h
+++ b/cc/metrics/compositor_frame_reporter.h
@@ -112,11 +112,13 @@
     kLayoutUpdate = 3,
     kPrepaint = 4,
     kComposite = 5,
-    kPaint = 6,
-    kScrollingCoordinator = 7,
-    kCompositeCommit = 8,
-    kUpdateLayers = 9,
-    kBeginMainSentToStarted = 10,
+    kCompositingInputs = 6,
+    kCompositingAssignments = 7,
+    kPaint = 8,
+    kScrollingCoordinator = 9,
+    kCompositeCommit = 10,
+    kUpdateLayers = 11,
+    kBeginMainSentToStarted = 12,
     kBreakdownCount
   };
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 692f7b6..0f965f1e 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -359,7 +359,8 @@
       current_begin_frame_tracker_(FROM_HERE),
       compositor_frame_reporting_controller_(
           std::make_unique<CompositorFrameReportingController>(
-              /*should_report_metrics=*/true)),
+              /*should_report_metrics=*/!settings
+                  .single_thread_proxy_scheduler)),
       settings_(settings),
       is_synchronous_single_threaded_(!task_runner_provider->HasImplThread() &&
                                       !settings_.single_thread_proxy_scheduler),
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 846ab9a3..4bea238c 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1361,7 +1361,6 @@
   "java/src/org/chromium/chrome/browser/send_tab_to_self/TargetDeviceInfo.java",
   "java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java",
   "java/src/org/chromium/chrome/browser/services/AndroidChildAccountHelper.java",
-  "java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java",
   "java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java",
   "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java",
   "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 0f443bde..cb1c645 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -470,7 +470,6 @@
   "javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java",
-  "javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/SettingsActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
index 3b990cb..4e607a38 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
@@ -208,7 +208,7 @@
     public long getTimestampMillis() {
         assert mTab != null
                 && mTab.get() != null : "getTimestampMillis can only be used with real tabs";
-        return mTab.get().getTimestampMillis();
+        return CriticalPersistedTabData.from(mTab.get()).getTimestampMillis();
     }
 
     /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
index edb5809..941d1512 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContext.java
@@ -110,7 +110,8 @@
             String referrerUrl = getReferrerUrlFromTab(tab);
             return new TabInfo(tab.getId(), tab.getTitle(), tab.getUrlString(),
                     tab.getOriginalUrl(), referrerUrl != null ? referrerUrl : "",
-                    tab.getTimestampMillis(), tab.getUrlString(), tab.isIncognito());
+                    CriticalPersistedTabData.from(tab).getTimestampMillis(), tab.getUrlString(),
+                    tab.isIncognito());
         }
 
         public double getSiteEngagementScore() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index a53dc32..aef0302 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -75,6 +75,7 @@
 import org.chromium.base.test.params.ParameterAnnotations;
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
@@ -683,6 +684,7 @@
     }
 
     @Test
+    @DisabledTest
     @MediumTest
     @Feature({"RenderTest"})
     @ParameterAnnotations.UseMethodParameter(NightModeTestUtils.NightModeParams.class)
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
index 772443b..79f1014 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
@@ -306,8 +306,9 @@
 
     @Test
     public void getTimestampMillis_realTab() {
+        CriticalPersistedTabData criticalPersistedTabaData = CriticalPersistedTabData.from(mTab1);
         long timestamp = 12345;
-        doReturn(timestamp).when(mTab1).getTimestampMillis();
+        doReturn(timestamp).when(criticalPersistedTabaData).getTimestampMillis();
 
         PseudoTab tab = PseudoTab.fromTab(mTab1);
         Assert.assertEquals(timestamp, tab.getTimestampMillis());
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index b2f73c13..975e796bf 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -1296,8 +1296,10 @@
 
         long timestamp1 = 1;
         long timestamp2 = 2;
-        doReturn(timestamp1).when(mTab1).getTimestampMillis();
-        doReturn(timestamp2).when(mTab2).getTimestampMillis();
+        CriticalPersistedTabData criticalPersistedTabData1 = CriticalPersistedTabData.from(mTab1);
+        CriticalPersistedTabData criticalPersistedTabData2 = CriticalPersistedTabData.from(mTab2);
+        doReturn(timestamp1).when(criticalPersistedTabData1).getTimestampMillis();
+        doReturn(timestamp2).when(criticalPersistedTabData2).getTimestampMillis();
         mMediator.resetWithListOfTabs(
                 PseudoTab.getListOfPseudoTab(tabs), /*quickMode =*/false, /*mruMode =*/true);
 
@@ -1307,8 +1309,8 @@
         assertThat(mMediator.indexOfTab(TAB1_ID), equalTo(1));
         assertThat(mMediator.indexOfTab(TAB2_ID), equalTo(0));
 
-        doReturn(timestamp2).when(mTab1).getTimestampMillis();
-        doReturn(timestamp1).when(mTab2).getTimestampMillis();
+        doReturn(timestamp2).when(criticalPersistedTabData1).getTimestampMillis();
+        doReturn(timestamp1).when(criticalPersistedTabData2).getTimestampMillis();
         mMediator.resetWithListOfTabs(
                 PseudoTab.getListOfPseudoTab(tabs), /*quickMode =*/false, /*mruMode =*/true);
 
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
index 039d6cf..03787219 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiUnitTestUtils.java
@@ -31,6 +31,8 @@
     public static TabImpl prepareTab(int tabId) {
         TabImpl tab = prepareTab();
         doReturn(tabId).when(tab).getId();
+        UserDataHost userDataHost = new UserDataHost();
+        doReturn(userDataHost).when(tab).getUserDataHost();
         return tab;
     }
 
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
index b84ac90..e366483 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java
@@ -53,7 +53,7 @@
     private static final int NEW_TAB_2_ID = 4;
     private static final int LAST_COMMITTED_INDEX = 1;
     private static final String TAB_CONTEXT_TAB_0_JSON = "[{\"id\":0,\"url\":"
-            + "\"mock_url_tab_0\",\"title\":\"mock_title_tab_0\",\"timestamp\":0,"
+            + "\"mock_url_tab_0\",\"title\":\"mock_title_tab_0\",\"timestamp\":100,"
             + "\"referrer\":\"mock_referrer_url_tab_0\"}]";
 
     @Rule
@@ -92,7 +92,7 @@
     }
 
     private static TabImpl mockTab(int id, int rootId, String title, String url, String originalUrl,
-            String referrerUrl, long getTimestampMillis) {
+            String referrerUrl, long timestampMillis) {
         TabImpl tab = mock(TabImpl.class);
         doReturn(id).when(tab).getId();
         UserDataHost userDataHost = new UserDataHost();
@@ -116,6 +116,7 @@
                 .when(navigationController)
                 .getEntryAtIndex(eq(LAST_COMMITTED_INDEX));
         doReturn(referrerUrl).when(navigationEntry).getReferrerUrl();
+        doReturn(timestampMillis).when(criticalPersistedTabData).getTimestampMillis();
         return tab;
     }
 
@@ -207,7 +208,8 @@
         Assert.assertNotNull(tabInfo);
         Assert.assertEquals(mTab0.getId(), tabInfo.id);
         Assert.assertEquals(mTab0.getUrlString(), tabInfo.url);
-        Assert.assertEquals(mTab0.getTimestampMillis(), tabInfo.timestampMillis);
+        Assert.assertEquals(
+                CriticalPersistedTabData.from(mTab0).getTimestampMillis(), tabInfo.timestampMillis);
         Assert.assertEquals(mTab0.getTitle(), tabInfo.title);
         NavigationEntry lastCommittedEntry =
                 mTab0.getWebContents().getNavigationController().getEntryAtIndex(
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
index 3cd0a53..9823b6d 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java
@@ -21,6 +21,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowProcess;
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.InMemorySharedPreferences;
@@ -35,6 +36,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider;
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tasks.tab_management.TabUiUnitTestUtils;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
@@ -49,7 +51,7 @@
  */
 @SuppressWarnings({"ResultOfMethodCallIgnored", "ArraysAsListWithZeroOrOneArgument"})
 @RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@Config(manifest = Config.NONE, shadows = ShadowProcess.class)
 public class TabSuggestionsOrchestratorTest {
     private static final int[] TAB_IDS = {0, 1, 2, 3, 4};
     private static final String GROUPING_PROVIDER = "groupingProvider";
@@ -76,12 +78,10 @@
     @Mock
     private ActivityLifecycleDispatcher mDispatcher;
 
-    private static Tab[] sTabs = {mockTab(TAB_IDS[0]), mockTab(TAB_IDS[1]), mockTab(TAB_IDS[2]),
-            mockTab(TAB_IDS[3]), mockTab(TAB_IDS[4])};
+    private static Tab[] sTabs = new Tab[TAB_IDS.length];
 
     private static Tab mockTab(int id) {
-        TabImpl tab = mock(TabImpl.class);
-        doReturn(id).when(tab).getId();
+        TabImpl tab = TabUiUnitTestUtils.prepareTab(id);
         WebContents webContents = mock(WebContents.class);
         GURL gurl = mock(GURL.class);
         doReturn("").when(gurl).getSpec();
@@ -93,6 +93,10 @@
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
+        ShadowProcess.reset();
+        for (int i = 0; i < sTabs.length; i++) {
+            sTabs[i] = mockTab(TAB_IDS[i]);
+        }
         mocker.mock(ProfileJni.TEST_HOOKS, mMockProfileNatives);
         doReturn(mTabModelFilterProvider).when(mTabModelSelector).getTabModelFilterProvider();
         doNothing()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java
deleted file mode 100644
index 7f93e4c..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/services/GoogleServicesManager.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.services;
-
-import android.annotation.SuppressLint;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.TraceEvent;
-import org.chromium.chrome.browser.signin.IdentityServicesProvider;
-import org.chromium.chrome.browser.signin.SigninManager;
-import org.chromium.components.signin.ChromeSigninController;
-import org.chromium.components.signin.metrics.SignoutReason;
-
-/**
- * Starts and monitors various sync and Google services related tasks.
- * - add listeners to AccountManager.
- * - sets up the Android status bar notification controller.
- * - start Tango service if sync setup is completed.
- * <p/>
- * It is intended to be an application level object and is not tied to any particulary
- * activity, although re-verifies some settings whe browser is launched.
- * <p/>
- * The object must be created on the main thread.
- * <p/>
- */
-public class GoogleServicesManager {
-    private static final String TAG = "GoogleServicesManager";
-
-    @VisibleForTesting
-    public static final String SESSION_TAG_PREFIX = "session_sync";
-
-    @SuppressLint("StaticFieldLeak")
-    private static GoogleServicesManager sGoogleServicesManager;
-
-    /**
-     * A helper method for retrieving the application-wide GoogleServicesManager.
-     * <p/>
-     * Can only be accessed on the main thread.
-     *
-     * @return a singleton instance of the GoogleServicesManager
-     */
-    public static GoogleServicesManager get() {
-        ThreadUtils.assertOnUiThread();
-        if (sGoogleServicesManager == null) {
-            sGoogleServicesManager = new GoogleServicesManager();
-        }
-        return sGoogleServicesManager;
-    }
-
-    private GoogleServicesManager() {
-        try (TraceEvent ignored =
-                        TraceEvent.scoped("GoogleServicesManager.GoogleServicesManager")) {
-            ThreadUtils.assertOnUiThread();
-            // The sign out flow starts by clearing the signed in user in the ChromeSigninController
-            // on the Java side, and then performs a sign out on the native side. If there is a
-            // crash on the native side then the signin state may get out of sync. Make sure that
-            // the native side is signed out if the Java side doesn't have a currently signed in
-            // user.
-            // TODO(https://crbug.com/1107942): Move this to SigninManager.
-            SigninManager signinManager = IdentityServicesProvider.get().getSigninManager();
-            if (!ChromeSigninController.get().isSignedIn()
-                    && signinManager.getIdentityManager().hasPrimaryAccount()) {
-                Log.w(TAG, "Signed in state got out of sync, forcing native sign out");
-                // TODO(https://crbug.com/873116): Pass the correct reason for the signout.
-                signinManager.signOut(SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS);
-            }
-        }
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
index c6ed8d1..32de32be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninHelper.java
@@ -21,7 +21,6 @@
 import org.chromium.base.TraceEvent;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.services.GoogleServicesManager;
 import org.chromium.chrome.browser.signin.SigninManager.SignInCallback;
 import org.chromium.chrome.browser.sync.SyncController;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
@@ -110,9 +109,6 @@
         mAccountTrackerService = IdentityServicesProvider.get().getAccountTrackerService(profile);
         mPrefsManager = SigninPreferencesManager.getInstance();
 
-        // TODO(https://crbug.com/1107942): Remove this after removing GoogleServicesManager.
-        GoogleServicesManager.get();
-
         ApplicationStatus.registerApplicationStateListener(this);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index 71c2d28..3cd039b2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -16,6 +16,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
 import org.chromium.base.ThreadUtils;
+import org.chromium.base.TraceEvent;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
@@ -237,6 +238,25 @@
         mIdentityManager.addObserver(this);
 
         reloadAllAccountsFromSystem();
+
+        reconcileJavaAndNativeStates();
+    }
+
+    private void reconcileJavaAndNativeStates() {
+        try (TraceEvent ignored = TraceEvent.scoped("SigninManager.reconcileJavaAndNativeStates")) {
+            ThreadUtils.assertOnUiThread();
+            // The sign out flow starts by clearing the signed in user in the ChromeSigninController
+            // on the Java side, and then performs a sign out on the native side. If there is a
+            // crash on the native side then the signin state may get out of sync. Make sure that
+            // the native side is signed out if the Java side doesn't have a currently signed in
+            // user.
+            if (!ChromeSigninController.get().isSignedIn()
+                    && mIdentityManager.hasPrimaryAccount()) {
+                Log.w(TAG, "Signed in state got out of sync, forcing native sign out");
+                // TODO(https://crbug.com/873116): Pass the correct reason for the signout.
+                signOut(SignoutReason.USER_CLICKED_SIGNOUT_SETTINGS);
+            }
+        }
     }
 
     /**
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 b313220..6c97404 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
@@ -174,11 +174,6 @@
     private boolean mIsRendererUnresponsive;
 
     /**
-     * The last time this tab was shown or the time of its initialization if it wasn't yet shown.
-     */
-    private long mTimestampMillis = INVALID_TIMESTAMP;
-
-    /**
      * Title of the ContentViews webpage.
      */
     private String mTitle;
@@ -421,11 +416,6 @@
     }
 
     @Override
-    public long getTimestampMillis() {
-        return mTimestampMillis;
-    }
-
-    @Override
     public boolean isIncognito() {
         return mIncognito;
     }
@@ -630,7 +620,7 @@
 
             // Updating the timestamp has to happen after the showInternal() call since subclasses
             // may use it for logging.
-            mTimestampMillis = System.currentTimeMillis();
+            CriticalPersistedTabData.from(this).setTimestampMillis(System.currentTimeMillis());
         } finally {
             TraceEvent.end("Tab.show");
         }
@@ -821,8 +811,8 @@
             }
 
         } finally {
-            if (mTimestampMillis == INVALID_TIMESTAMP) {
-                mTimestampMillis = System.currentTimeMillis();
+            if (CriticalPersistedTabData.from(this).getTimestampMillis() == INVALID_TIMESTAMP) {
+                CriticalPersistedTabData.from(this).setTimestampMillis(System.currentTimeMillis());
             }
             String appId = tabState != null ? tabState.openerAppId : null;
             Boolean hasThemeColor = tabState != null ? tabState.hasThemeColor() : null;
@@ -847,7 +837,7 @@
     void restoreFieldsFromState(TabState state) {
         assert state != null;
         CriticalPersistedTabData.from(this).setWebContentsState(state.contentsState);
-        mTimestampMillis = state.timestampMillis;
+        CriticalPersistedTabData.from(this).setTimestampMillis(state.timestampMillis);
         mUrl = new GURL(state.contentsState.getVirtualUrlFromState());
         mTitle = state.contentsState.getDisplayTitleFromState();
         mLaunchTypeAtCreation = state.tabLaunchTypeAtCreation;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java
index b747f5f..9a813d0c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateExtractor.java
@@ -25,7 +25,7 @@
         tabState.contentsState = getWebContentsState(tabImpl);
         tabState.openerAppId = TabAssociatedApp.getAppId(tab);
         tabState.parentId = CriticalPersistedTabData.from(tab).getParentId();
-        tabState.timestampMillis = tab.getTimestampMillis();
+        tabState.timestampMillis = CriticalPersistedTabData.from(tab).getTimestampMillis();
         tabState.tabLaunchTypeAtCreation = tab.getLaunchTypeAtInitialTabCreation();
         // Don't save the actual default theme color because it could change on night mode state
         // changed.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
index f3cb575..094730e4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
@@ -9,6 +9,7 @@
 
 import org.chromium.base.UserData;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.net.NetError;
 
@@ -162,7 +163,7 @@
 
     @Override
     public void onShown(Tab tab, @TabSelectionType int selectionType) {
-        long previousTimestampMillis = tab.getTimestampMillis();
+        long previousTimestampMillis = CriticalPersistedTabData.from(tab).getTimestampMillis();
         long now = SystemClock.elapsedRealtime();
 
         // Do not collect the tab switching data for the first switch to a tab after the cold start
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java
deleted file mode 100644
index 51e6a15..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.services;
-
-import android.support.test.annotation.UiThreadTest;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
-import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.test.ChromeActivityTestRule;
-import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-
-/**
- * Google Services Manager tests
- */
-@RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-public class GoogleServicesManagerIntegrationTest {
-    @Rule
-    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
-            new ChromeActivityTestRule<>(ChromeActivity.class);
-
-    /**
-     * Test changing the state of auto login
-     * @SmallTest
-     * @Feature({"Sync", "Main"})
-     */
-    @Test
-    @DisabledTest(message = "crbug.com/413289")
-    @UiThreadTest
-    public void testSetAutologinState() {
-        // TODO(acleung): Add back some sort of test for the GSM.
-    }
-
-    @Before
-    public void setUp() throws InterruptedException {
-        mActivityTestRule.startMainActivityOnBlankPage();
-    }
-}
diff --git a/chrome/android/modules/image_editor/image_editor_module.gni b/chrome/android/modules/image_editor/image_editor_module.gni
index f6db4b29..1e265f5 100644
--- a/chrome/android/modules/image_editor/image_editor_module.gni
+++ b/chrome/android/modules/image_editor/image_editor_module.gni
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/android/channel.gni")
 import("//build/config/android/rules.gni")
 
 _ink_dir =
@@ -10,7 +11,8 @@
 
 declare_args() {
   # Whether to enable the ImageEditor in Chrome.
-  enable_image_editor = false
+  enable_image_editor =
+      android_channel == "default" || android_channel == "canary"
 }
 
 image_editor_module_desc = {
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index 40401fae..41ab7b4 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -208,6 +208,7 @@
 #define IDC_SHOW_SAVE_LOCAL_CARD_SIGN_IN_PROMO_IF_APPLICABLE 40257
 #define IDC_CLOSE_SIGN_IN_PROMO        40258
 #define IDC_SHOW_FULL_URLS             40259
+#define IDC_CARET_BROWSING_TOGGLE      40260
 
 // Spell-check
 // Insert any additional suggestions before _LAST; these have to be consecutive.
diff --git a/chrome/app/chrome_dll.rc b/chrome/app/chrome_dll.rc
index 7e63b68..d299571a 100644
--- a/chrome/app/chrome_dll.rc
+++ b/chrome/app/chrome_dll.rc
@@ -42,6 +42,7 @@
 #endif  // ENABLE_PRINTING_FOR_RC
     "D",            IDC_BOOKMARK_ALL_TABS,      VIRTKEY, CONTROL, SHIFT
     "D",            IDC_BOOKMARK_THIS_TAB,      VIRTKEY, CONTROL
+    VK_F7,          IDC_CARET_BROWSING_TOGGLE,  VIRTKEY
     VK_DELETE,      IDC_CLEAR_BROWSING_DATA,    VIRTKEY, CONTROL, SHIFT
     "W",            IDC_CLOSE_TAB,              VIRTKEY, CONTROL
     VK_F4,          IDC_CLOSE_TAB,              VIRTKEY, CONTROL
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 61a8238..ea32c54 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -9260,6 +9260,37 @@
         Live Caption is not available right now
       </message>
 
+      <!-- Caret browsing. -->
+      <if expr="not chromeos">
+        <message name="IDS_ENABLE_CARET_BROWSING_INFO" desc="Information in the confirmation dialog for enabling caret browsing">
+          You can navigate pages with a text cursor. Press F7 to turn off.
+        </message>
+      </if>
+      <if expr="chromeos">
+        <message name="IDS_ENABLE_CARET_BROWSING_INFO" desc="Information in the confirmation dialog for enabling caret browsing">
+          You can navigate pages with a text cursor. Press Ctrl+Search+7 to turn off.
+        </message>
+      </if>
+      <message name="IDS_CARET_BROWSING_DO_NOT_ASK" desc="Label for check box that prevents the dialog from being shown in the future">
+        Don't ask me again
+      </message>
+      <if expr="not use_titlecase">
+        <message name="IDS_ENABLE_CARET_BROWSING_TITLE" desc="In sentence case: The title text of the confirmation dialog for enabling caret browsing">
+          Turn on caret browsing?
+        </message>
+        <message name="IDS_ENABLE_CARET_BROWSING_TURN_ON" desc="In sentence case: The text of the button that confirms turning on caret browsing">
+          Turn on
+        </message>
+      </if>
+      <if expr="use_titlecase">
+        <message name="IDS_ENABLE_CARET_BROWSING_TITLE" desc="In title case: The title text of the confirmation dialog for enabling caret browsing">
+          Turn On Caret Browsing?
+        </message>
+        <message name="IDS_ENABLE_CARET_BROWSING_TURN_ON" desc="In title case: The text of the button that confirms turning on caret browsing">
+          Turn On
+        </message>
+      </if>
+
       <!-- Media Galleries. -->
       <if expr="not is_android">
         <message name="IDS_MEDIA_GALLERIES_DIALOG_HEADER" desc="Header for media gallery permissions dialog.">
diff --git a/chrome/app/generated_resources_grd/IDS_CARET_BROWSING_DO_NOT_ASK.png.sha1 b/chrome/app/generated_resources_grd/IDS_CARET_BROWSING_DO_NOT_ASK.png.sha1
new file mode 100644
index 0000000..f5527b6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_CARET_BROWSING_DO_NOT_ASK.png.sha1
@@ -0,0 +1 @@
+7e6c477f73852529e95e5813cd5fbb832b0a1df3
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_INFO.png.sha1 b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_INFO.png.sha1
new file mode 100644
index 0000000..f5527b6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_INFO.png.sha1
@@ -0,0 +1 @@
+7e6c477f73852529e95e5813cd5fbb832b0a1df3
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TITLE.png.sha1
new file mode 100644
index 0000000..f5527b6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TITLE.png.sha1
@@ -0,0 +1 @@
+7e6c477f73852529e95e5813cd5fbb832b0a1df3
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TURN_ON.png.sha1 b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TURN_ON.png.sha1
new file mode 100644
index 0000000..f5527b6
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_ENABLE_CARET_BROWSING_TURN_ON.png.sha1
@@ -0,0 +1 @@
+7e6c477f73852529e95e5813cd5fbb832b0a1df3
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 416749b9..a0c65a6 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -216,6 +216,7 @@
 <translation id="7975919845073681630">‏هذا تثبيت ثانوي من Chromium، ولا يمكن جعله متصفحك التلقائي.</translation>
 <translation id="7979877361127045932">‏الإخفاء في قائمة Chromium</translation>
 <translation id="8013436988911883588">‏بعد حصول Chromium على إمكانية الوصول، ستتمكن المواقع الإلكترونية من مطالبتك بإمكانية الوصول.</translation>
+<translation id="8022442821873033760">‏إعداد مساحة Chromium Space الجديدة</translation>
 <translation id="81770708095080097">‏هذا الملف ضار، لذلك فقد حظره Chromium.</translation>
 <translation id="8248265253516264921">‏في حال لم تتضمن صورة ما وصفًا مفيدًا، سيحاول Chromium توفير وصف لك. لإنشاء الأوصاف، سيتم إرسال الصور إلى Google. ويمكنك إيقاف هذه الميزة في الإعدادات في أي وقت.</translation>
 <translation id="8266560134891435528">‏يتعذّر على Chromium التحقّق من كلمات المرور لأنك لم تسجّل الدخول.</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb
index 4520173..7b5e8ef 100644
--- a/chrome/app/resources/chromium_strings_az.xtb
+++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -214,6 +214,7 @@
 <translation id="7975919845073681630">Bu Chromium'un ikinci quraşdırmasıdır və defolt brauzer kimi ayarlana bilmir.</translation>
 <translation id="7979877361127045932">Chromium menyusunda gizlədin</translation>
 <translation id="8013436988911883588">Chromium'un giriş imkanı olduqda veb saytlar giriş üçün Sizdən icazə istəyəcək.</translation>
+<translation id="8022442821873033760">Yeni Chromium Space'inizi ayarlayın</translation>
 <translation id="81770708095080097">Bu fayl təklükəlidir, bu səbəbdən Chromium onu blok etdi.</translation>
 <translation id="8248265253516264921">Şəklin təsviri faydalı deyilsə, Chromium Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir. Bunu istənilən vaxt ayarlardan deaktiv edə bilərsiniz.</translation>
 <translation id="8266560134891435528">Hesaba daxil olmadığınız üçün Chromium parollarınızı yoxlaya bilmir</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb
index 6a530d1..92a85fa2 100644
--- a/chrome/app/resources/chromium_strings_be.xtb
+++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">Гэта другасны ўсталяваны экзэмпляр Chromium – яго нельга зрабіць стандартным браўзерам.</translation>
 <translation id="7979877361127045932">Схаваць у меню Chromium</translation>
 <translation id="8013436988911883588">Як толькі Chromium атрымае дазвол, вэб-сайты змогуць запытваць у вас доступ.</translation>
+<translation id="8022442821873033760">Наладзьце свой профіль Chromium Space</translation>
 <translation id="81770708095080097">Файл небяспечны, таму Chromium заблакіраваў яго.</translation>
 <translation id="8248265253516264921">Калі відарыс не мае прыдатнага апісання, Chromium паспрабуе дадаць яго для вас. Каб стварыць апісанні, відарысы адпраўляюцца ў Google. Гэты параметр можна адключыць у наладах у любы час.</translation>
 <translation id="8266560134891435528">Chromium не можа праверыць вашы паролі, пакуль вы не ўвойдзеце ва ўліковы запіс</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb
index 553c5bd..5bd71dd 100644
--- a/chrome/app/resources/chromium_strings_bn.xtb
+++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -248,7 +248,7 @@
 <translation id="91086099826398415">নতুন Chromium ট্যাবে লিঙ্ক খুলুন</translation>
 <translation id="911206726377975832">আপনার ব্রাউজিং ডেটাও মুছে দেবেন?</translation>
 <translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" /> অ্যাক্সেস করতে অন্য ব্রাউজার খোলার জন্য আপনার সিস্টেম অ্যাডমিনিস্ট্রেটর Chromium কনফিগার করেছেন।</translation>
-<translation id="9164845895615421500">Chromium সপ্তাহে একবার ডিভাইসে কোনও অযাচিত সফ্টওয়্যার আছে কিনা তা চেক করে দেখে। শেষবার চেক করা হয়েছে: এক মুহূর্ত আগে।</translation>
+<translation id="9164845895615421500">Chromium সপ্তাহে একবার ডিভাইসে কোনও অযাচিত সফ্টওয়্যার আছে কিনা তা চেক করে দেখে। শেষবার চেক করা হয়েছে: একটু আগে।</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">এই ডিভাইসে আপনার ব্রাউজ করার কাজকে সহজ করার জন্য Chromium Space ব্যবহার করুন</translation>
 <translation id="93478295209880648">Chromium সঠিকভাবে কাজ নাও করতে পারে কারণ এটি এখন আর Windows XP বা Windows Vista আর সমর্থিত নয়</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index b6953c4..72a5e63 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -217,6 +217,7 @@
 <translation id="7975919845073681630">Toto je druhá instalace prohlížeče Chromium. Tuto instalaci nelze nastavit jako výchozí prohlížeč.</translation>
 <translation id="7979877361127045932">Skrýt v nabídce Chromium</translation>
 <translation id="8013436988911883588">Až bude mít Chromium přístup, budou vás weby moci požádat o přístup.</translation>
+<translation id="8022442821873033760">Nastavení nového profilu Chromium Space</translation>
 <translation id="81770708095080097">Tento soubor je nebezpečný, proto jej prohlížeč Chromium zablokoval.</translation>
 <translation id="8248265253516264921">Pokud obrázek nemá užitečný popis, Chromium se vám jej pokusí poskytnout. Za účelem vytváření popisů jsou obrázky odesílány do Googlu. Tuto funkci můžete kdykoliv vypnout v nastavení.</translation>
 <translation id="8266560134891435528">Chromium nemůže zkontrolovat vaše hesla, protože nejste přihlášeni</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index e2357a15..2b5815b 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
-<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 tunti sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_HOURS} tuntia sitten}}</translation>
+<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 tunti sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_HOURS} tuntia sitten}}</translation>
 <translation id="1065672644894730302">Asetuksiasi ei voi lukea. Kaikkia toimintoja ei voi välttämättä käyttää eikä asetuksiin tehtäviä muutoksia tallenneta.</translation>
 <translation id="1098170124587656448">Chromium voi auttaa suojaamaan sinua tietosuojaloukkauksilta, haitallisilta laajennuksilta ja muilta</translation>
 <translation id="1104942323762546749">Chromium yrittää viedä salasanojasi tiedostoon. Salli tämä kirjoittamalla Windows-salasanasi.</translation>
@@ -39,7 +39,7 @@
 <translation id="2711502716910134313">Chromium-välilehti</translation>
 <translation id="2718390899429598676">Chromium lisää suojausta salaamalla tietosi.</translation>
 <translation id="2770231113462710648">Vaihda oletusselaimeksi:</translation>
-<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 minuutti sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_MINS} minuuttia sitten.}}</translation>
+<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 minuutti sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_MINS} minuuttia sitten.}}</translation>
 <translation id="2799223571221894425">Käynnistä uudelleen</translation>
 <translation id="2847479871509788944">Poista Chromiumista…</translation>
 <translation id="2885378588091291677">Tehtävänhallinta</translation>
@@ -169,7 +169,7 @@
 <translation id="6847869444787758381">Chromium ilmoittaa sinulle, jos salasanasi ovat vaarantuneet</translation>
 <translation id="6857782730669500492">Chromium – <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (kopioitu Chromiumiin)</translation>
-<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 päivä sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_DAYS} päivää sitten.}}</translation>
+<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 päivä sitten.}other{Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_DAYS} päivää sitten.}}</translation>
 <translation id="6893813176749746474">Chromium on päivitetty, mutta et ole käyttänyt sitä ainakaan 30 päivään.</translation>
 <translation id="6964305034639999644">Avaa linkki Chromiumin inco&amp;gnito-ikkunassa</translation>
 <translation id="6990124437352146030">Chromium tarvitsee oikeuden käyttää mikrofoniasi tällä sivustolla.</translation>
@@ -235,7 +235,7 @@
 <translation id="8621669128220841554">Asennus epäonnistui määrittelemättömän virheen vuoksi. Lataa Chromium uudelleen.</translation>
 <translation id="8697124171261953979">Määrittää myös Chromiumin ja omnibox-hakujen aloitussivun.</translation>
 <translation id="8704119203788522458">Tämä on oma Chromiumisi</translation>
-<translation id="8705191560707593947">Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: eilen.</translation>
+<translation id="8705191560707593947">Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi eilen.</translation>
 <translation id="8796602469536043152">Chromium tarvitsee oikeuden käyttää kameraasi ja mikrofoniasi tällä sivustolla.</translation>
 <translation id="8803635938069941624">Chromium-käyttöjärjestelmän käyttöehdot</translation>
 <translation id="8821041990367117597">Chromium ei voinut synkronoida tietoja, sillä tilin kirjautumistiedot ovat vanhentuneet.</translation>
@@ -251,7 +251,7 @@
 <translation id="91086099826398415">Avaa linkki uudella Chromiumin välilehdellä</translation>
 <translation id="911206726377975832">Poistetaanko myös selailutiedot?</translation>
 <translation id="9158494823179993217">Järjestelmänvalvojasi on määrittänyt Chromiumin avaamaan toisen selaimen, jolla <ph name="TARGET_URL_HOSTNAME" /> avataan.</translation>
-<translation id="9164845895615421500">Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: hetki sitten.</translation>
+<translation id="9164845895615421500">Chromium tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi hetki sitten.</translation>
 <translation id="9190841055450128916">Chromium (saapuva mDNS)</translation>
 <translation id="9191317372410544836">Pidä selaaminen laitteella järjestyksessä Chromiumin tilojen avulla</translation>
 <translation id="93478295209880648">Chromium ei välttämättä toimi oikein, koska se ei enää tue Windows XP:tä tai Windows Vistaa.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index e72fbe2..fe429cc 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">Pangalawang pag-install ito ng Chromium at hindi ito maaaring gawing iyong default na browser.</translation>
 <translation id="7979877361127045932">Itago sa menu ng Chromium</translation>
 <translation id="8013436988911883588">Kapag mayroon nang access ang Chromium, makakahingi na ang mga website ng access sa iyo.</translation>
+<translation id="8022442821873033760">I-set up ang iyong bagong Chromium Space</translation>
 <translation id="81770708095080097">Mapanganib ang file na ito, kaya na-block ito ng Chromium.</translation>
 <translation id="8248265253516264921">Kung hindi sapat ang deskripsyon ng isang larawan, susubukan ng Chromium na ayusin ito para sa iyo. Para gumawa ng mga deskripsyon, ipinapadala ang mga larawan sa Google. Puwede mo itong i-off sa mga setting anumang oras.</translation>
 <translation id="8266560134891435528">Hindi masusuri ng Chromium ang iyong mga password dahil hindi ka naka-sign in</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index e0f97d89..30cc297 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -216,6 +216,7 @@
 <translation id="7975919845073681630">यह क्रोमियम का द्वितीयक इंस्टॉलेशन है और इसे आपका डिफ़ॉल्ट ब्राउज़र नहीं बनाया जा सकता.</translation>
 <translation id="7979877361127045932">क्रोमियम मेन्यू में छिपाएं</translation>
 <translation id="8013436988911883588">क्रोमियम को ऐक्सेस मिलने के बाद, वेबसाइटें आपसे ऐक्सेस मांग सकेंगी.</translation>
+<translation id="8022442821873033760">क्रोमियम पर अपनी नई प्रोफ़ाइल सेट अप करें</translation>
 <translation id="81770708095080097">यह फ़ाइल खतरनाक है, इसलिए क्रोमियम ने इसे रोक दिया है.</translation>
 <translation id="8248265253516264921">अगर किसी इमेज के बारे में मददगार जानकारी मौजूद नहीं है, तो 'क्रोमियम' उसके बारे में जानकारी देने की कोशिश करेगा. जानकारी तैयार करने के लिए, इमेज Google को भेजी जाती हैं. आप किसी भी समय सेटिंग में जाकर इसे बंद कर सकते हैं.</translation>
 <translation id="8266560134891435528">क्रोमियम आपके पासवर्ड की जांच नहीं कर सकता, क्योंकि आपने साइन इन नहीं किया है</translation>
@@ -250,7 +251,7 @@
 <translation id="91086099826398415">नए क्रोमियम &amp;टैब में लिंक खोलें</translation>
 <translation id="911206726377975832">अपने ब्राउज़िंग डेटा भी मिटाएं?</translation>
 <translation id="9158494823179993217">आपके सिस्टम एडमिन ने 'क्रोमियम' को इस तरह कॉन्फ़िगर किया है कि वह <ph name="TARGET_URL_HOSTNAME" /> को ऐक्सेस करने के लिए कोई दूसरा ब्राउज़र खोले.</translation>
-<translation id="9164845895615421500">क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कुछ देर पहले की गई.</translation>
+<translation id="9164845895615421500">क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कुछ सेकंड पहले की गई.</translation>
 <translation id="9190841055450128916">क्रोमियम (mDNS-In)</translation>
 <translation id="9191317372410544836">क्रोमियम की कई जगहों पर खाता बनाने वाली सुविधा का इस्तेमाल करके, इस डिवाइस पर अपनी ब्राउज़िंग को आसान बनाएं</translation>
 <translation id="93478295209880648">हो सकता है क्रोमियम सही तरीके से काम ना करें क्‍योंकि अब वह Windows XP या Windows Vista पर काम नहीं करता है</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb
index 23be21b..df501e7 100644
--- a/chrome/app/resources/chromium_strings_hy.xtb
+++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hy">
-<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է 1 ժամ առաջ:}one{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}other{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}}</translation>
+<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է 1 ժամ առաջ։}one{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}other{Chromium-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}}</translation>
 <translation id="1065672644894730302">Ձեր նախասիրությունները չի հաջողվում ստանալ:
 
 Որոշ գործառույթներ կարող են մատչելի չլինել: Նախընտրանքների փոփոխությունները չեն պահպանվի:</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 89492f72..a195d15 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -250,7 +250,7 @@
 <translation id="91086099826398415">Buka Link di &amp;tab Chromium Baru</translation>
 <translation id="911206726377975832">Hapus juga data browsing Anda?</translation>
 <translation id="9158494823179993217">Administrator sistem Anda telah mengonfigurasi Chromium untuk membuka browser alternatif guna mengakses <ph name="TARGET_URL_HOSTNAME" />.</translation>
-<translation id="9164845895615421500">Chromium memeriksa software yang tidak diinginkan seminggu sekali. Terakhir diperiksa: beberapa waktu yang lalu.</translation>
+<translation id="9164845895615421500">Chromium memeriksa software yang tidak diinginkan seminggu sekali. Terakhir diperiksa: sesaat yang lalu.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">Gunakan Chromium Space agar penjelajahan Anda tetap terkelola di perangkat ini</translation>
 <translation id="93478295209880648">Chromium mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di Windows XP atau Windows Vista</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb
index 177e555..2d9124a7 100644
--- a/chrome/app/resources/chromium_strings_kk.xtb
+++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kk">
-<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 сағат бұрын.}other{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_HOURS} сағат бұрын.}}</translation>
+<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 сағат бұрын.}other{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_HOURS} сағат бұрын.}}</translation>
 <translation id="1065672644894730302">Реттеулерді оқу мүмкін емес.
 
 Кейбір мүмкіндіктер қолжетімсіз болуы мүмкін және параметрлерге жасалған өзгертулер сақталмайды.</translation>
@@ -41,7 +41,7 @@
 <translation id="2711502716910134313">Chromium қойындысы</translation>
 <translation id="2718390899429598676">Қосымша қауіпсіздік үшін Chromium деректеріңізді шифрлайды.</translation>
 <translation id="2770231113462710648">Әдепкі браузерді келесіге өзгерту:</translation>
-<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 минут бұрын.}other{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_MINS} минут бұрын.}}</translation>
+<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 минут бұрын.}other{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_MINS} минут бұрын.}}</translation>
 <translation id="2799223571221894425">Қайта іске қосу</translation>
 <translation id="2847479871509788944">Chromium жүйесінен алып тастау…</translation>
 <translation id="2885378588091291677">Тапсырмалар реттегіші</translation>
@@ -51,7 +51,7 @@
 <translation id="3032706164202344641">Chromium сіздің құпия сөздеріңізді тексере алмай жатыр. Кейінірек қайталап көріңіз.</translation>
 <translation id="3032787606318309379">Chromium жүйесіне қосылуда…</translation>
 <translation id="3068515742935458733">Google компаниясына жаңылыс туралы есептер және <ph name="UMA_LINK" /> жіберу арқылы Chromium жақсартуға көмектесіңіз</translation>
-<translation id="3086207596048762442">Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді.</translation>
+<translation id="3086207596048762442">Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді.</translation>
 <translation id="3103660991484857065">Орнату құралы мұрағаттан шығара алмады. Chromium қолданбасын қайта жүктеңіз.</translation>
 <translation id="3130323860337406239">Chromium микрофоныңызды пайдалануда.</translation>
 <translation id="3155163173539279776">Chromium қолданбасын қайта іске қосу</translation>
@@ -171,7 +171,7 @@
 <translation id="6847869444787758381">Құпия сөздеріңіз ұрланған жағдайда, Chromium бұл туралы хабарлайды.</translation>
 <translation id="6857782730669500492">Chromium – <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (Chromium браузеріне көшірілген)</translation>
-<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 күн бұрын.}other{Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_DAYS} күн бұрын.}}</translation>
+<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 күн бұрын.}other{Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_DAYS} күн бұрын.}}</translation>
 <translation id="6893813176749746474">Chromium жаңартылды, бірақ оны кемінде 30 күн пайдаланбадыңыз.</translation>
 <translation id="6964305034639999644">Сілтемені Chromium инкогнито терезесінде ашу</translation>
 <translation id="6990124437352146030">Chromium браузеріне бұл сайтта микрофонды пайдалану үшін рұқсат керек</translation>
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">Бұл – Chromium браузерінің қайта орнатылған нұсқасы және әдепкі браузер бола алмайды.</translation>
 <translation id="7979877361127045932">Chromium мәзірінде жасыру</translation>
 <translation id="8013436988911883588">Chromium браузерінің кіру рұқсаты болса, веб-сайттар сізден кіру рұқсатын сұрайды.</translation>
+<translation id="8022442821873033760">Жаңа Chromium профилін реттеңіз</translation>
 <translation id="81770708095080097">Бұл файл қауіпті болғандықтан, Chromium оны бөгеді.</translation>
 <translation id="8248265253516264921">Егер суреттің пайдалы сипаттамасы болмаса, Chromium оны өзі ұсынып көреді. Сипаттамалар жасау үшін суреттер Google-ға жіберіледі. Бұл функцияны кез келген уақытта параметрлерден өшіріп қоюға болады.</translation>
 <translation id="8266560134891435528">Есептік жазбаға кірмегендіктен, Chromium сіздің құпия сөздеріңізді тексере алмайды.</translation>
@@ -236,7 +237,7 @@
 <translation id="8621669128220841554">Орнату анықталмаған қате себебінен сәтсіз аяқталды. Chromium браузерін қайта жүктеңіз.</translation>
 <translation id="8697124171261953979">Сонымен қатар ол Chromium іске қосқаныңызда немесе Omnibox ішінен іздегеніңізде қайсы бет көрсетілетінін бақылайды.</translation>
 <translation id="8704119203788522458">Сізге арналған Chromium.</translation>
-<translation id="8705191560707593947">Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: кеше.</translation>
+<translation id="8705191560707593947">Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: кеше.</translation>
 <translation id="8796602469536043152">Chromium браузеріне бұл сайтта камераны және микрофонды пайдалану үшін рұқсат керек</translation>
 <translation id="8803635938069941624">Chromium OS шарттары</translation>
 <translation id="8821041990367117597">Chromium деректеріңізді синхрондай алмайды, себебі есептік жазбаңызға кіру мәліметтері ескірген.</translation>
@@ -252,7 +253,7 @@
 <translation id="91086099826398415">Сілтемені жаңа Chromium қойындысында ашу</translation>
 <translation id="911206726377975832">Сонымен қатар шолу деректеріңізді жоясыз ба?</translation>
 <translation id="9158494823179993217">Жүйе әкімшісі Chromium браузерін <ph name="TARGET_URL_HOSTNAME" /> сілтемесіне қосымша браузер арқылы кіре алатындай етіп конфигурациялады.</translation>
-<translation id="9164845895615421500">Chromium браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: жаңа ғана.</translation>
+<translation id="9164845895615421500">Chromium браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: жаңа ғана.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">Осы құрылғыда шолу тәртібін сақтау үшін Chromium профильдерін пайдаланыңыз.</translation>
 <translation id="93478295209880648">Chromium дұрыс жұмыс істемеуі мүмкін, себебі оған Windows XP не Windows Vista жүйелерінде қолдау көрсетілмейді</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb
index 1a4a05f..4247766 100644
--- a/chrome/app/resources/chromium_strings_km.xtb
+++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -219,6 +219,7 @@
 <translation id="7975919845073681630">នេះគឺជាការដំឡើេង Chromium បន្ទាប់បន្សំ ហើយវាមិនអាចធ្វើជាកម្មវិធីរុករកលំនាំដើមរបស់អ្នកបានទេ។</translation>
 <translation id="7979877361127045932">លាក់នៅក្នុងម៉ឺនុយ Chromium</translation>
 <translation id="8013436988911883588">បន្ទាប់ពី Chromium មានសិទ្ធិចូលប្រើហើយ គេហទំព័រ​នឹង​អាច​ស្នើ​សុំ​សិទ្ធិ​ចូល​ប្រើពី​អ្នកបាន។</translation>
+<translation id="8022442821873033760">រៀបចំ Chromium Space ថ្មីរបស់អ្នក</translation>
 <translation id="81770708095080097">ឯកសារនេះមានគ្រោះថ្នាក់ ហេតុដូច្នេះហើយបានជា Chromium រារាំងវា។</translation>
 <translation id="8248265253516264921">ប្រសិនបើរូបភាពមិនមាន​ការពណ៌នា​ដែលមានប្រយោជន៍ Chromium នឹង​ព្យាយាមផ្ដល់​ការពណ៌នា​ដែលមានប្រយោជន៍សម្រាប់​អ្នក។ រូបភាព​ត្រូវបានផ្ញើ​ទៅ Google ដើម្បី​បង្កើត​ការពណ៌នា។ អ្នកអាចបិទ​សកម្មភាពនេះ​នៅក្នុងការកំណត់​បានគ្រប់ពេល។</translation>
 <translation id="8266560134891435528">Chromium មិន​អាច​ពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ ដោយសារអ្នកមិនបានចូលគណនី</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb
index 09192600..e228d865 100644
--- a/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
-<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ಗಂಟೆಯ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ಗಂಟೆಯ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="1065672644894730302">ನಿಮ್ಮ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ರೀಡ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಅಲ್ಲದೇ, ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳು ಲಭ್ಯವಿಲ್ಲದಿರಬಹುದು ಮತ್ತು ಪ್ರಾಶಸ್ತ್ಯಗಳಲ್ಲಿ ಮಾಡಿದ ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="1098170124587656448">ಡೇಟಾ ಉಲ್ಲಂಘನೆಗಳು, ಕಳಪೆ ವಿಸ್ತರಣೆಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳಿಂದ ನಿಮ್ಮನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು Chromium ಸಹಾಯ ಮಾಡಬಹುದು</translation>
 <translation id="1104942323762546749">Chromium ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ಬಯಸುತ್ತದೆ. ಇದನ್ನು ಅನುಮತಿಸಲು ನಿಮ್ಮ Windows ಪಾಸ್‌ವರ್ಡ್‌ ಟೈಪ್ ಮಾಡಿ.</translation>
@@ -39,7 +39,7 @@
 <translation id="2711502716910134313">Chromium ಟ್ಯಾಬ್</translation>
 <translation id="2718390899429598676">ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, Chromium ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="2770231113462710648">ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಅನ್ನು ಇದ್ಕಕೆ ಬದಲಿಸಿ:</translation>
-<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ನಿಮಿಷದ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ನಿಮಿಷದ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="2799223571221894425">ಮರುಪ್ರಾರಂಭಿಸು</translation>
 <translation id="2847479871509788944">Chromium ನಿಂದ ತೆಗೆದುಹಾಕಿ...</translation>
 <translation id="2885378588091291677">ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation>
@@ -165,7 +165,7 @@
 <translation id="6847869444787758381">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಎಂದಾದರೂ ಹ್ಯಾಕ್‌ ಆಗಿವೆಯೇ ಎಂಬುದನ್ನು Chromium ನಿಮಗೆ ತಿಳಿಸುತ್ತದೆ</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google Pay (Chromium ಗೆ ನಕಲಿಸಲಾಗಿದೆ)</translation>
-<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ದಿನದ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ದಿನದ ಹಿಂದೆ.}one{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}other{Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="6893813176749746474">Chromium ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ, ಆದರೆ ನೀವು ಕನಿಷ್ಠ 30 ದಿನಗಳವರೆಗಾದರೂ ಇದನ್ನು ಬಳಸಿರಲಿಕ್ಕಿಲ್ಲ.</translation>
 <translation id="6964305034639999644">Chromium ಅ&amp;ದೃಶ್ಯ ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
 <translation id="6990124437352146030">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್‌ಗೆ ಪ್ರವೇಶಿಸಲು Chromium ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
@@ -227,7 +227,7 @@
 <translation id="8621669128220841554">ಅನಿರ್ದಿಷ್ಟ ದೋಷದಿಂದಾಗಿ ಸ್ಥಾಪನೆ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೊಮ್ಮೆ Chromium ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ.</translation>
 <translation id="8697124171261953979">ನೀವು Chromium ಪ್ರಾರಂಭಿಸಿದಾಗ ಅಥವಾ ಓಮ್ನಿಬಾಕ್ಸ್‌ನಿಂದ ಹುಡುಕಿದಾಗ ತೋರಿಸಬೇಕಾದ ಪುಟವನ್ನು ಕೂಡಾ ಇದು ನಿಯಂತ್ರಿಸುತ್ತದೆ.</translation>
 <translation id="8704119203788522458">ಇದು ನಿಮ್ಮ Chromium</translation>
-<translation id="8705191560707593947">Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: ನಿನ್ನೆ.</translation>
+<translation id="8705191560707593947">Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: ನಿನ್ನೆ.</translation>
 <translation id="8796602469536043152">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್‌ಗೆ ಪ್ರವೇಶಿಸಲು Chromium ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="8803635938069941624">Chromium OS ನಿಯಮಗಳು</translation>
 <translation id="8821041990367117597">ನಿಮ್ಮ ಖಾತೆಯ ಸೈನ್ ಇನ್ ವಿವರಗಳ ಅವಧಿ ಮುಗಿದಿರುವ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chromium ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
@@ -243,7 +243,7 @@
 <translation id="91086099826398415">ಹೊಸ Chromium &amp;ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
 <translation id="911206726377975832">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಸಹ ಅಳಿಸುವುದೇ?</translation>
 <translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಪ್ರವೇಶಿಸಲು ಒಂದು ಪರ್ಯಾಯ ಬ್ರೌಸರ್ ತೆರೆಯುವಂತೆ ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Chromium ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation>
-<translation id="9164845895615421500">Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: ಸ್ವಲ್ಪ ಸಮಯದ ಹಿಂದೆ.</translation>
+<translation id="9164845895615421500">Chromium ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: ಸ್ವಲ್ಪ ಸಮಯದ ಹಿಂದೆ.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">ಈ ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ವ್ಯವಸ್ಥಿತಗೊಳಿಸಲು Chromium ಸ್ಪೇಸ್‌ಗಳನ್ನು ಬಳಸಿ</translation>
 <translation id="93478295209880648">Windows XP ಅಥವಾ Windows Vista ದಲ್ಲಿ Chromium ಗೆ ಈಗ ಬೆಂಬಲವಿಲ್ಲದೇ ಇರುವುದರಿಂದ ಅದು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb
index cc7209a2..075018e 100644
--- a/chrome/app/resources/chromium_strings_ky.xtb
+++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">Бул Chromium'дун кошумча орнотулушу болгондуктан, аны демейки серепчиңиз катары тандай албайсыз.</translation>
 <translation id="7979877361127045932">Chromium менюсунда жашыруу</translation>
 <translation id="8013436988911883588">Chromium'га уруксат берилгенден кийин вебсайттар уруксат сурай алышат.</translation>
+<translation id="8022442821873033760">Жаңы Chromium сактагычын жөндөңүз</translation>
 <translation id="81770708095080097">Бул файл кооптуу, ошондуктан Chromium аны бөгөттөп койду.</translation>
 <translation id="8248265253516264921">Эгер сүрөттөрдүн түшүндүрмөсү жок болсо, Chromium аны түшүндүрүп берүүгө аракет кылат. Түшүндүрмөлөрдү даярдоо үчүн, сүрөттөр Google'га жөнөтүлөт. Аны жөндөөлөрдөн каалаган убакта өчүрүп койсоңуз болот.</translation>
 <translation id="8266560134891435528">Chromium сырсөздөрүңүздү текшере албайт, анткени аккаунтуңузга кирген жоксуз</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb
index 6a02f7e3..3c94c598 100644
--- a/chrome/app/resources/chromium_strings_lv.xtb
+++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -214,6 +214,7 @@
 <translation id="7975919845073681630">Šī ir Chromium papildu instalācija, un to nevar izmantot kā noklusējuma pārlūku.</translation>
 <translation id="7979877361127045932">Paslēpt Chromium izvēlnē</translation>
 <translation id="8013436988911883588">Tiklīdz pārlūkam Chromium tiks sniegta piekļuve, vietnes varēs lūgt jums piekļuvi.</translation>
+<translation id="8022442821873033760">Jaunas Chromium darbvietas izveide</translation>
 <translation id="81770708095080097">Šis fails ir bīstams, tāpēc Chromium to bloķēja.</translation>
 <translation id="8248265253516264921">Ja attēlam nav vērtīga apraksta, pārlūks Chromium mēģinās jums tādu nodrošināt. Lai izveidotu aprakstus, attēli tiek nosūtīti uzņēmumam Google. Jebkurā brīdī iestatījumos varat izslēgt šo iespēju.</translation>
 <translation id="8266560134891435528">Pārlūkprogrammā Chromium nevar pārbaudīt jūsu paroles, jo jūs neesat pierakstījies.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 92b364f4..1e14a42f5 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">ഇത് Chromium-ത്തിന്റെ ദ്വിതീയ ഇൻസ്‌റ്റലേഷനായതിനാൽ, നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാക്കാൻ കഴിയില്ല.</translation>
 <translation id="7979877361127045932">Chromium മെനുവിൽ മറയ്‌ക്കുക</translation>
 <translation id="8013436988911883588">Chromium-ത്തിന് ആക്‌സസ് ലഭിച്ചുകഴിഞ്ഞാൽ, വെബ്‌സൈറ്റുകൾക്ക് നിങ്ങളോട് ആക്‌സസ് ചോദിക്കാനാകും.</translation>
+<translation id="8022442821873033760">നിങ്ങളുടെ പുതിയ Chromium സ്പെയ്സ് സജ്ജീകരിക്കുക</translation>
 <translation id="81770708095080097">ഈ ഫയൽ അപകടകരമായതിനാൽ Chromium ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="8248265253516264921">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chromium ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്‌ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു. ഏതുസമയത്തും ക്രമീകരണത്തിൽ നിങ്ങൾക്കിത് ഓഫാക്കാം.</translation>
 <translation id="8266560134891435528">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തിട്ടില്ലാത്തതിനാൽ Chromium-ന് നിങ്ങളുടെ പാസ്‌വേഡുകൾ പരിശോധിക്കാനാവില്ല</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 35ce563..5851ccbd 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -251,7 +251,7 @@
 <translation id="91086099826398415">Link openen op een nieuw Chromium-&amp;tabblad</translation>
 <translation id="911206726377975832">Ook browsegegevens wissen?</translation>
 <translation id="9158494823179993217">Je systeembeheerder heeft geconfigureerd dat Chromium een alternatieve browser opent voor toegang tot <ph name="TARGET_URL_HOSTNAME" />.</translation>
-<translation id="9164845895615421500">Chromium checkt één keer per week op ongewenste software. Laatst gecheckt: zojuist.</translation>
+<translation id="9164845895615421500">Chromium checkt één keer per week op ongewenste software. Laatst gecheckt: minder dan een minuut geleden.</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">Gebruik Chromium-ruimten om het browsen overzichtelijk te houden op dit apparaat</translation>
 <translation id="93478295209880648">Chromium werkt mogelijk niet naar behoren omdat dit niet langer wordt ondersteund op Windows XP en Windows Vista</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 41981a09..69f0a290 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -216,6 +216,7 @@
 <translation id="7975919845073681630">Dette er en sekundær installering av Chromium. Den kan ikke brukes som standardnettleser.</translation>
 <translation id="7979877361127045932">Skjul i Chromium-menyen</translation>
 <translation id="8013436988911883588">Når Chromium har fått tilgang, kan nettsteder spørre deg om tilgang.</translation>
+<translation id="8022442821873033760">Konfigurer ditt nye Chromium Space</translation>
 <translation id="81770708095080097">Denne filen er farlig, så Chromium har blokkert den.</translation>
 <translation id="8248265253516264921">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chromium å finne en til deg. For å opprette beskrivelser blir bilder sendt til Google. Du kan slå av dette i innstillingene når som helst.</translation>
 <translation id="8266560134891435528">Chromium kan ikke sjekke passordene dine, siden du ikke er logget på</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb
index 9e42b1c..12a8766 100644
--- a/chrome/app/resources/chromium_strings_or.xtb
+++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="or">
-<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଘଣ୍ଟା ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_HOURS} ଘଣ୍ଟା ପୂର୍ବେ।}}</translation>
+<translation id="1060499346270045814">{NUM_HOURS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଘଣ୍ଟା ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_HOURS} ଘଣ୍ଟା ପୂର୍ବେ।}}</translation>
 <translation id="1065672644894730302">ଆପଣଙ୍କର ଅଗ୍ରାଧିକାରଗୁଡ଼ିକୁ ପଢ଼ାଯାଇପାରିବ ନାହିଁ।
 
 କିଛି ବୈଶିଷ୍ଟ୍ୟ ହୁଏତ ଉପଲବ୍ଧ ନଥାଇପାରେ ଏବଂ ଅଗ୍ରାଧିକାରଗୁଡ଼ିକରେ କରାଯାଇଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସେଭ୍ ନହୋଇପାରେ।</translation>
@@ -41,7 +41,7 @@
 <translation id="2711502716910134313">Chromium ଟାବ୍</translation>
 <translation id="2718390899429598676">ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, Chromium ଆପଣଙ୍କର ଡାଟା ଏନ୍‍କ୍ରିପ୍ଟ କରିବ।</translation>
 <translation id="2770231113462710648">ଏଠାକୁ ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍‌କୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ:</translation>
-<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ମିନିଟ୍ ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_MINS} ମିନିଟ୍ ପୂର୍ବେ।}}</translation>
+<translation id="2797461000988640326">{NUM_MINS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ମିନିଟ୍ ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_MINS} ମିନିଟ୍ ପୂର୍ବେ।}}</translation>
 <translation id="2799223571221894425">ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation>
 <translation id="2847479871509788944">Chromiumରୁ କାଢ଼ିଦିଅନ୍ତୁ...</translation>
 <translation id="2885378588091291677">ଟାସ୍କ ପରିଚାଳକ</translation>
@@ -51,7 +51,7 @@
 <translation id="3032706164202344641">Chromium ଆପଣଙ୍କର ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="3032787606318309379">Chromiumକୁ ଯୋଗ କରାଯାଉଛି...</translation>
 <translation id="3068515742935458733">Googleକୁ କ୍ରାସ୍ ରିପୋର୍ଟ ଏବଂ <ph name="UMA_LINK" /> ପଠାଇ Chromiumତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ</translation>
-<translation id="3086207596048762442">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ</translation>
+<translation id="3086207596048762442">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ</translation>
 <translation id="3103660991484857065">ଇନ୍‌ଷ୍ଟଲର୍ ଆର୍କାଇଭ୍ ଅଣସଙ୍କୁଚିତ କରିବାରେ ବିଫଳ ହେଲା। Chromium ପୁଣି ଡାଉନ୍‌ଲୋଡ୍ କରନ୍ତୁ</translation>
 <translation id="3130323860337406239">Chromium ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରୁଛି।</translation>
 <translation id="3155163173539279776">Chromiumକୁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation>
@@ -171,7 +171,7 @@
 <translation id="6847869444787758381">ଆପଣଙ୍କର ପାସ୍‍ୱାର୍ଡଗୁଡ଼ିକ କେବେ ବି ଚୋରି ହୋଇଛି କି ନାହିଁ ତାହା Chromium ଆପଣଙ୍କୁ ଜାଣିବାକୁ ଦିଏ</translation>
 <translation id="6857782730669500492">Chromium - <ph name="PAGE_TITLE" /></translation>
 <translation id="6863361426438995919">Google ପେ (Chromiumକୁ କପି କରାଯାଇଛି)</translation>
-<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଦିନ ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_DAYS} ଦିନ ପୂର୍ବେ।}}</translation>
+<translation id="6863846675160669383">{NUM_DAYS,plural, =1{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଦିନ ପୂର୍ବେ।}other{Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_DAYS} ଦିନ ପୂର୍ବେ।}}</translation>
 <translation id="6893813176749746474">Chromium ଅପ୍‌ଡେଟ୍‌ କରାଯାଇଛି, କିନ୍ତୁ ଆପଣ ଏହାକୁ ଅତିକମ୍‌ରେ 30 ଦିନ ହେଲା ବ୍ୟବହାର କରିନାହାନ୍ତି।</translation>
 <translation id="6964305034639999644">Chromium ଇନ୍‍କ&amp;ଗ୍ନିଟୋ ୱିଣ୍ଡୋରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ</translation>
 <translation id="6990124437352146030">ଏହି ସାଇଟ୍ ପାଇଁ ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍‌କୁ ଆକ୍ସେସ୍ କରିବାକୁ Chromium ଅନୁମତି ଆବଶ୍ୟକ କରୁଛି</translation>
@@ -235,7 +235,7 @@
 <translation id="8621669128220841554">ଅନିର୍ଦ୍ଦିଷ୍ଟ ତ୍ରୁଟି ଯୋଗୁଁ ଇନ୍‌ଷ୍ଟଲେସନ୍ ବିଫଳ ହୋଇଛି। ଦୟାକରି Chromium ପୁଣି ଡାଉନ୍‌ଲୋଡ୍ କରନ୍ତୁ।</translation>
 <translation id="8697124171261953979">ଯେତେବେଳେ ଆପଣ Chromium ଆରମ୍ଭ କରନ୍ତି କିମ୍ବା ବହୁଉପଯୋଗୀ କ୍ଷେତ୍ରରୁ ସନ୍ଧାନ କରନ୍ତି, ସେତେବେଳେ କେଉଁ ପୃଷ୍ଠା ଦେଖାଯିବ ତାହା ମଧ୍ୟ ଏହା ନିୟନ୍ତ୍ରଣ କରେ।</translation>
 <translation id="8704119203788522458">ଏହା ହେଉଛି ଆପଣଙ୍କର Chromium</translation>
-<translation id="8705191560707593947">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: ଗତକାଲି।</translation>
+<translation id="8705191560707593947">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: ଗତକାଲି।</translation>
 <translation id="8796602469536043152">ଏହି ସାଇଟ୍ ପାଇଁ ଆପଣଙ୍କର କ୍ୟାମେରା ଓ ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍ କରିବାକୁ Chromium ଅନୁମତି ଆବଶ୍ୟକ କରୁଛି</translation>
 <translation id="8803635938069941624">Chromium OS ସର୍ତ୍ତାବଳୀ</translation>
 <translation id="8821041990367117597">ଆପଣଙ୍କର ଆକାଉଣ୍ଟ ସାଇନ୍ ଇନ୍ ବିବରଣୀ ପୁରୁଣା ହୋଇଯାଇଥିବା ଯୋଗୁଁ Chromium ଆପଣଙ୍କର ଡାଟା ସିଙ୍କ୍ କରିପାରିଲା ନାହିଁ।</translation>
@@ -251,7 +251,7 @@
 <translation id="91086099826398415">ନୂଆ Chromium &amp;ଟାବ୍‌ରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ</translation>
 <translation id="911206726377975832">ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଡାଟା ମଧ୍ୟ ବିଲୋପ କରିବେ?</translation>
 <translation id="9158494823179993217"><ph name="TARGET_URL_HOSTNAME" />କୁ ଆକ୍ସେସ୍‌ କରିବା ପାଇଁ ଏକ ବିକଳ୍ପ ବ୍ରାଉଜର୍‌ ଖୋଲିବାକୁ ଆପଣଙ୍କର ସିଷ୍ଟମ୍ ବ୍ୟବସ୍ଥାପକ Chromium କନ୍‌ଫିଗର୍‌ କରିଛନ୍ତି।</translation>
-<translation id="9164845895615421500">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: କିଛି ସମୟ ପୂର୍ବେ।</translation>
+<translation id="9164845895615421500">Chromium ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: କିଛି ସମୟ ପୂର୍ବେ।</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">ଏହି ଡିଭାଇସରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂକୁ ବ୍ୟବସ୍ଥିତ ରଖିବା ପାଇଁ Chromium ସ୍ପେସ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation>
 <translation id="93478295209880648">Chromium ହୁଏତ ସଠିକ୍ ଭାବେ କାର୍ଯ୍ୟ କରି ନପାରେ କାରଣ ଏହା ଆଉ Windows XP କିମ୍ବା Windows Vistaରେ ସମର୍ଥିତ ନୁହେଁ</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index 8d9319e0..e01c506 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -216,6 +216,7 @@
 <translation id="7975919845073681630">Aceasta este o instalare secundară a browserului Chromium și nu poate fi setat ca browser prestabilit.</translation>
 <translation id="7979877361127045932">Ascunde în meniul Chromium</translation>
 <translation id="8013436988911883588">Odată ce Chromium are acces, site-urile web îți vor putea solicita accesul.</translation>
+<translation id="8022442821873033760">Configurează noul spațiu din Chromium</translation>
 <translation id="81770708095080097">Fișierul este periculos, așadar Chromium l-a blocat.</translation>
 <translation id="8248265253516264921">Dacă o imagine nu are o descriere utilă, Chromium va încerca să o completeze. Pentru a crea descrieri, imaginile sunt trimise la Google. Poți dezactiva această opțiune oricând din setări.</translation>
 <translation id="8266560134891435528">Chromium nu îți poate verifica parolele, deoarece nu te-ai conectat</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index 32f82e87..83f17abe 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">To je sekundarna namestitev Chromiuma in ga ni mogoče nastaviti kot privzeti brskalnik.</translation>
 <translation id="7979877361127045932">Skrij v meniju Chromiuma</translation>
 <translation id="8013436988911883588">Ko bo imel Chromium dostop, vas bodo spletna mesta lahko pozvala k omogočanju dostopa.</translation>
+<translation id="8022442821873033760">Nastavitev novega prostora v Chromiumu</translation>
 <translation id="81770708095080097">Ta datoteka je nevarna, zato jo je Chromium blokiral.</translation>
 <translation id="8248265253516264921">Če slika nima koristnega opisa, ga bo Chromium poskušal zagotoviti. Opisi se ustvarijo tako, da se slike pošljejo Googlu. To lahko kadar koli izklopite v nastavitvah.</translation>
 <translation id="8266560134891435528">Chromium ne more preveriti gesel, ker niste prijavljeni</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb
index bd4a381..d7ded399 100644
--- a/chrome/app/resources/chromium_strings_sq.xtb
+++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -218,6 +218,7 @@
 <translation id="7975919845073681630">Ky është instalim dytësor i Chromium dhe nuk mund të bëhet shfletuesi yt i parazgjedhur.</translation>
 <translation id="7979877361127045932">Fshih në menynë e Chromium-it</translation>
 <translation id="8013436988911883588">Pasi Chromium të ketë qasje, sajtet e uebit do të jenë në gjendje të kërkojnë prej teje qasje.</translation>
+<translation id="8022442821873033760">Konfiguro hapësirën tënde të re të Chromium</translation>
 <translation id="81770708095080097">Ky skedar është i rrezikshëm, prandaj Chromium e ka bllokuar.</translation>
 <translation id="8248265253516264921">Nëse një imazh nuk ka një përshkrim të dobishëm, Chromium do të përpiqet të të japë një përshkrim. Për të krijuar përshkrime, imazhet dërgohen te Google. Këtë mund ta çaktivizosh te cilësimet në çdo moment.</translation>
 <translation id="8266560134891435528">Chromium nuk mund t'i kontrollojë fjalëkalimet e tua sepse nuk je identifikuar</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb
index dc621b6..447298e 100644
--- a/chrome/app/resources/chromium_strings_uz.xtb
+++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -214,6 +214,7 @@
 <translation id="7975919845073681630">Chromium takroran o‘rnatilgan, shuning uchun u asosiy brauzer bo‘la olmaydi.</translation>
 <translation id="7979877361127045932">Chromium menyusida ko‘rsatilmasin</translation>
 <translation id="8013436988911883588">Chromium saytlarga ulanganda sizdan ruxsat so‘raydi.</translation>
+<translation id="8022442821873033760">Yangi Chromium Space profilingizni sozlang</translation>
 <translation id="81770708095080097">Bu fayl xavfli edi va u Chromium tomonidan bloklandi.</translation>
 <translation id="8248265253516264921">Agar rasmga foydali tavsif berilmagan boʻlsa, Chromium uni sizga tavsiflaydi. Tavsif yaratish uchun rasmlar Googlega yuboriladi. Bu sozlamani istalgan vaqtda faolsizlantirish mumkin.</translation>
 <translation id="8266560134891435528">Chromium parollaringizni faqat hisobingizga kirganingizdan keyin tekshira oladi</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb
index 8802171..21c5566 100644
--- a/chrome/app/resources/chromium_strings_zh-HK.xtb
+++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -217,6 +217,7 @@
 <translation id="7975919845073681630">這是以並行形式安裝的第二個 Chromium,因此無法設定為您的預設瀏覽器。</translation>
 <translation id="7979877361127045932">隱藏在 Chromium 選單中</translation>
 <translation id="8013436988911883588">Chromium 獲得存取權後,網站便可向您要求存取權。</translation>
+<translation id="8022442821873033760">設定新的 Chromium 空間</translation>
 <translation id="81770708095080097">此檔案不安全,因此 Chromium 已封鎖此檔案。</translation>
 <translation id="8248265253516264921">如果圖片並無有用的說明,Chromium 會嘗試為您提供說明。因此,圖片將傳送至 Google 以建立說明。您可以隨時在設定中關閉此功能。</translation>
 <translation id="8266560134891435528">由於您尚未登入帳戶,因此 Chromium 無法檢查密碼</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 48287db1..56fcacc 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -250,7 +250,7 @@
 <translation id="91086099826398415">在新的 Chromium 分頁中開啟連結(&amp;T)</translation>
 <translation id="911206726377975832">你要一併刪除瀏覽資料嗎?</translation>
 <translation id="9158494823179993217">系統管理員已設定 Chromium 開啟替代瀏覽器來存取 <ph name="TARGET_URL_HOSTNAME" />。</translation>
-<translation id="9164845895615421500">Chromium 每週檢查一次垃圾軟體。上次檢查時間:剛才。</translation>
+<translation id="9164845895615421500">Chromium 每週檢查一次垃圾軟體。上次檢查時間:不到一分鐘前。</translation>
 <translation id="9190841055450128916">Chromium (mDNS-In)</translation>
 <translation id="9191317372410544836">使用 Chromium Space 有效管理這部裝置上的瀏覽活動</translation>
 <translation id="93478295209880648">Chromium 已不適用於 Windows XP 或 Windows Vista,因此可能無法正常運作</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index 62480ea..21b10e9 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Voer jou PIN in</translation>
 <translation id="241082044617551207">Onbekende inprop</translation>
 <translation id="2412593942846481727">Opdatering is beskikbaar</translation>
-<translation id="2414499877591062094">Aktiveer outomatiese indiening van PIN</translation>
 <translation id="2416435988630956212">Sleutelbordfunksiesleutels</translation>
 <translation id="241727068219398187">Data is met jou Google-wagwoord geënkripteer vanaf
           <ph name="TIME" />. Dit sluit nie betaalmetodes en adresse van Google Pay af in nie.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Lees al jou data op die webwerwe wat jy besoek</translation>
 <translation id="5242724311594467048">Aktiveer "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Probeer asseblief oor 'n paar oomblikke weer</translation>
-<translation id="5244406554036143958">Voer jou PIN in om outomatiese indiening te aktiveer</translation>
 <translation id="5244474230056479698">Sinkroniseer tans na <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Begin met 'n skoolrekening</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> het omgeval. Klik hierdie ballon om die program te herbegin.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 1177765..87116a5c2 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">የእርስዎን ፒን ያስገቡ</translation>
 <translation id="241082044617551207">ያልታወቀ ተሰኪ</translation>
 <translation id="2412593942846481727">ዝማኔ ይገኛል</translation>
-<translation id="2414499877591062094">ፒንን ራስ-አስገባን አንቃ</translation>
 <translation id="2416435988630956212">የቁልፍ ሰሌዳ ተግባር ቁልፎች</translation>
 <translation id="241727068219398187">ውሂብ <ph name="TIME" /> ላይ በነበረው የGoogle ይለፍ ቃልዎ ተመስጥሯል። ይህ ከGoogle Pay የመክፈያ ዘዴዎችን እና አድራሻዎችን አያካትትም።</translation>
 <translation id="2419131370336513030">የተጫኑ መተግበረያዎችን ይመልከቱ</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">በሚጎበኙዋቸው የድር ጣቢያዎች ላይ ያሉ ሁሉንም የእርስዎን ውሂቦች ያንብቡ</translation>
 <translation id="5242724311594467048">«<ph name="EXTENSION_NAME" />» ይንቃ?</translation>
 <translation id="5243522832766285132">እባክዎ ከጥቂት ጊዜ በኋላ እንደገና ይሞክሩ</translation>
-<translation id="5244406554036143958">በራስ-አስገባን ለማንቃት የእርስዎን ፒን ያስገቡ</translation>
 <translation id="5244474230056479698">ከ<ph name="EMAIL" /> ጋር በማስመር ላይ</translation>
 <translation id="5245610266855777041">በትምህርት ቤት መለያ ይጀምሩ</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ተሰናክሏል። መተግበሪያውን ዳግም ለማስጀመር ይህን ፊኛ ጠቅ ያድርጉት።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index e368730..e67a8062 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 ميغابايت</translation>
 <translation id="2352810082280059586">يتم حفظ ملاحظات شاشة القفل تلقائيًا إلى <ph name="LOCK_SCREEN_APP_NAME" />. ستظل أحدث ملاحظة في شاشة القفل.</translation>
 <translation id="2353297238722298836">تم السماح باستخدام الكاميرا والميكروفون</translation>
+<translation id="2355314311311231464">تعذَّرت عملية الإعداد بسبب عدم التمكّن من استرداد تفاصيل حسابك. يُرجى إعادة المحاولة. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="2355604387869345912">تفعيل ميزة "التوصيل الفوري"</translation>
 <translation id="2356070529366658676">طلب</translation>
 <translation id="2357330829548294574">إزالة <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">إدخال رقم التعريف الشخصي</translation>
 <translation id="241082044617551207">مكوّن إضافي غير محدّد</translation>
 <translation id="2412593942846481727">هناك تحديث جديد</translation>
-<translation id="2414499877591062094">تفعيل رقم التعريف الشخصي لميزة "الإرسال التلقائي"</translation>
 <translation id="2416435988630956212">مفاتيح الوظائف على لوحة المفاتيح</translation>
 <translation id="241727068219398187">‏تم ترميز البيانات باستخدام كلمة مرور Google اعتبارًا من
           <ph name="TIME" />. لا يتضمّن ذلك طرق الدفع والعناوين من Google Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">ترجم هذه الصفحة</translation>
 <translation id="2475982808118771221">حدث خطأ</translation>
 <translation id="2476578072172137802">إعدادات الموقع الإلكتروني</translation>
+<translation id="2476974672882258506">‏يجب إيقاف تشغيل نظام Windows لإلغاء تثبيت <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">أذونات ملف الوسائط لـ "<ph name="EXTENSION" />"</translation>
 <translation id="247949520305900375">مشاركة الصوت</translation>
 <translation id="248003956660572823">لم يتم حفظ كلمات المرور</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">تم منح إذن دخول للقراءة فقط إلى <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">سيكون هذا الرمز مرئيًا عندما تتمكن الإضافة من تنفيذ الإجراءات على الصفحة الحالية. يمكنك استخدام هذه الإضافة بالنقر على الرمز أو بالضغط على <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">‏الإعداد كجهاز Chromebox للاجتماعات</translation>
+<translation id="2579232805407578790">‏تعذَّر الاتصال بالخادم. يُرجى التحقّق من الاتصال بالشبكة وإعادة المحاولة. وإذا استمرت هذه المشكلة، يُرجى إعادة تشغيل جهاز Chromebook. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="2580889980133367162">السماح دائمًا لـ <ph name="HOST" /> بتنزيل عدة ملفات</translation>
 <translation id="258095186877893873">طويل</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (النظام الأساسي <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">تم إيقاف تسجيل الدخول باستخدام اسم المستخدم هذا بواسطة المشرف.</translation>
 <translation id="283669119850230892">لاستخدام الشبكة <ph name="NETWORK_ID" />، أكمل أولاً اتصالك بالإنترنت أدناه.</translation>
 <translation id="2838379631617906747">يتم الآن التثبيت</translation>
+<translation id="2838835911926931318">يجب تسجيل الدخول لمزامنة الإشارات المرجعية وكلمات المرور والسجلّ والمزيد على جميع أجهزتك.</translation>
 <translation id="2839032553903800133">تم حظر الإشعارات.</translation>
 <translation id="2841013758207633010">الوقت</translation>
 <translation id="2841837950101800123">المزود</translation>
@@ -1584,6 +1587,7 @@
     رسالة الخادم: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">إضافة معرض الوسائط باستخدام الدليل</translation>
 <translation id="2910318910161511225">الاتصال بالشبكة وإعادة المحاولة</translation>
+<translation id="2910718431259223434">حدث خطأ. يُرجى إعادة المحاولة أو التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="2913331724188855103">السماح للمواقع الإلكترونية بحفظ بيانات ملفات تعريف الارتباط وقراءتها (موصى به)</translation>
 <translation id="2915102088417824677">عرض سِجلّ الأنشطة</translation>
 <translation id="2915873080513663243">المسح التلقائي</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{تمت الموافقة على إضافة واحدة.}zero{تمّت الموافقة على # إضافة.}two{تمت الموافقة على إضافتَين.}few{تمت الموافقة على # إضافات.}many{تمت الموافقة على # إضافةً.}other{تمت الموافقة على # إضافة.}}</translation>
 <translation id="3822559385185038546">تم فرض هذا الخادم الوكيل بواسطة المشرف</translation>
 <translation id="3823310065043511710">‏يُنصَح بتوفير <ph name="INSTALL_SIZE" /> على الأقل من المساحة لنظام التشغيل Linux.</translation>
+<translation id="3824621460022590830">الرمز المميز لتسجيل الجهاز غير صالح. يُرجى التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="3826440694796503677">‏لقد أوقف المشرف إمكانية إضافة المزيد من حسابات Google.</translation>
 <translation id="3827306204503227641">متابعة السماح للمكونات الإضافية غير المحمية</translation>
 <translation id="3827774300009121996">&amp;ملء الشاشة</translation>
@@ -3273,6 +3278,7 @@
 <translation id="5079950360618752063">استخدام كلمة مرور مُقترَحة</translation>
 <translation id="508059534790499809">‏تحديث تذكرة Kerberos</translation>
 <translation id="5084230410268011727">السماح للمواقع الإلكترونية باستخدام أجهزة استشعار الإضاءة والحركة</translation>
+<translation id="5084328598860513926">تمّت مقاطعة عملية الإعداد. يُرجى إعادة المحاولة أو التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="5085162214018721575">جارٍ البحث عن تحديثات</translation>
 <translation id="5086082738160935172">‏جهاز واجهة بشرية (HID)</translation>
 <translation id="5086874064903147617">هل تريد استعادة الصفحة الرئيسية التلقائية؟</translation>
@@ -3395,7 +3401,6 @@
 <translation id="5241128660650683457">مراجعة كل بياناتك على المواقع الإلكترونية التي تزورها</translation>
 <translation id="5242724311594467048">تفعيل "<ph name="EXTENSION_NAME" />"؟</translation>
 <translation id="5243522832766285132">يُرجى إعادة المحاولة بعد بضع لحظات</translation>
-<translation id="5244406554036143958">يجب إدخال رقم التعريف الشخصي لتفعيل ميزة "الإرسال التلقائي".</translation>
 <translation id="5244474230056479698">المزامنة مع <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">بدء استخدام حساب مدرسة</translation>
 <translation id="5246282308050205996">لقد تعطل <ph name="APP_NAME" />. انقر على هذا البالون لإعادة تشغيل التطبيق.</translation>
@@ -3673,6 +3678,7 @@
 <translation id="557722062034137776">‏لن يؤثر إعادة ضبط الجهاز على حسابات Google أو أي من البيانات التي تمت مزامنتها مع هذه الحسابات. ومع ذلك، سيتم حذف جميع الملفات التي تم حفظها محليًا على جهازك.</translation>
 <translation id="5578059481725149024">تسجيل الدخول تلقائيًا</translation>
 <translation id="558170650521898289">‏التحقق من برنامج تشغيل الأجهزة لـ Microsoft Windows</translation>
+<translation id="5581972110672966454">يتعذَّر ضم الجهاز إلى النطاق. يُرجى إعادة المحاولة أو التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="5582839680698949063">القائمة الرئيسية</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">هل تريد حفظ اسم المستخدم؟</translation>
@@ -3745,6 +3751,7 @@
 <translation id="5667546120811588575">‏جارٍ إعداد Google Play...</translation>
 <translation id="5669267381087807207">تفعيل</translation>
 <translation id="5669691691057771421">إدخال رقم التعريف الشخصي الجديد</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">تم حظر الصور</translation>
 <translation id="5671658447180261823">إزالة الاقتراح <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">سيتلقى هذا الجهاز تحديثات تلقائية للبرامج والأمان حتى <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
@@ -5392,6 +5399,7 @@
 <translation id="7764225426217299476">إضافة عنوان</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> من <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">نقل</translation>
+<translation id="7766082757934713382">تساعدك الشبكة التي تفرض تكلفة استخدام في تخفيض استخدام بيانات الشبكة من خلال إيقاف التحديثات التلقائية للنظام والتطبيقات بشكل مؤقت.</translation>
 <translation id="7766807826975222231">إجراء جولة</translation>
 <translation id="7766838926148951335">قبول الأذونات</translation>
 <translation id="7768770796815395237">تغيير</translation>
@@ -6304,6 +6312,7 @@
 <translation id="885701979325669005">التخزين</translation>
 <translation id="8859057652521303089">حدد لغتك:</translation>
 <translation id="8859174528519900719">هيكل سفلي: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">تعذَّر تحميل بنود الخدمة</translation>
 <translation id="8859662783913000679">حساب أحد الوالدَين</translation>
 <translation id="8862003515646449717">التبديل إلى متصفح سريع</translation>
 <translation id="8863753581171631212">فتح الرابط في نافذة جديدة في <ph name="APP" /></translation>
@@ -6572,6 +6581,7 @@
 <translation id="920045321358709304">البحث في <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">سيتم محو أي بيانات متوفرة بلا اتصال بالإنترنت.</translation>
 <translation id="9201220332032049474">خيارات قفل الشاشة</translation>
+<translation id="9201842707396338580">حدث خطأ. يُرجى التواصل مع مشرف الجهاز أو مالكه. رمز الخطأ: <ph name="ERROR_CODE" /></translation>
 <translation id="9203398526606335860">&amp;التوصيف مفعّل</translation>
 <translation id="9203904171912129171">اختيار جهاز</translation>
 <translation id="9203962528777363226">أوقف مشرف هذا الجهاز إمكانية إضافة مستخدمين جدد.</translation>
@@ -6643,6 +6653,7 @@
 <translation id="983511809958454316">‏هذه الميزة غير مدعومة في VR</translation>
 <translation id="984275831282074731">طرق الدفع</translation>
 <translation id="98515147261107953">أفقي</translation>
+<translation id="987068745968718743">‏نظام Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">عام</translation>
 <translation id="987897973846887088">لا تتوفر أي صور.</translation>
 <translation id="988978206646512040">غير مسموح باستخدام عبارة مرور فارغة</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 48aa2a30..446a007 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">আপোনাৰ পিন দিয়ক</translation>
 <translation id="241082044617551207">অজ্ঞাত প্লাগইন</translation>
 <translation id="2412593942846481727">আপডে’ট উপলব্ধ</translation>
-<translation id="2414499877591062094">স্বয়ংক্ৰিয়ভাৱে পিন দাখিল কৰাৰ সুবিধাটো সক্ষম কৰক</translation>
 <translation id="2416435988630956212">কীব’ৰ্ডৰ ফাংশ্বন কী</translation>
 <translation id="241727068219398187">এই ডেটা আপোনাৰ Google পাছৱৰ্ডৰ সৈতে 
           <ph name="TIME" />লৈকে এনক্ৰিপ্ট কৰা আছিল। ইয়াত Google Payৰ পৰিশোধ পদ্ধতি আৰু ঠিকনাবোৰ অন্তৰ্ভুক্ত নহয়।</translation>
@@ -3391,7 +3390,6 @@
 <translation id="5241128660650683457">আপুনি চোৱা ৱেবছাইটত আপোনাৰ সকলো ডেটা পঢ়ক</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" সক্ষম কৰিবনে?</translation>
 <translation id="5243522832766285132">অলপ সময়ৰ পাছত পুনৰ চেষ্টা কৰক</translation>
-<translation id="5244406554036143958">স্বয়ংক্ৰিয়ভাৱে দাখিল কৰাৰ সুবিধাটো সক্ষম কৰিবলৈ আপোনাৰ পিনটো দিয়ক</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />ত ছিংক কৰি থকা হৈছে</translation>
 <translation id="5245610266855777041">এটা বিদ্যালয়ৰ একাউণ্টৰ জৰিয়তে আৰম্ভ কৰক</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ক্ৰেশ্ব হৈছে। এপটো ৰিষ্টার্ট কৰিবলৈ এই বেলুনটোত ক্লিক কৰক।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 3effc66..cb0491d 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1117,6 +1117,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Ekran kilidi qeydləri avtomatik olaraq <ph name="LOCK_SCREEN_APP_NAME" /> tətbiqində yadda saxlanılır. Ən son edilən qeydlər ekran kilidində qalacaq.</translation>
 <translation id="2353297238722298836">Kamera və mikrofona icazə verildi</translation>
+<translation id="2355314311311231464">Təchizat uğursuz oldu, çünki hesab məlumatlarınız əldə olunmadı. Yenidən cəhd edin. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Ani Birləşməni aktiv edin</translation>
 <translation id="2356070529366658676">Soruşun</translation>
 <translation id="2357330829548294574"><ph name="USER_NAME" /> silin</translation>
@@ -1157,7 +1158,6 @@
 <translation id="2408955596600435184">PİN kodunuzu daxil edin</translation>
 <translation id="241082044617551207">Naməlum plaqin</translation>
 <translation id="2412593942846481727">Güncəlləmə əlçatandır</translation>
-<translation id="2414499877591062094">PIN avtomatik təqdim edilməsini aktivləşdirin</translation>
 <translation id="2416435988630956212">Klaviaturanın funksiya düymələri</translation>
 <translation id="241727068219398187"><ph name="TIME" /> tarixindən başlayaraq data Google parolunuz ilə şifrələndi. Google Pay'dəki ödəniş metodları və ünvanlar bura daxil deyil.</translation>
 <translation id="2419131370336513030">Quraşdırılmış tətbiqlərə baxın</translation>
@@ -1211,6 +1211,7 @@
 <translation id="2473195200299095979">Bu səhifəni tərcümə edin</translation>
 <translation id="2475982808118771221">Xəta baş verdi</translation>
 <translation id="2476578072172137802">Sayt Ayarları</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> tətbiqini quraşdırmaq üçün Windows'u söndürün.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" üçün Media-Fayl İcazələri</translation>
 <translation id="247949520305900375">Audionu paylaşın</translation>
 <translation id="248003956660572823">Parollar yadda saxlanmayıb</translation>
@@ -1301,6 +1302,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> yalnız oxumaq hüququ verilmişdir.</translation>
 <translation id="2575247648642144396">Artırmalar cari səhifədə fəaliyyət göstərəndə bu ikona görünəcək. İkonaya klikləməklə və ya <ph name="EXTENSION_SHORTCUT" /> bu artırmanı istifadə edin.</translation>
 <translation id="257779572837908839">Görüşlər üçün Chromebox olaraq ayarlayın</translation>
+<translation id="2579232805407578790">Serverə qoşulmaq mümkün olmadı. Şəbəkə bağlantınızı yoxlayıb yenidən cəhd edin. Problem davam edərsə, Chromebook'u yenidən başladın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> hostuna çoxsaylı faylları endirməyə həmişə icazə verin</translation>
 <translation id="258095186877893873">Uzun</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1520,6 +1522,7 @@
 <translation id="2836635946302913370">Bu istifadəçi adı ilə giriş aministratorunuz tərəfindən deaktiv edilib.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> şəbəkəsini istifadə etmək üçün ilk öncə internet bağlantınızı tamamlayın.</translation>
 <translation id="2838379631617906747">Qarşıya yükləmə ...</translation>
+<translation id="2838835911926931318">Bütün cihazlarda əlfəcin, parol, tarixçə və daha çoxunu sinxronizasiya etmək üçün daxil olun</translation>
 <translation id="2839032553903800133">Bildirişlər blok edilib</translation>
 <translation id="2841013758207633010">Vaxt</translation>
 <translation id="2841837950101800123">Provayder</translation>
@@ -1579,6 +1582,7 @@
     Server mesajı: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Direktoriya üzrə Media Qalereyası əlavə edin</translation>
 <translation id="2910318910161511225">Şəbəkəyə qoşulun və yenidən cəhd edin</translation>
+<translation id="2910718431259223434">Xəta baş verdi. Yenidən cəhd edin və ya cihaz sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Saytlara kuki datanı saxlamağa və oxumağa imkan verir (tövsiyə olunur)</translation>
 <translation id="2915102088417824677">Fəaliyyət qeydinə baxın</translation>
 <translation id="2915873080513663243">Avtomatik skan etmə</translation>
@@ -2318,6 +2322,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Artırma təsdiq edilib}other{# artırma təsdiq edilib}}</translation>
 <translation id="3822559385185038546">Bu proksi administrator tərəfindən icra olunur</translation>
 <translation id="3823310065043511710">Linux üçün minimum <ph name="INSTALL_SIZE" /> boş yerin olması tövsiyə edilir.</translation>
+<translation id="3824621460022590830">Cihaz qeydiyyat nişanı yanlışdır. Cihazın sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Administrator daha çox Google Hesabın əlavə edilməsini deaktiv edib</translation>
 <translation id="3827306204503227641">Səndboksdan çıxarılmış plaginlərə icazə verməyə davam edin.</translation>
 <translation id="3827774300009121996">Tam ekran</translation>
@@ -3269,6 +3274,7 @@
 <translation id="5079950360618752063">Təklif edilmiş paroldan istifadə edin</translation>
 <translation id="508059534790499809">Kerberos biletini yeniləyin</translation>
 <translation id="5084230410268011727">Saytların hərəkət və işıq senorlarından istifadəsinə icazə verin</translation>
+<translation id="5084328598860513926">Təchizat axını kəsildi. Yenidən cəhd edin və ya cihaz sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Güncəlləşmələr yoxlanır</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Defolt əsas səhifə bərpa edilsin?</translation>
@@ -3391,7 +3397,6 @@
 <translation id="5241128660650683457">Daxil olduğunuz veb saytlarda bütün datanızı oxuyun</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" aktiv edilsin?</translation>
 <translation id="5243522832766285132">Qısa zaman ərzində yenidən cəhd edin.</translation>
-<translation id="5244406554036143958">Avtomatik təqdim etməni aktivləşdirmək üçün PIN kodu daxil edin</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> e-poçtuna sinxronizasiya olunur</translation>
 <translation id="5245610266855777041">Məktəb hesabı ilə başlayın</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> qəzaya uğradı. Tətbiqi yenidən başlatmaq üçün bu topa klikləyin.</translation>
@@ -3668,6 +3673,7 @@
 <translation id="557722062034137776">Cihazınızın sıfırlanması Google hesablarınıza və ya bu hesablara sinxronizasiya edilmiş dataya təsir etməyəcək. Cihazınızda yerli olaraq saxlanılan bütün fayllar silinəcək.</translation>
 <translation id="5578059481725149024">Hesaba avtomatik giriş</translation>
 <translation id="558170650521898289">Microsoft Windows Avadanlıq Drayver Doğrulanması</translation>
+<translation id="5581972110672966454">Cihazı domenə qoşmaq olmur. Yenidən cəhd edin və ya cihaz sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Əsas menyu</translation>
 <translation id="5583640892426849032">Geri silmə</translation>
 <translation id="5584088138253955452">İstifadəçi adı yadda saxlansın?</translation>
@@ -3740,6 +3746,7 @@
 <translation id="5667546120811588575">Google Play quraşdırılır...</translation>
 <translation id="5669267381087807207">Aktivləşir</translation>
 <translation id="5669691691057771421">Yeni PIN kodu daxil edin</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Şəkillər blok edildi</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> təklifini silin</translation>
 <translation id="567587836466137939">Bu cihazda <ph name="MONTH_AND_YEAR" /> tarixinə qədər avtomatik proqram təminatı və təhlükəsizlik güncəlləmələri icra ediləcək. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation>
@@ -5384,6 +5391,7 @@
 <translation id="7764225426217299476">Ünvan əlavə edin</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> domenindən <ph name="DOWNLOAD_RECEIVED" /></translation>
 <translation id="7765158879357617694">Daşıyın</translation>
+<translation id="7766082757934713382">Avtomatik tətbiq və sistem güncəlləmələrini durduraraq şəbəkə datası istifadəsini azaltmağa yardım edir</translation>
 <translation id="7766807826975222231">Tanış olun</translation>
 <translation id="7766838926148951335">İcazələri qəbul edin</translation>
 <translation id="7768770796815395237">Dəyişin</translation>
@@ -6292,6 +6300,7 @@
 <translation id="885701979325669005">Yaddaş</translation>
 <translation id="8859057652521303089">Dil seçin:</translation>
 <translation id="8859174528519900719">Alt çərçivə: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Xidmət Şərtlərini yükləmək mümkün olmadı</translation>
 <translation id="8859662783913000679">Valideyn hesabı</translation>
 <translation id="8862003515646449717">Sürətli brauzerə keçin</translation>
 <translation id="8863753581171631212">Linki yeni <ph name="APP" /> tətbiqində açın</translation>
@@ -6560,6 +6569,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> provayderində axtarın</translation>
 <translation id="9201023452444595544">Oflayn data silinəcək</translation>
 <translation id="9201220332032049474">Ekran kilidi seçimləri</translation>
+<translation id="9201842707396338580">Xəta baş verdi. Cihazın sahibi və ya administrator ilə əlaqə saxlayın. Xəta kodu: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profilləşdirmə aktivdir</translation>
 <translation id="9203904171912129171">Cihaz seçin</translation>
 <translation id="9203962528777363226">Bu cihazın administratoru yeni istifadəçilərin əlavə edilməsini qadağan edib</translation>
@@ -6631,6 +6641,7 @@
 <translation id="983511809958454316">Bu funksiya VR-də dəstəklənmir</translation>
 <translation id="984275831282074731">Ödəniş üsulları</translation>
 <translation id="98515147261107953">Peyzaj</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Ümumi</translation>
 <translation id="987897973846887088">Əlçatan şəkil yoxdur</translation>
 <translation id="988978206646512040">Boş parol sözünə icazə verilmir</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 98c7e29..f05dd15b 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 МБ</translation>
 <translation id="2352810082280059586">Нататкі на заблакіраваным экране аўтаматычна захоўваюцца ў праграме <ph name="LOCK_SCREEN_APP_NAME" />. Апошняя нататка будзе заставацца на экране блакіроўкі.</translation>
 <translation id="2353297238722298836">Камера і мікрафон дазволены</translation>
+<translation id="2355314311311231464">Збой патоку падрыхтоўкі: не ўдалося атрымаць даныя ўліковага запісу. Паўтарыце спробу. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Уключыць Імгненны рэжым мадэма</translation>
 <translation id="2356070529366658676">Запытваць</translation>
 <translation id="2357330829548294574">Выдаліць карыстальніка <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Увядзіце PIN-код</translation>
 <translation id="241082044617551207">Невядомая ўбудова</translation>
 <translation id="2412593942846481727">Ёсць абнаўленне</translation>
-<translation id="2414499877591062094">Уключыць аўтаматычную адпраўку PIN-кода</translation>
 <translation id="2416435988630956212">Функцыянальныя клавішы клавіятуры</translation>
 <translation id="241727068219398187">Даныя зашыфраваны з дапамогай пароля Google па стане на
           <ph name="TIME" />. Шыфраванне не прымяняецца для спосабаў аплаты і адрасоў Google Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">Перакласці гэту старонку</translation>
 <translation id="2475982808118771221">Адбылася памылка</translation>
 <translation id="2476578072172137802">Налады сайта</translation>
+<translation id="2476974672882258506">Каб выдаліць <ph name="PARALLELS_DESKTOP" />, завяршыце працу Windows.</translation>
 <translation id="2478176599153288112">Дазволы выкарыстання мультымедыйных файлаў для пашырэння "<ph name="EXTENSION" />"</translation>
 <translation id="247949520305900375">Абагульваць аўдыя</translation>
 <translation id="248003956660572823">Паролі не захаваны</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">Доступ да <ph name="VOLUME_NAME" /> дадзены толькі для чытання.</translation>
 <translation id="2575247648642144396">Гэты значок будзе бачным, калі пашырэнне можа працаваць на бягучай старонцы. Каб выкарыстаць гэта пашырэнне, націсніце на значок або націсніце клавішы <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Задаць як Chromebox для сустрэч</translation>
+<translation id="2579232805407578790">Не ўдалося падключыцца да сервера. Праверце падключэнне да сеткі і паўтарыце спробу. Калі праблема не знікне, перазапусціце Chromebook. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Заўсёды дазваляць хосту <ph name="HOST" /> спампоўваць некалькі файлаў</translation>
 <translation id="258095186877893873">Доўгая</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Уваход пад гэтым іменем карыстальніка выключаны адміністратарам.</translation>
 <translation id="283669119850230892">Каб выкарыстоўваць сетку <ph name="NETWORK_ID" />, спачатку завяршыце падключэнне да інтэрнэту (гл. ніжэй).</translation>
 <translation id="2838379631617906747">Ідзе ўсталяванне</translation>
+<translation id="2838835911926931318">Каб закладкі, паролі, гісторыя і іншыя даныя сінхранізаваліся на ўсіх вашых прыладах, увайдзіце ў сістэму</translation>
 <translation id="2839032553903800133">Апавяшчэнні заблакіраваны</translation>
 <translation id="2841013758207633010">Час</translation>
 <translation id="2841837950101800123">Пастаўшчык</translation>
@@ -1584,6 +1587,7 @@
     Паведамленне сервера: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Дадаванне мультымедыйнай галерэі па каталозе</translation>
 <translation id="2910318910161511225">Падключыцеся да сеткі і паўтарыце спробу</translation>
+<translation id="2910718431259223434">Нешта пайшло не так. Паўтарыце спробу або звярніцеся да адміністратара ці ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Дазволіць сайтам захоўваць і чытаць даныя файлаў cookie (рэкамендуецца)</translation>
 <translation id="2915102088417824677">Праглядзець журнал актыўнасці</translation>
 <translation id="2915873080513663243">Аўтаматычнае сканіраванне</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Пашырэнне ўхвалена}one{# пашырэнне ўхвалена}few{# пашырэнні ўхвалена}many{# пашырэнняў ухвалена}other{# пашырэння ўхвалены}}</translation>
 <translation id="3822559385185038546">Адміністратар зрабіў выкарыстанне гэтага проксі-сервера абавязковым</translation>
 <translation id="3823310065043511710">Для выкарыстання Linux рэкамендуецца мець як мінімум <ph name="INSTALL_SIZE" />.</translation>
+<translation id="3824621460022590830">Токен рэгістрацыі прылады несапраўдны. Звярніцеся да адміністратара або ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Адміністратар выключыў дадаванне іншых Уліковых запісаў Google</translation>
 <translation id="3827306204503227641">Працягваць запускаць убудовы па-за пясочніцай</translation>
 <translation id="3827774300009121996">&amp;Поўнаэкранны рэжым</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Выкарыстайце прапанаваны пароль</translation>
 <translation id="508059534790499809">Абнаўленне білета Kerberos</translation>
 <translation id="5084230410268011727">Дазволіць сайтам выкарыстоўваць датчыкі руху і святла</translation>
+<translation id="5084328598860513926">Паток падрыхтоўкі быў перапынены. Паўтарыце спробу або звярніцеся да адміністратара ці ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Ідзе праверка наяўнасці абнаўленняў</translation>
 <translation id="5086082738160935172">HID (чалавека-машынны інтэрфейс)</translation>
 <translation id="5086874064903147617">Аднавіць стандартную галоўную старонку?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Чытаць усе даныя з вэб-сайтаў, якія вы наведваеце</translation>
 <translation id="5242724311594467048">Уключыць пашырэнне "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Паўтарыце спробу праз некалькі секунд</translation>
-<translation id="5244406554036143958">Для ўключэння аўтаматычнай адпраўкі ўвядзіце PIN-код</translation>
 <translation id="5244474230056479698">Сінхранізуецца з <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Пачатак працы з навучальным уліковым запісам</translation>
 <translation id="5246282308050205996">Збой праграмы "<ph name="APP_NAME" />". Націсніце на гэта ўсплывальнае папярэджанне, каб перазапусціць праграму.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Скід прылады не закране ўліковыя запісы Google і даныя, сінхранізаваныя з імі. Аднак усе файлы, захаваныя на прыладзе, будуць выдалены.</translation>
 <translation id="5578059481725149024">Аўтаматычны ўваход</translation>
 <translation id="558170650521898289">Спраўджанне драйвера абсталявання Microsoft Windows</translation>
+<translation id="5581972110672966454">Не ўдалося далучыць прыладу да дамена. Паўтарыце спробу або звярніцеся да адміністратара ці ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Галоўнае меню</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Захаваць імя карыстальніка?</translation>
@@ -3747,6 +3753,7 @@
 <translation id="5667546120811588575">Наладжваецца Google Play...</translation>
 <translation id="5669267381087807207">Ідзе актывацыя</translation>
 <translation id="5669691691057771421">Увядзіце новы PIN-код</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Выявы заблакіраваны</translation>
 <translation id="5671658447180261823">Выдаліць прапанову "<ph name="SUGGESTION_NAME" />"</translation>
 <translation id="567587836466137939">Месяц, у якім гэта прылада перастане ўсталёўваць аўтаматычныя абнаўленні праграмнага забеспячэння і сістэмы бяспекі: <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">Дадаць адрас</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> з дамена <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Перамясціць</translation>
+<translation id="7766082757934713382">Дапамагае знізіць выкарыстанне трафіка ў сетцы, прыпыняючы аўтаматычныя абнаўленні сістэмы і праграм</translation>
 <translation id="7766807826975222231">Азнаёміцца</translation>
 <translation id="7766838926148951335">Прыняць дазволы</translation>
 <translation id="7768770796815395237">Змяніць</translation>
@@ -6304,6 +6312,7 @@
 <translation id="885701979325669005">Сховішча</translation>
 <translation id="8859057652521303089">Выберыце мову:</translation>
 <translation id="8859174528519900719">Субфрэйм: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Не ўдалося загрузіць Умовы выкарыстання</translation>
 <translation id="8859662783913000679">Бацькоўскі ўліковы запіс</translation>
 <translation id="8862003515646449717">Пераключыцца на хуткі браўзер</translation>
 <translation id="8863753581171631212">Адкрыць спасылку ў новым акне праграмы <ph name="APP" /></translation>
@@ -6572,6 +6581,7 @@
 <translation id="920045321358709304">Пошук у сэрвісе <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Усе пазасеткавыя даныя будуць выдалены</translation>
 <translation id="9201220332032049474">Параметры блакіроўкі экрана</translation>
+<translation id="9201842707396338580">Нешта пайшло не так. Звярніцеся да адміністратара або ўладальніка прылады. Код памылкі: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Прафіліраванне ўключана</translation>
 <translation id="9203904171912129171">Выберыце прыладу</translation>
 <translation id="9203962528777363226">Адміністратар гэтай прылады выключыў магчымасць дадаваць новых карыстальнікаў</translation>
@@ -6643,6 +6653,7 @@
 <translation id="983511809958454316">Гэта функцыя не падтрымліваецца ў VR</translation>
 <translation id="984275831282074731">Спосабы аплаты</translation>
 <translation id="98515147261107953">Альбомная</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Агульныя</translation>
 <translation id="987897973846887088">Няма даступных відарысаў</translation>
 <translation id="988978206646512040">Неабходна задаць фразу-пароль</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 9a90962..02a87a9e 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">Въведете своя ПИН</translation>
 <translation id="241082044617551207">Неизвестна приставка</translation>
 <translation id="2412593942846481727">Налице е актуализация</translation>
-<translation id="2414499877591062094">Активиране на автоматичното изпращане на ПИН</translation>
 <translation id="2416435988630956212">Функционални клавиши на клавиатурата</translation>
 <translation id="241727068219398187">Данните бяха шифровани с паролата ви за Google от
 <ph name="TIME" />. Това не включва начините на плащане и адресите от Google Pay.</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">Четене на всичките ви данни от посещаваните от вас уебсайтове</translation>
 <translation id="5242724311594467048">Да се активира ли <ph name="EXTENSION_NAME" />?</translation>
 <translation id="5243522832766285132">Моля, опитайте отново след малко</translation>
-<translation id="5244406554036143958">Въведете своя ПИН, за да активирате автоматичното изпращане</translation>
 <translation id="5244474230056479698">Синхронизира се със: <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Първи стъпки с профила от учебно заведение</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> претърпя срив. Кликнете върху това балонче, за да рестартирате приложението.</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index a70fae9..892db9aa 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">আপনার পিন লিখুন</translation>
 <translation id="241082044617551207">অজানা প্লাগ-ইন</translation>
 <translation id="2412593942846481727">আপডেট উপলভ্য</translation>
-<translation id="2414499877591062094">অটোমেটিক পিন জমা করার ফিচার চালু করুন</translation>
 <translation id="2416435988630956212">কীবোর্ডের ফাংশন কী</translation>
 <translation id="241727068219398187">Google পাসওয়ার্ড দিয়ে <ph name="TIME" />-এ আপনার ডেটা এনক্রিপ্ট করা হয়েছিল। এতে Google Pay-এর পেমেন্ট পদ্ধতি ও ঠিকানা অন্তর্ভুক্ত থাকে না।</translation>
 <translation id="2419131370336513030">ইনস্টল করা অ্যাপ দেখুন</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">আপনার দেখা ওয়েবসাইটগুলির সমস্ত ডেটা পড়ুন</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" সক্ষম করবেন?</translation>
 <translation id="5243522832766285132">কয়েক মুহূর্তের মধ্যে আবার চেষ্টা করুন</translation>
-<translation id="5244406554036143958">নিজে থেকে জমা দেওয়ার ফিচারটি চালু করার জন্য আপনার পিন লিখুন</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> এ সিঙ্ক হচ্ছে</translation>
 <translation id="5245610266855777041">একটি স্কুল অ্যাকাউন্ট দিয়ে কাজ শুরু করা যাক</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ক্র্যাশ করেছে৷ অ্যাপ পুনঃসূচনা করতে এই বেলুনটি ক্লিক করুন৷</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 3c0b7956..a8c6cfe 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Unesite PIN</translation>
 <translation id="241082044617551207">Nepoznati dodatak</translation>
 <translation id="2412593942846481727">Ažuriranje je dostupno</translation>
-<translation id="2414499877591062094">Omogući automatsko slanje PIN-a</translation>
 <translation id="2416435988630956212">Funkcijske tipke tastature</translation>
 <translation id="241727068219398187">Podaci su šifrirani vašom šifrom za Google od
           <ph name="TIME" />. Ovo ne uključuje načine plaćanja i adrese s Google Paya.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Čitanje svih vaših podataka na web lokacijama koje posjećujete</translation>
 <translation id="5242724311594467048">Omogućiti "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Pokušajte ponovo za nekoliko trenutaka</translation>
-<translation id="5244406554036143958">Unesite PIN da omogućite automatsko slanje</translation>
 <translation id="5244474230056479698">Sinhroniziranje s korisničkim računom <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Počni koristiti školski račun</translation>
 <translation id="5246282308050205996">Došlo je do pada aplikacije <ph name="APP_NAME" />. Kliknite na ovaj balon da ponovo pokrenete aplikaciju.</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 83e7af0..fc5264e 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Introdueix el PIN</translation>
 <translation id="241082044617551207">Connector desconegut</translation>
 <translation id="2412593942846481727">Hi ha una actualització disponible</translation>
-<translation id="2414499877591062094">Activa la introducció automàtica del PIN</translation>
 <translation id="2416435988630956212">Tecles de funció del teclat</translation>
 <translation id="241727068219398187">Les dades s'han encriptat amb la contrasenya de Google del dia <ph name="TIME" />. No inclouen les formes de pagament ni les adreces de Google Pay.</translation>
 <translation id="2419131370336513030">Mostra les aplicacions instal·lades</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">Llegir totes les dades dels llocs web que es visitin</translation>
 <translation id="5242724311594467048">Vols activar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Torna-ho a provar d'aquí a una estona</translation>
-<translation id="5244406554036143958">Introdueix el PIN per activar l'enviament automàtic</translation>
 <translation id="5244474230056479698">S'està sincronitzant amb <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Comença a fer servir un compte de centre educatiu</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ha deixat de funcionar. Feu clic en aquest globus per reiniciar l'aplicació.</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 76d4f7e..9915e62d 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Poznámky na obrazovce uzamčení se automaticky ukládají do aplikace <ph name="LOCK_SCREEN_APP_NAME" />. Poslední poznámka na obrazovce uzamčení zůstane.</translation>
 <translation id="2353297238722298836">Kamera a mikrofon jsou povoleny</translation>
+<translation id="2355314311311231464">Nastavení se nezdařilo, protože nebylo možné načíst podrobnosti účtu. Zkuste to znovu. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Zapnout dynamický tethering</translation>
 <translation id="2356070529366658676">Zeptat se</translation>
 <translation id="2357330829548294574">Odstranit uživatele <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Zadejte PIN</translation>
 <translation id="241082044617551207">Neznámý plugin</translation>
 <translation id="2412593942846481727">K dispozici je aktualizace</translation>
-<translation id="2414499877591062094">Zapnout automatické odesílání kódu PIN</translation>
 <translation id="2416435988630956212">Funkční klávesy</translation>
 <translation id="241727068219398187">Všechny údaje byly zašifrovány pomocí hesla účtu Google ze dne <ph name="TIME" />. Toto šifrování se nevztahuje na platební metody a adresy z Google Pay.</translation>
 <translation id="2419131370336513030">Zobrazit nainstalované aplikace</translation>
@@ -1215,6 +1215,7 @@
 <translation id="2473195200299095979">Přeložit tuto stránku</translation>
 <translation id="2475982808118771221">Došlo k chybě</translation>
 <translation id="2476578072172137802">Nastavení webu</translation>
+<translation id="2476974672882258506">Pokud chcete odinstalovat <ph name="PARALLELS_DESKTOP" />, ukončete Windows.</translation>
 <translation id="2478176599153288112">Oprávnění souborů médií pro rozšíření <ph name="EXTENSION" /></translation>
 <translation id="247949520305900375">Sdílet zvuk</translation>
 <translation id="248003956660572823">Hesla se neuložila</translation>
@@ -1305,6 +1306,7 @@
 <translation id="2572032849266859634">Byl udělen přístup pouze ke čtení ke svazku <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">Ikona se zobrazí, když bude možné rozšíření použít na aktuální stránce. Rozšíření aktivujete kliknutím na ikonu nebo klávesovou zkratkou <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nastavit jako Chromebox pro videokonference</translation>
+<translation id="2579232805407578790">K serveru se nelze se připojit. Zkontrolujte připojení k síti a zkuste to znovu. Pokud problém přetrvává, restartujte Chromebook. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Vždy povolit hostiteli <ph name="HOST" /> stahování několika souborů</translation>
 <translation id="258095186877893873">Dlouhé</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1524,6 +1526,7 @@
 <translation id="2836635946302913370">Přihlášení pomocí tohoto uživatelského jména bylo správcem zakázáno.</translation>
 <translation id="283669119850230892">Chcete-li používat sít <ph name="NETWORK_ID" />, dokončete nejdříve připojení k internetu níže.</translation>
 <translation id="2838379631617906747">Instalace</translation>
+<translation id="2838835911926931318">Přihlaste se, abyste mohli synchronizovat záložky, hesla, historii a další údaje do všech svých zařízení</translation>
 <translation id="2839032553903800133">Byla zablokována oznámení</translation>
 <translation id="2841013758207633010">Čas</translation>
 <translation id="2841837950101800123">Poskytovatel</translation>
@@ -1583,6 +1586,7 @@
 Zpráva serveru: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Přidat galerii médií podle adresáře</translation>
 <translation id="2910318910161511225">Připojte se k síti a zkuste to znovu</translation>
+<translation id="2910718431259223434">Došlo k chybě. Zkuste to znovu nebo kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Povolit webům ukládat a číst data souborů cookie (doporučeno)</translation>
 <translation id="2915102088417824677">Zobrazit protokol aktivity</translation>
 <translation id="2915873080513663243">Automatické prohledávání</translation>
@@ -2322,6 +2326,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Rozšíření bylo schváleno}few{# rozšíření byla schválena}many{# rozšíření bylo schváleno}other{# rozšíření bylo schváleno}}</translation>
 <translation id="3822559385185038546">Tento proxy server je vyžadován administrátorem</translation>
 <translation id="3823310065043511710">Pro Linux je doporučeno alespoň <ph name="INSTALL_SIZE" /> místa.</translation>
+<translation id="3824621460022590830">Token registrace zařízení není platný. Kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Váš administrátor přidávání dalších účtů Google zakázal</translation>
 <translation id="3827306204503227641">I nadále povolovat pluginy mimo izolovaný prostor</translation>
 <translation id="3827774300009121996">&amp;Celá obrazovka</translation>
@@ -3274,6 +3279,7 @@
 <translation id="5079950360618752063">Použít navrhované heslo</translation>
 <translation id="508059534790499809">Obnovení lístku Kerberos</translation>
 <translation id="5084230410268011727">Povolit webům používat senzory pohybu a světla</translation>
+<translation id="5084328598860513926">Proces nastavení byl přerušen. Zkuste to znovu nebo kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Kontrola aktualizací</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Obnovit výchozí domovskou stránku?</translation>
@@ -3396,7 +3402,6 @@
 <translation id="5241128660650683457">Čtení veškerých dat na navštívených webových stránkách</translation>
 <translation id="5242724311594467048">Aktivovat rozšíření <ph name="EXTENSION_NAME" />?</translation>
 <translation id="5243522832766285132">Zkuste to znovu za okamžik</translation>
-<translation id="5244406554036143958">Chcete-li zapnout automatické odesílání, zadejte PIN</translation>
 <translation id="5244474230056479698">Údaje se synchronizují do účtu <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Začínáme se školním účtem</translation>
 <translation id="5246282308050205996">Aplikace <ph name="APP_NAME" /> selhala. Klinutím na tuto bublinu aplikaci restartujete.</translation>
@@ -3673,6 +3678,7 @@
 <translation id="557722062034137776">Resetování zařízení nebude mít vliv na vaše účty Google ani na data synchronizovaná s těmito účty. Všechny soubory uložené místně v zařízení však budou smazány.</translation>
 <translation id="5578059481725149024">Automatické přihlášení</translation>
 <translation id="558170650521898289">Ověření ovladače hardwaru systému Microsoft Windows</translation>
+<translation id="5581972110672966454">Zařízení do domény nelze přidat. Zkuste to znovu nebo kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Hlavní nabídka</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Uložit uživatelské jméno?</translation>
@@ -3745,6 +3751,7 @@
 <translation id="5667546120811588575">Nastavování Google Play...</translation>
 <translation id="5669267381087807207">Aktivování</translation>
 <translation id="5669691691057771421">Zadejte nový PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Byly zablokovány obrázky</translation>
 <translation id="5671658447180261823">Odstranit návrh <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Toto zařízení bude dostávat automatické aktualizace softwaru a zabezpečení do: <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation>
@@ -5391,6 +5398,7 @@
 <translation id="7764225426217299476">Přidat adresu</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> z <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Přesunout</translation>
+<translation id="7766082757934713382">Pomáhá snižovat využití dat v síti prostřednictvím pozastavení automatických aktualizací aplikací a systému</translation>
 <translation id="7766807826975222231">Spustit prohlídku</translation>
 <translation id="7766838926148951335">Přijmout oprávnění</translation>
 <translation id="7768770796815395237">Změnit</translation>
@@ -6302,6 +6310,7 @@
 <translation id="885701979325669005">Úložiště</translation>
 <translation id="8859057652521303089">Vyberte jazyk:</translation>
 <translation id="8859174528519900719">Podrámec: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Smluvní podmínky nelze načíst</translation>
 <translation id="8859662783913000679">Účet rodiče</translation>
 <translation id="8862003515646449717">Přejděte na rychlý prohlížeč</translation>
 <translation id="8863753581171631212">Otevřít odkaz v novém okně aplikace <ph name="APP" /></translation>
@@ -6570,6 +6579,7 @@
 <translation id="920045321358709304">Hledat pomocí vyhledávače <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Veškerá data offline budou vymazána</translation>
 <translation id="9201220332032049474">Možnosti zámku obrazovky</translation>
+<translation id="9201842707396338580">Došlo k chybě. Kontaktujte vlastníka nebo administrátora zařízení. Kód chyby: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profilování povoleno</translation>
 <translation id="9203904171912129171">Vyberte zařízení</translation>
 <translation id="9203962528777363226">Správce zařízení zakázal přidávat nové uživatele.</translation>
@@ -6641,6 +6651,7 @@
 <translation id="983511809958454316">Tato funkce ve virtuální realitě není podporována</translation>
 <translation id="984275831282074731">Platební metody</translation>
 <translation id="98515147261107953">Na šířku</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Všeobecné</translation>
 <translation id="987897973846887088">Nejsou k dispozici žádné obrázky</translation>
 <translation id="988978206646512040">Prázdné přístupové heslo není povoleno</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index e838d2b1..5e8ed90 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Angiv din pinkode</translation>
 <translation id="241082044617551207">Ukendt plugin</translation>
 <translation id="2412593942846481727">Der er en tilgængelig opdatering</translation>
-<translation id="2414499877591062094">Aktivér automatisk indsendelse af pinkode</translation>
 <translation id="2416435988630956212">Funktionstaster på tastaturet</translation>
 <translation id="241727068219398187">Dataene er krypteret med din Google-adgangskode fra
           <ph name="TIME" />. Dette omfatter ikke betalingsmetoder og adresser fra Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Læs alle dine data på de websites, du besøger</translation>
 <translation id="5242724311594467048">Skal "<ph name="EXTENSION_NAME" />" aktiveres?</translation>
 <translation id="5243522832766285132">Prøv igen om et øjeblik</translation>
-<translation id="5244406554036143958">Angiv din pinkode for at aktivere automatisk indsendelse</translation>
 <translation id="5244474230056479698">Synkroniserer til <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Kom godt i gang med en skolekonto</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> er gået ned. Klik her for at genstarte appen.</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 665a9ac..d0bd5af3 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">PIN eingeben</translation>
 <translation id="241082044617551207">Unbekanntes Plug-in</translation>
 <translation id="2412593942846481727">Update verfügbar</translation>
-<translation id="2414499877591062094">Funktion zum automatischen Senden von PINs aktivieren</translation>
 <translation id="2416435988630956212">Funktionstasten der Tastatur</translation>
 <translation id="241727068219398187">Ihre Daten wurden mit Ihrem Google-Passwort vom <ph name="TIME" /> verschlüsselt. Davon ausgenommen sind Zahlungsmethoden oder Adressen von Google Pay.</translation>
 <translation id="2419131370336513030">Installierte Apps anzeigen</translation>
@@ -3394,7 +3393,6 @@
 <translation id="5241128660650683457">Alle Ihre Daten auf von Ihnen besuchten Websites lesen</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" aktivieren?</translation>
 <translation id="5243522832766285132">Bitte versuchen Sie es in einigen Minuten noch einmal</translation>
-<translation id="5244406554036143958">Geben Sie Ihre PIN ein, um die Funktion zum automatischen Senden zu aktivieren</translation>
 <translation id="5244474230056479698">Mit <ph name="EMAIL" /> synchronisieren</translation>
 <translation id="5245610266855777041">Erste Schritte mit Konten von Bildungseinrichtungen</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ist abgestürzt. Klicken Sie auf dieses Fenster, um die App erneut zu laden.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index a9d70b2..62754ea 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Εισαγάγετε το PIN</translation>
 <translation id="241082044617551207">Άγνωστη προσθήκη</translation>
 <translation id="2412593942846481727">Υπάρχει διαθέσιμη ενημέρωση</translation>
-<translation id="2414499877591062094">Ενεργοποίηση αυτόματης υποβολής PIN</translation>
 <translation id="2416435988630956212">Πλήκτρα λειτουργίας πληκτρολογίου</translation>
 <translation id="241727068219398187">Τα δεδομένα κρυπτογραφήθηκαν με τον κωδικό πρόσβασης Google από τις
           <ph name="TIME" />. Αυτά τα δεδομένα δεν περιλαμβάνουν τρόπους πληρωμής και διευθύνσεις από το Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Ανάγνωση όλων των δεδομένων των ιστοτόπων που επισκέπτεστε</translation>
 <translation id="5242724311594467048">Ενεργοποίηση "<ph name="EXTENSION_NAME" />";</translation>
 <translation id="5243522832766285132">Δοκιμάστε ξανά σε λίγο</translation>
-<translation id="5244406554036143958">Εισαγάγετε το PIN για ενεργοποίηση της αυτόματης υποβολής</translation>
 <translation id="5244474230056479698">Συγχρονισμός με <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Ξεκινήστε με σχολικό λογαριασμό</translation>
 <translation id="5246282308050205996">Το <ph name="APP_NAME" /> παρουσίασε σφάλμα. Κάντε κλικ σε αυτό το πλαίσιο για να επανεκκινήσετε την εφαρμογή.</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index aad0aab..d9fc796b 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Enter your PIN</translation>
 <translation id="241082044617551207">Unknown plug-in</translation>
 <translation id="2412593942846481727">Update available</translation>
-<translation id="2414499877591062094">Enable auto-submit PIN</translation>
 <translation id="2416435988630956212">Keyboard function keys</translation>
 <translation id="241727068219398187">Data was encrypted with your Google password as of
           <ph name="TIME" />. This doesn't include payment methods and addresses from Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Read all your data on the websites that you visit</translation>
 <translation id="5242724311594467048">Enable "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Please try again in a few moments</translation>
-<translation id="5244406554036143958">Enter your PIN to enable auto-submit</translation>
 <translation id="5244474230056479698">Syncing to <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Get started with a school account</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> has crashed. Click this balloon to restart the app.</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 9074534..f675f15 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">Ingresa tu PIN</translation>
 <translation id="241082044617551207">Complemento desconocido</translation>
 <translation id="2412593942846481727">Actualización disponible</translation>
-<translation id="2414499877591062094">Habilitar el envío automático del PIN</translation>
 <translation id="2416435988630956212">Teclas de función del teclado</translation>
 <translation id="241727068219398187">Los datos se encriptaron con tu contraseña de Google a partir del
           <ph name="TIME" />. No se incluyen formas de pago ni direcciones de Google Pay.</translation>
@@ -3395,7 +3394,6 @@
 <translation id="5241128660650683457">Leer todos los datos de los sitios web que visitas</translation>
 <translation id="5242724311594467048">¿Habilitar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Vuelve a intentarlo en unos minutos</translation>
-<translation id="5244406554036143958">Ingresa tu PIN para habilitar el envío automático</translation>
 <translation id="5244474230056479698">Sincronizando con <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Comenzar con la cuenta de una institución educativa</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> se ha bloqueado. Haz clic en este globo para reiniciar la aplicación.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 15e6e1c..4a8e6b9 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Introduce tu PIN</translation>
 <translation id="241082044617551207">Complemento desconocido</translation>
 <translation id="2412593942846481727">Actualización disponible</translation>
-<translation id="2414499877591062094">Habilitar introducción automática de PINs</translation>
 <translation id="2416435988630956212">Teclas de funciones del teclado</translation>
 <translation id="241727068219398187">Se han cifrado los datos con tu contraseña de Google desde el
           <ph name="TIME" />. El cifrado no incluye los métodos de pago ni las direcciones de Google Pay.</translation>
@@ -3397,7 +3396,6 @@
 <translation id="5241128660650683457">Leer todos tus datos en los sitios web a los que accedes</translation>
 <translation id="5242724311594467048">¿Habilitar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Inténtalo de nuevo dentro de unos minutos.</translation>
-<translation id="5244406554036143958">Escribe tu PIN para habilitar la introducción automática</translation>
 <translation id="5244474230056479698">Sincronizando con <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Empieza a usar una cuenta de centro educativo</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ha dejado de funcionar. Haz clic en este globo para reiniciar la aplicación.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 9d1ed41..7c65673 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Sisestage PIN-kood</translation>
 <translation id="241082044617551207">Tundmatu pistikprogramm</translation>
 <translation id="2412593942846481727">Värskendus on saadaval</translation>
-<translation id="2414499877591062094">Luba PIN-koodi automaatne esitamine</translation>
 <translation id="2416435988630956212">Klaviatuuri funktsiooniklahvid</translation>
 <translation id="241727068219398187">Andmed krüpteeriti teie Google'i parooliga
           <ph name="TIME" />. See ei hõlma Google Pay makseviise ja aadresse.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Lugege kõiki teie külastatud veebisaitide andmeid</translation>
 <translation id="5242724311594467048">Kas lubada laiendus „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Proovige mõne aja pärast uuesti</translation>
-<translation id="5244406554036143958">Automaatse esitamise lubamiseks sisestage PIN-kood</translation>
 <translation id="5244474230056479698">Sünkroonimine aadressiga <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Alustage koolikonto kasutamist</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> läks krahhi. Rakenduse taaskäivitamiseks klõpsake sellel jutumullil.</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index fe915f8..3b32a87 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Idatzi PIN kodea</translation>
 <translation id="241082044617551207">Plugin ezezaguna</translation>
 <translation id="2412593942846481727">Eguneratu egin daiteke</translation>
-<translation id="2414499877591062094">Gaitu PIN kodearen bidalketa automatikoa</translation>
 <translation id="2416435988630956212">Teklatuko funtzio-teklak</translation>
 <translation id="241727068219398187">Google pasahitzarekin enkriptatu dira datuak data honetatik aurrera:
           <ph name="TIME" />. Ez dira hartzen barne Google Pay-ko ordainketa-metodoak eta helbideak.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Irakurri bisitatzen dituzun webguneetan dituzun datu guztiak</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" gaitu nahi duzu?</translation>
 <translation id="5243522832766285132">Saiatu berriro minutu gutxi batzuk barru</translation>
-<translation id="5244406554036143958">Idatzi PIN kodea bidalketa automatikoa gaitzeko</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> kontuarekin sinkronizatzen ari da</translation>
 <translation id="5245610266855777041">Hasi ikastetxeko kontu bat erabiltzen</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> aplikazioak huts egin du. Aplikazioa berrezartzeko, sakatu globo hau.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 9bfd581..0d37774d 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">پین را وارد کنید</translation>
 <translation id="241082044617551207">افزایه ناشناس</translation>
 <translation id="2412593942846481727">به‌روزرسانی دردسترس است</translation>
-<translation id="2414499877591062094">فعال کردن پین ارسال خودکار</translation>
 <translation id="2416435988630956212">کلیدهای عملکرد صفحه‌کلید</translation>
 <translation id="241727068219398187">‏داده‌ها با گذرواژه Google شما از 
           <ph name="TIME" /> رمزگذاری شدند. این کار شامل روش‌های پرداخت و نشانی‌های موجود در Google Pay نمی‌شود.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">خواندن همه داده‌هایتان در وب‌سایت‌هایی که بازدید می‌کنید</translation>
 <translation id="5242724311594467048">«<ph name="EXTENSION_NAME" />» فعال شود؟</translation>
 <translation id="5243522832766285132">چند لحظه دیگر دوباره امتحان کنید</translation>
-<translation id="5244406554036143958">برای فعال کردن ارسال خودکار، پین را وارد کنید</translation>
 <translation id="5244474230056479698">درحال همگام‌سازی در <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">شروع‌به‌کار با حساب مدرسه</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> خراب شده است. برای راه‌اندازی مجدد برنامه بر روی این بالون کلیک کنید.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index b235b60..610e221 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Lisää PIN-koodi</translation>
 <translation id="241082044617551207">Tuntematon laajennus</translation>
 <translation id="2412593942846481727">Päivitys saatavilla</translation>
-<translation id="2414499877591062094">Ota käyttöön automaattinen PIN-koodin lähettäminen</translation>
 <translation id="2416435988630956212">Näppäimistön toimintonäppäimet</translation>
 <translation id="241727068219398187">Data salattiin Google-salasanallasi
           <ph name="TIME" />. Tämä ei koske Google Payhin tallennettuja maksutapoja tai osoitteita.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">Lukea kaikkia tietojasi vierailemissasi sivustoissa</translation>
 <translation id="5242724311594467048">Otetaanko <ph name="EXTENSION_NAME" /> käyttöön?</translation>
 <translation id="5243522832766285132">Yritä uudelleen hetken kuluttua</translation>
-<translation id="5244406554036143958">Lisää PIN-koodi ottaaksesi käyttöön automaattisen lähettämisen</translation>
 <translation id="5244474230056479698">Synkronoidaan osoitteeseen <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Aloita oppilaitoksen tilin käyttö</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> on kaatunut. Käynnistä sovellus uudelleen klikkaamalla tätä kuplaa.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 2c4c23fb2..14912d5 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Awtomatikong nase-save sa <ph name="LOCK_SCREEN_APP_NAME" /> ang mga tala sa lock screen. Mananatili ang iyong pinakabagong tala sa lock screen.</translation>
 <translation id="2353297238722298836">Pinapayagan ang camera at mikropono</translation>
+<translation id="2355314311311231464">Hindi naisagawa ang pag-provision dahil hindi makuha ang mga detalye ng iyong account. Pakisubukan ulit. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">I-on ang Instant na Pag-tether</translation>
 <translation id="2356070529366658676">Magtanong</translation>
 <translation id="2357330829548294574">Alisin si <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Ilagay ang iyong PIN</translation>
 <translation id="241082044617551207">Hindi kilalang plugin</translation>
 <translation id="2412593942846481727">May available na update</translation>
-<translation id="2414499877591062094">I-enable ang awtomatikong pagsusumite ng PIN</translation>
 <translation id="2416435988630956212">Mga function key ng keyboard</translation>
 <translation id="241727068219398187">Na-encrypt ang data gamit ang iyong password sa Google simula noong
           <ph name="TIME" />. Hindi kasama rito ang mga paraan ng pagbabayad at address mula sa Google Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">I-translate ang pahinang ito</translation>
 <translation id="2475982808118771221">May isang naganap na error</translation>
 <translation id="2476578072172137802">Mga Setting ng Site</translation>
+<translation id="2476974672882258506">I-shut down ang Windows para ma-uninstall ang <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">Mga Pahintulot sa Media-File para sa "<ph name="EXTENSION" />"</translation>
 <translation id="247949520305900375">Ibahagi ang audio</translation>
 <translation id="248003956660572823">Hindi na-save ang mga password</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">Ipinagkaloob na sa <ph name="VOLUME_NAME" /> ang read-only na access.</translation>
 <translation id="2575247648642144396">Makikita ang icon na ito kapag makakakilos ang extension sa kasalukuyang pahina. Gamitin ang extension na ito sa pamamagitan ng pag-click sa icon o sa pamamagitan ng pagpindot sa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">I-set up bilang Chromebox for meetings</translation>
+<translation id="2579232805407578790">Hindi makakonekta sa server. Pakisuri ang iyong koneksyon ng network at subukan ulit. Kung magpapatuloy ang problema, i-restart ang iyong Chromebook. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Palaging payagan ang <ph name="HOST" /> na mag-download ng maraming file</translation>
 <translation id="258095186877893873">Matagal</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Hindi pinagana ng iyong administrator ang pag-sign in gamit ang username na ito.</translation>
 <translation id="283669119850230892">Upang gamitin ang network na <ph name="NETWORK_ID" />, kumpletuhin muna ang iyong koneksyon sa Internet sa ibaba.</translation>
 <translation id="2838379631617906747">Nag-i-install</translation>
+<translation id="2838835911926931318">Mag-sign in para I-sync ang iyong mga bookmark, password, history, at higit pa sa lahat ng device mo</translation>
 <translation id="2839032553903800133">Naka-block ang mga notification</translation>
 <translation id="2841013758207633010">Oras</translation>
 <translation id="2841837950101800123">Provider</translation>
@@ -1584,6 +1587,7 @@
     Mensahe mula sa server: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Magdagdag ng Media Gallery ayon sa Direktoryo</translation>
 <translation id="2910318910161511225">Kumonekta sa isang network at subukang muli</translation>
+<translation id="2910718431259223434">Nagkaproblema. Pakisubukan ulit o makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Payagan ang mga site na mag-save at magbasa ng data ng cookie (inirerekomenda)</translation>
 <translation id="2915102088417824677">Tingnan ang log ng aktibidad</translation>
 <translation id="2915873080513663243">Awtomatikong Pag-scan</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Inaprubahan ang isang extension}one{# extension ang inaprubahan}other{# na extension ang inaprubahan}}</translation>
 <translation id="3822559385185038546">Ipinapatupad ng iyong administrator ang proxy na ito</translation>
 <translation id="3823310065043511710">Hindi bababa sa <ph name="INSTALL_SIZE" /> na espasyo ang inirerekomenda para sa Linux.</translation>
+<translation id="3824621460022590830">Invalid ang token sa pag-enroll ng device. Makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Na-disable ng iyong administrator ang pagdaragdag ng higit pang Google Account</translation>
 <translation id="3827306204503227641">Patuloy na pahintulutan ang mga hindi naka-sandbox na plugin</translation>
 <translation id="3827774300009121996">&amp;Full Screen</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Gamitin ang iminumungkahing password</translation>
 <translation id="508059534790499809">I-refresh ang ticket ng Kerberos</translation>
 <translation id="5084230410268011727">Payagan ang mga site na gumamit ng mga motion at light sensor</translation>
+<translation id="5084328598860513926">Naantala ang daloy ng pag-provision. Pakisubukan ulit o makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Tumitingin ng mga update</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">I-restore ang default na homepage?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Basahin ang lahat ng iyong data sa mga website na binibisita mo</translation>
 <translation id="5242724311594467048">I-enable ang "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Pakisubukang muli pagkalipas ng ilang sandali</translation>
-<translation id="5244406554036143958">Ilagay ang iyong PIN para ma-enable ang awtomatikong pagsusumite</translation>
 <translation id="5244474230056479698">Sini-sync sa <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Magsimula gamit ang pampaaralang account</translation>
 <translation id="5246282308050205996">Nag-crash ang <ph name="APP_NAME" />. Mag-click sa lobong ito upang i-restart ang app.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Hindi maaapektuhan ng pag-reset sa iyong device ang iyong mga Google account o anumang data na naka-sync sa mga account na ito. Gayunpaman, matatanggal ang lahat ng file na lokal na naka-save sa iyong device.</translation>
 <translation id="5578059481725149024">Awtomatikong pag-sign in</translation>
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
+<translation id="5581972110672966454">Hindi maisama ang device sa domain. Pakisubukan ulit o makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Pangunahing menu</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">I-save ang username?</translation>
@@ -3747,6 +3753,7 @@
 <translation id="5667546120811588575">Sine-set up ang Google Play...</translation>
 <translation id="5669267381087807207">Ina-activate</translation>
 <translation id="5669691691057771421">Ilagay ang bagong PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Na-block ang mga larawan</translation>
 <translation id="5671658447180261823">Alisin ang suhestyong <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Makakatanggap ang device na ito ng mga awtomatikong update sa software at seguridad hanggang <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">Magdagdag ng address</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> mula sa <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Ilipat</translation>
+<translation id="7766082757934713382">Nakakatulong na mabawasan ang paggamit ng data ng network sa pamamagitan ng pag-pause sa mga awtomatikong update sa app at system</translation>
 <translation id="7766807826975222231">Maglibot</translation>
 <translation id="7766838926148951335">Tanggapin ang mga pahintulot</translation>
 <translation id="7768770796815395237">Baguhin</translation>
@@ -6306,6 +6314,7 @@
 <translation id="885701979325669005">Storage</translation>
 <translation id="8859057652521303089">Piliin ang iyong wika:</translation>
 <translation id="8859174528519900719">Subframe: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Hindi ma-load ang Mga Tuntunin ng Serbisyo</translation>
 <translation id="8859662783913000679">Account ng magulang</translation>
 <translation id="8862003515646449717">Lumipat sa isang mabilis na browser</translation>
 <translation id="8863753581171631212">Buksan ang link sa bagong <ph name="APP" /></translation>
@@ -6575,6 +6584,7 @@
 <translation id="920045321358709304">Maghanap sa <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Maki-clear ang anumang offline na data</translation>
 <translation id="9201220332032049474">Mga opsyon sa lock ng screen</translation>
+<translation id="9201842707396338580">Nagkaproblema. Makipag-ugnayan sa may-ari o administrator ng iyong device. Code ng error: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Pinagana ang pag-profile</translation>
 <translation id="9203904171912129171">Pumili ng device</translation>
 <translation id="9203962528777363226">Hindi pinagana ng administrator ng device na ito ang pagdaragdag ng mga bagong user</translation>
@@ -6646,6 +6656,7 @@
 <translation id="983511809958454316">Hindi sinusuportahan ang feature na ito sa VR</translation>
 <translation id="984275831282074731">Mga paraan ng pagbabayad</translation>
 <translation id="98515147261107953">Landscape</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Pangkalahatan</translation>
 <translation id="987897973846887088">Walang available na larawan</translation>
 <translation id="988978206646512040">Hindi pinapayagan ang passphrase na walang laman</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 6c69e0c0..ce18b3799 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Entrez votre NIP</translation>
 <translation id="241082044617551207">Plugiciel inconnu</translation>
 <translation id="2412593942846481727">Mise à jour disponible</translation>
-<translation id="2414499877591062094">Activer l'envoi automatique du NIP</translation>
 <translation id="2416435988630956212">Touches de fonction du clavier</translation>
 <translation id="241727068219398187">Des données ont été chiffrées à l'aide de votre mot de passe Google à compter du
           <ph name="TIME" />. Cette méthode ne couvre pas les modes de paiement ni les adresses de Google Pay.</translation>
@@ -3399,7 +3398,6 @@
 <translation id="5241128660650683457">Lire toutes vos données sur les sites Web que vous consultez</translation>
 <translation id="5242724311594467048">Activer « <ph name="EXTENSION_NAME" /> »?</translation>
 <translation id="5243522832766285132">Veuillez réessayer dans quelques instants</translation>
-<translation id="5244406554036143958">Entrez votre NIP pour activer l'envoi automatique</translation>
 <translation id="5244474230056479698">Synchronisation avec <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Commencer avec un compte scolaire</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> a planté. Cliquez sur cette infobulle pour redémarrer l'application.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 35042a8..7a05afd 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Saisissez votre code.</translation>
 <translation id="241082044617551207">Plug-in inconnu</translation>
 <translation id="2412593942846481727">Mise à jour disponible</translation>
-<translation id="2414499877591062094">Activer l'envoi automatique via un code</translation>
 <translation id="2416435988630956212">Touches de fonction du clavier</translation>
 <translation id="241727068219398187">Les données ont été chiffrées avec votre mot de passe Google à la date suivante :
           <ph name="TIME" />. Ceci ne s'applique pas aux modes de paiement et adresses Google Pay.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Lire toutes vos données sur les sites auxquels vous accédez</translation>
 <translation id="5242724311594467048">Activer "<ph name="EXTENSION_NAME" />" ?</translation>
 <translation id="5243522832766285132">Veuillez réessayer dans quelques instants</translation>
-<translation id="5244406554036143958">Saisissez votre code pour activer l'envoi automatique</translation>
 <translation id="5244474230056479698">Synchronisation avec <ph name="EMAIL" />…</translation>
 <translation id="5245610266855777041">Démarrer avec un compte scolaire</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> a planté. Cliquez sur cette info-bulle pour redémarrer l'application.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index c359856..f9235d3 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Introduce o PIN</translation>
 <translation id="241082044617551207">Plugin descoñecido</translation>
 <translation id="2412593942846481727">Hai unha actualización dispoñible</translation>
-<translation id="2414499877591062094">Activar envío automático do PIN</translation>
 <translation id="2416435988630956212">Teclas de función do teclado</translation>
 <translation id="241727068219398187">Os datos encriptáronse co teu contrasinal de Google a partir do
           <ph name="TIME" />. Non se inclúen os métodos de pago nin os enderezos de Google Pay.</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">Ler todos os teus datos dos sitios web que visitas</translation>
 <translation id="5242724311594467048">Queres activar <ph name="EXTENSION_NAME" />?</translation>
 <translation id="5243522832766285132">Téntao de novo nuns minutos</translation>
-<translation id="5244406554036143958">Escribe o teu PIN para activar o envío automático</translation>
 <translation id="5244474230056479698">Sincronizando en <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Comeza a utilizar unha conta de centro educativo</translation>
 <translation id="5246282308050205996">Produciuse un erro en <ph name="APP_NAME" />. Fai clic neste globo para reiniciar a aplicación.</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index b6e10e9..c55f585 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1157,7 +1157,6 @@
 <translation id="2408955596600435184">તમારો PIN દાખલ કરો</translation>
 <translation id="241082044617551207">અજ્ઞાત પ્લગિન</translation>
 <translation id="2412593942846481727">અપડેટ ઉપલબ્ધ છે</translation>
-<translation id="2414499877591062094">'ઑટોમૅટિક રીતે પિન સબમિટ કરો' સુવિધા ચાલુ કરો</translation>
 <translation id="2416435988630956212">કીબોર્ડની ફંકશન કી</translation>
 <translation id="241727068219398187">ડેટા <ph name="TIME" />ના રોજ તમારા Google પાસવર્ડ સાથે એન્ક્રિપ્ટ કર્યો હતો.
           આમાં Google Payની ચુકવણી પદ્ધતિઓ અને ઍડ્રેસ સામેલ હોતા નથી.</translation>
@@ -3394,7 +3393,6 @@
 <translation id="5241128660650683457">તમે મુલાકાત લો છો તે વેબસાઇટ્સ પરનો તમારો બધો ડેટા વાંચો</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ને ચાલુ કરીએ?</translation>
 <translation id="5243522832766285132">કૃપા કરીને થોડીવારમાં ફરી પ્રયાસ કરો</translation>
-<translation id="5244406554036143958">ઑટોમૅટિક રીતે સબમિટ કરવાની સુવિધા ચાલુ કરવા માટે તમારો પિન દાખલ કરો</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> પર સમન્વયિત કરી રહ્યાં છે</translation>
 <translation id="5245610266855777041">સ્કૂલ એકાઉન્ટ વડે શરૂઆત કરો</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ક્રેશ થયું છે. એપ્લિકેશનને ફરીથી પ્રારંભ કરવા માટે આ બલૂન ક્લિક કરો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 2272d197..3a117e2 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; एक एमबी</translation>
 <translation id="2352810082280059586">लॉक स्क्रीन के नोट <ph name="LOCK_SCREEN_APP_NAME" /> में अपने आप सेव किए जाते हैं. आपका सबसे हाल का नोट लॉक स्क्रीन पर ही रहेगा.</translation>
 <translation id="2353297238722298836">कैमरे और माइक्रोफ़ोन की अनुमति है</translation>
+<translation id="2355314311311231464">सेट अप नहीं किया जा सका, क्योंकि आपके खाते की जानकारी डाउनलोड नहीं हो सकी. कृपया फिर से कोशिश करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">इंस्टैंट टेदरिंग चालू करें</translation>
 <translation id="2356070529366658676">पूछें</translation>
 <translation id="2357330829548294574"><ph name="USER_NAME" /> हटाएं</translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">अपना पिन डालें</translation>
 <translation id="241082044617551207">अज्ञात प्लग इन</translation>
 <translation id="2412593942846481727">अपडेट मौजूद है</translation>
-<translation id="2414499877591062094">अपने-आप पिन सबमिट होने की सुविधा चालू करें</translation>
 <translation id="2416435988630956212">कीबोर्ड के फ़ंक्शन बटन</translation>
 <translation id="241727068219398187">आपका डेटा <ph name="TIME" /> से आपके Google पासवर्ड के साथ सुरक्षित किया गया था.
 इसमें Google Pay से भुगतान करने के तरीके और पते शामिल नहीं हैं.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">इस पेज का अनुवाद करें</translation>
 <translation id="2475982808118771221">कोई गड़बड़ी आई</translation>
 <translation id="2476578072172137802">साइट की सेटिंग</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> को अनइंस्टॉल करने के लिए Windows को पूरी तरह बंद करें.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" के लिए मीडिया-फ़ाइल अनुमतियां</translation>
 <translation id="247949520305900375">ऑडियो शेयर करें</translation>
 <translation id="248003956660572823">पासवर्ड सेव नहीं किए गए</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> को सिर्फ़ पढ़ने के लिए एक्सेस दी गई है.</translation>
 <translation id="2575247648642144396">यह आइकॉन तब दिखाई देगा जब एक्सटेंशन मौजूदा पेज पर काम कर सकेगा. आइकॉन पर क्लिक करके या <ph name="EXTENSION_SHORTCUT" /> को दबाकर यह एक्सटेंशन चालू करें.</translation>
 <translation id="257779572837908839">मीटिंग के लिए Chromebox के रूप में सेट अप करें</translation>
+<translation id="2579232805407578790">सर्वर से कनेक्ट नहीं किया जा सका. कृपया अपना इंटरनेट जांचें और फिर से कोशिश करें. अगर गड़बड़ी बनी रहती है, तो Chromebook को रीस्टार्ट करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> को एकाधिक फ़ाइलें हमेशा डाउनलोड करने दें</translation>
 <translation id="258095186877893873">लंबा</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (प्‍लेटफ़ॉर्म <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">आपके व्यवस्थापक द्वारा इस उपयोगकर्ता नाम से प्रवेश करना अक्षम कर दिया गया है.</translation>
 <translation id="283669119850230892">नेटवर्क <ph name="NETWORK_ID" /> का उपयोग करने के लिए, सबसे पहले नीचे इंटरनेट से अपना कनेक्‍शन पूरा करें.</translation>
 <translation id="2838379631617906747">इंस्‍टॉल कर रहा है</translation>
+<translation id="2838835911926931318">बुकमार्क, पासवर्ड, इतिहास वगैरह को अपने सभी डिवाइस पर सिंक करने के लिए साइन इन करें</translation>
 <translation id="2839032553903800133">सूचनाएं ब्लॉक की गईं</translation>
 <translation id="2841013758207633010">समय</translation>
 <translation id="2841837950101800123">कंपनी</translation>
@@ -1584,6 +1587,7 @@
     सर्वर का संदेश: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">निर्देशिका द्वारा मीडिया गैलरी जोड़ें</translation>
 <translation id="2910318910161511225">किसी नेटवर्क से कनेक्ट करें और फिर कोशिश करें</translation>
+<translation id="2910718431259223434">कोई गड़बड़ी हुई. कृपया फिर से कोशिश करें. इसके अलावा, डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">साइटों को कुकी डेटा सेव करने और पढ़ने की अनुमति दें (सुझाए गए)</translation>
 <translation id="2915102088417824677">गतिविधि लॉग देखें</translation>
 <translation id="2915873080513663243">अपने आप स्कैन होने की सुविधा</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{एक्सटेंशन को मंज़ूरी दी गई}one{# एक्सटेंशन को मंज़ूरी दी गई}other{# एक्सटेंशन को मंज़ूरी दी गई}}</translation>
 <translation id="3822559385185038546">यह प्रॉक्सी आपके व्‍यवस्‍थापक ने लागू किया है</translation>
 <translation id="3823310065043511710">Linux के लिए कम से कम <ph name="INSTALL_SIZE" /> खाली जगह होनी चाहिए.</translation>
+<translation id="3824621460022590830">डिवाइस का नाम दर्ज करने वाला टोकन अमान्य है. कृपया डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">आपके एडमिन ने और Google खाते जोड़ने की सेटिंग बंद कर दी है</translation>
 <translation id="3827306204503227641">सैंडबॉक्स नहीं किए गए प्लग इन को अनुमति देते रहें</translation>
 <translation id="3827774300009121996">&amp;पूर्ण स्क्रीन</translation>
@@ -3275,6 +3280,7 @@
 <translation id="5079950360618752063">सुझाए गए पासवर्ड का इस्तेमाल करें</translation>
 <translation id="508059534790499809">Kerberos टिकट रीफ़्रेश करें</translation>
 <translation id="5084230410268011727">साइटों को गति और लाइट का उपयोग करने की अनुमति दें</translation>
+<translation id="5084328598860513926">सेट अप करने के दौरान कोई गड़बड़ी हुई. कृपया फिर से कोशिश करें. इसके अलावा, डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">अपडेट जाँच रहा है</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">डिफ़ॉल्ट होमपेज को बहाल करना चाहते हैं?</translation>
@@ -3397,7 +3403,6 @@
 <translation id="5241128660650683457">जिन वेबसाइट पर आप जाते हैं, उन पर मौजूद अपना सारा डेटा पढ़ें</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" को चालू करें?</translation>
 <translation id="5243522832766285132">कृपया कुछ देर बाद कोशिश करें</translation>
-<translation id="5244406554036143958">अपने-आप सबमिट होने की सुविधा चालू करने के लिए अपना पिन डालें</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> से समन्वयित हो रहा है</translation>
 <translation id="5245610266855777041">स्कूल वाले खाते से शुरू करें</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> क्रैश हो गया है. ऐप्‍लिकेशन को रीस्टार्ट करने के लिए इस गुब्‍बारे पर क्‍लिक करें .</translation>
@@ -3674,6 +3679,7 @@
 <translation id="557722062034137776">अपने डिवाइस को रीसेट करना आपके Google खातों या इन खातों से समन्वयित किसी भी डेटा को प्रभावित नहीं करेगा. हालांकि, आपके डिवाइस पर स्थानीय रूप से सहेजी गईं सभी फ़ाइलें हट जाएंगी.</translation>
 <translation id="5578059481725149024">अपने आप साइन इन करें</translation>
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
+<translation id="5581972110672966454">डिवाइस को डोमेन से नहीं जोड़ा जा सकता. कृपया फिर से कोशिश करें. इसके अलावा, डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">मुख्य मेन्यू</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">उपयोगकर्ता नाम सेव करें?</translation>
@@ -3746,6 +3752,7 @@
 <translation id="5667546120811588575">Google Play सेट अप किया जा रहा है...</translation>
 <translation id="5669267381087807207">चालू हो रहा है</translation>
 <translation id="5669691691057771421">नया पिन डालें</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">इमेज ब्लॉक की गईं</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> का सुझाव हटाएं</translation>
 <translation id="567587836466137939">इस डिवाइस को <ph name="MONTH_AND_YEAR" /> तक सॉफ़्टवेयर और सुरक्षा अपडेट अपने-आप मिलेंगे. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation>
@@ -5392,6 +5399,7 @@
 <translation id="7764225426217299476">पता जोड़ें</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> से <ph name="DOWNLOAD_RECEIVED" /></translation>
 <translation id="7765158879357617694">ले जाएं</translation>
+<translation id="7766082757934713382">इससे आप ऐप्लिकेशन और सिस्टम को अपने-आप अपडेट होने से रोक सकते हैं. इससे आपका नेटवर्क डेटा कम खर्च होगा</translation>
 <translation id="7766807826975222231">एक झलक देखें</translation>
 <translation id="7766838926148951335">अनुमतियां स्वीकार करें</translation>
 <translation id="7768770796815395237">बदलें</translation>
@@ -6303,6 +6311,7 @@
 <translation id="885701979325669005">मेमोरी</translation>
 <translation id="8859057652521303089">अपनी भाषा चुनें:</translation>
 <translation id="8859174528519900719">सबफ़्रेम: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">सेवा की शर्तें लोड नहीं की जा सकीं</translation>
 <translation id="8859662783913000679">अभिभावक का खाता</translation>
 <translation id="8862003515646449717">किसी तेज़ ब्राउज़र पर जाएं</translation>
 <translation id="8863753581171631212">नए <ph name="APP" /> में लिंक खोलें</translation>
@@ -6571,6 +6580,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> खोजें</translation>
 <translation id="9201023452444595544">ऑफ़लाइन डेटा को मिटा दिया जाएगा</translation>
 <translation id="9201220332032049474">स्क्रीन लॉक विकल्प</translation>
+<translation id="9201842707396338580">कोई गड़बड़ी हुई. कृपया डिवाइस के मालिक या एडमिन से संपर्क करें. गड़बड़ी कोड: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;प्रोफ़ाइलिंग सक्षम</translation>
 <translation id="9203904171912129171">डिवाइस चुनें</translation>
 <translation id="9203962528777363226">इस डिवाइस के व्यवस्थापक ने नए उपयोगकर्ता जोड़े जाना अक्षम कर दिया है</translation>
@@ -6642,6 +6652,7 @@
 <translation id="983511809958454316">यह सुविधा VR में काम नहीं करती</translation>
 <translation id="984275831282074731">भुगतान के तरीके</translation>
 <translation id="98515147261107953">लैंडस्केप</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">सामान्य</translation>
 <translation id="987897973846887088">कोई इमेज उपलब्ध नहीं है</translation>
 <translation id="988978206646512040">खाली 'पासफ़्रेज़' की अनुमति नहीं है</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 4319621..e1a1a43d 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Unesite PIN</translation>
 <translation id="241082044617551207">Nepoznati dodatak</translation>
 <translation id="2412593942846481727">Dostupno je ažuriranje</translation>
-<translation id="2414499877591062094">Omogući automatsko slanje PIN-a</translation>
 <translation id="2416435988630956212">Funkcijske tipke na tipkovnici</translation>
 <translation id="241727068219398187">Podaci su kriptirani vašom Google zaporkom od
           <ph name="TIME" />. To ne uključuje načine plaćanja i adrese s Google Paya.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">čitati sve vaše podatke s web-lokacija koje posjetite</translation>
 <translation id="5242724311594467048">Omogućiti proširenje "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Pokušajte ponovo za nekoliko trenutaka.</translation>
-<translation id="5244406554036143958">Unesite PIN da biste omogućili automatsko slanje</translation>
 <translation id="5244474230056479698">Sinkronizira se s računom <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Početak rada sa školskim računom</translation>
 <translation id="5246282308050205996">Aplikacija <ph name="APP_NAME" /> srušila se. Kliknite ovaj balon za ponovno pokretanje aplikacije.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 712ef78..6161666 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">PIN-kód megadása</translation>
 <translation id="241082044617551207">Ismeretlen beépülő modul</translation>
 <translation id="2412593942846481727">Rendelkezésre áll frissítés</translation>
-<translation id="2414499877591062094">Az automatikus küldés engedélyezéséhez szükséges PIN-kód</translation>
 <translation id="2416435988630956212">Billentyűzet funkciógombjai</translation>
 <translation id="241727068219398187">Az adatok titkosítva lettek Google-jelszavával ekkor:
           <ph name="TIME" />. Ez nem tartalmazza a Google Payben megadott fizetési módokat és címeket.</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">Az összes adat beolvasása a felkeresett webhelyekről</translation>
 <translation id="5242724311594467048">Engedélyezi a következőt: „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Próbálkozzon újra néhány pillanat múlva</translation>
-<translation id="5244406554036143958">Az automatikus küldés engedélyezéséhez adja meg PIN-kódját</translation>
 <translation id="5244474230056479698">Szinkronizálás a következővel: <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Kezdő lépések az iskolai fiókkal</translation>
 <translation id="5246282308050205996">A(z) <ph name="APP_NAME" /> összeomlott. Az alkalmazás újraindításához kattintson erre a buborékra.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 09e2359..1065b6cdc 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Մուտքագրեք ձեր PIN կոդը</translation>
 <translation id="241082044617551207">Անհայտ փլագին</translation>
 <translation id="2412593942846481727">Հասանելի է նոր տարբերակը</translation>
-<translation id="2414499877591062094">Միացնել PIN կոդի ավտոմատ ուղարկումը</translation>
 <translation id="2416435988630956212">Ստեղնաշարի գործառական ստեղներ</translation>
 <translation id="241727068219398187">Տվյալները գաղտնագրվել են ձեր Google գաղտնաբառով
           <ph name="TIME" />-ին։ Գաղտնագրումը չի կիրառվում վճարման եղանակների և Google Pay-ի հասցեների համար։</translation>
@@ -3406,7 +3405,6 @@
 <translation id="5241128660650683457">Կարդալ ձեր այցելած կայքերի բոլոր տվյալները</translation>
 <translation id="5242724311594467048">Միացնե՞լ «<ph name="EXTENSION_NAME" />» ընդլայնումը:</translation>
 <translation id="5243522832766285132">Մի քանի րոպեից նորից փորձեք</translation>
-<translation id="5244406554036143958">Ավտոմատ ուղարկումը միացնելու համար մուտքագրեք PIN-ը</translation>
 <translation id="5244474230056479698">Համաժամացում <ph name="EMAIL" />-ի հետ</translation>
 <translation id="5245610266855777041">Սկսեք ձեր ուսումնական հաշվից</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" />-ը խափանվել է: Հավելվածը վերագործարկելու համար սեղմեք այս փուչիկի վրա:</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 382f100..39c3c53 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Masukkan PIN</translation>
 <translation id="241082044617551207">Plugin tidak dikenal</translation>
 <translation id="2412593942846481727">Update tersedia</translation>
-<translation id="2414499877591062094">Aktifkan PIN kirim otomatis</translation>
 <translation id="2416435988630956212">Tombol fungsi keyboard</translation>
 <translation id="241727068219398187">Data dienkripsi dengan sandi Google Anda mulai tanggal
 <ph name="TIME" />. Data ini tidak mencakup alamat dan metode pembayaran dari Google Pay.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Membaca semua data pada situs web yang Anda kunjungi</translation>
 <translation id="5242724311594467048">Aktifkan "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Coba lagi setelah beberapa saat</translation>
-<translation id="5244406554036143958">Masukkan PIN Anda untuk mengaktifkan pengiriman otomatis</translation>
 <translation id="5244474230056479698">Menyinkronkan dengan <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Mulai gunakan akun sekolah</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ngadat. Klik balon ini untuk menyalakan kembali apl.</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 777695ba..d38f2ba 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Sláðu inn PIN-númerið þitt</translation>
 <translation id="241082044617551207">Óþekkt viðbót</translation>
 <translation id="2412593942846481727">Uppfærsla í boði</translation>
-<translation id="2414499877591062094">Kveikja á sjálfvirkri PIN-sendingu</translation>
 <translation id="2416435988630956212">Aðgerðalyklar á lyklaborði</translation>
 <translation id="241727068219398187">Gögnin voru dulkóðuð með aðgangsorði Google
           <ph name="TIME" />. Þetta gildir ekki um greiðslumáta og heimilisföng af Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Lesa öll gögnin þín á vefsvæðum sem þú heimsækir</translation>
 <translation id="5242724311594467048">Kveikja á „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="5243522832766285132">Reyndu aftur eftir smástund</translation>
-<translation id="5244406554036143958">Sláðu inn PIN-númerið þitt til að kveikja á sjálfvirkri sendingu</translation>
 <translation id="5244474230056479698">Samstillir við <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Byrjaðu að nota skólareikning</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> hrundi. Smelltu á þessa blöðru til að endurræsa forritið.</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index c5ecdf3..07b2490d 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Inserisci il codice PIN</translation>
 <translation id="241082044617551207">Plug-in sconosciuto</translation>
 <translation id="2412593942846481727">Aggiornamento disponibile</translation>
-<translation id="2414499877591062094">Attiva l'invio automatico del PIN</translation>
 <translation id="2416435988630956212">Tasti funzione della tastiera</translation>
 <translation id="241727068219398187">I dati sono stati criptati con la tua password Google dal giorno <ph name="TIME" />. Non sono inclusi i metodi di pagamento e gli indirizzi di Google Pay.</translation>
 <translation id="2419131370336513030">Visualizzare le app installate</translation>
@@ -3397,7 +3396,6 @@
 <translation id="5241128660650683457">Lettura di tutti i dati sui siti web visitati</translation>
 <translation id="5242724311594467048">Attivare "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Riprova tra qualche istante</translation>
-<translation id="5244406554036143958">Inserisci il PIN per attivare l'invio automatico</translation>
 <translation id="5244474230056479698">Sincronizzazione con <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Inizia a usare un account della scuola</translation>
 <translation id="5246282308050205996">Arresto anomalo di <ph name="APP_NAME" />. Fai clic su questo fumetto per riavviare l'applicazione.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 30cd3cb..4392afe 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">‏הזן את מספר ה-PIN</translation>
 <translation id="241082044617551207">פלאגין לא ידוע</translation>
 <translation id="2412593942846481727">יש עדכון זמין</translation>
-<translation id="2414499877591062094">הפעלת שליחה אוטומטית באמצעות קוד אימות</translation>
 <translation id="2416435988630956212">מקשי פונקציה במקלדת</translation>
 <translation id="241727068219398187">‏נתונים הוצפנו עם סיסמת Google שלך החל מ-
           <ph name="TIME" />. ההצפנה לא כוללת אמצעי תשלום וכתובות מ-Google Pay.</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">קריאת כל הנתונים שלך באתרים שבהם אתה מבקר</translation>
 <translation id="5242724311594467048">האם להפעיל את "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">צריך לנסות שוב בעוד כמה רגעים</translation>
-<translation id="5244406554036143958">כדי להפעיל שליחה אוטומטית, עליך להזין את קוד האימות שלך</translation>
 <translation id="5244474230056479698">מסנכרן ל-<ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">תחילת העבודה עם חשבון בית ספרי</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> קרס. לחץ על בלון זה כדי להפעיל מחדש את היישום.</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 844049c..f47b21bd 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">PIN を入力してください</translation>
 <translation id="241082044617551207">不明なプラグイン</translation>
 <translation id="2412593942846481727">アップデートが利用可能</translation>
-<translation id="2414499877591062094">PIN の自動送信を有効にする</translation>
 <translation id="2416435988630956212">キーボードのファンクション キー</translation>
 <translation id="241727068219398187"><ph name="TIME" />時点の Google パスワードでデータを暗号化しました。
           なお、Google Pay のお支払い方法と住所はこれには含まれていません。</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">アクセスしたウェブサイトでのすべてのユーザーデータの読み取り</translation>
 <translation id="5242724311594467048">「<ph name="EXTENSION_NAME" />」を有効にしますか?</translation>
 <translation id="5243522832766285132">しばらくしてからもう一度お試しください</translation>
-<translation id="5244406554036143958">自動送信を有効にするには PIN を入力してください</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> に同期しています</translation>
 <translation id="5245610266855777041">学校用アカウントのご利用開始</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> がクラッシュしました。このバルーンをクリックして再起動してください。</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index c04b837..f1a52954 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">შეიყვანეთ თქვენი PIN-კოდი</translation>
 <translation id="241082044617551207">უცნობი დანამატი</translation>
 <translation id="2412593942846481727">ხელმისაწვდომია განახლება</translation>
-<translation id="2414499877591062094">PIN-კოდის ავტომატური გადაგზავნის ჩართვა</translation>
 <translation id="2416435988630956212">კლავიატურის ფუნქციური კლავიშები</translation>
 <translation id="241727068219398187">მონაცემები დაშიფრულია თქვენი Google პაროლით <ph name="TIME" />-ის მდგომარეობით. აღნიშნული არ მოიცავს Google Pay-ში შენახულ გადახდის მეთოდებსა და მისამართებს.</translation>
 <translation id="2419131370336513030">დაინსტალირებული აპების ნახვა</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">წაიკითხეთ თქვენი მთლიანი მონაცემები მონახულებულ ვებსაიტებზე</translation>
 <translation id="5242724311594467048">ჩავრთოთ "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">გთხოვთ, სცადოთ რამდენიმე წუთში</translation>
-<translation id="5244406554036143958">ავტომატური გადაგზავნის ჩასართავად შეიყვანეთ თქვენი PIN-კოდი</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />-თან სინქრონიზაცია</translation>
 <translation id="5245610266855777041">დაიწყეთ სასწავლებლის ანგარიშით სარგებლობა</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" />-ში შეცდომაა. პროგრამის გადასატვირთად დააწკაპუნეთ ამ ბუშტზე.</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index a8047e4..336fe630 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1118,6 +1118,7 @@
 <translation id="2352662711729498748">&lt; 1 МБ</translation>
 <translation id="2352810082280059586">Экран құлпы жөніндегі ескертпелері автоматты түрде <ph name="LOCK_SCREEN_APP_NAME" /> қолданбасына сақталған. Ең соңғы ескертпе құлып экранында берілген.</translation>
 <translation id="2353297238722298836">Камера мен микрофонды пайдалануға рұқсат берілген</translation>
+<translation id="2355314311311231464">Инициализация сәтсіз аяқталды, себебі есептік жазба деректерін шығарып алу мүмкін болмады. Қайталап көріңіз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Жылдам тетерингті қосу</translation>
 <translation id="2356070529366658676">Сұрау</translation>
 <translation id="2357330829548294574">Пайдаланушыны (<ph name="USER_NAME" />) өшіру</translation>
@@ -1158,7 +1159,6 @@
 <translation id="2408955596600435184">PIN кодын енгізіңіз</translation>
 <translation id="241082044617551207">Белгісіз плагин</translation>
 <translation id="2412593942846481727">Жаңартылған нұсқа қолжетімді</translation>
-<translation id="2414499877591062094">PIN кодын автоматты түрде жіберуді қосу</translation>
 <translation id="2416435988630956212">Пернетақтаның функциялық пернелері</translation>
 <translation id="241727068219398187">Деректер <ph name="TIME" /> күні сақталған Google құпия сөзімен шифрланған.
           Google Pay қызметіндегі төлеу әдістері мен мекенжайлар құпия фразамен шифрланбайды.</translation>
@@ -1213,6 +1213,7 @@
 <translation id="2473195200299095979">Осы бетті аудару</translation>
 <translation id="2475982808118771221">Қате орын алды</translation>
 <translation id="2476578072172137802">Сайт параметрлері</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> бағдарламасын жою үшін Windows жүйесін өшіріңіз.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" үшін мультимедиа файлының рұқсаттары</translation>
 <translation id="247949520305900375">Аудиомен бөлісу</translation>
 <translation id="248003956660572823">Құпия сөздер сақталмаған</translation>
@@ -1303,6 +1304,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> тек оқу құқығы берілді.</translation>
 <translation id="2575247648642144396">Бұл бетбелгі кеңейтім ағымдағы бетте әрекет еткенде ғана көрінеді. Бұл кеңейтімді белгішені басу арқылы немесе <ph name="EXTENSION_SHORTCUT" /> басу арқылы пайдаланыңыз.</translation>
 <translation id="257779572837908839">Кездесулерге арналған Chromebox құрылғысы ретінде реттеу</translation>
+<translation id="2579232805407578790">Серверге қосылмады. Желі байланысын тексеріп, қайталап көріңіз. Егер мәселе жойылмаса, Chromebook құрылғысын өшіріп қайта қосыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> хостына әрқашан бірнеше файлды жүктеуге рұқсат беру</translation>
 <translation id="258095186877893873">Ұзақ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> платформасы) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1522,6 +1524,7 @@
 <translation id="2836635946302913370">Бұл пайдаланушы атымен кіру мүмкіндігін әкімші өшірген.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> желісін пайдалану үшін алдымен төмендегі интернет байланысын орнатып болыңыз.</translation>
 <translation id="2838379631617906747">Орнатылуда</translation>
+<translation id="2838835911926931318">Барлық құрылғыларда бетбелгілерді, құпия сөздерді, тарихты және т.б. синхрондау үшін есептік жазбаға кіріңіз.</translation>
 <translation id="2839032553903800133">Хабарландырулар бөгелді.</translation>
 <translation id="2841013758207633010">Уақыт</translation>
 <translation id="2841837950101800123">Провайдер</translation>
@@ -1581,6 +1584,7 @@
     Сервер хабары: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Каталог бойынша медиа галереяны қосу</translation>
 <translation id="2910318910161511225">Желімен байланыс орнатып, әрекетті қайталап көріңіз</translation>
+<translation id="2910718431259223434">Бірдеңе дұрыс болмады. Әрекетті қайталаңыз немесе құрылғының иесіне не әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Сайттарға cookie деректерін сақтауға және оқуға рұқсат беру (ұсынылған)</translation>
 <translation id="2915102088417824677">Әрекеттер журналын көру</translation>
 <translation id="2915873080513663243">Автоматты түрде сканерлеу</translation>
@@ -2320,6 +2324,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Кеңейтім мақұлданды.}other{# кеңейтім мақұлданды.}}</translation>
 <translation id="3822559385185038546">Бұл прокси-серверді әкімші іске қосқан</translation>
 <translation id="3823310065043511710">Linux үшін кемінде <ph name="INSTALL_SIZE" /> орын қажет.</translation>
+<translation id="3824621460022590830">Құрылғыны тіркеу токені жарамсыз. Құрылғының иесіне немесе әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Әкімшіңіз Google есептік жазбаларын енгізуді өшіріп қойған.</translation>
 <translation id="3827306204503227641">Сынақ ортасынан тыс плагиндерге берілген рұқсатты сақтау</translation>
 <translation id="3827774300009121996">&amp;Толық экран</translation>
@@ -3273,6 +3278,7 @@
 <translation id="5079950360618752063">Ұсынылған құпия сөзді пайдалану</translation>
 <translation id="508059534790499809">Kerberos билетін жаңарту</translation>
 <translation id="5084230410268011727">Сайттардың қозғалыс және жарық датчиктерін пайдалануына рұқсат беру</translation>
+<translation id="5084328598860513926">Инициализация үзілді. Әрекетті қайталаңыз немесе құрылғының иесіне не әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Жаңартуларды тексеру</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Реттелмелі үлкен курсор қалпына келтірілсін бе?</translation>
@@ -3395,7 +3401,6 @@
 <translation id="5241128660650683457">Сіз кіретін веб-сайттардағы барлық деректеріңізді оқу</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" қосасыз ба?</translation>
 <translation id="5243522832766285132">Бірнеше минуттан кейін қайталап көріңіз</translation>
-<translation id="5244406554036143958">Авто жіберуді іске қосу үшін PIN кодын енгізіңіз.</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> электрондық поштасымен синхрондау</translation>
 <translation id="5245610266855777041">Жұмысты оқу есептік жазбасымен бастау</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> жұмысы тоқтатылды. Қолданбаны қайта іске қосу үшін осы хабарды басыңыз.</translation>
@@ -3672,6 +3677,7 @@
 <translation id="557722062034137776">Құрылғыңызды қалпына келтіру Google есептік жазбаларыңызға немесе кез келген осы есептік жазбалармен синхрондалған деректерге әсер етпейді. Дегенмен, құрылғыңызда жергілікті сақталған барлық файлдар жойылады.</translation>
 <translation id="5578059481725149024">Автоматты түрде кіру</translation>
 <translation id="558170650521898289">Microsoft Windows Hardware Driver Verification</translation>
+<translation id="5581972110672966454">Құрылғыны доменге қосу мүмкін емес. Әрекетті қайталаңыз немесе құрылғының иесіне не әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Басты мәзір</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Пайдаланушы аты сақталсын ба?</translation>
@@ -3744,6 +3750,7 @@
 <translation id="5667546120811588575">Google Play орнатылуда...</translation>
 <translation id="5669267381087807207">Белсендірілуде</translation>
 <translation id="5669691691057771421">Жаңа PIN кодын енгізіңіз</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Кескіндер бөгелді</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> ұсынысын өшіру</translation>
 <translation id="567587836466137939">Бұл құрылғыға бағдарламалық құрал мен қауіпсіздік жүйесінің автоматты жаңартулары <ph name="MONTH_AND_YEAR" /> дейін жіберіледі. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation>
@@ -5390,6 +5397,7 @@
 <translation id="7764225426217299476">Мекенжай қосу</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> доменінен <ph name="DOWNLOAD_RECEIVED" /></translation>
 <translation id="7765158879357617694">Жылжыту</translation>
+<translation id="7766082757934713382">Автоматты қолданбаны және жүйелік жаңартуларды кідірту арқылы желінің дерек трафигін азайтуға көмектеседі.</translation>
 <translation id="7766807826975222231">Тур жасаңыз</translation>
 <translation id="7766838926148951335">Рұқсаттарды қабылдау</translation>
 <translation id="7768770796815395237">Өзгерту</translation>
@@ -6301,6 +6309,7 @@
 <translation id="885701979325669005">Сақтау</translation>
 <translation id="8859057652521303089">Тіліңізді таңдаңыз:</translation>
 <translation id="8859174528519900719">Ішкі жақтау: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Қызмет көрсету шарттары жүктелмеді.</translation>
 <translation id="8859662783913000679">Ата-ананың есептік жазбасы</translation>
 <translation id="8862003515646449717">Жылдам браузерге ауысыңыз</translation>
 <translation id="8863753581171631212">Сілтемені жаңа <ph name="APP" /> қолданбасында ашу</translation>
@@ -6569,6 +6578,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> арқылы іздеу</translation>
 <translation id="9201023452444595544">Барлық офлайн деректер өшіріледі.</translation>
 <translation id="9201220332032049474">Экран құлпы опциялары</translation>
+<translation id="9201842707396338580">Бірдеңе дұрыс болмады. Құрылғының иесіне немесе әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Профильдеу қосылған</translation>
 <translation id="9203904171912129171">Құрылғыны таңдау</translation>
 <translation id="9203962528777363226">Бұл құрылғының әкімшісі жаңа пайдаланушыларды қосу мүмкіндігін өшірді</translation>
@@ -6640,6 +6650,7 @@
 <translation id="983511809958454316">Бұл функция VR режимінде қолданылмайды</translation>
 <translation id="984275831282074731">Төлеу әдістері</translation>
 <translation id="98515147261107953">Альбомдық</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Жалпы</translation>
 <translation id="987897973846887088">Суреттер қолжетімді емес</translation>
 <translation id="988978206646512040">Құпия фраза бос болмауы керек</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index a899d77..1977686 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">ចំណាំ​អេក្រង់​ចាក់សោ​ត្រូវ​បាន​រក្សាទុក​ទៅ​ក្នុង <ph name="LOCK_SCREEN_APP_NAME" /> ដោយស្វ័យប្រវត្តិ។ ចំណាំថ្មី​បំផុត​របស់អ្នក​នឹងនៅតែមាន​នៅលើ​អេក្រង់​ចាក់​សោ​ដដែល។</translation>
 <translation id="2353297238722298836">បាន​អនុញ្ញាត​ឱ្យប្រើ​កាមេរ៉ា និង​មីក្រូហ្វូន</translation>
+<translation id="2355314311311231464">ការផ្ដល់មិនបានសម្រេច ដោយសារមិនអាចទាញយកព័ត៌មានលម្អិតអំពីគណនីរបស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀត។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="2355604387869345912">បើក​ការភ្ជាប់​ភ្លាមៗ</translation>
 <translation id="2356070529366658676">សួរ</translation>
 <translation id="2357330829548294574">លុប <ph name="USER_NAME" /> ចេញ</translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">បញ្ចូល​កូដ PIN របស់​អ្នក</translation>
 <translation id="241082044617551207">កម្មវិធីជំនួយដែលមិនស្គាល់</translation>
 <translation id="2412593942846481727">មាន​កំណែថ្មី</translation>
-<translation id="2414499877591062094">បើកការដាក់បញ្ជូនកូដ PIN ដោយស្វ័យប្រវត្តិ</translation>
 <translation id="2416435988630956212">គ្រាប់ចុច​មុខងារ​នៅលើក្ដារចុច</translation>
 <translation id="241727068219398187">ទិន្នន័យត្រូវបានអ៊ីនគ្រីបដោយប្រើពាក្យសម្ងាត់ Google របស់អ្នក ពីថ្ងៃទី
           <ph name="TIME" />។ ការ​អ៊ីនគ្រីបនេះមិន​រួមបញ្ចូល​អាសយដ្ឋាន និងវិធីបង់ប្រាក់​ពី Google Pay ទេ។</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">បកប្រែទំព័រនេះ</translation>
 <translation id="2475982808118771221">កំហុសឆ្គងមួយបានកើតឡើង</translation>
 <translation id="2476578072172137802">ការកំណត់គេហទំព័រ</translation>
+<translation id="2476974672882258506">បិទ Windows ដើម្បីលុប <ph name="PARALLELS_DESKTOP" />។</translation>
 <translation id="2478176599153288112">ការអនុញ្ញាតឯកសារកំសាន្តសម្រាប់ "<ph name="EXTENSION" />"</translation>
 <translation id="247949520305900375">ចែករំលែកសម្លេង</translation>
 <translation id="248003956660572823">មិនបាន​រក្សាទុក​ពាក្យសម្ងាត់​ទេ</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">ការចូលប្រើការអានប៉ុណ្ណោះលើ <ph name="VOLUME_NAME" /> ត្រូវបានផ្តល់ជូន។</translation>
 <translation id="2575247648642144396">រូបតំណាងនេះនឹងអាចមើលឃើញ នៅពេលកម្មវិធីបន្ថែមអាចធ្វើសកម្មភាពនៅលើទំព័របច្ចុប្បន្ន។ ប្រើកម្មវិធីបន្ថែមនេះដោយការចុចនៅលើរូបតំណាងនេះ ដោយការចុច <ph name="EXTENSION_SHORTCUT" />។</translation>
 <translation id="257779572837908839">រៀបចំជា Chromebox សម្រាប់ការប្រជុំ</translation>
+<translation id="2579232805407578790">មិនអាច​ភ្ជាប់ជាមួយ​ម៉ាស៊ីនមេបានទេ។ សូម​ពិនិត្យ​មើល​ការ​តភ្ជាប់​បណ្ដាញ​របស់​អ្នក​ រួច​ព្យាយាម​ម្ដង​ទៀត​។ ប្រសិនបើបញ្ហានៅតែបន្តកើតមាន សូមចាប់ផ្ដើម Chromebook របស់អ្នក​ឡើងវិញ។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="2580889980133367162">អនុញ្ញាតឲ្យ <ph name="HOST" /> ទាញយកឯកសារច្រើនជានិច្ច</translation>
 <translation id="258095186877893873">វែង</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (អង្គប្រតិបត្តិការ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">ការចូលដោយជាមួយឈ្មោះអ្នកប្រើនេះត្រូវបាន</translation>
 <translation id="283669119850230892">ដើម្បីប្រើបណ្តាញ <ph name="NETWORK_ID" /> ជាដំបូងបំពេញការភ្ជាប់របស់អ្នកទៅអ៊ីនធឺណិតខាងក្រោម។</translation>
 <translation id="2838379631617906747">កំពុងដំឡើង</translation>
+<translation id="2838835911926931318">ចូលគណនី ដើម្បីធ្វើសមកាលកម្ម​ចំណាំ ពាក្យសម្ងាត់ ប្រវត្តិរបស់អ្នក និងអ្វីៗជាច្រើនទៀត​នៅលើឧបករណ៍ទាំងអស់​របស់អ្នក</translation>
 <translation id="2839032553903800133">បាន​ទប់ស្កាត់​ការជូនដំណឹង</translation>
 <translation id="2841013758207633010">ពេលវេលា</translation>
 <translation id="2841837950101800123">ក្រុមហ៊ុនផ្តល់សេវាកម្ម</translation>
@@ -1584,6 +1587,7 @@
     សារពីម៉ាស៊ីនមេ៖ <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">បន្ថែមវិចិត្រសាលកំសាន្តតាមថតឯកសារ</translation>
 <translation id="2910318910161511225">សូមភ្ជាប់​បណ្តាញ រួច​ព្យាយាម​ម្តងទៀត</translation>
+<translation id="2910718431259223434">មានអ្វីមួយខុសប្រក្រតី។ សូម​ព្យាយាម​ម្ដងទៀត ឬ​ទាក់ទង​អ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍របស់អ្នក។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="2913331724188855103">អនុញ្ញាតឲ្យគេហទំព័ររក្សាទុក និងអានទិន្នន័យខុកឃី (បានណែនាំ)</translation>
 <translation id="2915102088417824677">មើល​កំណត់ហេតុ​សកម្មភាព</translation>
 <translation id="2915873080513663243">ស្កេនដោយស្វ័យប្រវត្តិ</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{កម្មវិធីបន្ថែមមួយ​ត្រូវបាន​អនុញ្ញាតហើយ}other{កម្មវិធីបន្ថែម # ត្រូវបាន​អនុញ្ញាតហើយ}}</translation>
 <translation id="3822559385185038546">ប្រូកស៊ី​នេះ​ត្រូវបាន​អនុវត្ត​ដោយ​អ្នកគ្រប់គ្រង​របស់​អ្នក</translation>
 <translation id="3823310065043511710">យ៉ាងហោច​ណាស់ <ph name="INSTALL_SIZE" /> នៃទំហំផ្ទុក​ត្រូវបានណែនាំឱ្យប្រើ​សម្រាប់ Linux។</translation>
+<translation id="3824621460022590830">ធាតុកូដចុះឈ្មោះឧបករណ៍​មិនត្រឹមត្រូវទេ។ សូមទាក់ទង​អ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍​របស់អ្នក។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="3826440694796503677">អ្នកគ្រប់គ្រង​របស់អ្នក​បានបិទ​ការបញ្ចូល​គណនី Google បន្ថែម</translation>
 <translation id="3827306204503227641">បន្តអនុញ្ញាតកម្មវិធីជំនួយដែលមិនបានសេនបក់</translation>
 <translation id="3827774300009121996">ពេញអេក្រង់</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">ប្រើពាក្យសម្ងាត់​ដែល​បាន​ណែនាំ</translation>
 <translation id="508059534790499809">ផ្ទុកសំបុត្រ Kerberos ឡើងវិញ</translation>
 <translation id="5084230410268011727">អនុញ្ញាត​ឱ្យ​ទំព័រ​ប្រើ​ឧបករណ៍​ចាប់សញ្ញា​ពន្លឺ និងចលនា</translation>
+<translation id="5084328598860513926">ដំណើរការផ្ដល់​ត្រូវបានកាត់ផ្ដាច់។ សូម​ព្យាយាម​ម្ដងទៀត ឬ​ទាក់ទង​អ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍របស់អ្នក។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="5085162214018721575">កំពុងពិនិត្យរកការធ្វើបច្ចុប្បន្នភាព</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">ស្តារទំព័រដើមលំនាំដើម?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">អានទិន្នន័យរបស់អ្នកទាំងអស់នៅលើគេហទំព័រដែលអ្នកបានទៅកាន់។</translation>
 <translation id="5242724311594467048">បើកដំណើរការ "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">សូម​ព្យាយាម​ម្ដង​ទៀត​នៅ​ពេល​បន្តិច​ទៀត</translation>
-<translation id="5244406554036143958">បញ្ចូលកូដ PIN របស់អ្នក ដើម្បីបើកការដាក់បញ្ជូនដោយស្វ័យប្រវត្តិ</translation>
 <translation id="5244474230056479698">កំពុងធ្វើសមកាលកម្មទៅ <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">ចាប់ផ្តើម​ដោយប្រើ​គណនីសាលារៀន</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> បានគាំង។ ចុចប៉េងប៉ោងនេះដើម្បីចាប់ផ្តើមកម្មវិធីនេះឡើងវិញ។</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">ការកំណត់ឧបករណ៍របស់អ្នកឡើងវិញនឹងមិនប៉ះពាល់ដល់គណនី Google របស់អ្នក ឬទិន្នន័យំណាមួយដែលបានធ្វើសមកម្មទៅគណនីទាំងនេះទេ។ ទោះបីជាយ៉ាងណាក៏ដោយ ឯកសារទាំងអស់ដែលបានរក្សាទុកជាមូលដ្ឋាននៅលើឧបករណ៍របស់អ្នកនឹងត្រូវលុប។</translation>
 <translation id="5578059481725149024">ចូល​ដោយស្វ័យប្រវត្តិ</translation>
 <translation id="558170650521898289">ការផ្ទៀងផ្ទាត់ដ្រាយវ័រផ្នែករឹង Microsoft Windows</translation>
+<translation id="5581972110672966454">មិនអាចភ្ជាប់ឧបករណ៍ជាមួយដែនបានទេ។ សូម​ព្យាយាម​ម្ដងទៀត ឬ​ទាក់ទង​អ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍របស់អ្នក។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="5582839680698949063">ម៉ឺនុយមេ</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">រក្សាទុកឈ្មោះ​អ្នកប្រើប្រាស់?</translation>
@@ -3748,6 +3754,7 @@
 <translation id="5667546120811588575">កំពុង​រៀបចំ Google Play...</translation>
 <translation id="5669267381087807207">កំពុងធ្វើសកម្មភាព</translation>
 <translation id="5669691691057771421">បញ្ចូលកូដ PIN ថ្មី</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">បានទប់ស្កាត់រូបភាព</translation>
 <translation id="5671658447180261823">លុបការ​ណែនាំ <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">ឧបករណ៍នេះ​នឹងទទួលបាន​កំណែកម្មវិធី និងសុវត្ថិភាពថ្មី​ដោយស្វ័យប្រវត្តិ រហូតដល់ខែ <ph name="MONTH_AND_YEAR" />។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation>
@@ -5394,6 +5401,7 @@
 <translation id="7764225426217299476">បន្ថែមអាសយដ្ឋាន</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> ពី <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">ផ្លាស់ទី</translation>
+<translation id="7766082757934713382">ជួយកាត់បន្ថយ​ការប្រើប្រាស់ទិន្នន័យបណ្ដាញ​ដោយផ្អាកការធ្វើបច្ចុប្បន្នភាពប្រព័ន្ធ និងកម្មវិធីដោយស្វ័យប្រវត្តិ</translation>
 <translation id="7766807826975222231">ចូលទស្សនាស្វែងយល់</translation>
 <translation id="7766838926148951335">ទទួលយក​ការអនុញ្ញាត</translation>
 <translation id="7768770796815395237">ប្ដូរ</translation>
@@ -6305,6 +6313,7 @@
 <translation id="885701979325669005">ឧបករណ៍ផ្ទុកទិន្នន័យ</translation>
 <translation id="8859057652521303089">ជ្រើសរើសភាសារបស់អ្នក៖</translation>
 <translation id="8859174528519900719">ហ្វ្រេមរង៖ <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">មិនអាចផ្ទុក​លក្ខខណ្ឌប្រើប្រាស់​បានទេ</translation>
 <translation id="8859662783913000679">គណនី​មាតាបិតា</translation>
 <translation id="8862003515646449717">ប្តូរទៅ​កម្មវិធីរុករកតាមអ៊ីនធឺណិតដែលរហ័ស</translation>
 <translation id="8863753581171631212">បើក​តំណ​នៅក្នុង <ph name="APP" /> ថ្មី</translation>
@@ -6573,6 +6582,7 @@
 <translation id="920045321358709304">ស្វែងរក <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">រាល់​​ទិន្នន័យ​ដែលបានផ្ទុកក្នុងឧបករណ៍​នឹង​ត្រូវបាន​សម្អាត</translation>
 <translation id="9201220332032049474">ជម្រើស​ចាក់សោអេក្រង់</translation>
+<translation id="9201842707396338580">មានអ្វីមួយខុសប្រក្រតី។ សូមទាក់ទង​អ្នកគ្រប់គ្រង ឬម្ចាស់ឧបករណ៍​របស់អ្នក។ លេខ​កូដ​បញ្ហា៖ <ph name="ERROR_CODE" />។</translation>
 <translation id="9203398526606335860">បើកដំណើរការទម្រង់</translation>
 <translation id="9203904171912129171">ជ្រើសរើស​ឧបករណ៍</translation>
 <translation id="9203962528777363226">អ្នកគ្រប់គ្រងឧបករណ៍នេះបានបិទការបន្ថែមអ្នកប្រើថ្មី</translation>
@@ -6644,6 +6654,7 @@
 <translation id="983511809958454316">មិនស្គាល់​មុខងារនេះ​នៅក្នុង VR ទេ</translation>
 <translation id="984275831282074731">វិធី​បង់ប្រាក់</translation>
 <translation id="98515147261107953">ផ្តេក</translation>
+<translation id="987068745968718743">Parallels Desktop៖ <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">ទូទៅ</translation>
 <translation id="987897973846887088">មិនមាន​រូបភាពទេ</translation>
 <translation id="988978206646512040">ឃ្លាសម្ងាត់​ដែល​ទទេ​មិនត្រូវ​បាន​អនុញ្ញាត​ទេ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index c1416f3f..5e4950a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ</translation>
 <translation id="241082044617551207">ಅಪರಿಚಿತ ಪ್ಲಗ್-ಇನ್</translation>
 <translation id="2412593942846481727">ಅಪ್‌ಡೇಟ್‌‌ ಲಭ್ಯವಿದೆ</translation>
-<translation id="2414499877591062094">ಪಿನ್ ಅನ್ನು ಸ್ವಯಂ ಸಲ್ಲಿಸುವ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="2416435988630956212">ಕೀಬೋರ್ಡ್ ಫಂಕ್ಷನ್ ಕೀಗಳು</translation>
 <translation id="241727068219398187"><ph name="TIME" /> ರಂದು ಬಳಕೆಯಲ್ಲಿದ್ದ ನಿಮ್ಮ Google ಪಾಸ್‌ವರ್ಡ್‌ ಬಳಸಿಕೊಂಡು ಡೇಟಾವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಇದು Google Pay ನಿಂದ ಪಾವತಿ ವಿಧಾನಗಳು ಮತ್ತು ವಿಳಾಸಗಳನ್ನು ಒಳಗೊಂಡಿರುವುದಿಲ್ಲ.</translation>
 <translation id="2419131370336513030">ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation>
@@ -3399,7 +3398,6 @@
 <translation id="5241128660650683457">ನೀವು ಭೇಟಿ ನೀಡುವ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಓದಿ</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" ಸಕ್ರಿಯಗೊಳಿಸುವುದೆ?</translation>
 <translation id="5243522832766285132">ದಯವಿಟ್ಟು ಕೆಲವು ಕ್ಷಣಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
-<translation id="5244406554036143958">ಸ್ವಯಂ ಸಲ್ಲಿಕೆ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಪಿನ್ ನಮೂದಿಸಿ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="5245610266855777041">ಶಾಲಾ ಖಾತೆಯ ಮೂಲಕ ಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ. ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಈ ಬಲೂನ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 7b3a0145..722af90 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">PIN 입력</translation>
 <translation id="241082044617551207">알 수 없는 플러그인</translation>
 <translation id="2412593942846481727">업데이트 가능</translation>
-<translation id="2414499877591062094">자동 제출 PIN 사용 설정</translation>
 <translation id="2416435988630956212">키보드 기능 키</translation>
 <translation id="241727068219398187"><ph name="TIME" />에 데이터가 Google 비밀번호로 암호화되었습니다.
           Google Pay의 결제 수단 및 주소는 암호화되지 않습니다.</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">방문하는 웹사이트의 모든 데이터 읽기</translation>
 <translation id="5242724311594467048">'<ph name="EXTENSION_NAME" />'을(를) 사용하시겠습니까?</translation>
 <translation id="5243522832766285132">잠시 후 다시 시도해 주세요.</translation>
-<translation id="5244406554036143958">자동 제출을 사용 설정하려면 PIN을 입력하세요.</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />에 동기화</translation>
 <translation id="5245610266855777041">학교 계정으로 시작하세요</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" />이(가) 다운되었습니다. 앱을 다시 시작하려면 이 풍선을 클릭하세요.</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index bf8f01a..385dcb2 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 МБ</translation>
 <translation id="2352810082280059586">Кулпуланган экрандын эскертүүлөрү автоматтык түрдө <ph name="LOCK_SCREEN_APP_NAME" /> барып сакталат. Эң акыркы эскертүүңүз кулпуланган экранда кала берет.</translation>
 <translation id="2353297238722298836">Камера менен микрофонду колдонууга уруксат берилди</translation>
+<translation id="2355314311311231464">Аккаунтуңуздун чоо-жайы алынбай койгондуктан шайкештирүү үзгүлтүккө учурады. Кайталап көрүңүз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Ыкчам байланыш түйүнүн күйгүзүү</translation>
 <translation id="2356070529366658676">Сураңыз</translation>
 <translation id="2357330829548294574"><ph name="USER_NAME" /> өчүрүү</translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">PIN кодуңузду киргизиңиз</translation>
 <translation id="241082044617551207">Белгисиз плагин</translation>
 <translation id="2412593942846481727">Жаңы версия бар</translation>
-<translation id="2414499877591062094">PIN кодду автоматтык түрдө тапшырууну иштетүү</translation>
 <translation id="2416435988630956212">Баскычтоптун функционалдык баскычтары</translation>
 <translation id="241727068219398187">Дайындар Google сырсөзүңүз менен
           <ph name="TIME" /> күнү шифрленген. Бул Google Pay'деги төлөм ыкмалары менен даректерге карата колдонулбайт.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">Бул бетти которуңуз</translation>
 <translation id="2475982808118771221">Ката кетти</translation>
 <translation id="2476578072172137802">Сайт жөндөөлөрү</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> чыгарып салуу үчүн, Windows'ту жабыңыз.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" үчүн Медиа-Файл уруксаттары</translation>
 <translation id="247949520305900375">Аудио бөлүшүү</translation>
 <translation id="248003956660572823">Сырсөздөр сакталган жок</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> томуна уруксат берилди (окуу үчүн гана).</translation>
 <translation id="2575247648642144396">Бул сүрөтчө ушул беттеги кеңейтүү иштеп баштаганда көрүнөт. Бул кеңейтүүнү колдонуу үчүн, сүрөтчөнү чыкылдатыңыз же <ph name="EXTENSION_SHORTCUT" /> басып коюңуз.</translation>
 <translation id="257779572837908839">Жыйналыштар үчүн Chromebox'ту жөндөө</translation>
+<translation id="2579232805407578790">Серверге туташпай калды. Тармактык туташууңузду текшерип, дагы бир жолу аракет кылыңыз. Эгер маселе чечилбесе, Chromebook'уңузду өчүрүп күйгүзүңүз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> бир нече файлды жүктөп алууга ар дайым уруксат берилсин</translation>
 <translation id="258095186877893873">Узак</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Бул колдонуучунун ысымы менен катталып кирүү аракети администратор тарабынан бөгөттөлгөн.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> тармагын колдонуу үчүн, адегенде төмөнкү интернетке туташууну бүтүрүңүз.</translation>
 <translation id="2838379631617906747">Орнотулууда</translation>
+<translation id="2838835911926931318">Бардык түзмөктөрүңүздөн кыстармаларды, сырсөздөрдү, таржымалды жана башка жөндөөлөрүңүздү алуу үчүн Шайкештирүүгө кириңиз.</translation>
 <translation id="2839032553903800133">Билдирмелер бөгөттөлдү</translation>
 <translation id="2841013758207633010">Убакыт</translation>
 <translation id="2841837950101800123">Жабдуучу</translation>
@@ -1584,6 +1587,7 @@
     Сервердин билдирүүсү: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Медиа галереяны каталог боюнча кошуу</translation>
 <translation id="2910318910161511225">Интернетке туташып, кайталап көрүңүз</translation>
+<translation id="2910718431259223434">Бир жерден ката кетти. Кайталап көрүңүз, болбосо, түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Сайттарга куки дайындарын сактоого жана окууга уруксат берүү (сунушталат)</translation>
 <translation id="2915102088417824677">Аракеттер таржымалын көрүү</translation>
 <translation id="2915873080513663243">Авто-скандоо</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Кеңейтүү жактырылды}other{# кеңейтүү жактырылды}}</translation>
 <translation id="3822559385185038546">Бул проксини администраторуңуз күчүнө киргизген</translation>
 <translation id="3823310065043511710">Linux үчүн кеминде <ph name="INSTALL_SIZE" /> орун талап кылынат.</translation>
+<translation id="3824621460022590830">Түзмөктү каттоо токени жараксыз. Түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Администраторуңуз кошумча Google аккаунттарын кошуу функциясын өчүрүп койгон</translation>
 <translation id="3827306204503227641">Сынамык чөйрөдөн тышкары плагиндерге уруксат бериле берсин</translation>
 <translation id="3827774300009121996">&amp;Толук экран</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Сунушталган сырсөздү колдонуу</translation>
 <translation id="508059534790499809">Kerberos билетин жаңыртуу</translation>
 <translation id="5084230410268011727">Сайттарда кыймыл жана жарык сенсорлорун колдонууга уруксат берилсин</translation>
+<translation id="5084328598860513926">Шайкештирүү үзгүлтүккө учурады. Кайталап көрүңүз, болбосо, түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Жаңыртуулар изделүүдө</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Демейки башкы бет калыбына келтирилсинби?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Каралган вебсайттарыңыздагы бардык дайын-даректериңизди окуңуз</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" иштетилсинби?</translation>
 <translation id="5243522832766285132">Бир аздан кийин кайталап көрүңүз</translation>
-<translation id="5244406554036143958">Автоматтык түрдө тапшыруу үчүн PIN кодду киргизиңиз</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> менен шайкештирилүүдө</translation>
 <translation id="5245610266855777041">Мектептин аккаунту менен баштоо</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> кыйрады. Колдонмону өчүрүп күйгүзүү үчүн, бул булутчаны чыкылдатыңыз.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Түзмөгүңүз баштапкы абалга келтирилгенде, Google аккаунтуңузга же ал аккаунтка шайкештештирилген бардык дайындарга эч кандай таасир тийгизилбейт. Бирок түзмөгүңүздө сакталган жергиликтүү файлдардын баары жок болот.</translation>
 <translation id="5578059481725149024">Авто кирүү</translation>
 <translation id="558170650521898289">Microsoft Windows Жабдык драйверин текшерүү</translation>
+<translation id="5581972110672966454">Түзмөк доменге кошулбай жатат. Кайталап көрүңүз, болбосо, түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Башкы меню</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Колдонуучунун аты сакталсынбы?</translation>
@@ -3747,6 +3753,7 @@
 <translation id="5667546120811588575">Google Play жөндөлүүдө…</translation>
 <translation id="5669267381087807207">Жандырылууда</translation>
 <translation id="5669691691057771421">Жаңы PIN киргизиңиз</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Сүрөттөр бөгөттөлдү</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> сунушун алып салуу</translation>
 <translation id="567587836466137939">Бул түзмөк программанын жана коопсуздук жаңыртууларын <ph name="MONTH_AND_YEAR" /> чейин автоматтык түрдө алат. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">Дарек кошуу</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> кийинкиден <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Жылуу</translation>
+<translation id="7766082757934713382">Автоматтык түрдө иштеген колдонмолорду жана тутумдун жаңыртууларын тындырып, Интернет трафигин үнөмдөөгө жардам берет</translation>
 <translation id="7766807826975222231">Саякатка чыгуу</translation>
 <translation id="7766838926148951335">Уруксаттарды кабыл алуу</translation>
 <translation id="7768770796815395237">Өзгөртүү</translation>
@@ -6304,6 +6312,7 @@
 <translation id="885701979325669005">Сактагыч</translation>
 <translation id="8859057652521303089">Тилиңизди тандаңыз:</translation>
 <translation id="8859174528519900719">Көмөкчү алкак: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Тейлөө шарттары жүктөлгөн жок</translation>
 <translation id="8859662783913000679">Ата-эненин аккаунту</translation>
 <translation id="8862003515646449717">Ылдам серепчиге которулуу</translation>
 <translation id="8863753581171631212">Шилтемени жаңы <ph name="APP" /> колдонмосунда ачуу</translation>
@@ -6572,6 +6581,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> аркылуу издөө</translation>
 <translation id="9201023452444595544">Баардык оффлайн маалыматы тазаланат</translation>
 <translation id="9201220332032049474">Экранды кулпулоо параметрлери</translation>
+<translation id="9201842707396338580">Бир жерден ката кетти. Түзмөктүн ээсине же администраторго кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Профилдөө иштетилди</translation>
 <translation id="9203904171912129171">Түзмөк тандоо</translation>
 <translation id="9203962528777363226">Бул түзмөктүн администратору колдонуучуларды кошуу мүмкүнчүлүгүн өчүрүп койгон.</translation>
@@ -6643,6 +6653,7 @@
 <translation id="983511809958454316">Бул функция VR режиминде иштебейт</translation>
 <translation id="984275831282074731">Төлөм ыкмалары</translation>
 <translation id="98515147261107953">Туурасынан</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Жалпы</translation>
 <translation id="987897973846887088">Сүрөттөр жок</translation>
 <translation id="988978206646512040">Купуя сөз айкашын бош калтырууга болбойт</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 0aaf2584..eb50fa1 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1160,7 +1160,6 @@
 <translation id="2408955596600435184">​ປ້ອນ​ລະ​ຫັດ PIN ຂອງ​ທ່ານ</translation>
 <translation id="241082044617551207">ປລັກອິນທີ່ບໍ່ຮູ້ຈັກ</translation>
 <translation id="2412593942846481727">ມີການອັບເດດໃໝ່</translation>
-<translation id="2414499877591062094">ເປີດການນຳໃຊ້ສົ່ງ PIN ອັດຕະໂນມັດ</translation>
 <translation id="2416435988630956212">ປຸ່ມຟັງຊັນໃນແປ້ນພິມ</translation>
 <translation id="241727068219398187">ເຂົ້າລະຫັດຂໍ້ມູນດ້ວຍລະຫັດຜ່ານ Google ຂອງທ່ານແລ້ວໃນວັນທີ
           <ph name="TIME" />. ນີ້ບໍ່ຮວມເອົາວິທີການຈ່າຍເງິນ ແລະ ທີ່ຢູ່ຈາກ Google Pay.</translation>
@@ -3403,7 +3402,6 @@
 <translation id="5241128660650683457">ອ່ານ​ທຸກ​ຂໍ້​ມູນ​ຂອງ​ທ່ານ​ຢູ່​ເທິງ​ເວັບ​ໄຊ​ທ໌​ທີ່​ທ່ານ​ເຂົ້າ​ເບິ່ງ</translation>
 <translation id="5242724311594467048">ເປີດໃຊ້ງານ "<ph name="EXTENSION_NAME" />" ບໍ?</translation>
 <translation id="5243522832766285132">ກະລຸນາລອງໃໝ່ໃນໄວໆນີ້</translation>
-<translation id="5244406554036143958">ປ້ອນ PIN ຂອງທ່ານເພື່ອເປີດການນຳໃຊ້ສົ່ງຂໍ້ມູນອັດຕະໂນມັດ</translation>
 <translation id="5244474230056479698">ກຳລັງຊິ້ງຂໍ້ມູນກັບ <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">ເລີ່ມຕົ້ນດ້ວຍບັນຊີໂຮງຮຽນ</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ໄດ້ເກີດການຂັດຂ້ອງ. ຄລິກປູມເປົ້ານີ້ເພື່ອ​ເລີ່​ມ​ເປີດແອັບໃໝ່.</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 4a40dd3..dcb11746 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Įveskite PIN kodą</translation>
 <translation id="241082044617551207">Nežinomas papildinys</translation>
 <translation id="2412593942846481727">Pasiekiamas naujinys</translation>
-<translation id="2414499877591062094">Įjungti automatinį PIN kodo pateikimą</translation>
 <translation id="2416435988630956212">Klaviatūros funkcijų klavišai</translation>
 <translation id="241727068219398187">Nuo <ph name="TIME" /> duomenys užšifruoti naudojant „Google“
           slaptažodį. Neįtraukiami mokėjimo metodai ir adresai iš „Google Pay“.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Skaityti visus duomenis svetainėse, kuriose apsilankote</translation>
 <translation id="5242724311594467048">Įgalinti „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="5243522832766285132">Po kelių minučių bandykite dar kartą</translation>
-<translation id="5244406554036143958">Įveskite PIN kodą, kad įgalintumėte automatinį pateikimą</translation>
 <translation id="5244474230056479698">Sinchronizavimas su <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Pradžia naudojant mokyklos paskyrą</translation>
 <translation id="5246282308050205996">„<ph name="APP_NAME" />“ užstrigo. Jei norite iš naujo paleisti programą, spustelėkite šį debesėlį.</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 8cab28a9..a44aae1 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt;1 MB</translation>
 <translation id="2352810082280059586">Bloķēšanas ekrāna piezīmes tiek automātiski saglabātas lietotnē <ph name="LOCK_SCREEN_APP_NAME" />. Jūsu jaunākās piezīmes paliks bloķēšanas ekrānā.</translation>
 <translation id="2353297238722298836">Kameras un mikrofona lietošana ir atļauta</translation>
+<translation id="2355314311311231464">Nodrošināšana neizdevās, jo nevarēja izgūt jūsu konta datus. Lūdzu, mēģiniet vēlreiz. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Tūlītējas piesaistes ieslēgšana</translation>
 <translation id="2356070529366658676">Vaicāt</translation>
 <translation id="2357330829548294574">Noņemt <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Ievadiet PIN kodu</translation>
 <translation id="241082044617551207">Nezināms spraudnis</translation>
 <translation id="2412593942846481727">Ir pieejams atjauninājums</translation>
-<translation id="2414499877591062094">Iespējot automātisku PIN koda iesniegšanu</translation>
 <translation id="2416435988630956212">Tastatūras funkciju taustiņi</translation>
 <translation id="241727068219398187">Dati tika šifrēti, izmantojot jūsu Google paroli (sinhronizācijas laiks:
           <ph name="TIME" />). Tajā nav iekļauti maksājumu veidi un adreses no pakalpojuma Google Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">Tulkot šo lapu</translation>
 <translation id="2475982808118771221">Radās kļūda</translation>
 <translation id="2476578072172137802">Vietnes iestatījumi</translation>
+<translation id="2476974672882258506">Lai atinstalētu <ph name="PARALLELS_DESKTOP" />, izslēdziet Windows datoru.</translation>
 <translation id="2478176599153288112">Multivides faila atļaujas paplašinājumam “<ph name="EXTENSION" />”</translation>
 <translation id="247949520305900375">Kopīgot audio</translation>
 <translation id="248003956660572823">Paroles netika saglabātas</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">Tika piešķirta tikai lasīšanas piekļuve krātuvei <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">Šī ikona ir redzama, ja pašlaik atvērtajā lapā var lietot paplašinājumu. Lai lietotu šo paplašinājumu, noklikšķiniet uz ikonas vai nospiediet taustiņu kombināciju <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Iestatīt kā sistēmu “Chromebox sapulcēm”</translation>
+<translation id="2579232805407578790">Nevarēja izveidot savienojumu ar serveri. Lūdzu, pārbaudiet tīkla savienojumu un mēģiniet vēlreiz. Ja problēma joprojām pastāv, restartējiet Chromebook datoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Vienmēr ļaut saimniekdatoram <ph name="HOST" /> lejupielādēt vairākus failus</translation>
 <translation id="258095186877893873">Ilgi</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Administrators ir atspējojis iespēju pierakstīties, izmantojot šo lietotājvārdu.</translation>
 <translation id="283669119850230892">Lai izmantotu tīklu <ph name="NETWORK_ID" />, vispirms pabeidziet savienojuma izveidi ar internetu tālāk.</translation>
 <translation id="2838379631617906747">Notiek instalēšana</translation>
+<translation id="2838835911926931318">Pierakstieties, lai sinhronizētu grāmatzīmes, paroles, vēsturi un citu saturu visās savās ierīcēs.</translation>
 <translation id="2839032553903800133">Paziņojumi bloķēti</translation>
 <translation id="2841013758207633010">Laiks</translation>
 <translation id="2841837950101800123">Nodrošinātājs</translation>
@@ -1584,6 +1587,7 @@
 Servera ziņojums: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Multivides galerijas pievienošana pēc direktorija</translation>
 <translation id="2910318910161511225">Izveidojiet savienojumu ar tīklu un mēģiniet vēlreiz.</translation>
+<translation id="2910718431259223434">Radās kļūda. Lūdzu, mēģiniet vēlreiz vai sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Atļaut vietnēm saglabāt un lasīt sīkfailu datus (ieteicams)</translation>
 <translation id="2915102088417824677">Skatīt darbību žurnālu</translation>
 <translation id="2915873080513663243">Automātiska meklēšana</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Paplašinājums tika apstiprināts}zero{# paplašinājumi tika apstiprināti}one{# paplašinājums tika apstiprināts}other{# paplašinājumi tika apstiprināti}}</translation>
 <translation id="3822559385185038546">Šo starpniekserveri ievieš jūsu administrators.</translation>
 <translation id="3823310065043511710">Sistēmai Linux ir ieteicams vismaz <ph name="INSTALL_SIZE" /> vietas krātuvē.</translation>
+<translation id="3824621460022590830">Ierīces reģistrācijas marķieris nav derīgs. Lūdzu, sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Administrators ir atspējojis citu Google kontu pievienošanu.</translation>
 <translation id="3827306204503227641">Turpināt atļaut spraudņus, kas nav ievietoti smilškastē</translation>
 <translation id="3827774300009121996">Pil&amp;nekrāna režīms</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Izmantojiet ieteikto paroli</translation>
 <translation id="508059534790499809">Kerberos biļetes atsvaidzināšana</translation>
 <translation id="5084230410268011727">Atļaut vietnēm izmantot kustību un gaismas sensorus</translation>
+<translation id="5084328598860513926">Nodrošināšanas plūsma traucēta. Lūdzu, mēģiniet vēlreiz vai sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Notiek pārbaude, vai ir pieejami atjauninājumi.</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Vai atjaunot noklusējuma sākumlapu?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Lasīt visus apmeklēto vietņu datus</translation>
 <translation id="5242724311594467048">Vai iespējot “<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Lūdzu, pēc brīža mēģiniet vēlreiz.</translation>
-<translation id="5244406554036143958">Lai iespējotu automātisku iesniegšanu, ievadiet savu PIN kodu.</translation>
 <translation id="5244474230056479698">Sinhronizēšana ar <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Darba sākšana, izmantojot mācību iestādes kontu</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ir sabojājies. Noklikšķiniet uz šī balona, lai restartētu šo lietotni.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Ierīces atiestatīšana neietekmēs jūsu Google kontus un ar tiem sinhronizētos datus, taču tiks dzēsti visi faili, kuri ierīcē ir saglabāti lokāli.</translation>
 <translation id="5578059481725149024">Automātiska pierakstīšanās</translation>
 <translation id="558170650521898289">Microsoft Windows aparatūras dziņa verifikācija</translation>
+<translation id="5581972110672966454">Ierīci nevar saistīt ar domēnu. Lūdzu, mēģiniet vēlreiz vai sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Galvenā izvēlne</translation>
 <translation id="5583640892426849032">Atkāpšanās taustiņš</translation>
 <translation id="5584088138253955452">Vai saglabāt lietotājvārdu?</translation>
@@ -3747,6 +3753,7 @@
 <translation id="5667546120811588575">Notiek Google Play iestatīšana...</translation>
 <translation id="5669267381087807207">Notiek aktivizācija</translation>
 <translation id="5669691691057771421">Ievadiet jauno PIN.</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Attēli bloķēti</translation>
 <translation id="5671658447180261823">Noņemt <ph name="SUGGESTION_NAME" /> ieteikumu</translation>
 <translation id="567587836466137939">Šajā ierīcē tiks saņemti automātiski programmatūras un drošības atjauninājumi līdz: <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">Pievienot adresi</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> no <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Pārvietot</translation>
+<translation id="7766082757934713382">Palīdz samazināt tīkla datu lietojumu, apturot automātiskos lietotņu un sistēmas atjauninājumus.</translation>
 <translation id="7766807826975222231">Skatīt ceļvedi</translation>
 <translation id="7766838926148951335">Piekrist atļaujām</translation>
 <translation id="7768770796815395237">Mainīt</translation>
@@ -6304,6 +6312,7 @@
 <translation id="885701979325669005">Krātuve</translation>
 <translation id="8859057652521303089">Atlasiet savu valodu:</translation>
 <translation id="8859174528519900719">Apakšrāmis: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Nevarēja ielādēt pakalpojumu sniegšanas noteikumus</translation>
 <translation id="8859662783913000679">Vecāku konts</translation>
 <translation id="8862003515646449717">Pāreja uz ātru pārlūku</translation>
 <translation id="8863753581171631212">Atvērt saiti jaunā <ph name="APP" /> logā</translation>
@@ -6572,6 +6581,7 @@
 <translation id="920045321358709304">Meklēt pakalpojumā <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Visi bezsaistē esošie dati tiks izdzēsti</translation>
 <translation id="9201220332032049474">Ekrāna bloķēšanas opcijas</translation>
+<translation id="9201842707396338580">Radās kļūda. Lūdzu, sazinieties ar ierīces īpašnieku vai administratoru. Kļūdas kods: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profilēšana iespējota</translation>
 <translation id="9203904171912129171">Atlasiet ierīci</translation>
 <translation id="9203962528777363226">Šīs ierīces administrators ir atspējojis jaunu lietotāju pievienošanu.</translation>
@@ -6643,6 +6653,7 @@
 <translation id="983511809958454316">Šī funkcija virtuālajā realitātē netiek atbalstīta</translation>
 <translation id="984275831282074731">Maksājumu veidi</translation>
 <translation id="98515147261107953">Ainava</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Vispārīgi</translation>
 <translation id="987897973846887088">Nav pieejams neviens attēls</translation>
 <translation id="988978206646512040">Nav atļauta tukša ieejas frāze.</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index cfce1cb..57142bd4 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Внесете го вашиот PIN</translation>
 <translation id="241082044617551207">Непознат приклучок</translation>
 <translation id="2412593942846481727">Достапно е ажурирање</translation>
-<translation id="2414499877591062094">Овозможи користење PIN-код за автоматско испраќање</translation>
 <translation id="2416435988630956212">Функциски копчиња на тастатурата</translation>
 <translation id="241727068219398187">Податоците се шифрирани со вашата лозинка на Google од
           <ph name="TIME" />. Тоа не ги вклучува начините на плаќање и адресите од Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Читајте ги сите ваши податоци на веб-локациите што ги посетувате</translation>
 <translation id="5242724311594467048">Да се овозможи „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="5243522832766285132">Обидете се повторно наскоро</translation>
-<translation id="5244406554036143958">Внесете го PIN-кодот за да се овозможи автоматско испраќање</translation>
 <translation id="5244474230056479698">Синхронизирање со <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Започнете со училишна сметка</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> падна. Кликнете на балонот за да ја рестартирате апликацијата.</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index b8d8400..e8326e8d 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1118,6 +1118,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">ലോക്ക് സ്‌ക്രീൻ കുറിപ്പുകൾ <ph name="LOCK_SCREEN_APP_NAME" /> എന്നതിലേക്ക് സ്വമേധയാ സംരക്ഷിക്കപ്പെടുന്നു. നിങ്ങൾ ഏറ്റവും സമീപകാലത്ത് എഴുതിയ കുറിപ്പ് ലോക്ക് സ്‌ക്രീനിൽ നിലനിൽക്കും.</translation>
 <translation id="2353297238722298836">ക്യാമറയും മൈക്രോഫോണും അനുവദനീയം</translation>
+<translation id="2355314311311231464">നിങ്ങളുടെ അക്കൗണ്ട് വിശദാംശങ്ങൾ വീണ്ടെടുക്കാനാകാത്തതിനാൽ സജ്ജീകരിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">തൽക്ഷണ ടെതറിംഗ് ഓണാക്കുക</translation>
 <translation id="2356070529366658676">ചോദിക്കുക</translation>
 <translation id="2357330829548294574"><ph name="USER_NAME" /> നീക്കം ചെയ്യുക</translation>
@@ -1158,7 +1159,6 @@
 <translation id="2408955596600435184">നിങ്ങളുടെ പിൻ നൽകുക</translation>
 <translation id="241082044617551207">അജ്ഞാത പ്ലഗ് ഇൻ</translation>
 <translation id="2412593942846481727">അപ്‌ഡേറ്റ് ലഭ്യമാണ്</translation>
-<translation id="2414499877591062094">പിൻ സ്വയമേവ സമർപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2416435988630956212">കീബോർഡ് ഫംഗ്ഷൻ കീകൾ</translation>
 <translation id="241727068219398187"><ph name="TIME" /> മുതലുള്ള ഡാറ്റ നിങ്ങളുടെ Google പാസ്‌വേഡ് ഉപയോഗിച്ച് എൻക്രി‌പ്‌റ്റ് ചെയ്‌തു.
           ഇതിൽ Google Pay-ൽ നിന്നുള്ള പേയ്മെന്‍റ് രീതികളും വിലാസങ്ങളും അടങ്ങുന്നില്ല.</translation>
@@ -1213,6 +1213,7 @@
 <translation id="2473195200299095979">ഈ പേജ് വിവർത്തനം ചെയ്യുക</translation>
 <translation id="2475982808118771221">ഒരു പിശക് സംഭവിച്ചു</translation>
 <translation id="2476578072172137802">സൈറ്റ് ക്രമീകരണങ്ങൾ</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> അൺഇൻസ്റ്റാൾ ചെയ്യാൻ Windows ഷട്ട് ഡൗൺ ചെയ്യുക.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" എന്നതിനായുള്ള മീഡിയ-ഫയൽ അനുമതികൾ</translation>
 <translation id="247949520305900375">ഓഡിയോ പങ്കിടുക</translation>
 <translation id="248003956660572823">പാസ്‌വേഡ് സംരക്ഷിച്ചില്ല</translation>
@@ -1303,6 +1304,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> എന്നതിലേക്ക് റീഡ് ഒൺലി ആക്‌സസ്സ് അനുവദിച്ചു.</translation>
 <translation id="2575247648642144396">വിപുലീകരണത്തിന് നിലവിലെ പേജിൽ പ്രവർത്തിക്കാൻ കഴിയുമ്പോൾ ഈ ഐക്കൺ ദൃശ്യമാകും. ഐക്കണിൽ ക്ലിക്ക് ചെയ്‌തുകൊണ്ടോ <ph name="EXTENSION_SHORTCUT" /> അമർത്തിക്കൊണ്ടോ ഈ വിപുലീകരണം ഉപയോഗിക്കുക</translation>
 <translation id="257779572837908839">മീറ്റിംഗിനുള്ള Chromebox സജ്ജമാക്കുക</translation>
+<translation id="2579232805407578790">സെർവറുമായി കണക്റ്റ് ചെയ്യാനായില്ല. നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക. പ്രശ്നം തുടരുന്നുവെങ്കിൽ Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">എല്ലായ്‌പ്പോഴും ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ <ph name="HOST" />-നെ അനുവദിക്കുക</translation>
 <translation id="258095186877893873">ദൈർഘ്യമേറിയ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (പ്ലാറ്റ്‌ഫോം <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1522,6 +1524,7 @@
 <translation id="2836635946302913370">ഈ ഉപയോക്തൃനാമം ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="283669119850230892">നെറ്റ്‌വർക്ക് <ph name="NETWORK_ID" /> ഉപയോഗിക്കുന്നതിന്, ആദ്യം ഇന്റർനെറ്റിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷൻ ചുവടെ പൂർത്തിയാക്കുക.</translation>
 <translation id="2838379631617906747">ഇൻസ്‌റ്റാളുചെയ്യുന്നു</translation>
+<translation id="2838835911926931318">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്‌മാർക്കുകളും പാസ്‌വേഡുകളും ചരിത്രവും മറ്റും സമന്വയിപ്പിക്കാൻ സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="2839032553903800133">അറിയിപ്പുകൾ ബ്ലോക്ക് ചെയ്‌തു</translation>
 <translation id="2841013758207633010">സമയം</translation>
 <translation id="2841837950101800123">ദാതാവ്</translation>
@@ -1581,6 +1584,7 @@
     സെർവർ സന്ദേശം: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">ഡയറക്‌റ്ററി പ്രകാരം മീഡിയ ഗാലറി ചേർക്കുക</translation>
 <translation id="2910318910161511225">ഒരു നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റ് ചെയ്‌ത ശേഷം വീണ്ടും ശ്രമിക്കുക</translation>
+<translation id="2910718431259223434">എന്തോ കുഴപ്പം സംഭവിച്ചു. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്‍മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">കുക്കി ഡാറ്റ സംരക്ഷിക്കുന്നതിനും വായിക്കുന്നതിനും സൈറ്റുകളെ അനുവദിക്കുക (ശുപാർശചെയ്‌തത്)</translation>
 <translation id="2915102088417824677">ആക്റ്റിവിറ്റി ലോഗ് കാണുക</translation>
 <translation id="2915873080513663243">സ്വയമേവയുള്ള സ്‌കാൻ</translation>
@@ -2320,6 +2324,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{ഒരു വിപുലീകരണത്തിന് അംഗീകാരം ലഭിച്ചു}other{# വിപുലീകരണങ്ങൾക്ക് അംഗീകാരം ലഭിച്ചു}}</translation>
 <translation id="3822559385185038546">ഈ പ്രോക്‌സി നിങ്ങളുടെ അഡ്‌മിനി‌സ്‌ട്രേറ്റർ നടപ്പിലാക്കിയതാണ്</translation>
 <translation id="3823310065043511710">കുറഞ്ഞത് <ph name="INSTALL_SIZE" />  ഇടമാണ് Linux-ന് വേണ്ടി ശുപാർശ ചെയ്യുന്നത്.</translation>
+<translation id="3824621460022590830">ഉപകരണ എൻറോൾമെന്റ് ടോക്കൺ സാധുവല്ല. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്‌മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">കൂടുതൽ Google അക്കൗണ്ടുകൾ ചേർക്കുന്നത് നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി</translation>
 <translation id="3827306204503227641">അൺസാൻഡ്‌ബോക്‌സ് ചെയ്‌ത പ്ലഗ്-ഇന്നുകൾ അനുവദിക്കുന്നത് തുടരുക</translation>
 <translation id="3827774300009121996">&amp;പൂര്‍ണ്ണ ‌സ്‌ക്രീന്‍</translation>
@@ -3272,6 +3277,7 @@
 <translation id="5079950360618752063">നിർദ്ദേശിച്ച പാസ്‌വേഡ് ഉപയോഗിക്കുക</translation>
 <translation id="508059534790499809">Kerberos ടിക്കറ്റ് പുതുക്കിയെടുക്കുക</translation>
 <translation id="5084230410268011727">ചലന സെൻസറുകളും വെളിച്ച സെൻസറുകളും ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation>
+<translation id="5084328598860513926">സജ്ജീകരിക്കുന്ന പ്രക്രിയ തടസ്സപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്‍മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">അപ്‌ഡേറ്റുകൾക്കായി പരിശോധിക്കുന്നു</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">ഡിഫോൾട്ട് ഹോം പേജ് പുനഃസ്ഥാപിക്കണോ?</translation>
@@ -3394,7 +3400,6 @@
 <translation id="5241128660650683457">നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകളിലെ എല്ലാ വിവരവും വായിക്കുക</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" പ്രവർത്തനക്ഷമമാക്കണോ?</translation>
 <translation id="5243522832766285132">അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="5244406554036143958">സ്വയമേവ സമർപ്പിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കാൻ നിങ്ങളുടെ പിൻ ചേർക്കുക</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ഇമെയിലിലേക്ക് സമന്വയിപ്പിക്കുന്നു</translation>
 <translation id="5245610266855777041">സ്‌കൂൾ അക്കൗണ്ട് ഉപയോഗിച്ച് ആരംഭിക്കുക</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> എന്നത് ക്രാഷ് ചെയ്തു. ആപ്പ് പുനരാംഭിക്കുന്നതിനായി ഈ ബലൂണ്‍ ക്ലിക്ക് ചെയ്യുക.</translation>
@@ -3671,6 +3676,7 @@
 <translation id="557722062034137776">നിങ്ങളുടെ ഉപകരണം റീസെറ്റ് ചെയ്യുന്നത് Google അക്കൗണ്ടുകളെയോ ഈ അക്കൗണ്ടുകളിൽ സമന്വയിപ്പിച്ചിരിക്കുന്ന മറ്റേതെങ്കിലും ഡാറ്റയെയോ ബാധിക്കില്ല. എന്നിരുന്നാലും, നിങ്ങളുടെ ഉപകരണത്തിൽ പ്രാദേശികമായി സംരക്ഷിച്ച എല്ലാ ഫയലുകളും ഇല്ലാതാക്കും.</translation>
 <translation id="5578059481725149024">സ്വയമേവയുള്ള സൈൻ ഇൻ ചെയ്യൽ</translation>
 <translation id="558170650521898289">Microsoft Windows ഹാർഡ്‍വെയർ ഡ്രൈവർ പരിശോധിച്ചുറപ്പിക്കൽ</translation>
+<translation id="5581972110672966454">ഉപകരണത്തെ ഡൊമെയ്‌നുമായി ബന്ധിപ്പിക്കാനാകുന്നില്ല. വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്‍മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">പ്രധാന മെനു</translation>
 <translation id="5583640892426849032">ബാക്ക്‌സ്പെയ്‌സ്</translation>
 <translation id="5584088138253955452">ഉപയോക്‌തൃ നാമം സംരക്ഷിക്കണോ?</translation>
@@ -3743,6 +3749,7 @@
 <translation id="5667546120811588575">Google Play സജ്ജമാക്കുന്നു...</translation>
 <translation id="5669267381087807207">സജീവമാക്കുന്നു</translation>
 <translation id="5669691691057771421">പുതിയ പിൻ നൽകുക</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">ചിത്രങ്ങൾ ബ്ലോക്ക് ചെയ്‌തു</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> നിർദ്ദേശം നീക്കം ചെയ്യുക</translation>
 <translation id="567587836466137939"><ph name="MONTH_AND_YEAR" /> വരെ ഈ ഉപകരണത്തിന് സ്വയമേവയുള്ള സോഫ്‌റ്റ്‌വെയർ, സുരക്ഷാ അപ്‌ഡേറ്റുകൾ ലഭിക്കും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">വിലാസം ചേർക്കുക</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> ഡൊമെയ്‌നിൽ നിന്ന് <ph name="DOWNLOAD_RECEIVED" /></translation>
 <translation id="7765158879357617694">നീക്കുക</translation>
+<translation id="7766082757934713382">ആപ്പിന്റെയും സിസ്റ്റത്തിന്റെയും സ്വയമേവയുള്ള അപ്ഡേറ്റുകൾ താൽക്കാലികമായി നിർത്തി നെറ്റ്‌വർക്ക് ഡാറ്റാ ഉപയോഗം കുറയ്ക്കാൻ സഹായിക്കുന്നു</translation>
 <translation id="7766807826975222231">ഒരു ടൂര്‍‌ നടത്തുക</translation>
 <translation id="7766838926148951335">അനുമതികൾ അംഗീകരിക്കുക</translation>
 <translation id="7768770796815395237">മാറ്റുക</translation>
@@ -6304,6 +6312,7 @@
 <translation id="885701979325669005">സംഭരണം</translation>
 <translation id="8859057652521303089">നിങ്ങളുടെ ഭാഷ തിരഞ്ഞെടുക്കുക :</translation>
 <translation id="8859174528519900719">സബ്ഫ്രെയിം: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">സേവന നിബന്ധനകൾ ലോഡ് ചെയ്യാനായില്ല</translation>
 <translation id="8859662783913000679">രക്ഷാകർതൃ അക്കൗണ്ട്</translation>
 <translation id="8862003515646449717">ഒരു വേഗതയേറിയ ബ്രൗസറിലേക്ക് മാറുക</translation>
 <translation id="8863753581171631212">പുതിയ <ph name="APP" /> ആപ്പിൽ ലിങ്ക് തുറക്കുക</translation>
@@ -6572,6 +6581,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> തിരയുക</translation>
 <translation id="9201023452444595544">എല്ലാ ഓഫ്‍ലൈൻ ഡാറ്റയും മായ്‌ക്കും</translation>
 <translation id="9201220332032049474">സ്‌ക്രീൻ ലോക്ക് ഓപ്ഷനുകള്‍</translation>
+<translation id="9201842707396338580">എന്തോ കുഴപ്പം സംഭവിച്ചു. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്‌മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;പ്രൊഫൈലിംഗ് പ്രാപ്തമാക്കി</translation>
 <translation id="9203904171912129171">ഒരു ഉപകരണം തിരഞ്ഞെടുക്കുക</translation>
 <translation id="9203962528777363226">പുതിയ ഉപയോക്താക്കളെ ചേർക്കുന്നത് ഈ ഉപകരണത്തിന്റെ അഡ്‌മിൻ പ്രവർത്തനരഹിതമാക്കി</translation>
@@ -6643,6 +6653,7 @@
 <translation id="983511809958454316">ഈ ഫീച്ചർ VR-ൽ പ്രവർത്തിക്കില്ല</translation>
 <translation id="984275831282074731">പേയ്‌മെന്റ് രീതികൾ</translation>
 <translation id="98515147261107953">ലാന്‍ഡ്‌സ്‌കേപ്പ്</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">പൊതുവായ</translation>
 <translation id="987897973846887088">ചിത്രങ്ങളൊന്നും ലഭ്യമല്ല</translation>
 <translation id="988978206646512040">പാസ്‌ഫ്രെയ്‌സ് പൂരിപ്പിക്കാതിരിക്കാൻ കഴിയില്ല</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index f554953e..b0b4bcb 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1157,7 +1157,6 @@
 <translation id="2408955596600435184">ПИН-ээ оруулна уу</translation>
 <translation id="241082044617551207">Үл мэдэх нэмэлт өргөтгөл</translation>
 <translation id="2412593942846481727">Шинэчлэх боломжтой</translation>
-<translation id="2414499877591062094">ПИН-г автоматаар илгээхийг идэвхжүүлэх</translation>
 <translation id="2416435988630956212">Гарын функцийн түлхүүр</translation>
 <translation id="241727068219398187">Өгөгдлийг таны Google-н нууц үгтэй <ph name="TIME" />-д шифрлэсэн байна. Үүнд Google Pay-с төлбөрийн хэрэгслүүд болон хаягуудыг агуулдаггүй.</translation>
 <translation id="2419131370336513030">Суулгасан аппуудыг харах</translation>
@@ -3392,7 +3391,6 @@
 <translation id="5241128660650683457">Өөрийн ордог вэб сайт дээрх бүх мэдээллийг уншина уу</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />-ыг идэвхжүүлэх үү"?</translation>
 <translation id="5243522832766285132">Хэдэн хормын дараа дахин оролдоно уу</translation>
-<translation id="5244406554036143958">Автоматаар илгээхийг идэвхжүүлэхийн тулд ПИН-ээ оруулна уу</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />-д синк хийж байна</translation>
 <translation id="5245610266855777041">Сургуулийн бүртгэл ашиглаж эхлэх</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> эвдэрсэн байна. Энэ аппликйешнийг дахин эхлүүлэхийн тулд энэ заагч суман дээр дарна уу.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 7b1d2e3..a7856be5 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">तुमचा पिन प्रविष्‍ट करा</translation>
 <translation id="241082044617551207">अज्ञात प्लग-इन</translation>
 <translation id="2412593942846481727">अपडेट उपलब्ध आहे</translation>
-<translation id="2414499877591062094">ऑटो सबमिट पिन सुरू करा</translation>
 <translation id="2416435988630956212">कीबोर्ड कार्य की</translation>
 <translation id="241727068219398187">डेटा <ph name="TIME" /> पर्यंत तुमच्या Google पासवर्डसह एंक्रिप्ट केला होता.
           यामध्ये Google Pay वरील पेमेंट पद्धतींचा आणि पत्त्यांचा समावेश नसतो.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">तुम्ही भेट देता त्या वेबसाइटवर तुमचा सर्व डेटा वाचा</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" सुरू करायचे?</translation>
 <translation id="5243522832766285132">कृपया थोड्या वेळानंतर पुन्हा प्रयत्न करा</translation>
-<translation id="5244406554036143958">ऑटो सबमिट सुरू करण्यासाठी तुमचा पिन एंटर करा</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> वर संकालित करीत आहे</translation>
 <translation id="5245610266855777041">शाळा खात्यासोबत सुरुवात करा</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> क्रॅश झाला आहे. ॲप्लिकेशन रीस्टार्ट करण्यासाठी या फुग्यावर क्लिक करा.</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 7da821b..cb11fcc9 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Masukkan PIN anda</translation>
 <translation id="241082044617551207">Pemalam tidak diketahui</translation>
 <translation id="2412593942846481727">Kemas kini tersedia</translation>
-<translation id="2414499877591062094">Dayakan autoserah PIN</translation>
 <translation id="2416435988630956212">Kekunci fungsi papan kekunci</translation>
 <translation id="241727068219398187">Data telah disulitkan dengan kata laluan Google anda bermula dari
           <ph name="TIME" />. Penyulitan ini tidak termasuk kaedah pembayaran dan alamat daripada Google Pay.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Baca semua data anda di tapak web yang anda lawati</translation>
 <translation id="5242724311594467048">Dayakan "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Sila cuba lagi dalam beberapa ketika</translation>
-<translation id="5244406554036143958">Masukkan PIN anda untuk mendayakan autoserah</translation>
 <translation id="5244474230056479698">Menyegerak ke <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Bermula dengan akaun institusi pengajian</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> telah mengalami nahas. Klik belon ini untuk memulakan semula apl.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 8b6bd00..4c76f37 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1163,7 +1163,6 @@
 <translation id="2408955596600435184">သင့်ပင်နံပါတ်ကို ထည့်ပါ</translation>
 <translation id="241082044617551207">အမည်မသိ ပလက်ဂင်</translation>
 <translation id="2412593942846481727">အပ်ဒိတ် ရနိုင်သည်</translation>
-<translation id="2414499877591062094">ပင်နံပါတ်အလိုအလျောက်ထည့်ခြင်းကို ဖွင့်ရန်</translation>
 <translation id="2416435988630956212">လက်ကွက်လုပ်ဆောင်ချက် ကီးများ</translation>
 <translation id="241727068219398187"><ph name="TIME" /> စင့်ခ်လုပ်ထားသော ဒေတာများအား Google စကားဝှက်ဖြင့်
           အသွင်ဝှက်ပါ။ ၎င်းတွင် ငွေပေးချေနည်းလမ်းများနှင့် Google Pay မှ လိပ်စာများ မပါဝင်ပါ။</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">သင် ဝင်ကြည့်ခဲ့သည့် ဝက်ဘ်ဆိုက်များထဲက သင်၏ ဒေတာ အားလုံးကို ဖတ်ရန်</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ကို ဖွင့်ထားမလား?</translation>
 <translation id="5243522832766285132">ခေတ္တအကြာတွင် ထပ်စမ်းကြည့်ပါ</translation>
-<translation id="5244406554036143958">အလိုအလျောက်ပေးပို့ခြင်းကိုဖွင့်ရန် သင့်ပင်နံပါတ်ထည့်ပါ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> သို့စင့်ခ်လုပ်နေသည်</translation>
 <translation id="5245610266855777041">ကျောင်းသုံးအကောင့်ဖြင့် စတင်ခြင်း</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> မှာ ပျက်စီးသွားပြီ။ အက်ပ်ကို ပြန်ဖွင့်ရန် ဒီပူဖောင်းကို ကလစ်ပါ။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 7ca9c04..9b638a1 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1157,7 +1157,6 @@
 <translation id="2408955596600435184">आफ्नो PIN प्रविष्टि गर्नुहोस्</translation>
 <translation id="241082044617551207">अज्ञात प्लगइन</translation>
 <translation id="2412593942846481727">अद्यावधिक उपलब्ध छ</translation>
-<translation id="2414499877591062094">PIN स्वतः पेस गर्ने सुविधा सक्षम पार्नुहोस्</translation>
 <translation id="2416435988630956212">किबोर्डका फङ्सन कुञ्जीहरू</translation>
 <translation id="241727068219398187">Google को तपाईंको पासवर्डमार्फत <ph name="TIME" /> सम्मका डेटा
           इन्क्रिप्ट गरियो। यसअन्तर्गत Google Pay का भुक्तानी विधि र ठेगानाहरू समावेश हुँदैनन्।</translation>
@@ -3394,7 +3393,6 @@
 <translation id="5241128660650683457">तपाईंले हेर्नुहुने वेबसाइटहरुमा आवस्थित आफ्ना सबै डेटा पढ्नुहोस्</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" /> " सक्षम गर्ने?</translation>
 <translation id="5243522832766285132">कृपया केही क्षणमा फेरि प्रयास गर्नुहोस्</translation>
-<translation id="5244406554036143958">स्वतः पेस सुविधा सक्षम पार्न आफ्नो PIN प्रविष्टि गर्नुहोस्</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> मा सिंक गर्दै</translation>
 <translation id="5245610266855777041">विद्यालयको खाता प्रयोग गरेर सुरु गर्नुहोस्</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> क्रयास भएको छ। एप पुन: चालू गर्नको लागि यस बेलुनलाई क्लिक गर्नुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index d8f872ce..d1b3c77 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Je pincode opgeven</translation>
 <translation id="241082044617551207">Onbekende plug-in</translation>
 <translation id="2412593942846481727">Update beschikbaar</translation>
-<translation id="2414499877591062094">Automatisch indienen van pincode inschakelen</translation>
 <translation id="2416435988630956212">Functietoetsen toetsenbord</translation>
 <translation id="241727068219398187">Je gegevens zijn vanaf <ph name="TIME" /> versleuteld met je Google-wachtwoord.
           Hieronder vallen geen betaalmethoden en adressen van Google Pay.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Al je gegevens lezen voor de websites die je bezoekt</translation>
 <translation id="5242724311594467048">'<ph name="EXTENSION_NAME" />' inschakelen?</translation>
 <translation id="5243522832766285132">Probeer het over enige tijd opnieuw</translation>
-<translation id="5244406554036143958">Geef je pincode op om automatisch indienen in te schakelen</translation>
 <translation id="5244474230056479698">Synchroniseren met <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Aan de slag met een schoolaccount</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> is vastgelopen. Klik op deze ballon om de app opnieuw te starten.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 0d3c35d1..fc6fa48 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1118,6 +1118,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Notater på låseskjermen lagres automatisk i <ph name="LOCK_SCREEN_APP_NAME" />. Det nyeste notatet ditt forblir på låseskjermen.</translation>
 <translation id="2353297238722298836">Kameraet og mikrofonen er tillatt</translation>
+<translation id="2355314311311231464">Klargjøringen mislyktes fordi kontoopplysningene dine ikke kunne hentes. Prøv på nytt. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Slå på umiddelbar internettdeling</translation>
 <translation id="2356070529366658676">Spør</translation>
 <translation id="2357330829548294574">Fjern <ph name="USER_NAME" /></translation>
@@ -1158,7 +1159,6 @@
 <translation id="2408955596600435184">Skriv inn PIN-koden din</translation>
 <translation id="241082044617551207">Ukjent programtillegg</translation>
 <translation id="2412593942846481727">En oppdatering er tilgjengelig</translation>
-<translation id="2414499877591062094">Slå på automatisk innsending av PIN-kode</translation>
 <translation id="2416435988630956212">Funksjonstaster på tastaturet</translation>
 <translation id="241727068219398187">Data ble kryptert med Google-passordet ditt
           <ph name="TIME" />. Dette inkluderer ikke betalingsmåter og adresser fra Google Pay.</translation>
@@ -1213,6 +1213,7 @@
 <translation id="2473195200299095979">Oversett denne siden</translation>
 <translation id="2475982808118771221">Det oppstod en feil</translation>
 <translation id="2476578072172137802">Nettstedsinnstillinger</translation>
+<translation id="2476974672882258506">Slå av Windows for å avinstallere <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">Mediafilrettigheter for «<ph name="EXTENSION" />»</translation>
 <translation id="247949520305900375">Del lyd</translation>
 <translation id="248003956660572823">Passord er ikke lagret</translation>
@@ -1303,6 +1304,7 @@
 <translation id="2572032849266859634">Skrivebeskyttet tilgang til <ph name="VOLUME_NAME" /> er innvilget.</translation>
 <translation id="2575247648642144396">Dette ikonet vises når utvidelsen kan brukes på den gjeldende siden. Aktivér utvidelsen ved å klikke på ikonet eller trykke på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfigurer som en Chromebox for møter</translation>
+<translation id="2579232805407578790">Kunne ikke koble til tjeneren. Sjekk nettverkstilkoblingen din, og prøv på nytt. Start Chromebooken på nytt hvis problemet vedvarer. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Tillat alltid at <ph name="HOST" /> laster ned flere filer</translation>
 <translation id="258095186877893873">Lang</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> – <ph name="PRODUCT_VERSION" /> (plattform <ph name="PLATFORM_VERSION" />) – <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1522,6 +1524,7 @@
 <translation id="2836635946302913370">Pålogging med dette brukernavnet er deaktivert av administratoren din.</translation>
 <translation id="283669119850230892">Fullfør tilkoblingen til Internett nedenfor for å bruke nettverket <ph name="NETWORK_ID" />.</translation>
 <translation id="2838379631617906747">Installerer</translation>
+<translation id="2838835911926931318">Logg på for å synkronisere bokmerkene dine, loggen din med mer på alle enhetene dine</translation>
 <translation id="2839032553903800133">Varsler er blokkert</translation>
 <translation id="2841013758207633010">Klokkeslett</translation>
 <translation id="2841837950101800123">Leverandør</translation>
@@ -1581,6 +1584,7 @@
     Tjenermelding: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Legg til mediegalleri etter katalog</translation>
 <translation id="2910318910161511225">Koble til et nettverk og prøv igjen</translation>
+<translation id="2910718431259223434">Noe gikk galt. Prøv på nytt, eller kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Tillat at nettsteder lagrer og leser data i informasjonskapsler (anbefales)</translation>
 <translation id="2915102088417824677">Se aktivitetsloggen</translation>
 <translation id="2915873080513663243">Automatisk skanning</translation>
@@ -2320,6 +2324,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{En utvidelse er godkjent}other{# utvidelser er godkjent}}</translation>
 <translation id="3822559385185038546">Administratoren din kontrollerer denne proxy-tjeneren</translation>
 <translation id="3823310065043511710">Det anbefales minst <ph name="INSTALL_SIZE" /> ledig plass for Linux.</translation>
+<translation id="3824621460022590830">Tokenet for registrering av enhet er ugyldig. Kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Administratoren har slått av muligheten for å legge til flere Google-kontoer</translation>
 <translation id="3827306204503227641">Fortsett å tillate programtillegg uten prosessisolering</translation>
 <translation id="3827774300009121996">&amp;Full skjerm</translation>
@@ -3271,6 +3276,7 @@
 <translation id="5079950360618752063">Bruk foreslått passord</translation>
 <translation id="508059534790499809">Oppdater en Kerberos-sak</translation>
 <translation id="5084230410268011727">Tillat at nettsteder bruker bevegelses- og lyssensorer</translation>
+<translation id="5084328598860513926">Klargjøringsflyten ble avbrutt. Prøv på nytt, eller kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Ser etter oppdateringer</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Vil du gjenopprette standardstartsiden?</translation>
@@ -3393,7 +3399,6 @@
 <translation id="5241128660650683457">Les alle dataene på nettstedene du besøker</translation>
 <translation id="5242724311594467048">Vil du slå på «<ph name="EXTENSION_NAME" />»?</translation>
 <translation id="5243522832766285132">Prøv på nytt om en liten stund</translation>
-<translation id="5244406554036143958">Skriv inn PIN-koden for å slå på automatisk innsending</translation>
 <translation id="5244474230056479698">Synkroniserer til <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Kom i gang med en skolekonto</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> har fått programstopp. Klikk på denne ballongen for å starten programmet på nytt.</translation>
@@ -3670,6 +3675,7 @@
 <translation id="557722062034137776">Tilbakestilling av enheten påvirker ikke Google-kontoene dine eller andre data som er synkronisert til disse kontoene. Derimot slettes alle filer som er lagret lokalt på enheten.</translation>
 <translation id="5578059481725149024">Automatisk pålogging</translation>
 <translation id="558170650521898289">Verifisering av maskinvaredriver for Microsoft Windows</translation>
+<translation id="5581972110672966454">Kan ikke knytte enheten til domenet. Prøv på nytt, eller kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Hovedmeny</translation>
 <translation id="5583640892426849032">Tilbake-tasten</translation>
 <translation id="5584088138253955452">Vil du lagre brukernavnet?</translation>
@@ -3742,6 +3748,7 @@
 <translation id="5667546120811588575">Konfigurerer Google Play …</translation>
 <translation id="5669267381087807207">Aktiverer</translation>
 <translation id="5669691691057771421">Skriv inn en ny PIN-kode</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Bilder er blokkert</translation>
 <translation id="5671658447180261823">Fjerner forslaget <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Denne enheten får automatiske programvare- og sikkerhetsoppdateringer frem til <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
@@ -5388,6 +5395,7 @@
 <translation id="7764225426217299476">Legg til adresse</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> fra <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Flytt</translation>
+<translation id="7766082757934713382">Bidrar til å redusere nettverksdatabruken ved å sette automatiske app- og systemoppdateringer på pause</translation>
 <translation id="7766807826975222231">Få en innføring</translation>
 <translation id="7766838926148951335">Godta tillatelsene</translation>
 <translation id="7768770796815395237">Endre</translation>
@@ -6300,6 +6308,7 @@
 <translation id="885701979325669005">Lagring</translation>
 <translation id="8859057652521303089">Velg språk:</translation>
 <translation id="8859174528519900719">Underramme: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Kunne ikke laste inn vilkårene for bruk</translation>
 <translation id="8859662783913000679">Foreldrekonto</translation>
 <translation id="8862003515646449717">Bytt til en raskere nettleser</translation>
 <translation id="8863753581171631212">Åpne linken i ny <ph name="APP" /></translation>
@@ -6568,6 +6577,7 @@
 <translation id="920045321358709304">Søk med <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Eventuelle frakoblede data blir slettet.</translation>
 <translation id="9201220332032049474">Alternativer for skjermlås</translation>
+<translation id="9201842707396338580">Noe gikk galt. Kontakt eieren eller administratoren av enheten. Feilkode: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profilering aktivert</translation>
 <translation id="9203904171912129171">Velg enhet</translation>
 <translation id="9203962528777363226">Administratoren til denne enheten har deaktivert tillegging av nye brukere</translation>
@@ -6639,6 +6649,7 @@
 <translation id="983511809958454316">Denne funksjonen støttes ikke i VR</translation>
 <translation id="984275831282074731">Betalingsmåter</translation>
 <translation id="98515147261107953">Liggende</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Generelt</translation>
 <translation id="987897973846887088">Ingen bilder er tilgjengelige</translation>
 <translation id="988978206646512040">Tomme passordfraser er ikke tillatt</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 4079857f..81ca19b 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1155,7 +1155,6 @@
 <translation id="2408955596600435184">ଆପଣଙ୍କର PIN ଲେଖନ୍ତୁ</translation>
 <translation id="241082044617551207">ଅଜଣା ପ୍ଲଗ୍-ଇନ୍</translation>
 <translation id="2412593942846481727">ଅପ୍‍‍ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି</translation>
-<translation id="2414499877591062094">ସ୍ୱତଃ ଦାଖଲ PIN ସକ୍ଷମ କରନ୍ତୁ</translation>
 <translation id="2416435988630956212">କୀବୋର୍ଡ ଫଙ୍କସନ୍ କୀଗୁଡ଼ିକ</translation>
 <translation id="241727068219398187">ଆପଣଙ୍କର ଡାଟା <ph name="TIME" />ରୁ ଆପଣଙ୍କ Google ପାସ୍‌ୱର୍ଡ ସହିତ ଏନ୍‍କ୍ରିପ୍ଟ କରାଯାଇଥିଲା। ଏଥିରେ Google Payରୁ ପେମେଣ୍ଟ କରିବାର ପଦ୍ଧତି ଏବଂ ଠିକଣାଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ନାହିଁ।</translation>
 <translation id="2419131370336513030">ଇନଷ୍ଟଲ୍ କରାଯାଇଥିବା ଆପଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ</translation>
@@ -3390,7 +3389,6 @@
 <translation id="5241128660650683457">ଆପଣ ଯାଇଥିବା ୱେବ୍‌ସାଇଟ୍‌ଗୁଡ଼ିକରେ ଥିବା ଆପଣଙ୍କ ସମସ୍ତ ଡାଟା ପଢ଼ନ୍ତୁ</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"କୁ ସକ୍ଷମ କରିବେ କି?</translation>
 <translation id="5243522832766285132">କିଛି କ୍ଷଣ ମଧ୍ୟରେ ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation>
-<translation id="5244406554036143958">ସ୍ୱଚାଳିତ ଦାଖଲ ଫିଚର୍ ସକ୍ଷମ କରିବାକୁ ଆପଣଙ୍କ PIN ଲେଖନ୍ତୁ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />କୁ ସିଙ୍କ୍ କରାଯାଉଛି</translation>
 <translation id="5245610266855777041">ଏକ ସ୍କୁଲ ଆକାଉଣ୍ଟ ସହିତ ଆରମ୍ଭ କରନ୍ତୁ</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> କ୍ରାସ୍ ହୋଇଯାଇଛି। ଆପ୍‌କୁ ରିଷ୍ଟାର୍ଟ କରିବା ପାଇଁ ଏହି ବେଲୁନ୍‌ରେ କ୍ଲିକ୍ କରନ୍ତୁ।</translation>
@@ -4474,7 +4472,7 @@
 <translation id="6602956230557165253">ନାଭିଗେଟ୍‍ କରିବାକୁ ବାମ ଏବଂ ଡାହାଣ ତୀର କୀ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="6605847144724004692">ବର୍ତ୍ତମାନ ପର୍ଯ୍ୟନ୍ତ କୌଣସି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ମୂଲ୍ୟାଙ୍କିତ କରାଯାଇନାହିଁ।</translation>
 <translation id="6607831829715835317">ଅଧିକ ଟୁ&amp;ଲ୍</translation>
-<translation id="6608012008902909398">ଡିଭାଇସ୍ ସଫ୍ଟୱେୟାର ଯାଞ୍ଚର ବିବରଣୀ ଦେଖାନ୍ତୁ</translation>
+<translation id="6608012008902909398">ଡିଭାଇସ୍ ସଫ୍ଟୱେର ଯାଞ୍ଚର ବିବରଣୀ ଦେଖାନ୍ତୁ</translation>
 <translation id="6611972847767394631">ଆପଣଙ୍କର ଟାବ୍‍ଗୁଡ଼ିକୁ ଏଠାରେ ଖୋଜନ୍ତୁ</translation>
 <translation id="6612358246767739896">ସୁରକ୍ଷିତ ବିଷୟବସ୍ତୁ</translation>
 <translation id="6615455863669487791">ମୋତେ ଦେଖାନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index fbead929..4ebc57f 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">ਆਪਣਾ PIN ਦਾਖਲ ਕਰੋ</translation>
 <translation id="241082044617551207">ਅਗਿਆਤ ਪਲੱਗਇਨ</translation>
 <translation id="2412593942846481727">ਅੱਪਡੇਟ ਉਪਲਬਧ ਹੈ</translation>
-<translation id="2414499877591062094">ਪਿੰਨ ਨੂੰ ਸਵੈਚਲਿਤ ਸਪੁਰਦ ਕਰਨਾ ਚਾਲੂ ਕਰੋ</translation>
 <translation id="2416435988630956212">ਕੀ-ਬੋਰਡ ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ</translation>
 <translation id="241727068219398187"><ph name="TIME" /> ਤੱਕ ਦੇ ਡਾਟੇ ਨੂੰ ਤੁਹਾਡੇ Google ਪਾਸਵਰਡ ਨਾਲ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਇਸ ਵਿੱਚ Google Pay ਦੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਅਤੇ ਪਤੇ ਸ਼ਾਮਲ ਨਹੀਂ ਹਨ।</translation>
 <translation id="2419131370336513030">ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦੇਖੋ</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">ਉਨ੍ਹਾਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਆਪਣਾ ਸਾਰਾ ਡਾਟਾ ਪੜ੍ਹੋ ਜਿਨ੍ਹਾਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਤੁਸੀਂ ਜਾਂਦੇ ਹੋ</translation>
 <translation id="5242724311594467048">ਕੀ "<ph name="EXTENSION_NAME" />" ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation>
 <translation id="5243522832766285132">ਕਿਰਪਾ ਕਰਕੇ ਕੁਝ ਪਲਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation>
-<translation id="5244406554036143958">ਸਵੈਚਲਿਤ ਸਪੁਰਦ ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਆਪਣਾ ਪਿੰਨ ਦਾਖਲ ਕਰੋ</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ਨਾਲ ਸਮਕਾਲੀ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="5245610266855777041">ਸਕੂਲੀ ਖਾਤੇ ਨਾਲ ਸ਼ੁਰੂਆਤ ਕਰੋ</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ਕ੍ਰੈਸ਼ ਹੋ ਗਈ ਹੈ। ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਇਸ ਬਲੂਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index cdeb197..a7bf6d3 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">Wpisz kod PIN</translation>
 <translation id="241082044617551207">Nieznana wtyczka</translation>
 <translation id="2412593942846481727">Dostępna aktualizacja</translation>
-<translation id="2414499877591062094">Włącz kod PIN automatycznego przesyłania</translation>
 <translation id="2416435988630956212">Klawisze funkcyjne na klawiaturze</translation>
 <translation id="241727068219398187">Dane zostały zaszyfrowane Twoim hasłem Google z <ph name="TIME" />.
           Nie obejmuje to form płatności ani adresów w Google Pay.</translation>
@@ -3401,7 +3400,6 @@
 <translation id="5241128660650683457">Odczyt wszystkich Twoich danych na odwiedzanych stronach internetowych</translation>
 <translation id="5242724311594467048">Włączyć rozszerzenie „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Spróbuj ponownie za kilka chwil</translation>
-<translation id="5244406554036143958">Podaj kod PIN, by włączyć automatyczne przesyłanie</translation>
 <translation id="5244474230056479698">Synchronizacja z <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Pierwsze kroki z kontem szkolnym</translation>
 <translation id="5246282308050205996">Aplikacja <ph name="APP_NAME" /> uległa awarii. Kliknij ten dymek, aby uruchomić ją ponownie.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index a1adb5d..84765ac5 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Informe seu PIN</translation>
 <translation id="241082044617551207">Plug-in desconhecido</translation>
 <translation id="2412593942846481727">Atualização disponível</translation>
-<translation id="2414499877591062094">Ativar PIN para envio automático</translation>
 <translation id="2416435988630956212">Teclas de função do teclado</translation>
 <translation id="241727068219398187">Dados foram criptografados com sua senha do Google a partir de
           <ph name="TIME" />. Isso não inclui formas de pagamento e endereços do Google Pay.</translation>
@@ -3399,7 +3398,6 @@
 <translation id="5241128660650683457">Ler todos os dados sobre os websites que você visita</translation>
 <translation id="5242724311594467048">Ativar "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Tente novamente em alguns instantes</translation>
-<translation id="5244406554036143958">Digite o PIN para ativar o envio automático</translation>
 <translation id="5244474230056479698">Sincronizado com <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Primeiros passos com uma conta escolar</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> travou. Clique neste balão para reiniciar o aplicativo.</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 67616bd..0874a01 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Introduza o PIN</translation>
 <translation id="241082044617551207">Plug-in desconhecido</translation>
 <translation id="2412593942846481727">Atualização disponível</translation>
-<translation id="2414499877591062094">Ativar envio automático do PIN</translation>
 <translation id="2416435988630956212">Teclas de função do teclado</translation>
 <translation id="241727068219398187">Os dados foram encriptados com a sua palavra-passe do Google em <ph name="TIME" />. Não estão incluídos métodos de pagamento e endereços do Google Pay.</translation>
 <translation id="2419131370336513030">Ver apps instaladas</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Ler todos os dados nos Sites visitados</translation>
 <translation id="5242724311594467048">Ativar a extensão "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Tente novamente dentro de alguns momentos.</translation>
-<translation id="5244406554036143958">Introduza o seu PIN para ativar o envio automático</translation>
 <translation id="5244474230056479698">A sincronizar com <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Comece com uma conta escolar</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> falhou. Clique neste balão para reiniciar a aplicação.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 8e3693e3c..38b64a8 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Notele de pe ecranul de blocare sunt salvate automat în <ph name="LOCK_SCREEN_APP_NAME" />. Cea mai recentă notă va rămâne pe ecranul de blocare.</translation>
 <translation id="2353297238722298836">Camera foto și microfonul sunt permise</translation>
+<translation id="2355314311311231464">Provizionarea nu a reușit, deoarece detaliile contului nu au putut fi preluate. Încearcă din nou. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Activează Tetheringul instantaneu</translation>
 <translation id="2356070529366658676">Întreabă-mă</translation>
 <translation id="2357330829548294574">Șterge utilizatorul <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Introdu codul PIN</translation>
 <translation id="241082044617551207">Plugin necunoscut</translation>
 <translation id="2412593942846481727">Actualizare disponibilă</translation>
-<translation id="2414499877591062094">Activează trimiterea automată a codului PIN</translation>
 <translation id="2416435988630956212">Tastele pentru funcții de la tastatură</translation>
 <translation id="241727068219398187">Datele au fost criptate cu parola ta Google începând cu
           <ph name="TIME" />. Acest lucru nu este valabil și pentru metodele de plată și adresele din Google Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">Traduceți această pagină</translation>
 <translation id="2475982808118771221">A apărut o eroare</translation>
 <translation id="2476578072172137802">Setările site-ului</translation>
+<translation id="2476974672882258506">Închide Windows pentru a dezinstala <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">Permisiuni privind fișierele media pentru „<ph name="EXTENSION" />”</translation>
 <translation id="247949520305900375">Trimite conținutul audio</translation>
 <translation id="248003956660572823">Parolele nu au fost salvate</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">A fost acordat accesul numai în citire la <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">Această pictogramă va fi vizibilă atunci când extensia poate acționa pe pagina actuală. Utilizați această extensie dând clic pe pictogramă sau apăsând pe <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurează ca Chromebox pentru videoconferințe</translation>
+<translation id="2579232805407578790">Nu s-a putut conecta la server. Verifică starea conexiunii la rețea și încearcă din nou. Dacă problema persistă, repornește Chromebookul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Permiteți întotdeauna <ph name="HOST" /> să descarce mai multe fișiere</translation>
 <translation id="258095186877893873">Lungă</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Conectarea cu acest nume de utilizator a fost dezactivată de către administratorul dvs.</translation>
 <translation id="283669119850230892">Pentru a utiliza rețeaua <ph name="NETWORK_ID" />, finalizați mai întâi conexiunea la internet mai jos.</translation>
 <translation id="2838379631617906747">Se instalează</translation>
+<translation id="2838835911926931318">Conectează-te pentru a sincroniza marcajele, parolele, istoricul și altele pe toate dispozitivele</translation>
 <translation id="2839032553903800133">Notificările au fost blocate</translation>
 <translation id="2841013758207633010">Oră</translation>
 <translation id="2841837950101800123">Furnizor</translation>
@@ -1584,6 +1587,7 @@
 Mesaj de la server: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Adăugați galeria media după directoare</translation>
 <translation id="2910318910161511225">Conectează-te la o rețea și încearcă din nou</translation>
+<translation id="2910718431259223434">A apărut o eroare. Încearcă din nou sau contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Permite site-urilor să salveze și să citească datele asociate cookie-urilor (recomandat)</translation>
 <translation id="2915102088417824677">Vezi Jurnalul de activități</translation>
 <translation id="2915873080513663243">Scanare automată</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{O extensie a fost aprobată}few{# extensii au fost aprobate}other{# de extensii au fost aprobate}}</translation>
 <translation id="3822559385185038546">Acest proxy este impus de administrator</translation>
 <translation id="3823310065043511710">Pentru Linux, se recomandă un spațiu de cel puțin <ph name="INSTALL_SIZE" />.</translation>
+<translation id="3824621460022590830">Indicativul de înregistrare a dispozitivului nu este valid. Contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Administratorul a dezactivat adăugarea mai multor Conturi Google</translation>
 <translation id="3827306204503227641">Continuă permiterea pluginurilor scoase din mediul de testare</translation>
 <translation id="3827774300009121996">&amp;Ecran complet</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Folosește parola sugerată</translation>
 <translation id="508059534790499809">Actualizează un tichet Kerberos</translation>
 <translation id="5084230410268011727">Permite folosirea senzorilor de mișcare și de lumină de către site-uri</translation>
+<translation id="5084328598860513926">Fluxul de provizionare a fost întrerupt. Încearcă din nou sau contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Se caută actualizări</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Restabilești pagina principală prestabilită?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Citește toate datele de pe site-urile pe care le vizitezi</translation>
 <translation id="5242724311594467048">Activați extensia „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Încearcă din nou în câteva momente</translation>
-<translation id="5244406554036143958">Introdu codul PIN pentru a activa trimiterea automată</translation>
 <translation id="5244474230056479698">Se sincronizează cu <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Începe lucrul cu un cont de la școală</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> s-a blocat. Dă clic pe balon pentru a reporni aplicația.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Resetarea dispozitivului nu va afecta conturile Google sau datele sincronizate cu aceste conturi. Cu toate acestea, toate fișierele salvate local pe dispozitiv vor fi șterse.</translation>
 <translation id="5578059481725149024">Conectare automată</translation>
 <translation id="558170650521898289">Verificare a driverelor hardware pentru Microsoft Windows</translation>
+<translation id="5581972110672966454">Dispozitivul nu a putut fi asociat domeniului. Încearcă din nou sau contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Meniu principal</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Salvezi numele de utilizator?</translation>
@@ -3747,6 +3753,7 @@
 <translation id="5667546120811588575">Se configurează Google Play...</translation>
 <translation id="5669267381087807207">Se activează</translation>
 <translation id="5669691691057771421">Introdu noul cod PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Imagini blocate</translation>
 <translation id="5671658447180261823">Elimină sugestia <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Acest dispozitiv va primi actualizări automate de software și de securitate până în <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
@@ -5393,6 +5400,7 @@
 <translation id="7764225426217299476">Adaugă o adresă</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de la <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Mută</translation>
+<translation id="7766082757934713382">Reduce utilizarea datelor din rețea prin întreruperea actualizărilor automate ale aplicațiilor și sistemului</translation>
 <translation id="7766807826975222231">Faceți un tur</translation>
 <translation id="7766838926148951335">Acceptă permisiunile</translation>
 <translation id="7768770796815395237">Modifică</translation>
@@ -6305,6 +6313,7 @@
 <translation id="885701979325669005">Stocare</translation>
 <translation id="8859057652521303089">Selectează limba:</translation>
 <translation id="8859174528519900719">Subcadru: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Nu s-au putut încărca termenii și condițiile</translation>
 <translation id="8859662783913000679">Cont de părinte</translation>
 <translation id="8862003515646449717">Comută la un browser rapid</translation>
 <translation id="8863753581171631212">Deschide linkul într-o fereastră nouă în <ph name="APP" /></translation>
@@ -6573,6 +6582,7 @@
 <translation id="920045321358709304">Caută pe <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Toate datele offline vor fi șterse</translation>
 <translation id="9201220332032049474">Opțiuni de blocare a ecranului</translation>
+<translation id="9201842707396338580">A apărut o eroare. Contactează proprietarul dispozitivului ori administratorul. Cod de eroare: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Analizare activată</translation>
 <translation id="9203904171912129171">Selectează un dispozitiv</translation>
 <translation id="9203962528777363226">Administratorul acestui dispozitiv a dezactivat adăugarea de utilizatori noi</translation>
@@ -6644,6 +6654,7 @@
 <translation id="983511809958454316">Această funcție nu este acceptată în RV</translation>
 <translation id="984275831282074731">Metode de plată</translation>
 <translation id="98515147261107953">Peisaj</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">General</translation>
 <translation id="987897973846887088">Nu există imagini disponibile</translation>
 <translation id="988978206646512040">Trebuie să fie introdusă expresia de acces</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 4123210..26a0b8f 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1160,7 +1160,6 @@
 <translation id="2408955596600435184">Введите PIN-код</translation>
 <translation id="241082044617551207">Неизвестный плагин</translation>
 <translation id="2412593942846481727">Доступно обновление</translation>
-<translation id="2414499877591062094">Отправлять PIN-код автоматически</translation>
 <translation id="2416435988630956212">Функциональные клавиши клавиатуры</translation>
 <translation id="241727068219398187">Данные зашифрованы с помощью пароля вашего аккаунта Google от <ph name="TIME" />. Шифрование не применяется к способам оплаты и адресам из Google Pay.</translation>
 <translation id="2419131370336513030">Показать установленные приложения</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">Просмотр ваших данных на посещаемых сайтах</translation>
 <translation id="5242724311594467048">Включить приложение "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Повторите попытку через несколько секунд</translation>
-<translation id="5244406554036143958">Введите PIN-код, чтобы включить автоматическую отправку.</translation>
 <translation id="5244474230056479698">Синхронизация с <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Начало работы с учебным аккаунтом</translation>
 <translation id="5246282308050205996">Произошел сбой приложения <ph name="APP_NAME" />. Нажмите на это сообщение, чтобы перезапустить его.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index e6f2c52..44ff3d81 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">ඔබගේ PIN එක ඇතුළු කරන්න</translation>
 <translation id="241082044617551207">නොදන්නා ප්ලගිනය</translation>
 <translation id="2412593942846481727">යාවත්කාලීනයක් ඇත</translation>
-<translation id="2414499877591062094">ස්වයංක්‍රිය ඉදිරිපත් කිරීම් PIN සබල කරන්න</translation>
 <translation id="2416435988630956212">යතුරු පුවරු කාර්ය යතුරු</translation>
 <translation id="241727068219398187"><ph name="TIME" /> වන විට ඔබේ Google මුරපදය සමඟ දත්ත සංකේතන කළා.
           මෙයට Google Pay වෙතින් ගෙවීමේ ක්‍රම සහ ලිපින ඇතුළු නොවේ.</translation>
@@ -3403,7 +3402,6 @@
 <translation id="5241128660650683457">ඔබ පිවිසෙන සියලුම වෙබ් අඩවිවල ඔබගේ සියලුම දත්ත කියවන්න</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" සබල කරන්නද?</translation>
 <translation id="5243522832766285132">කරුණාකර සුළු මොහොතකින් නැවත උත්සාහ කරන්න</translation>
-<translation id="5244406554036143958">ස්වයංක්‍රීයව ඉදිරිපත් කිරීම සබල කිරීමට ඔබගේ PIN අංකය ඇතුළත් කරන්න</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> වෙත සමමුහුර්ත කරමින්</translation>
 <translation id="5245610266855777041">පාසල් ගිණුමක් සමඟ පටන් ගන්න</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> බිඳ වැටී තිබේ. යෙදුම නැවත ඇරඹීමට මෙම බැලූනය මත ක්ලික් කරන්න.</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 53c99a9..a774c4c 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Zadajte kód PIN</translation>
 <translation id="241082044617551207">Neznámy doplnok</translation>
 <translation id="2412593942846481727">K dispozícii je aktualizácia</translation>
-<translation id="2414499877591062094">Aktivovať automatické zadávanie kódu PIN</translation>
 <translation id="2416435988630956212">Funkčné klávesy na klávesnici</translation>
 <translation id="241727068219398187">Údaje boli <ph name="TIME" /> zašifrované pomocou vášho hesla Google. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation>
 <translation id="2419131370336513030">Zobraziť inštalované aplikácie</translation>
@@ -3404,7 +3403,6 @@
 <translation id="5241128660650683457">Čítať všetky vaše údaje na weboch, ktoré navštevujete</translation>
 <translation id="5242724311594467048">Povoliť rozšírenie <ph name="EXTENSION_NAME" />?</translation>
 <translation id="5243522832766285132">Skúste to znova o chvíľu</translation>
-<translation id="5244406554036143958">Aby sa aktivovalo automatické zadávanie, zadajte PIN</translation>
 <translation id="5244474230056479698">Synchronizácia do účtu <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Ako začať so školským účtom</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> zlyhala. Aplikáciu reštartujte kliknutím na túto bublinu.</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index a42bd82..82d70ca 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Zapiski na zaklenjenem zaslonu so samodejno shranjeni v aplikacijo <ph name="LOCK_SCREEN_APP_NAME" />. Zadnji zapisek ostane na zaklenjenem zaslonu.</translation>
 <translation id="2353297238722298836">Kamera in mikrofon sta dovoljena</translation>
+<translation id="2355314311311231464">Omogočanje uporabe ni uspelo, ker ni bilo mogoče pridobiti podrobnosti računa. Poskusite znova. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Vklop takojšnje povezave računalnika z internetom prek mobilnega telefona</translation>
 <translation id="2356070529366658676">Vprašaj</translation>
 <translation id="2357330829548294574">Odstranitev uporabnika <ph name="USER_NAME" /></translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">Vnos kode PIN</translation>
 <translation id="241082044617551207">Neznani vtičnik</translation>
 <translation id="2412593942846481727">Na voljo je posodobitev</translation>
-<translation id="2414499877591062094">Omogoči kodo PIN za samodejno pošiljanje</translation>
 <translation id="2416435988630956212">Funkcijske tipke tipkovnice</translation>
 <translation id="241727068219398187">Podatki so bili šifrirani z vašim geslom za Google Račun z dnem
           <ph name="TIME" />. To ne vključuje plačilnih sredstev in naslovov iz Googla Pay.</translation>
@@ -1216,6 +1216,7 @@
 <translation id="2473195200299095979">Prevede to stran</translation>
 <translation id="2475982808118771221">Prišlo je do napake</translation>
 <translation id="2476578072172137802">Nastavitve mesta</translation>
+<translation id="2476974672882258506">Zaustavite sistem Windows, če želite odmestiti program <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">Dovoljenja za predstavnostne datoteke za razširitev »<ph name="EXTENSION" />«</translation>
 <translation id="247949520305900375">Skupna raba zvoka</translation>
 <translation id="248003956660572823">Gesla niso bila shranjena</translation>
@@ -1306,6 +1307,7 @@
 <translation id="2572032849266859634">Odobren je dostop samo za branje za <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">Ikona bo vidna, če lahko razširitev deluje na trenutni strani. Razširitev uporabite tako, da kliknete ikono ali pritisnete <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nastavitev kot Chromebox za videokonference</translation>
+<translation id="2579232805407578790">Ni se bilo mogoče povezati s strežnikom. Preverite omrežno povezavo in poskusite znova. Če težave ne odpravite, znova zaženite Chromebook. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Gostitelju <ph name="HOST" /> vedno dovoli prenos več datotek</translation>
 <translation id="258095186877893873">Dolga</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Okolje <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1525,6 +1527,7 @@
 <translation id="2836635946302913370">Skrbnik je onemogočil prijavo s tem uporabniškim imenom.</translation>
 <translation id="283669119850230892">Če želite uporabljati omrežje <ph name="NETWORK_ID" />, najprej spodaj vzpostavite povezavo z internetom.</translation>
 <translation id="2838379631617906747">Nameščanje</translation>
+<translation id="2838835911926931318">Prijavite se, če želite sinhronizirati zaznamke, gesla, zgodovino in druge podatke v vseh napravah</translation>
 <translation id="2839032553903800133">Obvestila so blokirana</translation>
 <translation id="2841013758207633010">Čas</translation>
 <translation id="2841837950101800123">Ponudnik</translation>
@@ -1584,6 +1587,7 @@
     Sporočilo strežnika: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Dodajanje galerije predstavnosti po imeniku</translation>
 <translation id="2910318910161511225">Vzpostavite povezavo z omrežjem in poskusite znova</translation>
+<translation id="2910718431259223434">Prišlo je do napake. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Dovoli spletnim mestom shranjevanje in branje podatkov piškotkov (priporočljivo)</translation>
 <translation id="2915102088417824677">Ogled dnevnika dejavnosti</translation>
 <translation id="2915873080513663243">Samodejno iskanje</translation>
@@ -2323,6 +2327,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Razširitev je odobrena}one{# razširitev je odobrena}two{# razširitvi sta odobreni}few{# razširitve so odobrene}other{# razširitev je odobrenih}}</translation>
 <translation id="3822559385185038546">Ta strežnik proxy je uveljavil skrbnik</translation>
 <translation id="3823310065043511710">Za Linux priporočamo najmanj <ph name="INSTALL_SIZE" /> prostora.</translation>
+<translation id="3824621460022590830">Žeton za včlanitev naprave je neveljaven. Obrnite se na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Skrbnik je onemogočil dodajanje več računov Google</translation>
 <translation id="3827306204503227641">Še naprej dovoli vtičnike brez varnostnih omejitev</translation>
 <translation id="3827774300009121996">&amp;Celozaslonsko</translation>
@@ -3276,6 +3281,7 @@
 <translation id="5079950360618752063">Uporabi predlagano geslo</translation>
 <translation id="508059534790499809">Osvežitev kartončka za Kerberos</translation>
 <translation id="5084230410268011727">Spletnim mestom dovoli uporabo tipal za gibanje in svetlobo</translation>
+<translation id="5084328598860513926">Potek omogočanja uporabe je bil prekinjen. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Preverjanje, ali so na voljo posodobitve</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Želite obnoviti privzeto začetno stran?</translation>
@@ -3398,7 +3404,6 @@
 <translation id="5241128660650683457">Branje vseh vaših podatkov na spletnih mestih, ki jih obiščete</translation>
 <translation id="5242724311594467048">Ali želite omogočiti »<ph name="EXTENSION_NAME" />«?</translation>
 <translation id="5243522832766285132">Poskusite znova čez nekaj trenutkov</translation>
-<translation id="5244406554036143958">Vnesite kodo PIN, če želite omogočiti samodejno pošiljanje</translation>
 <translation id="5244474230056479698">Syncing to <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Začnite uporabljati šolski račun</translation>
 <translation id="5246282308050205996">Program <ph name="APP_NAME" /> se je zrušil. Kliknite ta oblaček, da ga znova zaženete.</translation>
@@ -3675,6 +3680,7 @@
 <translation id="557722062034137776">Ponastavitev naprave ne bo vplivala na vaše Google Račune ali kakršne koli druge podatke, sinhronizirane s temi računi. Izbrisani pa bodo vsi podatki, shranjeni lokalno v napravi.</translation>
 <translation id="5578059481725149024">Samodejna prijava</translation>
 <translation id="558170650521898289">Preverjanje gonilnikov strojne opreme za sistem Microsoft Windows</translation>
+<translation id="5581972110672966454">Naprave ni mogoče pridružiti domeni. Poskusite znova ali se obrnite na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Glavni meni</translation>
 <translation id="5583640892426849032">Vračalka</translation>
 <translation id="5584088138253955452">Želite shraniti uporabniško ime?</translation>
@@ -3749,6 +3755,7 @@
 <translation id="5667546120811588575">Nastavljanje Googla Play ...</translation>
 <translation id="5669267381087807207">Aktiviranje</translation>
 <translation id="5669691691057771421">Vnos nove kode PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Slike so blokirane</translation>
 <translation id="5671658447180261823">Odstrani predlog <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Ta naprava bo prejemala samodejne posodobitve programske opreme in varnostne posodobitve do tega datuma: <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
@@ -5395,6 +5402,7 @@
 <translation id="7764225426217299476">Dodaj naslov</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> iz <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Premakni</translation>
+<translation id="7766082757934713382">Z začasno zaustavitvijo posodobitev aplikacij in sistema pomaga zmanjšati preneseno količino podatkov v omrežju</translation>
 <translation id="7766807826975222231">Oglejte si predstavitev</translation>
 <translation id="7766838926148951335">Sprejmi dovoljenja</translation>
 <translation id="7768770796815395237">Spremeni</translation>
@@ -6307,6 +6315,7 @@
 <translation id="885701979325669005">Shramba</translation>
 <translation id="8859057652521303089">Izberite jezik:</translation>
 <translation id="8859174528519900719">Podokvir: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Pogojev storitve ni bilo mogoče naložiti</translation>
 <translation id="8859662783913000679">Starševski račun</translation>
 <translation id="8862003515646449717">Preklop na hitrejši brskalnik</translation>
 <translation id="8863753581171631212">Odpiranje povezave v novem oknu aplikacije <ph name="APP" /></translation>
@@ -6575,6 +6584,7 @@
 <translation id="920045321358709304">Iskanje z iskalnikom <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Morebitni podatki brez povezave bodo izbrisani</translation>
 <translation id="9201220332032049474">Možnosti zaklepanja zaslona</translation>
+<translation id="9201842707396338580">Prišlo je do napake. Obrnite se na lastnika ali skrbnika naprave. Koda napake: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profiliranje omogočeno</translation>
 <translation id="9203904171912129171">Izberite napravo</translation>
 <translation id="9203962528777363226">Skrbnik te naprave je onemogočil dodajanje novih uporabnikov</translation>
@@ -6646,6 +6656,7 @@
 <translation id="983511809958454316">Ta funkcija ni podprta v navidezni resničnosti</translation>
 <translation id="984275831282074731">Plačilna sredstva</translation>
 <translation id="98515147261107953">Ležeče</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Splošno</translation>
 <translation id="987897973846887088">Na voljo ni nobenih slik</translation>
 <translation id="988978206646512040">Prazno geslo ni dovoljeno</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index bc814f3..d82dad1 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1118,6 +1118,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Shënimet në ekranin e kyçjes ruhen automatikisht te <ph name="LOCK_SCREEN_APP_NAME" />. Shënimi yt më i fundit do të qëndrojë në ekranin e kyçjes.</translation>
 <translation id="2353297238722298836">Kamera dhe mikrofoni lejohen</translation>
+<translation id="2355314311311231464">Përgatitja dështoi sepse detajet e llogarisë sate nuk mund të merreshin. Provo përsëri. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Aktivizo "Ndarjen e internetit në çast"</translation>
 <translation id="2356070529366658676">Pyet</translation>
 <translation id="2357330829548294574">Hiqe <ph name="USER_NAME" /></translation>
@@ -1158,7 +1159,6 @@
 <translation id="2408955596600435184">Fut kodin PIN</translation>
 <translation id="241082044617551207">Përbërës shtesë i panjohur</translation>
 <translation id="2412593942846481727">Ka përditësim</translation>
-<translation id="2414499877591062094">Aktivizo dërgimin automatik të kodit PIN</translation>
 <translation id="2416435988630956212">Tastet e funksionit të tastierës</translation>
 <translation id="241727068219398187">Të dhënat janë enkriptuar me fjalëkalimin tënd të Google që nga data
           <ph name="TIME" />. Kjo nuk përfshin mënyrat e pagesës dhe adresat nga Google Pay.</translation>
@@ -1213,6 +1213,7 @@
 <translation id="2473195200299095979">Përktheje këtë faqe</translation>
 <translation id="2475982808118771221">Ndodhi një gabim</translation>
 <translation id="2476578072172137802">Cilësimet e sajtit</translation>
+<translation id="2476974672882258506">Fike sistemin Windows për ta çinstaluar <ph name="PARALLELS_DESKTOP" />.</translation>
 <translation id="2478176599153288112">Lejet e skedarëve të medias për "<ph name="EXTENSION" />"</translation>
 <translation id="247949520305900375">Ndaj audion</translation>
 <translation id="248003956660572823">Fjalëkalimet nuk u ruajtën</translation>
@@ -1303,6 +1304,7 @@
 <translation id="2572032849266859634">Është dhënë qasja "vetëm për lexim" për <ph name="VOLUME_NAME" />.</translation>
 <translation id="2575247648642144396">Kjo ikonë do të jetë e dukshme kur shtesa të arrijë të veprojë në faqen aktuale. Përdore këtë shtesë duke klikuar mbi ikonën ose duke shtypur <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfiguroje si "Chromebox për takime"</translation>
+<translation id="2579232805407578790">Nuk mund të lidhej me serverin. Kontrollo lidhjen e rrjetit dhe provo përsëri. Nëse problemi vazhdon, rinise pajisjen Chromebook. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162">Lejo gjithmonë që <ph name="HOST" /> të shkarkojë shumë skedarë</translation>
 <translation id="258095186877893873">E gjatë</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1522,6 +1524,7 @@
 <translation id="2836635946302913370">Identifikimi me këtë emër përdoruesi është çaktivizuar nga administratori yt.</translation>
 <translation id="283669119850230892">Për të përdorur rrjetin <ph name="NETWORK_ID" />, në fillim përfundo lidhjen tënde me internetin më poshtë.</translation>
 <translation id="2838379631617906747">Po instalohet</translation>
+<translation id="2838835911926931318">Identifikohu për të sinkronizuar faqeshënuesit, fjalëkalimet, historikun etj. në të gjitha pajisjet e tua</translation>
 <translation id="2839032553903800133">Njoftimet janë bllokuar</translation>
 <translation id="2841013758207633010">Koha</translation>
 <translation id="2841837950101800123">Ofruesi</translation>
@@ -1581,6 +1584,7 @@
     Mesazhi i serverit: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Shto galerinë e medias sipas direktorisë</translation>
 <translation id="2910318910161511225">Lidhu me një rrjet dhe provo përsëri</translation>
+<translation id="2910718431259223434">Ndodhi një gabim. Provo përsëri ose kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Lejo faqet të ruajnë dhe lexojnë të dhënat e kukive (rekomandohet)</translation>
 <translation id="2915102088417824677">Shiko evidencën e aktivitetit</translation>
 <translation id="2915873080513663243">Skanimi automatik</translation>
@@ -2320,6 +2324,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Një shtesë është miratuar}other{# shtesa janë miratuar}}</translation>
 <translation id="3822559385185038546">Ky përfaqësues zbatohet nga administratori yt</translation>
 <translation id="3823310065043511710">Për Linux rekomandohet të paktën <ph name="INSTALL_SIZE" /> hapësirë.</translation>
+<translation id="3824621460022590830">Kodi i regjistrimit të pajisjes është i pavlefshëm. Kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Administratori yt ka çaktivizuar shtimin e "Llogarive të tjera të Google"</translation>
 <translation id="3827306204503227641">Vazhdo lejimin e përbërësve shtesë të pakufizuar</translation>
 <translation id="3827774300009121996">&amp;Ekran i plotë</translation>
@@ -3273,6 +3278,7 @@
 <translation id="5079950360618752063">Përdor fjalëkalimin e sugjeruar</translation>
 <translation id="508059534790499809">Rifresko një biletë Kerberos</translation>
 <translation id="5084230410268011727">Lejo sajtet të përdorin sensorët e lëvizjes dhe të dritës</translation>
+<translation id="5084328598860513926">Fluksi i përgatitjes u ndërpre. Provo përsëri ose kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Po kontrollon për përditësime</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Të restaurohet faqja bazë e parazgjedhur?</translation>
@@ -3395,7 +3401,6 @@
 <translation id="5241128660650683457">Lexo të gjitha të dhënat e tua në faqet e internetit që viziton</translation>
 <translation id="5242724311594467048">Të aktivizohet "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Provo sërish pas pak</translation>
-<translation id="5244406554036143958">Fut kodin tënd PIN për të aktivizuar dërgimin automatik</translation>
 <translation id="5244474230056479698">Sinkronizimi në <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Fillo me një llogari shkolle</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> është ndërprerë aksidentalisht. Kliko te kjo balonë për ta rinisur aplikacionin.</translation>
@@ -3672,6 +3677,7 @@
 <translation id="557722062034137776">Rivendosja e pajisjes nuk do të ndikojë në llogaritë e tua të Google dhe të dhënat e sinkronizuara te këto llogari. Sidoqoftë, të gjithë skedarët e ruajtur lokalisht në pajisjen tënde do të fshihen.</translation>
 <translation id="5578059481725149024">Identifikimi automatik</translation>
 <translation id="558170650521898289">Verifikimi i drejtuesit të harduerit të Microsoft Windows</translation>
+<translation id="5581972110672966454">Pajisja nuk mund të bashkohet në domen. Provo përsëri ose kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Menyja kryesore</translation>
 <translation id="5583640892426849032">Hapësirë prapa</translation>
 <translation id="5584088138253955452">Të ruhet emri i përdoruesit?</translation>
@@ -3744,6 +3750,7 @@
 <translation id="5667546120811588575">Po konfiguron Google Play...</translation>
 <translation id="5669267381087807207">Po aktivizohet</translation>
 <translation id="5669691691057771421">Fut kodin e ri PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Imazhet u bllokuan</translation>
 <translation id="5671658447180261823">Hiq sugjerimin <ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">Kjo pajisje do të marrë përditësime automatike të softuerëve dhe të sigurisë deri në <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation>
@@ -5390,6 +5397,7 @@
 <translation id="7764225426217299476">Shto adresë</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> nga <ph name="DOWNLOAD_DOMAIN" /></translation>
 <translation id="7765158879357617694">Zhvendos</translation>
+<translation id="7766082757934713382">Ndihmon për të zvogëluar përdorimin e të dhënave të rrjetit duke i vendosur në pauzë përditësimet e aplikacioneve dhe sistemit</translation>
 <translation id="7766807826975222231">Bëj një turne</translation>
 <translation id="7766838926148951335">Prano lejet</translation>
 <translation id="7768770796815395237">Ndrysho</translation>
@@ -6300,6 +6308,7 @@
 <translation id="885701979325669005">Hapësira ruajtëse</translation>
 <translation id="8859057652521303089">Përzgjidh gjuhën tënde:</translation>
 <translation id="8859174528519900719">Nënkuadri: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Kushtet e shërbimit nuk mund të ngarkoheshin</translation>
 <translation id="8859662783913000679">Llogaria e prindit</translation>
 <translation id="8862003515646449717">Kalo te një shfletues i shpejtë</translation>
 <translation id="8863753581171631212">Hape lidhjen në dritaren e re të <ph name="APP" /></translation>
@@ -6568,6 +6577,7 @@
 <translation id="920045321358709304">Kërko në <ph name="SEARCH_ENGINE" /></translation>
 <translation id="9201023452444595544">Çdo e dhënë jashtë linje do të fshihet</translation>
 <translation id="9201220332032049474">Opsionet e kyçjes së ekranit</translation>
+<translation id="9201842707396338580">Ndodhi një gabim. Kontakto me zotëruesin e pajisjes ose administratorin. Kodi i gabimit: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Profilizimi u aktivizua</translation>
 <translation id="9203904171912129171">Zgjidh një pajisje</translation>
 <translation id="9203962528777363226">Administratori i kësaj pajisjeje ka çaktivizuar shtimin e përdoruesve të rinj</translation>
@@ -6639,6 +6649,7 @@
 <translation id="983511809958454316">Ky funksion nuk mbështetet në VR</translation>
 <translation id="984275831282074731">Mënyrat e pagesës</translation>
 <translation id="98515147261107953">Horizontal</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Të përgjithshme</translation>
 <translation id="987897973846887088">Nuk ka imazhe në dispozicion</translation>
 <translation id="988978206646512040">Lënia bosh e frazës së kalimit nuk lejohet</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index d56e54b4..c3116c3 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">Unesite PIN</translation>
 <translation id="241082044617551207">Nepoznata dodatna komponenta</translation>
 <translation id="2412593942846481727">Dostupno je ažuriranje</translation>
-<translation id="2414499877591062094">Omogući automatsko slanje PIN-a</translation>
 <translation id="2416435988630956212">Funkcijski tasteri na tastaturi</translation>
 <translation id="241727068219398187">Podaci su šifrovani pomoću Google lozinke od
           <ph name="TIME" />. To ne obuhvata načine plaćanja i adrese iz Google Pay-a.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">Čitanje svih vaših podataka na veb-sajtovima koje posećujete</translation>
 <translation id="5242724311594467048">Želite li da omogućite „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="5243522832766285132">Probajte ponovo za nekoliko trenutaka</translation>
-<translation id="5244406554036143958">Unesite PIN da biste omogućili automatsko slanje</translation>
 <translation id="5244474230056479698">Sinhronizuje se sa <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Započni pomoću školskog naloga</translation>
 <translation id="5246282308050205996">Aplikacija <ph name="APP_NAME" /> je otkazala. Kliknite na ovaj oblačić da biste je ponovo pokrenuli.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 24e5936..a5fca0b4 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">Унесите PIN</translation>
 <translation id="241082044617551207">Непозната додатна компонента</translation>
 <translation id="2412593942846481727">Доступно је ажурирање</translation>
-<translation id="2414499877591062094">Омогући аутоматско слање PIN-а</translation>
 <translation id="2416435988630956212">Функцијски тастери на тастатури</translation>
 <translation id="241727068219398187">Подаци су шифровани помоћу Google лозинке од
           <ph name="TIME" />. То не обухвата начине плаћања и адресе из Google Pay-а.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">Читање свих ваших података на веб-сајтовима које посећујете</translation>
 <translation id="5242724311594467048">Желите ли да омогућите „<ph name="EXTENSION_NAME" />“?</translation>
 <translation id="5243522832766285132">Пробајте поново за неколико тренутака</translation>
-<translation id="5244406554036143958">Унесите PIN да бисте омогућили аутоматско слање</translation>
 <translation id="5244474230056479698">Синхронизује се са <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Започни помоћу школског налога</translation>
 <translation id="5246282308050205996">Апликација <ph name="APP_NAME" /> је отказала. Кликните на овај облачић да бисте је поново покренули.</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index af2a707..7bce666 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">Ange din pinkod</translation>
 <translation id="241082044617551207">Okänt pluginprogram</translation>
 <translation id="2412593942846481727">Det finns en uppdatering</translation>
-<translation id="2414499877591062094">Aktivera skicka pinkod automatiskt</translation>
 <translation id="2416435988630956212">Funktionstangenter på tangentbordet</translation>
 <translation id="241727068219398187">Data krypterades med Google-lösenordet den
           <ph name="TIME" />. Betalningsuppgifter och adresser från Google Pay omfattas inte.</translation>
@@ -3405,7 +3404,6 @@
 <translation id="5241128660650683457">Läsa all din data på webbplatserna som du besöker</translation>
 <translation id="5242724311594467048">Vill du aktivera <ph name="EXTENSION_NAME" />?</translation>
 <translation id="5243522832766285132">Försök igen om en liten stund</translation>
-<translation id="5244406554036143958">Ange pinkoden om du vill aktivera skicka automatiskt</translation>
 <translation id="5244474230056479698">Synkroniseras med <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Kom igång med ett skolkonto</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> har kraschat. Klicka på ballongen för att starta om appen.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index b0ad90c3..cbe5a54 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1159,7 +1159,6 @@
 <translation id="2408955596600435184">Weka PIN yako</translation>
 <translation id="241082044617551207">Programu jalizi haijulikani</translation>
 <translation id="2412593942846481727">Sasisho linapatikana</translation>
-<translation id="2414499877591062094">Washa kipengele cha kutuma PIN kiotomatiki</translation>
 <translation id="2416435988630956212">Vitufe vya chaguo za kukokotoa kwenye kibodi</translation>
 <translation id="241727068219398187">Data yako imesimbwa kwa njia fiche kwa kutumia nenosiri la Google lililokuwepo
           <ph name="TIME" />. Hali hii haijumuishi njia za kulipa na anwani kutoka Google Pay.</translation>
@@ -3400,7 +3399,6 @@
 <translation id="5241128660650683457">Soma data yako yote kwenye tovuti unazotembelea</translation>
 <translation id="5242724311594467048">Ungependa kuwasha "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Tafadhali jaribu tena baada ya muda mfupi</translation>
-<translation id="5244406554036143958">Weka PIN ili uwashe kipengele cha kutuma kiotomatiki</translation>
 <translation id="5244474230056479698">Inasawazisha kwenye <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Anza kutumia akaunti ya shuleni</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> imeharibika. Bofya puto hii ili kuzima na kuwasha programu hii.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index e0f5b9de..aed65e20 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">பின்னை உள்ளிடவும்</translation>
 <translation id="241082044617551207">அறியப்படாத செருகுநிரல்</translation>
 <translation id="2412593942846481727">புதுப்பிப்பு உள்ளது</translation>
-<translation id="2414499877591062094">தானாகச் சமர்ப்பிக்கும் பின்னை இயக்கு</translation>
 <translation id="2416435988630956212">கீபோர்டு செயல்பாட்டு விசைகள்</translation>
 <translation id="241727068219398187"><ph name="TIME" /> அன்றைக்கான உங்கள் Google கடவுச்சொல் மூலம் தரவு என்கிரிப்ட் செய்யப்பட்டது.
           இதில் Google Payயிலுள்ள கட்டண முறைகளும் முகவரிகளும் சேர்க்கப்படவில்லை.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">நீங்கள் செல்லும் இணையதளங்களில் உள்ள உங்கள் தரவு அனைத்தையும் படிக்கவும்</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" ஐ இயக்கவா?</translation>
 <translation id="5243522832766285132">ஒரு சில வினாடிகளில் மீண்டும் முயலவும்</translation>
-<translation id="5244406554036143958">தானாகச் சமர்ப்பிப்பதை இயக்க உங்கள் பின்னை உள்ளிடவும்</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />க்கு ஒத்திசைக்கிறது</translation>
 <translation id="5245610266855777041">பள்ளிக் கணக்கு மூலம் தொடங்குக</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> செயலிழந்தது. ஆப்ஸை மறுதொடக்கம் செய்ய இந்த பலூனைக் கிளிக் செய்க.</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 152af3d..5ca3c8a 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">మీ PINని నమోదు చేయండి</translation>
 <translation id="241082044617551207">తెలియని ప్లగ్ఇన్‌</translation>
 <translation id="2412593942846481727">అప్‌డేట్ అందుబాటులో ఉంది</translation>
-<translation id="2414499877591062094">ఆటోమేటిక్‌గా సమర్పించే పిన్‌ను ఎనేబుల్ చేయండి</translation>
 <translation id="2416435988630956212">కీబోర్డ్ ఫంక్షన్ కీలు</translation>
 <translation id="241727068219398187"><ph name="TIME" /> నాటికి మీ Google పాస్‌వర్డ్‌తో డేటా ఎన్‌క్రిప్ట్ చేయబడింది.
           Google Payకి చెందిన చెల్లింపు పద్ధతులు మరియు చిరునామాలు ఇందులో ఉండవు.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">మీరు సందర్శించే వెబ్‌సైట్‌ల్లోని మీ మొత్తం డేటాను చదవండి</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ను ప్రారంభించాలా?</translation>
 <translation id="5243522832766285132">దయచేసి కొన్ని నిమిషాల్లో మళ్లీ ప్రయత్నించండి</translation>
-<translation id="5244406554036143958">ఆటోమాటిక్‌గా సమర్పించడాన్ని ఎనేబుల్ చేయడానికి మీ పిన్‌ను ఎంటర్ చేయండి</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> ఖాతాకు సింక్ చేస్తోంది</translation>
 <translation id="5245610266855777041">పాఠశాల ఖాతాతో ప్రారంభించండి</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> క్రాష్ అయ్యింది. యాప్‌ పునఃప్రారంభించడానికి ఈ బెలూన్‌ను క్లిక్ చేయండి.</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 4bb3a8fe..5f7ca6e 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">ป้อน PIN ของคุณ</translation>
 <translation id="241082044617551207">ปลั๊กอินที่ไม่รู้จัก</translation>
 <translation id="2412593942846481727">มีเวอร์ชันอัปเดต</translation>
-<translation id="2414499877591062094">เปิดใช้ PIN สำหรับการส่งอัตโนมัติ</translation>
 <translation id="2416435988630956212">แป้นฟังก์ชันของแป้นพิมพ์</translation>
 <translation id="241727068219398187">มีการเข้ารหัสลับข้อมูลด้วยรหัสผ่าน Google ของคุณตั้งแต่
           <ph name="TIME" /> ข้อมูลนี้ไม่รวมถึงวิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">อ่านข้อมูลทั้งหมดของคุณบนเว็บไซต์ที่คุณเข้าชม</translation>
 <translation id="5242724311594467048">เปิดใช้งาน "<ph name="EXTENSION_NAME" />" ไหม</translation>
 <translation id="5243522832766285132">โปรดลองอีกครั้งในอีกสักครู่</translation>
-<translation id="5244406554036143958">ป้อน PIN เพื่อเปิดใช้การส่งอัตโนมัติ</translation>
 <translation id="5244474230056479698">กำลังซิงค์กับ <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">เริ่มต้นใช้งานบัญชีโรงเรียน</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ขัดข้อง คลิกที่บอลลูนนี้เพื่อรีสตาร์ตแอปพลิเคชันนี้</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 8e7b9ee..5e166a75 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">PIN'inizi girin</translation>
 <translation id="241082044617551207">Bilinmeyen eklenti</translation>
 <translation id="2412593942846481727">Güncelleme var</translation>
-<translation id="2414499877591062094">PIN'i otomatik göndermeyi etkinleştir</translation>
 <translation id="2416435988630956212">Klavye işlev tuşları</translation>
 <translation id="241727068219398187"><ph name="TIME" /> itibarıyla veriler Google şifrenizle şifrelendi.
           Google Pay'deki adresler ve ödeme yöntemleri bu kapsamda değildir.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Ziyaret ettiğiniz web sitelerindeki tüm verilerinizi okuma</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" etkinleştirilsin mi?</translation>
 <translation id="5243522832766285132">Lütfen kısa bir süre sonra tekrar deneyin</translation>
-<translation id="5244406554036143958">Otomatik göndermeyi etkinleştirmek için PIN'inizi girin</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> hesabıyla senkronize ediliyor</translation>
 <translation id="5245610266855777041">Bir okul hesabıyla kullanmaya başlayın</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> kilitlendi. Uygulamayı yeniden başlatmak için bu balonu tıklayın.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index b1cda86..0a28a04c 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Введіть PIN-код</translation>
 <translation id="241082044617551207">Невідомий плагін</translation>
 <translation id="2412593942846481727">Доступне оновлення</translation>
-<translation id="2414499877591062094">Увімкнути функцію автоматичного надсилання PIN-кодів</translation>
 <translation id="2416435988630956212">Функціональні клавіші клавіатури</translation>
 <translation id="241727068219398187">Дані зашифровано паролем Google від
           <ph name="TIME" />. Це не стосується способів оплати й адрес із Google Pay.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Переглядати всі ваші дані на веб-сайтах, які ви відвідуєте</translation>
 <translation id="5242724311594467048">Увімкнути розширення "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Повторіть спробу через кілька хвилин</translation>
-<translation id="5244406554036143958">Щоб увімкнути функцію автоматичного надсилання, введіть PIN-код</translation>
 <translation id="5244474230056479698">Синхронізація з обліковим записом <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Початок роботи з обліковим записом закладу освіти</translation>
 <translation id="5246282308050205996">Відбулося аварійне завершення роботи програми <ph name="APP_NAME" />. Натисніть цю спливаючу підказку, щоб перезапустити програму.</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 0be2515..7792fb4 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1162,7 +1162,6 @@
 <translation id="2408955596600435184">‏اپنا PIN درج کریں</translation>
 <translation id="241082044617551207">نامعلوم پلگ ان</translation>
 <translation id="2412593942846481727">اپ ڈیٹ دستیاب ہے</translation>
-<translation id="2414499877591062094">‏خود کار جمع کرائیں PIN کو فعال کریں</translation>
 <translation id="2416435988630956212">کی بورڈ کی فنکشن کلیدیں</translation>
 <translation id="241727068219398187">‏ڈيٹا کی مرموزکاری بوقت <ph name="TIME" /> آپ کے Google پاس فریز کے ساتھ کر دی گئی۔
           اس میں Google Pay سے ادائیگی کے طریقے اور پتے شامل نہیں ہوتے ہیں۔</translation>
@@ -3399,7 +3398,6 @@
 <translation id="5241128660650683457">آپ جو ویب سائٹس ملاحظہ کرتے ہیں ان پر اپنا سبھی ڈیٹا پڑھیں</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" فعال کریں؟</translation>
 <translation id="5243522832766285132">براہ کرم کچھ دیر میں دوبارہ کوشش کریں</translation>
-<translation id="5244406554036143958">‏خودکار جمع کرانے کیلئے اپنا PIN درج کریں</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> میں مطابقت پذیری کی جا رہی ہے</translation>
 <translation id="5245610266855777041">اسکول کے اکاؤنٹ کے ساتھ شروع کریں</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> کریش ہوگیا ہے۔ ایپ کو دوبارہ شروع کرنے کیلئے اس غبارہ پر کلک کریں۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index e60bf39..68d046f1 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1119,6 +1119,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Ekran qulfi qaydlari <ph name="LOCK_SCREEN_APP_NAME" /> ilovasiga avtomatik saqlanadi. Oxirgi qaydlar qulflangan ekranda ko‘rsatiladi.</translation>
 <translation id="2353297238722298836">Kamera va mikrofondan foydalanish mumkin</translation>
+<translation id="2355314311311231464">Tekshiruv vaqtida xatolik yuz berdi, chunki hisob maʼlumotlari yuklanmadi. Qaytadan urining. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="2355604387869345912">Tezkor modem rejimini yoqish</translation>
 <translation id="2356070529366658676">So‘ralsin</translation>
 <translation id="2357330829548294574">Olib tashlash: <ph name="USER_NAME" /></translation>
@@ -1159,7 +1160,6 @@
 <translation id="2408955596600435184">PIN kodni kiriting</translation>
 <translation id="241082044617551207">Noma’lum plagin</translation>
 <translation id="2412593942846481727">Yangilanish chiqdi</translation>
-<translation id="2414499877591062094">Avtomatik PIN yuborishni yoqish</translation>
 <translation id="2416435988630956212">Klaviaturaning funksiya tugmalari</translation>
 <translation id="241727068219398187">Maʼlumotlaringiz <ph name="TIME" /> sanasida Google hisobingiz paroli bilan shifrlangan.
           Google Pay manzillari va toʻlov usullari esa shifrlanmagan.</translation>
@@ -1214,6 +1214,7 @@
 <translation id="2473195200299095979">Bu sahifani tarjima qilish</translation>
 <translation id="2475982808118771221">Xatolik yuz berdi</translation>
 <translation id="2476578072172137802">Sayt sozlamalari</translation>
+<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> oʻchirib tashlanishi uchun Windows tizimini oʻchirib yoqing.</translation>
 <translation id="2478176599153288112">"<ph name="EXTENSION" />" uchun media fayli ruxsatlari</translation>
 <translation id="247949520305900375">Audioga umumiy ruxsat</translation>
 <translation id="248003956660572823">Parollar saqlanmadi</translation>
@@ -1304,6 +1305,7 @@
 <translation id="2572032849266859634"><ph name="VOLUME_NAME" />’ga faqat o‘qishga ruxsat berildi.</translation>
 <translation id="2575247648642144396">Agar kengaytma joriy sahifada ishlay olsa, uning ikonkasi paydo bo‘ladi. Bu kengaytmani ikonkasi ustiga bosib yoki <ph name="EXTENSION_SHORTCUT" /> tugmalar birkmasini bosib faollashtiring.</translation>
 <translation id="257779572837908839">Video muloqotlar uchun Chromebox sifatida foydalanish</translation>
+<translation id="2579232805407578790">Serverga ulana olmadi. Tarmoq ulanishini tekshiring va qaytadan urining. Muammo hal boʻlmasa, Chromebook qurilmasini oʻchirib yoqing. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> saytidan har doim birdaniga bir nechta fayl yuklab olishga ruxsat berilsin</translation>
 <translation id="258095186877893873">Uzoq</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> platformasi) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1523,6 +1525,7 @@
 <translation id="2836635946302913370">Administrator ushbu foydalanuvchi nomidan tizimga kirishini taqiqlab qo‘ygan.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> tarmog‘idan foydalanish uchun, avval Internetga ulaning.</translation>
 <translation id="2838379631617906747">O‘rnatilmoqda</translation>
+<translation id="2838835911926931318">Bukmark, parol, tarix va barcha qurilmalaringizdagi maʼlumotlarni sinxronlash uchun hisobingizga kiring</translation>
 <translation id="2839032553903800133">Bildirishnomalar bloklandi</translation>
 <translation id="2841013758207633010">Vaqt</translation>
 <translation id="2841837950101800123">Ta’minotchi</translation>
@@ -1582,6 +1585,7 @@
     Server xabari: <ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">Media gallereyasini jilddan qo‘shish</translation>
 <translation id="2910318910161511225">Tarmoqqa ulaning va qaytadan urining</translation>
+<translation id="2910718431259223434">Nimadir xato ketdi. Qayta urining. Foydasi tegmasa, qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="2913331724188855103">Saytlarga cookie-fayllarini saqlash va o’qishga ruxsat berish (tavsiya etiladi)</translation>
 <translation id="2915102088417824677">Faollik jurnalini ochish</translation>
 <translation id="2915873080513663243">Avtomatik skanerlash</translation>
@@ -2321,6 +2325,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{Kengaytma tasdiqlandi}other{# ta kengaytma tasdiqlandi}}</translation>
 <translation id="3822559385185038546">Bu proksi-server sozlamalari administrator tomonidan belgilangan</translation>
 <translation id="3823310065043511710">Linux uchun kamida <ph name="INSTALL_SIZE" />  joy ochilishi tavsiya etiladi.</translation>
+<translation id="3824621460022590830">Qurilmalarni qayd qilish tokeni yaroqsiz. Qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="3826440694796503677">Boshqa Google hisoblarini qoʻshish administrator tomonidan oʻchirib qoʻyilgan</translation>
 <translation id="3827306204503227641">Sinov muhitida bo‘lmagan plaginlarga ruxsat berish</translation>
 <translation id="3827774300009121996">&amp;To‘liq ekran rejimi</translation>
@@ -3274,6 +3279,7 @@
 <translation id="5079950360618752063">Taklif qilingan parolni ishlatish</translation>
 <translation id="508059534790499809">Kerberos chiptasini yangilash</translation>
 <translation id="5084230410268011727">Saytlarga harakat va yorug‘lik sensorlaridan foydalanishga ruxsat berish</translation>
+<translation id="5084328598860513926">Tekshiruv vaqtida xatolik yuz berdi. Qayta urining. Foydasi tegmasa, qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="5085162214018721575">Yangilanishlar mavjudligi tekshirilmoqda</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">Standart bosh sahifa tiklansinmi?</translation>
@@ -3396,7 +3402,6 @@
 <translation id="5241128660650683457">Tashrif buyuriladigan saytlardagi ma’lumotlaringizni ko‘rish</translation>
 <translation id="5242724311594467048">“<ph name="EXTENSION_NAME" />” kengaytmasi ishga tushirilsinmi?</translation>
 <translation id="5243522832766285132">Bir necha daqiqadan keyin qayta urining</translation>
-<translation id="5244406554036143958">Avtomatik yuborishni yoqish uchun PIN kodni kiriting</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" /> hisobiga sinxronlanmoqda</translation>
 <translation id="5245610266855777041">Maktab hisobi bilan ishni boshlang</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> ilovasi ishdan chiqdi. Ilovani qayta ishga tushirish uchun, bu yerga bosing.</translation>
@@ -3673,6 +3678,7 @@
 <translation id="557722062034137776">Qurilmani asl holatiga qaytarsangiz, bu Google hisoblari yoki ularga sinxronlangan ma’lumotlarga ta’sir qilmaydi. Ammo, qurilmada saqlangan barcha fayllar o‘chirib tashlanadi.</translation>
 <translation id="5578059481725149024">Avtomatik kirish</translation>
 <translation id="558170650521898289">Microsoft Windows qurilmasi drayveri tekshiruvi</translation>
+<translation id="5581972110672966454">Qurilma domenga ulana olmadi. Qayta urining. Foydasi tegmasa, qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="5582839680698949063">Asosiy menyu</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">Login saqlansinmi?</translation>
@@ -3745,6 +3751,7 @@
 <translation id="5667546120811588575">Google Play sozlanmoqda</translation>
 <translation id="5669267381087807207">Faollashmoqda</translation>
 <translation id="5669691691057771421">Yangi PIN kodni kiriting</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">Rasmlar bloklandi</translation>
 <translation id="5671658447180261823"><ph name="SUGGESTION_NAME" /> taklifini olib tashlash</translation>
 <translation id="567587836466137939">Bu qurilmadagi dasturlar va xavfsizlik sozlamalari <ph name="MONTH_AND_YEAR" /> sanasigacha avtomatik yangilanadi. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation>
@@ -5391,6 +5398,7 @@
 <translation id="7764225426217299476">Manzil qo‘shish</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> saytidan <ph name="DOWNLOAD_RECEIVED" /></translation>
 <translation id="7765158879357617694">Ko‘chirib o‘tkazish</translation>
+<translation id="7766082757934713382">Tarmoq trafik sarfini avtomatik ishga tushuvchi ilovalar va tizim uchun yangilanishlarni pauza qilish orqali kamaytirish mumkin.</translation>
 <translation id="7766807826975222231">Ko‘proq o‘rganish</translation>
 <translation id="7766838926148951335">Ruxsatlarni qabul qilish</translation>
 <translation id="7768770796815395237">Oʻzgartirish</translation>
@@ -6301,6 +6309,7 @@
 <translation id="885701979325669005">Ombor</translation>
 <translation id="8859057652521303089">Tilni tanlang:</translation>
 <translation id="8859174528519900719">Subramka: <ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">Xizmat shartlari yuklanmadi</translation>
 <translation id="8859662783913000679">Ota-ona hisobi</translation>
 <translation id="8862003515646449717">Tezkor brauzerdan foydalaning</translation>
 <translation id="8863753581171631212">Havolani yangi <ph name="APP" /> dasturida ochish</translation>
@@ -6569,6 +6578,7 @@
 <translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> orqali qidirish</translation>
 <translation id="9201023452444595544">Har qanday oflayn axborot tozalab tashlanadi</translation>
 <translation id="9201220332032049474">Ekran qulfi parametrlari</translation>
+<translation id="9201842707396338580">Nimadir xato ketdi. Qurilma egasi yoki administratorga murojaat qiling. Xatolik kodi: <ph name="ERROR_CODE" />.</translation>
 <translation id="9203398526606335860">&amp;Ma’lumotlarni yig‘ish yoniq</translation>
 <translation id="9203904171912129171">Qurilmani tanlang</translation>
 <translation id="9203962528777363226">Bu qurilmaning administratori yangi foydalanuvchilarni qo‘shish umkonini o‘chirib qo‘ygan</translation>
@@ -6641,6 +6651,7 @@
 <translation id="983511809958454316">Bu xususiyat VR muhitida ishlamaydi</translation>
 <translation id="984275831282074731">To‘lov usullari</translation>
 <translation id="98515147261107953">Manzara</translation>
+<translation id="987068745968718743">Parallels Desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">Umumiy</translation>
 <translation id="987897973846887088">Hech narsa topilmadi</translation>
 <translation id="988978206646512040">Kodli ibora kiritilishi majburiy</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index e6f8a122..a94b67da 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">Nhập mã PIN của bạn</translation>
 <translation id="241082044617551207">Plugin không rõ</translation>
 <translation id="2412593942846481727">Đã có bản cập nhật</translation>
-<translation id="2414499877591062094">Bật chế độ tự động gửi mã PIN</translation>
 <translation id="2416435988630956212">Phím chức năng trên bàn phím</translation>
 <translation id="241727068219398187">Dữ liệu được mã hóa bằng mật khẩu Google của bạn kể từ
           <ph name="TIME" />. Dữ liệu này không bao gồm địa chỉ và phương thức thanh toán từ Google Pay.</translation>
@@ -3398,7 +3397,6 @@
 <translation id="5241128660650683457">Đọc tất cả dữ liệu của bạn trên các trang web bạn truy cập</translation>
 <translation id="5242724311594467048">Cho phép "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Vui lòng thử lại sau giây lát</translation>
-<translation id="5244406554036143958">Nhập mã PIN của bạn để bật tính năng tự động gửi</translation>
 <translation id="5244474230056479698">Đang đồng bộ hóa với <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Bắt đầu với tài khoản trường học</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> đã xảy ra lỗi. Nhấp vào bong bóng này để khởi động lại ứng dụng.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 20945caa..bd87bfb 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1158,7 +1158,6 @@
 <translation id="2408955596600435184">输入您的 PIN 码</translation>
 <translation id="241082044617551207">未知插件</translation>
 <translation id="2412593942846481727">有可用的更新</translation>
-<translation id="2414499877591062094">启用自动提交 PIN 码的功能</translation>
 <translation id="2416435988630956212">键盘功能键</translation>
 <translation id="241727068219398187">数据已于 <ph name="TIME" />使用您的 Google 密码加密。这并不包括 Google Pay 中的付款方式和地址。</translation>
 <translation id="2419131370336513030">查看已安装的应用</translation>
@@ -3393,7 +3392,6 @@
 <translation id="5241128660650683457">读取您在访问的网站上的所有数据</translation>
 <translation id="5242724311594467048">要启用“<ph name="EXTENSION_NAME" />”吗?</translation>
 <translation id="5243522832766285132">请稍后重试</translation>
-<translation id="5244406554036143958">请输入您的 PIN 码,以启用自动提交功能</translation>
 <translation id="5244474230056479698">同步到 <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">开始使用学校帐号</translation>
 <translation id="5246282308050205996">“<ph name="APP_NAME" />”崩溃了。点击此信息框,以重启该应用。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index e18235b6..aed1f9d4 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1121,6 +1121,7 @@
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">上鎖畫面上的筆記會自動儲存至 <ph name="LOCK_SCREEN_APP_NAME" />。最近的筆記會保留在上鎖畫面上。</translation>
 <translation id="2353297238722298836">已允許使用相機和麥克風</translation>
+<translation id="2355314311311231464">無法擷取您的帳戶詳情,因此無法佈建。請再試一次。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="2355604387869345912">開啟「即時網絡共享」</translation>
 <translation id="2356070529366658676">詢問</translation>
 <translation id="2357330829548294574">移除「<ph name="USER_NAME" />」</translation>
@@ -1161,7 +1162,6 @@
 <translation id="2408955596600435184">請輸入您的 PIN</translation>
 <translation id="241082044617551207">不明的外掛程式</translation>
 <translation id="2412593942846481727">有可用的更新</translation>
-<translation id="2414499877591062094">啟用自動提交 PIN</translation>
 <translation id="2416435988630956212">鍵盤功能鍵</translation>
 <translation id="241727068219398187">系統已於 <ph name="TIME" />使用您的 Google 密碼加密資料。Google Pay 的付款方法和地址不會包括在內。</translation>
 <translation id="2419131370336513030">查看已安裝的應用程式</translation>
@@ -1215,6 +1215,7 @@
 <translation id="2473195200299095979">翻譯這個網頁</translation>
 <translation id="2475982808118771221">發生錯誤</translation>
 <translation id="2476578072172137802">網站設定</translation>
+<translation id="2476974672882258506">關閉 Windows 即可解除安裝 <ph name="PARALLELS_DESKTOP" />。</translation>
 <translation id="2478176599153288112">「<ph name="EXTENSION" />」的媒體檔案權限</translation>
 <translation id="247949520305900375">分享音效檔案</translation>
 <translation id="248003956660572823">密碼未儲存</translation>
@@ -1305,6 +1306,7 @@
 <translation id="2572032849266859634">已授與「<ph name="VOLUME_NAME" />」的唯讀權限。</translation>
 <translation id="2575247648642144396">畫面上顯示這個圖示時,表示擴充功能可在目前網頁上運作。如要啟用這項擴充功能,請按一下圖示或按下 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="257779572837908839">設定為 Chromebox 視像會議</translation>
+<translation id="2579232805407578790">無法連線至伺服器。請檢查網絡連線,然後再試一次。如果問題持續,請重新啟動 Chromebook。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="2580889980133367162">永遠允許 <ph name="HOST" /> 下載多個檔案</translation>
 <translation id="258095186877893873">長</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (平台:<ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
@@ -1524,6 +1526,7 @@
 <translation id="2836635946302913370">管理員已禁止使用這個使用者名稱登入。</translation>
 <translation id="283669119850230892">如要使用 <ph name="NETWORK_ID" /> 網絡,請先在下方連線至互聯網。</translation>
 <translation id="2838379631617906747">正在安裝</translation>
+<translation id="2838835911926931318">登入即可同步您裝置上的書籤、密碼、記錄和其他設定</translation>
 <translation id="2839032553903800133">已封鎖通知</translation>
 <translation id="2841013758207633010">時間</translation>
 <translation id="2841837950101800123">供應商</translation>
@@ -1583,6 +1586,7 @@
     伺服器訊息:<ph name="SERVER_MSG" /></translation>
 <translation id="2908162660801918428">依目錄新增媒體庫</translation>
 <translation id="2910318910161511225">請連線至網絡並再試一次</translation>
+<translation id="2910718431259223434">發生錯誤。請再試一次,或聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="2913331724188855103">允許網站儲存及讀取 Cookie 資料 (建議)</translation>
 <translation id="2915102088417824677">查看活動記錄</translation>
 <translation id="2915873080513663243">自動掃瞄</translation>
@@ -2322,6 +2326,7 @@
 <translation id="3821372858277557370">{NUM_EXTENSIONS,plural, =1{已核准 1 個擴充程式}other{已核准 # 個擴充程式}}</translation>
 <translation id="3822559385185038546">管理員已強制執行此 Proxy</translation>
 <translation id="3823310065043511710">Linux 需要至少 <ph name="INSTALL_SIZE" /> 的空間。</translation>
+<translation id="3824621460022590830">裝置註冊憑證無效。請聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="3826440694796503677">您的管理員已停用新增更多 Google 帳戶的功能</translation>
 <translation id="3827306204503227641">繼續允許無沙箱防護的外掛程式</translation>
 <translation id="3827774300009121996">全螢幕(&amp;F)</translation>
@@ -3275,6 +3280,7 @@
 <translation id="5079950360618752063">使用建議的密碼</translation>
 <translation id="508059534790499809">更新 Kerberos 票證</translation>
 <translation id="5084230410268011727">允許網站使用動態和光線感應器</translation>
+<translation id="5084328598860513926">佈建流程已中斷。請再試一次,或聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="5085162214018721575">檢查更新</translation>
 <translation id="5086082738160935172">HID</translation>
 <translation id="5086874064903147617">要將首頁還原至預設值嗎?</translation>
@@ -3397,7 +3403,6 @@
 <translation id="5241128660650683457">讀取您瀏覽網站上的所有資料。</translation>
 <translation id="5242724311594467048">啟用「<ph name="EXTENSION_NAME" />」?</translation>
 <translation id="5243522832766285132">請稍後再試</translation>
-<translation id="5244406554036143958">輸入 PIN 即可啟用自動提交</translation>
 <translation id="5244474230056479698">正在同步至 <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">登入學校帳戶即可開始使用</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> 當機了,請按一下這個汽球來重新啟動應用程式。</translation>
@@ -3674,6 +3679,7 @@
 <translation id="557722062034137776">重設裝置並不會影響您的 Google 帳戶,以及任何與這些帳戶同步處理的數據。不過,裝置中所有本機儲存檔案將被刪除。</translation>
 <translation id="5578059481725149024">自動登入</translation>
 <translation id="558170650521898289">Microsoft Windows 硬件驅動程式驗證</translation>
+<translation id="5581972110672966454">無法將裝置加入網域。請再試一次,或聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="5582839680698949063">主選單</translation>
 <translation id="5583640892426849032">Backspace</translation>
 <translation id="5584088138253955452">要儲存使用者名稱嗎?</translation>
@@ -3746,6 +3752,7 @@
 <translation id="5667546120811588575">正在設定 Google Play…</translation>
 <translation id="5669267381087807207">啟用</translation>
 <translation id="5669691691057771421">輸入新的 PIN</translation>
+<translation id="5670702108860320605">BSSID</translation>
 <translation id="5671641761787789573">已封鎖圖片</translation>
 <translation id="5671658447180261823">移除此建議:<ph name="SUGGESTION_NAME" /></translation>
 <translation id="567587836466137939">此裝置會在 <ph name="MONTH_AND_YEAR" />前自動進行軟件和安全性更新。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
@@ -5392,6 +5399,7 @@
 <translation id="7764225426217299476">新增地址</translation>
 <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> (來源網域:<ph name="DOWNLOAD_DOMAIN" />)</translation>
 <translation id="7765158879357617694">移動</translation>
+<translation id="7766082757934713382">暫停自動應用程式和系統更新,有助減少網絡數據用量</translation>
 <translation id="7766807826975222231">觀看導覽介紹</translation>
 <translation id="7766838926148951335">接受權限</translation>
 <translation id="7768770796815395237">變更</translation>
@@ -6303,6 +6311,7 @@
 <translation id="885701979325669005">儲存設備</translation>
 <translation id="8859057652521303089">選擇語言:</translation>
 <translation id="8859174528519900719">子頁框:<ph name="SUBFRAME_SITE" /></translation>
+<translation id="8859402192569844210">無法載入《服務條款》</translation>
 <translation id="8859662783913000679">家長帳戶</translation>
 <translation id="8862003515646449717">改用速度快的瀏覽器</translation>
 <translation id="8863753581171631212">在「<ph name="APP" />」的新視窗中開啟連結</translation>
@@ -6571,6 +6580,7 @@
 <translation id="920045321358709304">透過 <ph name="SEARCH_ENGINE" /> 搜尋</translation>
 <translation id="9201023452444595544">所有離線資料將會被清除</translation>
 <translation id="9201220332032049474">螢幕鎖定選項</translation>
+<translation id="9201842707396338580">發生錯誤。請聯絡您的裝置擁有者或管理員。錯誤代碼:<ph name="ERROR_CODE" />。</translation>
 <translation id="9203398526606335860">分析已啟用(&amp;P)</translation>
 <translation id="9203904171912129171">選取裝置</translation>
 <translation id="9203962528777363226">裝置管理員已停用新增使用者功能</translation>
@@ -6642,6 +6652,7 @@
 <translation id="983511809958454316">無法在 VR 狀態下使用此功能</translation>
 <translation id="984275831282074731">付款方法</translation>
 <translation id="98515147261107953">橫向</translation>
+<translation id="987068745968718743">Parallels Desktop:<ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">一般</translation>
 <translation id="987897973846887088">沒有可用的圖片</translation>
 <translation id="988978206646512040">密碼短語欄位不得留空</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index fc6fd115..35fadb0 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1161,7 +1161,6 @@
 <translation id="2408955596600435184">請輸入你的 PIN 碼</translation>
 <translation id="241082044617551207">不明的外掛程式</translation>
 <translation id="2412593942846481727">有可用的更新</translation>
-<translation id="2414499877591062094">啟用 PIN 碼自動提交</translation>
 <translation id="2416435988630956212">鍵盤功能鍵</translation>
 <translation id="241727068219398187">系統已採用你在 <ph name="TIME" />設定的 Google 密碼針對資料進行加密處理。加密的資料不包括 Google Pay 的付款方式和地址。</translation>
 <translation id="2419131370336513030">查看已安裝的應用程式</translation>
@@ -3396,7 +3395,6 @@
 <translation id="5241128660650683457">讀取你在造訪的網站上產生的所有資料</translation>
 <translation id="5242724311594467048">啟用「<ph name="EXTENSION_NAME" />」?</translation>
 <translation id="5243522832766285132">請稍後再試</translation>
-<translation id="5244406554036143958">請輸入 PIN 碼以啟用自動提交功能</translation>
 <translation id="5244474230056479698">同步到 <ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">登入學校帳戶即可開始使用</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> 當機了,請按一下這個提示框來重新啟動應用程式。</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 70280ce0..807be5c 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1160,7 +1160,6 @@
 <translation id="2408955596600435184">Faka iphinikhodi yakho</translation>
 <translation id="241082044617551207">I-plugin engaziwa</translation>
 <translation id="2412593942846481727">Isibuyekezo siyatholakala</translation>
-<translation id="2414499877591062094">Nika amandla ukuthumela Iphinikhodi ngokuzenzekelayo</translation>
 <translation id="2416435988630956212">Okhiye bokusebenza kwekhibhodi</translation>
 <translation id="241727068219398187">Idatha ibethelwe ngephasiwedi yakho ye-Google kusuka ngo-
           <ph name="TIME" />. Lokhu akubandakanyi izindlela zokukokha namakheli kusuka ku-Google Pay.</translation>
@@ -3402,7 +3401,6 @@
 <translation id="5241128660650683457">Funda yonke idatha yakho kumawebhusayithi owavakashelayo</translation>
 <translation id="5242724311594467048">Nika amandla i-"<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Sicela uzame futhi ngezikhathi ezimbalwa</translation>
-<translation id="5244406554036143958">Faka Iphinikhodi yakho ukunika amandla ukuthumela okuzenzakalelayo</translation>
 <translation id="5244474230056479698">Ivumelanisa ku-<ph name="EMAIL" /></translation>
 <translation id="5245610266855777041">Qalisa nge-akhawunti yesikole</translation>
 <translation id="5246282308050205996">I-<ph name="APP_NAME" /> iphahlazekile. Chofoza kuleli bhamuza ukuze uqale kabusha uhlelo lokusebenza.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index bf9cb046..65cab201 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -40,6 +40,7 @@
 <translation id="1874309113135274312">‏الإصدار التجريبي من Google Chrome‏ (mDNS-In)</translation>
 <translation id="1877026089748256423">‏إصدار Chrome قديم</translation>
 <translation id="1919130412786645364">‏السماح بتسجيل الدخول إلى Chrome</translation>
+<translation id="195645108406520445">‏إعداد مساحة Chrome Space الجديدة</translation>
 <translation id="2063848847527508675">‏يلزم إعادة تشغيل نظام التشغيل Chrome حتى يتم تطبيق التحديث.</translation>
 <translation id="2094919256425865063">‏هل تريد الخروج من Chrome على أي حال؟</translation>
 <translation id="2120620239521071941">‏سيعمل هذا على حذف <ph name="ITEMS_COUNT" /> من العناصر من هذا الجهاز. لاسترداد بياناتك لاحقًا، سجّل الدخول إلى Chrome كـ <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb
index f52d010..477d7671d 100644
--- a/chrome/app/resources/google_chrome_strings_az.xtb
+++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -40,6 +40,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome'un vaxtı keçib</translation>
 <translation id="1919130412786645364">Chrome girişinə icazə verin</translation>
+<translation id="195645108406520445">Yeni Chrome Space'inizi ayarlayın</translation>
 <translation id="2063848847527508675">Güncəlləşmənin tətbiq olunması üçün Chrome OS yenidən başladılmalıdır.</translation>
 <translation id="2094919256425865063">İstənilən halda Chrome'dan çıxılsın?</translation>
 <translation id="2120620239521071941"><ph name="ITEMS_COUNT" /> element bu cihazdan silinəcək. Sonradan datanızı bərpa etmək üçün Chrome'a <ph name="USER_EMAIL" /> kimi daxil olun.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb
index c3cd343..36504cd 100644
--- a/chrome/app/resources/google_chrome_strings_be.xtb
+++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Бэта-версія Google Chrome (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome састарэў</translation>
 <translation id="1919130412786645364">Дазволіць уваход ва ўліковы запіс Chrome</translation>
+<translation id="195645108406520445">Наладзьце свой профіль Chrome Space</translation>
 <translation id="2063848847527508675">Каб прымяніць абнаўленне, трэба перазапусціць Chrome OS.</translation>
 <translation id="2094919256425865063">Усё роўна выйсці з Chrome?</translation>
 <translation id="2120620239521071941">З гэтай прылады будзе выдалена наступная колькасць элементаў: <ph name="ITEMS_COUNT" />. Каб потым атрымаць свае даныя, увайдзіце ў Chrome як <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index fb67d5d3..e3ef92b 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome আপনার ক্যামেরা ব্যবহার করছে৷</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> বিপজ্জনক, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation>
 <translation id="1619887657840448962">Chrome-কে আরও নিরাপদ করতে, আমরা নিচের এক্সটেনশনটি বন্ধ করেছি যা <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />-এ তালিকাবদ্ধ করা হয়নি এবং হয়ত আপনাকে না জানিয়ে যোগ করা হয়েছিল৷</translation>
-<translation id="162448658176061655">Chrome সপ্তাহে একবার ডিভাইসে কোনও অযাচিত সফ্টওয়্যার আছে কিনা তা চেক করে দেখে। শেষবার চেক করা হয়েছে: এক মুহূর্ত আগে।</translation>
+<translation id="162448658176061655">Chrome সপ্তাহে একবার ডিভাইসে কোনও অযাচিত সফ্টওয়্যার আছে কিনা তা চেক করে দেখে। শেষবার চেক করা হয়েছে: একটু আগে।</translation>
 <translation id="162629503687514352">Chrome OS আপনার পাসওয়ার্ড সিঙ্ক করতে পারেনি।</translation>
 <translation id="1628000112320670027">Chrome বিষয়ে সাহায্য পান</translation>
 <translation id="1662639173275167396"><ph name="BEGIN_LINK_LINUX_OSS" />Linux (Beta)<ph name="END_LINK_LINUX_OSS" />-এর মত অতিরিক্ত <ph name="BEGIN_LINK_CROS_OSS" />ওপেন সোর্স সফ্টওয়্যার<ph name="END_LINK_CROS_OSS" /> ব্যবহার করে Chrome OS তৈরি করা সম্ভব হয়েছে।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 93325dd7..f09136a 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome je zastaralý</translation>
 <translation id="1919130412786645364">Povolit přihlášení do Chromu</translation>
+<translation id="195645108406520445">Nastavení nového profilu Chrome Space</translation>
 <translation id="2063848847527508675">Aktualizace se použije po restartování systému Chrome OS.</translation>
 <translation id="2094919256425865063">Přesto Chrome ukončit?</translation>
 <translation id="2120620239521071941">Ze zařízení bude smazán následující počet položek: <ph name="ITEMS_COUNT" />. Budete-li chtít své údaje později načíst, přihlaste se do Chromu jako <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index 521fcec..83b61a0 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome käyttää kameraasi.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> on vaarallinen, joten Chrome on estänyt sen.</translation>
 <translation id="1619887657840448962">Paransimme Chromen turvallisuutta poistamalla käytöstä sovelluksia, joita <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ei tarjoa ja jotka on voitu lisätä ilman lupaasi.</translation>
-<translation id="162448658176061655">Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: hetki sitten.</translation>
+<translation id="162448658176061655">Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi hetki sitten.</translation>
 <translation id="162629503687514352">Chrome-käyttöjärjestelmä ei voinut synkronoida salasanojasi.</translation>
 <translation id="1628000112320670027">Ohjeita Chromen käyttöön</translation>
 <translation id="1662639173275167396">Toinen <ph name="BEGIN_LINK_CROS_OSS" />avoimen lähdekoodin ohjelmisto<ph name="END_LINK_CROS_OSS" /> tukee Chrome-käyttöjärjestelmää, kuten myös <ph name="BEGIN_LINK_LINUX_OSS" />Linuxia (beta)<ph name="END_LINK_LINUX_OSS" />.</translation>
@@ -138,7 +138,7 @@
 <translation id="4771048833395599659">Tämä tiedosto voi olla vaarallinen, joten Chrome on estänyt sen.</translation>
 <translation id="479167709087336770">Tämä käyttää samaa oikeinkirjoituksen tarkistusta kuin Google Haku. Selaimeen kirjoittamasi teksti lähetetään Googlelle. Voit muuttaa tätä milloin tahansa asetuksista.</translation>
 <translation id="4891791193823137474">Jätä Google Chrome käyntiin taustalle</translation>
-<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 päivä sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_DAYS} päivää sitten.}}</translation>
+<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 päivä sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_DAYS} päivää sitten.}}</translation>
 <translation id="4895437082222824641">Avaa linkki uudella Chromen välilehdellä</translation>
 <translation id="4953650215774548573">Aseta Google Chrome oletusselaimeksi</translation>
 <translation id="495931528404527476">Chromessa</translation>
@@ -198,13 +198,13 @@
 <translation id="7106741999175697885">Tehtävänhallinta - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Uusi Chrome-päivitys on saatavilla, ja se otetaan käyttöön uudelleenkäynnistyksen jälkeen.}=1{Uusi Chrome-päivitys on saatavilla, ja se otetaan käyttöön uudelleenkäynnistyksen jälkeen. Incognito-ikkunaasi ei avata uudelleen.}other{Uusi Chrome-päivitys on saatavilla, ja se otetaan käyttöön uudelleenkäynnistyksen jälkeen. # incognito-ikkunaasi ei avata uudelleen.}}</translation>
 <translation id="7155997830309522122">Jos vaihdoit, päivitä muutos Chromen tallennettuihin salasanoihin.</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 tunti sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_HOURS} tuntia sitten}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 tunti sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_HOURS} tuntia sitten}}</translation>
 <translation id="7242029209006116544">Olet kirjautumassa sisään hallinnoidulla tilillä ja antamassa tilin järjestelmänvalvojalle oikeuden hallita Google Chrome -profiiliasi. Chrome-tietosi, kuten sovelluksesi, kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi, yhdistetään pysyvästi käyttäjätiliin <ph name="USER_NAME" />. Voit poistaa nämä tiedot Google-tilien Hallintapaneelissa, mutta et voi liittää tietoja toiseen tiliin. Voit myös halutessasi luoda uuden profiilin, jos haluat pitää aiemmat Chrome-tietosi erillään. <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Google Chrome ‑käyttöliittymä näytetään tällä kielellä</translation>
 <translation id="7296210096911315575">Tärkeää käyttö- ja turvallisuustietoa</translation>
 <translation id="7308322188646931570">Chrome tarvitsee tallennustilan käyttöoikeuden tiedostojen lataamiseen.</translation>
 <translation id="7339898014177206373">Uusi ikkuna</translation>
-<translation id="7386132805935307836">Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: eilen.</translation>
+<translation id="7386132805935307836">Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi eilen.</translation>
 <translation id="7398801000654795464">Chromeen kirjautunut käyttäjä: <ph name="USER_EMAIL_ADDRESS" />. Kirjaudu uudelleen sisään samalla tilillä.</translation>
 <translation id="7408085963519505752">Chrome-käyttöjärjestelmän käyttöehdot</translation>
 <translation id="7419046106786626209">Chrome-käyttöjärjestelmä ei voinut synkronoida tietoja, koska synkronointi ei ole käytettävissä verkkotunnuksessasi.</translation>
@@ -241,7 +241,7 @@
 <translation id="828798499196665338">Vanhempasi ovat laittaneet Chromen sivustojen, sovellusten ja laajennusten käyttöluvat pois päältä. Käyttöönottoa (<ph name="EXTENSION_TYPE_PARAMETER" />) ei sallita.</translation>
 <translation id="8290100596633877290">Hups! Google Chrome kaatui. Käynnistetäänkö uudelleen?</translation>
 <translation id="8342675569599923794">Tämä tiedosto on vaarallinen, joten Chrome on estänyt sen.</translation>
-<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: 1 minuutti sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi: {NUM_MINS} minuuttia sitten.}}</translation>
+<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi 1 minuutti sitten.}other{Chrome tarkistaa ei-toivotut ohjelmistot kerran viikossa. Tarkistettu viimeksi {NUM_MINS} minuuttia sitten.}}</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Kaikki oikeudet pidätetään.</translation>
 <translation id="840084489713044809">Google Chrome yrittää viedä salasanojasi tiedostoon.</translation>
 <translation id="8498858610309223613">Google Chromen tärkeä tietoturvapäivitys on asennettu. Käynnistä selain uudelleen – palautamme avoimet välilehdet.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 51cdf60e..f40a0d0 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Luma na ang Chrome</translation>
 <translation id="1919130412786645364">Pagayan ang pag-sign in sa Chrome</translation>
+<translation id="195645108406520445">I-set up ang iyong bagong Chrome Space</translation>
 <translation id="2063848847527508675">Kailangang ma-restart ang Chrome OS upang mailapat ang update.</translation>
 <translation id="2094919256425865063">Umalis pa rin sa Chrome?</translation>
 <translation id="2120620239521071941">Magde-delete ito ng <ph name="ITEMS_COUNT" /> (na) item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chrome bilang <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index ef0cd88..7cd379df 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome आपके कैमरे का उपयोग कर रहा है.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> खरतरनाक है, इसलिए Chrome ने उसे अवरोधित कर दिया है.</translation>
 <translation id="1619887657840448962">Chrome को ज़्यादा सुरक्षित बनाने के लिए, हमने निम्न एक्सटेंशन को अक्षम कर दिया है जो <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> में सूचीबद्ध नहीं है और आपकी जानकारी के बिना जोड़ा गया हो सकता है.</translation>
-<translation id="162448658176061655">क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कुछ देर पहले की गई.</translation>
+<translation id="162448658176061655">Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कुछ सेकंड पहले की गई.</translation>
 <translation id="162629503687514352">Chrome OS आपके पासवर्ड सिंक नहीं कर सका.</translation>
 <translation id="1628000112320670027">Chrome में सहायता पाएं</translation>
 <translation id="1662639173275167396">Chrome OS को <ph name="BEGIN_LINK_LINUX_OSS" />Linux (बीटा)<ph name="END_LINK_LINUX_OSS" /> की तरह ही, अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> के ज़रिए कारगर बनाया गया है.</translation>
@@ -38,6 +38,7 @@
 <translation id="1874309113135274312">Google Chrome बीटा (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome पुराना हो गया है</translation>
 <translation id="1919130412786645364">Chrome में साइन-इन करने दें</translation>
+<translation id="195645108406520445">Chrome पर अपनी नई प्रोफ़ाइल सेट अप करें</translation>
 <translation id="2063848847527508675">अपडेट लागू करने के लिए Chrome OS को रीस्टार्ट करने की ज़रुरत होती है.</translation>
 <translation id="2094919256425865063">फिर भी Chrome छोड़ें?</translation>
 <translation id="2120620239521071941">ऐसा करने से इस डिवाइस से <ph name="ITEMS_COUNT" /> आइटम मिट जाएंगे. बाद में अपना डेटा पाने के लिए, Chrome में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation>
@@ -137,7 +138,7 @@
 <translation id="4771048833395599659">यह फ़ाइल खतरनाक हो सकती है, इसलिए Chrome ने इसे रोक दिया है.</translation>
 <translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप 'सेटिंग' में जाकर इसे कभी भी बदल सकते हैं.</translation>
 <translation id="4891791193823137474">Google Chrome को पृष्ठभूमि में चलने दें</translation>
-<translation id="489337168347244450">{NUM_DAYS,plural, =1{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 दिन पहले की गई.}one{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_DAYS} दिन पहले की गई.}other{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_DAYS} दिन पहले की गई.}}</translation>
+<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 दिन पहले की गई.}one{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_DAYS} दिन पहले की गई.}other{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_DAYS} दिन पहले की गई.}}</translation>
 <translation id="4895437082222824641">नए Chrome &amp;टैब में लिंक खोलें</translation>
 <translation id="4953650215774548573">Google Chrome को अपने डिफ़ॉल्ट ब्राउज़र के रूप में सेट करना</translation>
 <translation id="495931528404527476">Chrome में</translation>
@@ -183,7 +184,7 @@
 <translation id="6338556085225130112">Google Chrome अपडेट हो रहा है</translation>
 <translation id="6368958679917195344">Chrome OS को अतिरिक्त <ph name="BEGIN_LINK_CROS_OSS" />ओपन सोर्स सॉफ़्टवेयर<ph name="END_LINK_CROS_OSS" /> द्वारा संभव बनाया गया है.</translation>
 <translation id="6372315130616785175">आपने काम से जुड़े खाते से साइन इन किया है. क्या आप डेटा को अलग रखने के लिए, Chrome क्रोमियम पर नई प्रोफ़ाइल बनाना चाहते हैं?</translation>
-<translation id="6454142105866844106">क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है</translation>
+<translation id="6454142105866844106">Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome डेवलपर</translation>
 <translation id="6566149418543181476">Google Chrome अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6676384891291319759">इंटरनेट एक्सेस करें</translation>
@@ -201,13 +202,13 @@
 <translation id="7106741999175697885">काम का प्रबंधक - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome के लिए एक नया अपडेट उपलब्ध है और जैसे ही आप फिर से लॉन्च करेंगे, अपडेट लागू कर दिया जाएगा.}=1{Chrome के लिए एक नया अपडेट उपलब्ध है और जैसे ही आप फिर से लॉन्च करेंगे, अपडेट लागू कर दिया जाएगा. आपकी गुप्त विंडो फिर से नहीं खुलेगी.}one{Chrome के लिए एक नया अपडेट उपलब्ध है और जैसे ही आप फिर से लॉन्च करेंगे, अपडेट लागू कर दिया जाएगा. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}other{Chrome के लिए एक नया अपडेट उपलब्ध है और जैसे ही आप फिर से लॉन्च करेंगे, अपडेट लागू कर दिया जाएगा. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}}</translation>
 <translation id="7155997830309522122">अगर आपने पहले ही पासवर्ड बदल दिया है, तो कृपया Chrome में सेव किए गए पासवर्ड में बदलाव करें, ताकि यह आपके नए पासवर्ड से मेल खाए.</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 घंटा पहले की गई.}one{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_HOURS} घंटा पहले की गई.}other{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_HOURS} घंटे पहले की गई.}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 घंटा पहले की गई.}one{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_HOURS} घंटा पहले की गई.}other{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_HOURS} घंटे पहले की गई.}}</translation>
 <translation id="7242029209006116544">आप प्रबंधित खाते से साइन इन कर रहे हैं और उसके एडमिन को अपनी Google Chrome प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका Chrome डेटा, जैसे आपके ऐप्लिकेशन, बुकमार्क, इतिहास, पासवर्ड, और दूसरे सेटिंग <ph name="USER_NAME" /> से स्थायी रूप से जुड़ जाएंगे. आप Google खाता डैशबोर्ड से इस डेटा को मिटा सकेंगे, लेकिन आप किसी दूसरे खाते से इस डेटा को जोड़ नहीं सकेंगे. <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">इस भाषा का इस्तेमाल Google Chrome यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए किया जाता है</translation>
 <translation id="7296210096911315575">इस्तेमाल और सुरक्षा से जुड़ी ज़रूरी जानकारी</translation>
 <translation id="7308322188646931570">Chrome को फ़ाइलें डाउनलोड करने के लिए मेमोरी एक्‍सेस की ज़रूरत होगी</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
-<translation id="7386132805935307836">क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कल की गई.</translation>
+<translation id="7386132805935307836">Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: कल की गई.</translation>
 <translation id="7398801000654795464">आपने Chrome में <ph name="USER_EMAIL_ADDRESS" /> के रूप में साइन इन किया था. फिर से साइन इन करने के लिए कृपया उसी खाते का इस्तेमाल करें.</translation>
 <translation id="7408085963519505752">Chrome OS शर्तें</translation>
 <translation id="7419046106786626209">Chrome OS आपका डेटा समन्वयित नहीं कर सका क्योंकि आपके डोमेन के लिए समन्वयन उपलब्ध नहीं है.</translation>
@@ -244,7 +245,7 @@
 <translation id="828798499196665338">आपके अभिभावक ने Chrome के लिए, "साइट, ऐप्लिकेशन, और एक्सटेंशन के लिए अनुमतियां" को बंद कर दिया है. इस <ph name="EXTENSION_TYPE_PARAMETER" /> को चालू करने की अनुमति नहीं है.</translation>
 <translation id="8290100596633877290">रुकिए! Google Chrome क्रैश हो गया है. अभी फिर से लॉन्च करें?</translation>
 <translation id="8342675569599923794">यह फ़ाइल खतरनाक है, इसलिए Chrome ने इसे रोक दिया है.</translation>
-<translation id="8344083974188970894">{NUM_MINS,plural, =1{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 मिनट पहले की गई.}one{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_MINS} मिनट पहले की गई.}other{क्रोमियम हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_MINS} मिनट पहले की गई.}}</translation>
+<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: 1 मिनट पहले की गई.}one{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_MINS} मिनट पहले की गई.}other{Chrome हफ़्ते में एक बार अनचाहे सॉफ़्टवेयर की जांच करता है. पिछली जांच: {NUM_MINS} मिनट पहले की गई.}}</translation>
 <translation id="8370517070665726704">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्वाधिकार सुरक्षित.</translation>
 <translation id="840084489713044809">Google Chrome आपके पासवर्ड निर्यात करना चाहता है.</translation>
 <translation id="8498858610309223613">Google Chrome के लिए एक खास सुरक्षा अपडेट अभी-अभी लागू किया गया था. अभी रीस्टार्ट करें और हम आपके टैब बहाल कर देंगे.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb
index 7b336949..28074072 100644
--- a/chrome/app/resources/google_chrome_strings_hy.xtb
+++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -204,7 +204,7 @@
 <translation id="7106741999175697885">Խնդիրների կառավարիչ - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome-ի այս տարբերակի համար առկա է թարմացում: Այն կտեղադրվի, երբ դիտարկիչը վերագործարկվի։}=1{Chrome-ի այս տարբերակի համար առկա է թարմացում: Այն կտեղադրվի, երբ դիտարկիչը վերագործարկվի։ Ձեր ինկոգնիտո պատուհանը նորից չի բացվի։}one{Chrome-ի այս տարբերակի համար առկա է թարմացում: Այն կտեղադրվի, երբ դիտարկիչը վերագործարկվի։ Ձեր # ինկոգնիտո պատուհանը նորից չի բացվի։}other{Chrome-ի այս տարբերակի համար առկա է թարմացում: Այն կտեղադրվի, երբ դիտարկիչը վերագործարկվի։ Ձեր # ինկոգնիտո պատուհանները նորից չեն բացվի։}}</translation>
 <translation id="7155997830309522122">Եթե այո, ապա փոխեք ձեր պահված գաղտնաբառը Chrome-ում, որպեսզի այն համապատասխանի ձեր նոր գաղտնաբառին։</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է 1 ժամ առաջ:}one{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}other{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է 1 ժամ առաջ։}one{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}other{Chrome-ը ստուգում է անցանկալի ծրագրերի առկայությունը շաբաթը մեկ անգամ։ Վերջին անգամ ստուգվել է {NUM_HOURS} ժամ առաջ։}}</translation>
 <translation id="7242029209006116544">Դուք մուտք եք գործում վերահսկվող հաշիվ՝ թույլ տալով ադմինիստրատորին կառավարել ձեր Google Chrome պրոֆիլը: Ձեր Chrome-ի տվյալները, ինչպես օրինակ՝ հավելվածները, էջանիշները, պատմությունը, գաղտնաբառերը և մյուս կարգավորումները, մշտապես կկցվեն <ph name="USER_NAME" /> հաշվին: Դուք կկարողանաք ջնջել այս տվյալները Google Dashboard-ի միջոցով, սակայն չեք կարողանա համակցել դրանք այլ հաշվի հետ: Որպես տարբերակ կարող եք ստեղծել նոր պրոֆիլ՝ Chrome-ի առկա տվյալներն առանձին պահելու համար: <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Այս լեզուն օգտագործվում է որպես Google Chrome-ի միջերեսի լեզու</translation>
 <translation id="7296210096911315575">Կարևոր տեղեկություններ օգտագործման և անվտանգության մասին</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 62842e34..d2e103d 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome menggunakan kamera Anda.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> berbahaya, sehingga Chrome memblokirnya.</translation>
 <translation id="1619887657840448962">Agar Chrome lebih aman, kami menonaktifkan ekstensi berikut yang tidak tercantum dalam <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> dan mungkin telah ditambahkan tanpa sepengetahuan Anda.</translation>
-<translation id="162448658176061655">Chrome memeriksa software yang tidak diinginkan seminggu sekali. Terakhir diperiksa: beberapa waktu yang lalu.</translation>
+<translation id="162448658176061655">Chrome memeriksa software yang tidak diinginkan seminggu sekali. Terakhir diperiksa: sesaat yang lalu.</translation>
 <translation id="162629503687514352">Chrome OS tidak dapat menyinkronkan sandi Anda.</translation>
 <translation id="1628000112320670027">Dapatkan bantuan Chrome</translation>
 <translation id="1662639173275167396">Chrome OS terwujud karena adanya <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> tambahan, seperti <ph name="BEGIN_LINK_LINUX_OSS" />Linux (Beta)<ph name="END_LINK_LINUX_OSS" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb
index 69eb394..1bc0892 100644
--- a/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -22,7 +22,7 @@
 <translation id="1587223624401073077">Google Chrome камераңызды пайдалануда.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> қауіпті болғандықтан, Chrome оны бөгеді.</translation>
 <translation id="1619887657840448962">Chrome браузерін қауіпсіз ету үшін, <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> тізімінде жоқ келесі кеңейтім  өшірілді, ол сізге ескертілмей қосылған болуы мүмкін.</translation>
-<translation id="162448658176061655">Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: жаңа ғана.</translation>
+<translation id="162448658176061655">Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: жаңа ғана.</translation>
 <translation id="162629503687514352">Chrome OS құпия сөздеріңізді синхрондай алмады.</translation>
 <translation id="1628000112320670027">Chrome жөнінде анықтама алу</translation>
 <translation id="1662639173275167396">Chrome OS <ph name="BEGIN_LINK_LINUX_OSS" />Linux (Бета)<ph name="END_LINK_LINUX_OSS" /> сияқты қосымша <ph name="BEGIN_LINK_CROS_OSS" />ашық бастапқы код бағдарламасы<ph name="END_LINK_CROS_OSS" /> арқылы жасалады.</translation>
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome ескірген</translation>
 <translation id="1919130412786645364">Chrome браузеріне кіруге рұқсат ету</translation>
+<translation id="195645108406520445">Жаңа Chrome профилін реттеңіз</translation>
 <translation id="2063848847527508675">Жаңарту күшіне енуі үшін Chrome OЖ-н қайта іске қосу қажет.</translation>
 <translation id="2094919256425865063">Chrome браузерінен бәрібір шығасыз ба?</translation>
 <translation id="2120620239521071941"><ph name="ITEMS_COUNT" /> элемент бұл құрылғыдан жойылады. Деректерді кейінірек алу үшін Chrome жүйесіне <ph name="USER_EMAIL" /> болып кіріңіз.</translation>
@@ -141,7 +142,7 @@
 <translation id="4771048833395599659">Бұл файл қауіпті болуы мүмкін болғандықтан, Chrome оны бөгеді.</translation>
 <translation id="479167709087336770">Google Search қызметіндегі емлені тексеру құралы пайдаланылады. Браузерде терілген мәтін Google-ға жіберіледі. Мұны параметрлерде өзгертуіңізге болады.</translation>
 <translation id="4891791193823137474">Google Chrome жүйесіне фонда жұмыс істеуге рұқсат беру</translation>
-<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 күн бұрын.}other{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_DAYS} күн бұрын.}}</translation>
+<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 күн бұрын.}other{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_DAYS} күн бұрын.}}</translation>
 <translation id="4895437082222824641">Сілтемені жаңа Chrome қойындысында ашу</translation>
 <translation id="4953650215774548573">Әдепкі браузеріңіз ретінде Google Chrome орнату</translation>
 <translation id="495931528404527476">Chrome ішінде</translation>
@@ -187,7 +188,7 @@
 <translation id="6338556085225130112">Google Chrome браузерін жаңарту</translation>
 <translation id="6368958679917195344">Chrome OS қосымша <ph name="BEGIN_LINK_CROS_OSS" />ашық дереккөз бағдарламалық жасақтамасы<ph name="END_LINK_CROS_OSS" /> арқылы жасалды.</translation>
 <translation id="6372315130616785175">Жұмыс есептік жазбасымен кірдіңіз. Деректеріңізді бөлек сақтау үшін жұмысқа жаңа Chrome профилін жасағыңыз келе ме?</translation>
-<translation id="6454142105866844106">Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді.</translation>
+<translation id="6454142105866844106">Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді.</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome әзірлеуші нұсқасы</translation>
 <translation id="6566149418543181476">Google Chrome жаңартылуда (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6676384891291319759">Интернетке кіру</translation>
@@ -205,13 +206,13 @@
 <translation id="7106741999175697885">Тапсырмалар реттегіші – Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome браузерінің жаңа нұсқасы шықты. Ол браузерді өшіріп, қайта іске қосқанда орнатылады.}=1{Chrome браузерінің жаңа нұсқасы шықты. Ол браузерді өшіріп, қайта іске қосқанда орнатылады. Инкогнито терезесі қайта ашылмайды.}other{Chrome браузерінің жаңа нұсқасы шықты. Ол браузерді өшіріп, қайта іске қосқанда орнатылады. # инкогнито терезесі қайта ашылмайды.}}</translation>
 <translation id="7155997830309522122">Егер өзгертсеңіз, Chrome браузерінде сақталған құпия сөзді де жаңасына өзгертіңіз.</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 сағат бұрын.}other{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_HOURS} сағат бұрын.}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 сағат бұрын.}other{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_HOURS} сағат бұрын.}}</translation>
 <translation id="7242029209006116544">Бақыланатын есептік жазба арқылы кіріп, оның әкімшісіне Google Chrome профиліңізді басқару мүмкіндігін бердіңіз. Қолданбалар, бетбелгілер, журнал, құпия сөздер сияқты Chrome деректеріңіз және басқа параметрлер біржола <ph name="USER_NAME" /> пайдаланушысына байланыстырылады. Бұл деректерді Google есептік жазба бақылау тақтасы арқылы жоя аласыз, бірақ бұл деректерді басқа есептік жазбамен байланыстыра алмайсыз. <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Бұл тіл Google Chrome интерфейсін көрсету үшін қолданылады.</translation>
 <translation id="7296210096911315575">Пайдалану және қауіпсіздік туралы маңызды ақпарат</translation>
 <translation id="7308322188646931570">Файлдарды жүктеп алу үшін Chrome браузеріне сақтау орнын пайдалану құқығы қажет</translation>
 <translation id="7339898014177206373">Жаңа терезе</translation>
-<translation id="7386132805935307836">Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: кеше.</translation>
+<translation id="7386132805935307836">Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: кеше.</translation>
 <translation id="7398801000654795464">Chrome жүйесіне <ph name="USER_EMAIL_ADDRESS" /> ретінде кірдіңіз. Қайта кіру үшін бірдей есептік жазбаны пайдаланыңыз.</translation>
 <translation id="7408085963519505752">Chrome OS шарттары</translation>
 <translation id="7419046106786626209">Chrome OS деректеріңізді синхрондай алмады, себебі синхрондау функциясы доменіңіз үшін қолжетімді емес.</translation>
@@ -248,7 +249,7 @@
 <translation id="828798499196665338">Ата-анаңыз Chrome браузері үшін "Сайттар, қолданбалар және кеңейтімдер бойынша рұқсаттар" параметрін өшірді. <ph name="EXTENSION_TYPE_PARAMETER" /> кеңейтімін іске қосуға болмайды.</translation>
 <translation id="8290100596633877290">Google Chrome жаңылысты. Қазір қайта ашу керек пе?</translation>
 <translation id="8342675569599923794">Бұл файл қауіпті болғандықтан, Chrome оны бөгеді.</translation>
-<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 минут бұрын.}other{Chrome браузері зиянды бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_MINS} минут бұрын.}}</translation>
+<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: 1 минут бұрын.}other{Chrome браузері қажетсіз бағдарламалық құралдың бар-жоғын аптасына бір рет тексереді. Соңғы тексерілген уақыты: {NUM_MINS} минут бұрын.}}</translation>
 <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Барлық құқықтары қорғалған.</translation>
 <translation id="840084489713044809">Google Chrome құпия сөздерді экспорттағысы келеді.</translation>
 <translation id="8498858610309223613">Google Chrome браузеріне қазір ғана қауіпсіздік бойынша арнайы жаңартылған нұсқа қолданылды. Оны қазір қайта ашсаңыз, ондағы қойындылар қалпына келтіріледі.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb
index 13e743a..d1e30cd 100644
--- a/chrome/app/resources/google_chrome_strings_km.xtb
+++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome បេតា (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome ហួសសម័យហើយ</translation>
 <translation id="1919130412786645364">អនុញ្ញាត​ការចូល Chrome</translation>
+<translation id="195645108406520445">រៀបចំ Chrome Space ថ្មី​របស់អ្នក</translation>
 <translation id="2063848847527508675">Chrome OS ត្រូវចាប់ផ្តើមឡើងវិញដើម្បីអនុវត្តការអាប់ដេតនេះ។</translation>
 <translation id="2094919256425865063">នៅ​តែ​ចង់​ចាក​ចេញពី Chrome ឬ?</translation>
 <translation id="2120620239521071941">វា​នឹង​លុប​ធាតុ​ <ph name="ITEMS_COUNT" /> ចេញ​ពី​ឧបករណ៍​នេះ។ ដើម្បី​ទាញ​យក​ទិន្នន័យ​របស់អ្នក​មកវិញ​នៅ​ពេល​ក្រោយ សូម​ចូល​ទៅ​កាន់ Chrome ជា <ph name="USER_EMAIL" /> ។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index d61d63d..bb23e51 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸುತ್ತಿದೆ.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹಾಗಾಗಿ Chrome ಅದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="1619887657840448962">Chrome ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು, <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ನಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡದಿರುವ ಕೆಳಗಿನ ವಿಸ್ತರಣೆಯನ್ನು ನಾವು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದೇವೆ ಮತ್ತು ಇದು ನಿಮ್ಮ ಗಮನಕ್ಕೆ ಬಾರದೇ ಸೇರಿಸಲಾಗಿರಬಹುದು.</translation>
-<translation id="162448658176061655">Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: ಸ್ವಲ್ಪ ಸಮಯದ ಹಿಂದೆ.</translation>
+<translation id="162448658176061655">Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: ಸ್ವಲ್ಪ ಸಮಯದ ಹಿಂದೆ.</translation>
 <translation id="162629503687514352">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chrome OS ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
 <translation id="1628000112320670027">Chrome ಕುರಿತಾಗಿ ಸಹಾಯ ಪಡೆಯಿರಿ</translation>
 <translation id="1662639173275167396">ಹೆಚ್ಚುವರಿ <ph name="BEGIN_LINK_CROS_OSS" />ಓಪನ್ ಸೋರ್ಸ್ ಸಾಫ್ಟ್‌ವೇರ್‌<ph name="END_LINK_CROS_OSS" /> ನಿಂದ Chrome OS ನ ರಚನೆ, ಹಾಗೆಯೇ <ph name="BEGIN_LINK_LINUX_OSS" />Linux (ಬೀಟಾ)<ph name="END_LINK_LINUX_OSS" /> ರಚನೆ ಸಹ ಸಾಧ್ಯವಾಯಿತು.</translation>
@@ -139,7 +139,7 @@
 <translation id="4771048833395599659">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="479167709087336770">ಇದು Google ಹುಡುಕಾಟದಲ್ಲಿ ಬಳಸಲಾದ ಅದೇ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನೀವು ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾಯಿಸಬಹುದು.</translation>
 <translation id="4891791193823137474">Google Chrome ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಚಾಲನೆಯಾಗಲು ಅನುಮತಿಸಿ</translation>
-<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ದಿನದ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ದಿನದ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_DAYS} ದಿನಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="4895437082222824641">ಹೊಸ Chrome &amp;ಟ್ಯಾಬ್‌ನಲ್ಲಿ ಲಿಂಕ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="4953650215774548573">Google Chrome ಅನ್ನು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್‌ ರೂಪದಲ್ಲಿ ಹೊಂದಿಸಿ</translation>
 <translation id="495931528404527476">Chrome ನಲ್ಲಿ</translation>
@@ -198,13 +198,13 @@
 <translation id="7106741999175697885">ಕಾರ್ಯ ನಿರ್ವಾಹಕ - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome ಗಾಗಿ ಹೊಸತೊಂದು ಅಪ್‌ಡೇಟ್ ಲಭ್ಯವಿದೆ ಹಾಗೂ ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದ ಕೂಡಲೇ ಅದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.}=1{Chrome ಗಾಗಿ ಹೊಸತೊಂದು ಅಪ್‌ಡೇಟ್ ಲಭ್ಯವಿದೆ ಹಾಗೂ ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದ ಕೂಡಲೇ ಅದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}one{Chrome ಗಾಗಿ ಹೊಸತೊಂದು ಅಪ್‌ಡೇಟ್ ಲಭ್ಯವಿದೆ ಹಾಗೂ ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದ ಕೂಡಲೇ ಅದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}other{Chrome ಗಾಗಿ ಹೊಸತೊಂದು ಅಪ್‌ಡೇಟ್ ಲಭ್ಯವಿದೆ ಹಾಗೂ ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದ ಕೂಡಲೇ ಅದನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}}</translation>
 <translation id="7155997830309522122">ಹಾಗಿದ್ದರೆ, Chrome ನಲ್ಲಿ ನಿಮ್ಮ ಉಳಿಸಿದ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ, ಇದರಿಂದಾಗಿ ಅದು ನಿಮ್ಮ ಹೊಸ ಪಾಸ್‌ವರ್ಡ್‌ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತದೆ.</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ಗಂಟೆಯ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ಗಂಟೆಯ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_HOURS} ಗಂಟೆಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="7242029209006116544">ನೀವು ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುತ್ತಿರುವಿರಿ ಮತ್ತು ನಿಮ್ಮ Google Chrome ಪ್ರೊಫೈಲ್ ಮೂಲಕ ಅದರ ನಿರ್ವಾಹಕ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು, ಹಾಗೂ ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳಂತಹ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು <ph name="USER_NAME" /> ಅವರಿಗೆ ಶಾಶ್ವತವಾಗಿ ಬಂಧಿಸಲಾಗುತ್ತದೆ. Google ಖಾತೆಗಳ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಮೂಲಕ ಈ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ, ಆದರೆ ಬೇರೊಂದು ಖಾತೆಯೊಂದಿಗೆ ಈ ಡೇಟಾವನ್ನು ಸಂಯೋಜಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ Chrome ಡೇಟಾವನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಇರಿಸಿಕೊಳ್ಳಲು ನೀವು ಐಚ್ಛಿಕವಾಗಿ ಹೊಸ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಬಹುದು. <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Google Chrome UI ತೋರಿಸಲು ಈ ಭಾಷೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ</translation>
 <translation id="7296210096911315575">ಬಳಕೆ ಮತ್ತು ಸುರಕ್ಷತೆ ಕುರಿತಾದ ಪ್ರಮುಖ ಮಾಹಿತಿ</translation>
 <translation id="7308322188646931570">ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು Chrome ಗೆ ಸಂಗ್ರಹಣೆಯನ್ನು ಪ್ರವೇಶಿಸುವ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="7339898014177206373">ಹೊಸ ವಿಂಡೊ</translation>
-<translation id="7386132805935307836">Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: ನಿನ್ನೆ.</translation>
+<translation id="7386132805935307836">Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: ನಿನ್ನೆ.</translation>
 <translation id="7398801000654795464"><ph name="USER_EMAIL_ADDRESS" /> ನಂತೆ Chrome ಅನ್ನು ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವಿರಿ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಅದೇ ಖಾತೆಯನ್ನು ಬಳಸಿ.</translation>
 <translation id="7408085963519505752">Chrome OS ನಿಯಮಗಳು</translation>
 <translation id="7419046106786626209">ನಿಮ್ಮ ಡೊಮೇನ್‌ನಲ್ಲಿ ಸಿಂಕ್ ಮಾಡುವ ಸೌಲಭ್ಯವಿಲ್ಲದ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chrome OS ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation>
@@ -241,7 +241,7 @@
 <translation id="828798499196665338">ನಿಮ್ಮ ಪೋಷಕರು Chrome ನಲ್ಲಿ "ಸೈಟ್‌ಗಳು, ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳಿಗಾಗಿ ಅನುಮತಿಗಳನ್ನು" ಆಫ್ ಮಾಡಿದ್ದಾರೆ. ಈ <ph name="EXTENSION_TYPE_PARAMETER" /> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಅನುಮತಿಯಿಲ್ಲ.</translation>
 <translation id="8290100596633877290">ಓಹ್! Google Chrome ಕ್ರ‍್ಯಾಶ್‌ ಆಗಿದೆ.ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸುವುದೆ?</translation>
 <translation id="8342675569599923794">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
-<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: 1 ನಿಮಿಷದ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲನೆ ಮಾಡಿರುವುದು: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}}</translation>
+<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: 1 ನಿಮಿಷದ ಹಿಂದೆ.}one{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}other{Chrome ಅನಗತ್ಯ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಳನ್ನು ವಾರಕ್ಕೊಮ್ಮೆ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಕೊನೆಯ ಪರಿಶೀಲನೆ: {NUM_MINS} ನಿಮಿಷಗಳ ಹಿಂದೆ.}}</translation>
 <translation id="8370517070665726704">ಕೃತಿಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google LLC. ಎಲ್ಲ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation>
 <translation id="840084489713044809">Google Chrome ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ಬಯಸುತ್ತದೆ.</translation>
 <translation id="8498858610309223613">Google Chrome ಗೆ ವಿಶೇಷ ಸುರಕ್ಷತೆಯ ಅಪ್‌ಡೇಟ್‌‌ ಅನ್ನು ಈಗ ತಾನೇ ಅನ್ವಯಿಸಲಾಗಿದೆ. ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಟ್ಯಾಬ್‌ಗಳನ್ನು ನಾವು ಮರುಸ್ಥಾಪಿಸುತ್ತೇವೆ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb
index e8726a4d6..c4d8551 100644
--- a/chrome/app/resources/google_chrome_strings_ky.xtb
+++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Бета (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome эскирип калган.</translation>
 <translation id="1919130412786645364">Chrome'го кирүүгө уруксат берүү</translation>
+<translation id="195645108406520445">Жаңы Chrome сактагычын жөндөңүз</translation>
 <translation id="2063848847527508675">Жаңыртууну колдонуу үчүн Chrome OS өчүрүлүп күйгүзүлүшү керек.</translation>
 <translation id="2094919256425865063">Баары бир Chrome'ду токтотосузбу?</translation>
 <translation id="2120620239521071941">Ушуну менен түзмөктөгү <ph name="ITEMS_COUNT" /> нерсе өчүрүлөт. Дайын-даректериңизди кийинчерээк чыгарып алуу үчүн Chrome'го <ph name="USER_EMAIL" /> аккаунту менен кириңиз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index 181e0d9..c17872f 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -40,6 +40,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome versija ir novecojusi.</translation>
 <translation id="1919130412786645364">Atļaut pierakstīties pārlūkā Chrome</translation>
+<translation id="195645108406520445">Jaunas Chrome darbvietas izveide</translation>
 <translation id="2063848847527508675">Lai lietotu atjauninājumu, Chrome OS ir jārestartē.</translation>
 <translation id="2094919256425865063">Vai tik un tā aizvērt pārlūku Chrome?</translation>
 <translation id="2120620239521071941">Veicot šo darbību, no šīs ierīces tiks dzēsts(-i) <ph name="ITEMS_COUNT" /> vienums(-i). Lai vēlāk izgūtu datus, pierakstieties pārlūkā Chrome kā <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index 773a35b..9f9ab34 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome ബീറ്റ (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome കാലഹരണപ്പെട്ടതാണ്</translation>
 <translation id="1919130412786645364">Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യാൻ അനുവദിക്കുക</translation>
+<translation id="195645108406520445">നിങ്ങളുടെ പുതിയ Chrome സ്പെയ്സ് സജ്ജീകരിക്കുക</translation>
 <translation id="2063848847527508675">അപ്‌ഡേറ്റ് ബാധകമാക്കാൻ Chrome റീസ്റ്റാർട്ട് ചെയ്യേണ്ടതുണ്ട്.</translation>
 <translation id="2094919256425865063">എന്തായാലും Chrome-ൽ നിന്ന് പുറത്തുകടക്കണോ?</translation>
 <translation id="2120620239521071941">ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് <ph name="ITEMS_COUNT" /> ഇനങ്ങൾ ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chrome‌-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index b4f43025..4349c90 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -22,7 +22,7 @@
 <translation id="1587223624401073077">Google Chrome gebruikt je camera.</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> is gevaarlijk en is daarom door Chrome geblokkeerd.</translation>
 <translation id="1619887657840448962">We hebben de volgende extensie uitgeschakeld die niet wordt vermeld in de <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> en mogelijk zonder je medeweten is toegevoegd. We doen dit om Chrome veiliger te maken.</translation>
-<translation id="162448658176061655">Chrome checkt één keer per week op ongewenste software. Laatst gecheckt: zojuist.</translation>
+<translation id="162448658176061655">Chrome checkt één keer per week op ongewenste software. Laatst gecheckt: minder dan een minuut geleden.</translation>
 <translation id="162629503687514352">Chrome OS kan je wachtwoorden niet synchroniseren.</translation>
 <translation id="1628000112320670027">Hulp bij Chrome</translation>
 <translation id="1662639173275167396">Chrome OS wordt mogelijk gemaakt door aanvullende <ph name="BEGIN_LINK_CROS_OSS" />open-sourcesoftware<ph name="END_LINK_CROS_OSS" />, net als <ph name="BEGIN_LINK_LINUX_OSS" />Linux (bèta)<ph name="END_LINK_LINUX_OSS" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 73f1507..e01a14f 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -38,6 +38,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS – inn)</translation>
 <translation id="1877026089748256423">Chrome er utdatert</translation>
 <translation id="1919130412786645364">Tillat Chrome-pålogging</translation>
+<translation id="195645108406520445">Konfigurer ditt nye Chrome Space</translation>
 <translation id="2063848847527508675">Chrome OS må startes på nytt for at oppdateringen skal tas i bruk.</translation>
 <translation id="2094919256425865063">Vil du avslutte Chrome likevel?</translation>
 <translation id="2120620239521071941">Dette sletter <ph name="ITEMS_COUNT" /> elementer fra denne enheten. For å hente dataene dine igjen senere må du logge på Chrome som <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index b848952..ddac402 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -22,7 +22,7 @@
 <translation id="1587223624401073077">Google Chrome ଆପଣଙ୍କର କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> ବିପଜ୍ଜନକ ଅଟେ, ତେଣୁ Chrome ଏହାକୁ ଅବରୋଧ କରିଛି।</translation>
 <translation id="1619887657840448962">Chromeକୁ ଆହୁରି ସୁରକ୍ଷିତ କରିବା ପାଇଁ, ଆମେ <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />ରେ ତାଲିକାଭୁକ୍ତ ହୋଇନଥିବା ଏବଂ ଆପଣଙ୍କର ଅଜାଣତରେ ଯୋଗ କରାଯାଇଥିବା ନିମ୍ନୋକ୍ତ ଏକ୍ସ‌ଟେନ୍‌ସନ୍‌କୁ ଅକ୍ଷମ କରିଦେଇଛୁ।</translation>
-<translation id="162448658176061655">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: କିଛି ସମୟ ପୂର୍ବେ।</translation>
+<translation id="162448658176061655">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: କିଛି ସମୟ ପୂର୍ବେ।</translation>
 <translation id="162629503687514352">Chrome OS ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ସିଙ୍କ୍ କରିପାରିଲା ନାହିଁ।</translation>
 <translation id="1628000112320670027">Chrome ସାହାଯ୍ୟରେ ସାହାଯ୍ୟ ପ୍ରାପ୍ତ କରନ୍ତୁ</translation>
 <translation id="1662639173275167396"><ph name="BEGIN_LINK_LINUX_OSS" />Linux (ବିଟା)<ph name="END_LINK_LINUX_OSS" /> ଭଳି ଅତିରିକ୍ତ <ph name="BEGIN_LINK_CROS_OSS" />ମୁକ୍ତ ଉତ୍ସ ସଫ୍ଟୱେର୍<ph name="END_LINK_CROS_OSS" /> ଦ୍ଵାରା Chrome OSକୁ ସକ୍ଷମ କରାଯାଇଛି।</translation>
@@ -141,7 +141,7 @@
 <translation id="4771048833395599659">ଏହି ଫାଇଲ୍‌ ବିପଜ୍ଜନକ ହୋ‍ଇପାରେ, ତେଣୁ ଏହାକୁ Chrome ଅବରୋଧ କରିଛି।</translation>
 <translation id="479167709087336770">ଏହା Google ସନ୍ଧାନରେ ବ୍ୟବହୃତ ହେଉଥିବା ସମାନବନାନ ଯାଞ୍ଚକାରୀ ବ୍ୟବହାର କରେ। ବ୍ରାଉଜର୍‌ରେ ଆପଣ ଟାଇପ୍ କରିଥିବା ଟେକ୍ସଟ୍ Googleକୁ ପଠାଯାଏ। ଆପଣ ସର୍ବଦା ସେଟିଂସ୍‌ରେ ଏହି ଆଚରଣ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation>
 <translation id="4891791193823137474">ପୃଷ୍ଠଭୂମିରେ Google Chromeକୁ ଚାଲିବାକୁ ଦିଅନ୍ତୁ</translation>
-<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଦିନ ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_DAYS} ଦିନ ପୂର୍ବେ।}}</translation>
+<translation id="489337168347244450">{NUM_DAYS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଦିନ ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_DAYS} ଦିନ ପୂର୍ବେ।}}</translation>
 <translation id="4895437082222824641">ନୂଆ Chrome &amp;ଟାବ୍‌ରେ ଲିଙ୍କ୍‌ଟି ଖୋଲନ୍ତୁ</translation>
 <translation id="4953650215774548573">Google Chromeକୁ ଆପଣଙ୍କର ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଭାବେ ସେଟ୍ କରନ୍ତୁ</translation>
 <translation id="495931528404527476">Chromeରେ</translation>
@@ -186,7 +186,7 @@
 <translation id="6338556085225130112">Google Chrome ଅପ୍‌ଡେଟ୍ ହେଉଛି</translation>
 <translation id="6368958679917195344">Chrome OS ଅତିରିକ୍ତ <ph name="BEGIN_LINK_CROS_OSS" />ମୁକ୍ତ ଉତ୍ସ ସଫ୍ଟୱେୟାର୍ <ph name="END_LINK_CROS_OSS" /> ଦ୍ୱାରା ସମ୍ଭବପର ହୋ‍ଇଛି।</translation>
 <translation id="6372315130616785175">ଆପଣ ଏକ କାର୍ଯ୍ୟସ୍ଥଳୀ ଆକାଉଣ୍ଟ ସହ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି। ଆପଣ ଆପଣଙ୍କ ଡାଟାକୁ ଅଲଗା ରଖିବା ପାଇଁ କାର୍ଯ୍ୟସ୍ଥଳୀ ନିମନ୍ତେ ଏକ ନୂଆ Chrome ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିବାକୁ ପସନ୍ଦ କରିବେ?</translation>
-<translation id="6454142105866844106">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ</translation>
+<translation id="6454142105866844106">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome ଅପ୍‌ଡେଟ୍ ହେଉଛି (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6676384891291319759">ଇଣ୍ଟର୍ନେଟ୍ ପ୍ରବେଶ କରନ୍ତୁ</translation>
@@ -204,13 +204,13 @@
 <translation id="7106741999175697885">ଟାସ୍କ ପରିଚାଳକ - Google Chrome</translation>
 <translation id="7140653346177713799">{COUNT,plural, =0{Chrome ପାଇଁ ଗୋଟିଏ ନୂଆ ଅପ୍‌ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି ଏବଂ ଆପଣ ପୁଣି ଲଞ୍ଚ କରିବା କ୍ଷଣି ଏହା ଲାଗୁ ହୋଇଯିବ।}=1{Chrome ପାଇଁ ଗୋଟିଏ ନୂଆ ଅପ୍‌ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି ଏବଂ ଆପଣ ପୁଣି ଲଞ୍ଚ କରିବା କ୍ଷଣି ଏହା ଲାଗୁ ହୋଇଯିବ। ଆପଣଙ୍କର ଇନ୍‌କଗ୍ନିଟୋ ୱିଣ୍ଡୋ ପୁଣି ଖୋଲିବ ନାହିଁ।}other{Chrome ପାଇଁ ଗୋଟିଏ ନୂଆ ଅପ୍‌ଡେଟ୍ ଉପଲବ୍ଧ ଅଛି ଏବଂ ଆପଣ ପୁଣି ଲଞ୍ଚ କରିବା କ୍ଷଣି ଏହା ଲାଗୁ ହୋଇଯିବ। ଆପଣଙ୍କର #ଟି ଇନ୍‌କଗ୍ନିଟୋ ୱିଣ୍ଡୋ ପୁଣି ଖୋଲିବ ନାହିଁ।}}</translation>
 <translation id="7155997830309522122">ଯଦି ଏପରି ହୋଇଥାଏ, ତେବେ ଦୟାକରି Chromeରେ ଆପଣଙ୍କ ସେଭ୍ କରାଯାଇଥିବା ପାସୱାର୍ଡକୁ ସମ୍ପାଦନ କରନ୍ତୁ ଯାହା ଫଳରେ ଏହା ଆପଣଙ୍କ ନୂଆ ପାସୱାର୍ଡ ସହ ମେଳ ହେବ।</translation>
-<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଘଣ୍ଟା ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_HOURS} ଘଣ୍ଟା ପୂର୍ବେ।}}</translation>
+<translation id="7236955538461508933">{NUM_HOURS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ଘଣ୍ଟା ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_HOURS} ଘଣ୍ଟା ପୂର୍ବେ।}}</translation>
 <translation id="7242029209006116544">ଆପଣ ଏକ ପରିଚାଳିତ ଆକାଉଣ୍ଟ ସାହାଯ୍ୟରେ ସାଇନ୍ ଇନ୍ କରୁଛନ୍ତି ଏବଂ ଆପଣଙ୍କର Google Chrome ପ୍ରୋଫାଇଲ୍ ଉପରେ ଏହାର ବ୍ୟବସ୍ଥାପକଙ୍କୁ ନିୟନ୍ତ୍ରଣ ଦେଉଛନ୍ତି। ଆପଣଙ୍କର Chrome ଡାଟା ଯେପରିକି, ଆପଣଙ୍କର ଆପ୍ସ, ବୁକ୍‌ମାର୍କ, ଇତିବୃତ୍ତି, ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକ ଏବଂ ଅନ୍ୟାନ୍ୟ ସେଟିଂସ୍ ସ୍ଥାୟୀ ରୂପେ <ph name="USER_NAME" /> ସହ ଯୋଡ଼ି ହୋଇଯିବ। ଆପଣ ଏହି ଡାଟାକୁ Google ଆକାଉଣ୍ଟ ଡ୍ୟାସ୍‌ବୋର୍ଡ ମାଧ୍ୟମରେ ଡିଲିଟ୍ କରିପାରିବେ, କିନ୍ତୁ ଆପଣ ତାହାକୁ ଅନ୍ୟ ଆକାଉଣ୍ଟ ସହିତ ଯୋଡ଼ିପାରିବେ ନାହିଁ। ଆପଣଙ୍କର ବିଦ୍ୟମାନ Chrome ଡାଟାକୁ ଅଲଗା ରଖିବା ପାଇଁ ଇଚ୍ଛାଧୀନ ରୂପେ ଆପଣ ଏକ ନୂଆ ପ୍ରୋଫାଇଲ୍ ତିଆରି କରିପାରିବେ। <ph name="LEARN_MORE" /></translation>
 <translation id="7295052994004373688">Google Chrome UI ପ୍ରଦର୍ଶନ କରିବା ପାଇଁ ଏହି ଭାଷା ବ୍ୟବହାର କରାଯାଏ</translation>
 <translation id="7296210096911315575">ଗୁରୁତ୍ବପୂର୍ଣ୍ଣ ବ୍ୟବହାର ଏବଂ ସୁରକ୍ଷା ସୂଚନା</translation>
 <translation id="7308322188646931570">ଫାଇଲ୍‌ଗୁଡ଼ିକ ଡାଉନ୍‌ଲୋଡ୍ କରିବାକୁ Chrome ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଆବଶ୍ୟକ କରେ</translation>
 <translation id="7339898014177206373">ନୂଆ ୱିଣ୍ଡୋ</translation>
-<translation id="7386132805935307836">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: ଗତକାଲି।</translation>
+<translation id="7386132805935307836">Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: ଗତକାଲି।</translation>
 <translation id="7398801000654795464"><ph name="USER_EMAIL_ADDRESS" /> ଭାବରେ ଆପଣ Chromeରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି। ପୁଣିଥରେ ସାଇନ୍ ଇନ୍ କରିବା ପାଇଁ ଦୟାକରି ସେହି ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="7408085963519505752">Chrome OS ସର୍ତ୍ତ</translation>
 <translation id="7419046106786626209">Chrome OS ଆପଣଙ୍କର ଡାଟାକୁ ସିଙ୍କ୍ କରିପାରିବ ନାହିଁ, କାରଣ ଆପଣଙ୍କ ଡୋମେନ୍ ପାଇଁ ସିଙ୍କ୍ ଉପଲବ୍ଧ ନାହିଁ।</translation>
@@ -247,7 +247,7 @@
 <translation id="828798499196665338">ଆପଣଙ୍କ ବାପାମା Chrome ପାଇଁ "ସାଇଟ୍, ଆପ୍ ଏବଂ ଏକ୍ସଟେନସନଗୁଡ଼ିକ ନିମନ୍ତେ ଅନୁମତିଗୁଡ଼ିକ" ବନ୍ଦ କରିଦେଇଛନ୍ତି। ଏହି <ph name="EXTENSION_TYPE_PARAMETER" />କୁ ସକ୍ଷମ କରିବା ପାଇଁ ଅନୁମତି ନାହିଁ।</translation>
 <translation id="8290100596633877290">ୱାହୋ! Google Chrome କ୍ରାସ୍ ହୋଇଯାଇଛି। ବର୍ତ୍ତମାନ ପୁଣି ଲଞ୍ଚ କରିବେ କି?</translation>
 <translation id="8342675569599923794">ଏହି ଫାଇଲ୍‌ ବିପଜ୍ଜନକ ଅଟେ, ତେଣୁ Chrome ଏହାକୁ ଅବରୋଧ କରିଛି।</translation>
-<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ମିନିଟ୍ ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେୟାରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_MINS} ମିନିଟ୍ ପୂର୍ବେ।}}</translation>
+<translation id="8344083974188970894">{NUM_MINS,plural, =1{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: 1 ମିନିଟ୍ ପୂର୍ବେ।}other{Chrome ସପ୍ତାହକୁ ଥରେ ଅଦରକାରୀ ସଫ୍ଟୱେରର ଯାଞ୍ଚ କରେ। ଗତ ଥର ଯାଞ୍ଚ କରାଯାଇଛି: {NUM_MINS} ମିନିଟ୍ ପୂର୍ବେ।}}</translation>
 <translation id="8370517070665726704">କପିରାଇଟ୍ <ph name="YEAR" /> Google LLC। ସମସ୍ତ ଅଧିକାର ସଂରକ୍ଷିତ ଅଛି।</translation>
 <translation id="840084489713044809">Google Chrome ଆପଣଙ୍କର ପାସ୍‌ୱାର୍ଡ‌ଗୁଡିକୁ ଏକ୍ସପୋର୍ଟ୍ କରିବାକୁ ଚାହେଁ।</translation>
 <translation id="8498858610309223613">କିଛି ସମୟ ପୂର୍ବରୁ Google Chrome ପାଇଁ ଏକ ବିଶେଷ ସୁରକ୍ଷା ଅପ୍‌ଡେଟ୍ ଲାଗୁ କରାଯାଇଛି। ବର୍ତ୍ତମାନ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ ଏବଂ ଆମେ ଆପଣଙ୍କ ଟାବ୍ ରିଷ୍ଟୋର୍ କରିବୁ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index 2677405..0855dab 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -38,6 +38,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome nu este actualizat</translation>
 <translation id="1919130412786645364">Permite conectarea la Chrome</translation>
+<translation id="195645108406520445">Configurează noul spațiu din Chrome</translation>
 <translation id="2063848847527508675">Pentru a se aplica actualizarea, sistemul de operare Chrome trebuie să fie repornit.</translation>
 <translation id="2094919256425865063">Ieși din Chrome oricum?</translation>
 <translation id="2120620239521071941">Astfel, se vor șterge <ph name="ITEMS_COUNT" /> elemente de pe acest dispozitiv. Pentru a recupera datele mai târziu, conectează-te la Chrome ca <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index f1657564..2ffc014 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome je zastarel</translation>
 <translation id="1919130412786645364">Omogočanje prijave v Chrome</translation>
+<translation id="195645108406520445">Nastavitev novega prostora v Chromu</translation>
 <translation id="2063848847527508675">Če želite namestiti posodobitev, morate znova zagnati OS Chrome.</translation>
 <translation id="2094919256425865063">Želite vseeno zapreti Chrome?</translation>
 <translation id="2120620239521071941">S tem bo iz te naprave izbrisanih več elementov (<ph name="ITEMS_COUNT" />). Če želite pozneje prenesti podatke, se v Chrome prijavite kot <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb
index f8ce7c7..e9a54a62 100644
--- a/chrome/app/resources/google_chrome_strings_sq.xtb
+++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome nuk është i përditësuar</translation>
 <translation id="1919130412786645364">Lejo identifikimin në Chrome</translation>
+<translation id="195645108406520445">Konfiguro hapësirën tënde të re të Chrome</translation>
 <translation id="2063848847527508675">Chrome OS ka nevojë të riniset për të zbatuar përditësimin.</translation>
 <translation id="2094919256425865063">Dëshiron ta mbyllësh Chrome gjithsesi?</translation>
 <translation id="2120620239521071941">Kjo do të fshijë <ph name="ITEMS_COUNT" /> artikuj nga kjo pajisje. Për t'i marrë më vonë të dhënat, identifikohu te Chrome si <ph name="USER_EMAIL" />.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index b937255..d820cc18 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -39,6 +39,7 @@
 <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome versiyasi eskirdi</translation>
 <translation id="1919130412786645364">Chrome hisobiga kirishga ruxsat berish</translation>
+<translation id="195645108406520445">Yangi Chrome Space profilingizni sozlang</translation>
 <translation id="2063848847527508675">Yangilov o‘rnatilishi uchun Chrome OS qaytadan ishga tushirilishi kerak.</translation>
 <translation id="2094919256425865063">Chrome baribir yopilsinmi?</translation>
 <translation id="2120620239521071941">Ushbu qurilmadagi <ph name="ITEMS_COUNT" /> ta element butunlay o‘chiriladi. Ma’lumotlaringizni keyinroq olish uchun Chrome brauzeriga <ph name="USER_EMAIL" /> sifatida kiring.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index 8f51026..0eddfeb 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -42,6 +42,7 @@
 <translation id="1874309113135274312">Google Chrome 測試版 (mDNS-In)</translation>
 <translation id="1877026089748256423">Chrome 版本過舊</translation>
 <translation id="1919130412786645364">允許登入 Chrome</translation>
+<translation id="195645108406520445">設定新的 Chrome 空間</translation>
 <translation id="2063848847527508675">必須重新啟動 Chrome 作業系統,才能套用更新。</translation>
 <translation id="2094919256425865063">仍要退出 Chrome 嗎?</translation>
 <translation id="2120620239521071941">這會刪除此裝置上的 <ph name="ITEMS_COUNT" /> 個項目。如果日後想擷取資料,請以 <ph name="USER_EMAIL" /> 的身分登入 Chrome。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index b75474c..9ea5876 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -20,7 +20,7 @@
 <translation id="1587223624401073077">Google Chrome 正在使用你的攝影機。</translation>
 <translation id="1587325591171447154"><ph name="FILE_NAME" /> 並不安全,因此遭到 Chrome 封鎖。</translation>
 <translation id="1619887657840448962">為了讓 Chrome 的安全性更有保障,我們停用了以下這個未列在「<ph name="IDS_EXTENSION_WEB_STORE_TITLE" />」中的擴充功能 (它可能是在您不知情的情況下加入瀏覽器)。</translation>
-<translation id="162448658176061655">Chrome 每週檢查一次垃圾軟體。上次檢查時間:剛才。</translation>
+<translation id="162448658176061655">Chrome 每週檢查一次垃圾軟體。上次檢查時間:不到一分鐘前。</translation>
 <translation id="162629503687514352">Chrome 作業系統無法同步處理你的密碼。</translation>
 <translation id="1628000112320670027">前往 Chrome 說明頁面</translation>
 <translation id="1662639173275167396">Chrome 作業系統藉助了其他<ph name="BEGIN_LINK_CROS_OSS" />開放原始碼軟體<ph name="END_LINK_CROS_OSS" />的相關技術才得以問世,<ph name="BEGIN_LINK_LINUX_OSS" />Linux (測試版)<ph name="END_LINK_LINUX_OSS" /> 也是如此。</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 9bf146a5..c156f42 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -54,11 +54,30 @@
     If an image doesn’t have a useful description, Chrome will try to provide one for you. To create descriptions, images are sent to Google.
   </message>
   <message name="IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE" desc="Name of the setting to enable Live Caption.">
-    Live caption
+    Get captions for your media
   </message>
   <message name="IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE" desc="Subtitle of the setting to enable Live Caption.">
-    Live caption detects speech in media and automatically generates captions for all media playing in Chrome.
+    Chrome automatically creates English captions using Live Caption
   </message>
+  <message name="IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS" desc="This message is displayed as a subtitle to the Live Caption title while the model is being downloading. It shows the download progress as a percentage and is updated dynamically.">
+    Downloading speech recognition files... <ph name="PERCENT">$1<ex>17</ex></ph>%
+  </message>
+  <message name="IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR" desc="Message displayed when there is an error downloading the live caption files.">
+    The required files can't be downloaded. Try again later.
+  </message>
+  <message name="IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE" desc="Name of the setting to enable Caret Browsing, which allows you to move around any web page using a text caret.">
+    Navigate pages with a text cursor
+  </message>
+  <if expr="not chromeos">
+    <message name="IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE" desc="Subtitle of the setting to enable Caret Browsing, which allows you to move around any web page using a text caret.">
+      To turn caret browsing on or off, use the shortcut F7
+    </message>
+  </if>
+  <if expr="chromeos">
+    <message name="IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE" desc="Subtitle of the setting to enable Caret Browsing, which allows you to move around any web page using a text caret.">
+      To turn caret browsing on or off, use the shortcut Ctrl+Search+7
+    </message>
+  </if>
   <if expr="not chromeos">
     <message name="IDS_SETTINGS_ACCESSIBILITY_FOCUS_HIGHLIGHT_DESCRIPTION" desc="In the settings tab, the text next to the checkbox to highlight the focused object to make it easier to see.">
       Show a quick highlight on the focused object
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE.png.sha1
index 3d15fb7..581c2596 100644
--- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE.png.sha1
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE.png.sha1
@@ -1 +1 @@
-cf206f45ac340d44f0e2cddd52cde7d2d1039f5c
\ No newline at end of file
+1b43a1c226fe097dfcd7e3a9d9e95c02dc6545a7
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE.png.sha1
index 3d15fb7..cdfcff2c 100644
--- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE.png.sha1
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE.png.sha1
@@ -1 +1 @@
-cf206f45ac340d44f0e2cddd52cde7d2d1039f5c
\ No newline at end of file
+4271555d15cf7deabdfc68334155188c659bd60f
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR.png.sha1
new file mode 100644
index 0000000..6bdebe1
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR.png.sha1
@@ -0,0 +1 @@
+de2d4b5a1c4e38d959600ecf346cd349b992f1c5
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS.png.sha1
new file mode 100644
index 0000000..43a2941
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS.png.sha1
@@ -0,0 +1 @@
+d948b934df4d931b8d5752985d4f063c316d4562
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE.png.sha1
new file mode 100644
index 0000000..d4c65640
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+eff97e57304f18e2c6f99cbad37995c41ecdc184
\ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE.png.sha1
new file mode 100644
index 0000000..d4c65640
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE.png.sha1
@@ -0,0 +1 @@
+eff97e57304f18e2c6f99cbad37995c41ecdc184
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b3d125d..a85cffc 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4560,8 +4560,6 @@
       "notifications/screen_lock_notification_blocker.cc",
       "notifications/screen_lock_notification_blocker.h",
       "platform_util.cc",
-      "policy/chrome_browser_cloud_management_controller.cc",
-      "policy/chrome_browser_cloud_management_controller.h",
       "policy/chrome_browser_cloud_management_controller_desktop.cc",
       "policy/chrome_browser_cloud_management_controller_desktop.h",
       "policy/chrome_browser_cloud_management_register_watcher.cc",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 4d8f0ad..6719541 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+apps",
   "+cc/paint",
+  "+cc/test",
   "+chrome/android/native_j_unittests_jni_headers",
   "+chrome/android/chrome_jni_headers",
   "+chrome/android/features/autofill_assistant/jni_headers",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index b19e720..6473cbb2 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3235,10 +3235,6 @@
                                  "https://play.google.com/store/apps/"
                                  "details?id=com.android.chrome")},
 #endif  // OS_ANDROID
-    {"tls13-hardening-for-local-anchors",
-     flag_descriptions::kTLS13HardeningForLocalAnchorsName,
-     flag_descriptions::kTLS13HardeningForLocalAnchorsDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kTLS13HardeningForLocalAnchors)},
     {"enable-tls13-early-data", flag_descriptions::kEnableTLS13EarlyDataName,
      flag_descriptions::kEnableTLS13EarlyDataDescription, kOsAll,
      FEATURE_VALUE_TYPE(net::features::kEnableTLS13EarlyData)},
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index bc06e23..8493d1b 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -44,7 +44,6 @@
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/lifetime/browser_shutdown.h"
 #include "chrome/browser/mac/mac_startup_profiler.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
@@ -93,6 +92,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #include "components/handoff/handoff_manager.h"
 #include "components/handoff/handoff_utility.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
diff --git a/chrome/browser/browser_commands_unittest.cc b/chrome/browser/browser_commands_unittest.cc
index 5162ab6..31f6320 100644
--- a/chrome/browser/browser_commands_unittest.cc
+++ b/chrome/browser/browser_commands_unittest.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
@@ -26,6 +27,7 @@
 #include "content/public/test/test_renderer_host.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/page/page_zoom.h"
+#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
 
 namespace {
 
@@ -437,4 +439,55 @@
   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ZOOM_MINUS));
 }
 
+TEST_F(BrowserCommandsTest, ToggleCaretBrowsing) {
+  // Set initial known state for browser process TestingProfile.
+  PrefService* pref_service = profile()->GetPrefs();
+  pref_service->SetBoolean(prefs::kCaretBrowsingEnabled, false);
+  pref_service->SetBoolean(prefs::kShowCaretBrowsingDialog, false);
+
+  // Create multiple tabs to test if caret browsing mode gets broadcast to all
+  // tabs when toggled.
+  GURL about_blank(url::kAboutBlankURL);
+  int tab_count = 3;
+  for (int i = 0; i < tab_count; ++i) {
+    AddTab(browser(), about_blank);
+  }
+
+  // Toggle on caret browsing.
+  chrome::ExecuteCommand(browser(), IDC_CARET_BROWSING_TOGGLE);
+  EXPECT_TRUE(pref_service->GetBoolean(prefs::kCaretBrowsingEnabled));
+
+  // Add another tab after toggling caret browsing mode--it should also have
+  // caret browsing mode set.
+  AddTab(browser(), about_blank);
+  tab_count++;
+
+  // Check renderer preferences for each tab.
+  for (int i = 0; i < tab_count; ++i) {
+    WebContents* web_contents =
+        browser()->tab_strip_model()->GetWebContentsAt(i);
+    blink::mojom::RendererPreferences* renderer_preferences =
+        web_contents->GetMutableRendererPrefs();
+    EXPECT_TRUE(renderer_preferences->caret_browsing_enabled);
+  }
+
+  // Toggle off caret browsing.
+  chrome::ExecuteCommand(browser(), IDC_CARET_BROWSING_TOGGLE);
+  EXPECT_FALSE(pref_service->GetBoolean(prefs::kCaretBrowsingEnabled));
+
+  // Add another tab after toggling caret browsing mode--it should also have
+  // caret browsing mode unset.
+  AddTab(browser(), about_blank);
+  tab_count++;
+
+  // Check renderer preferences for each tab.
+  for (int i = 0; i < tab_count; ++i) {
+    WebContents* web_contents =
+        browser()->tab_strip_model()->GetWebContentsAt(i);
+    blink::mojom::RendererPreferences* renderer_preferences =
+        web_contents->GetMutableRendererPrefs();
+    EXPECT_FALSE(renderer_preferences->caret_browsing_enabled);
+  }
+}
+
 }  // namespace
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index f5224ee1..4f656cf 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -194,8 +194,8 @@
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
 #include "chrome/browser/first_run/upgrade_util.h"
 #include "chrome/browser/notifications/notification_ui_manager.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/ui/user_manager.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #endif
 
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 16b51d22..73eecfc 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -195,7 +195,7 @@
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
 #include "chrome/browser/first_run/upgrade_util.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 96077da..b71ac35 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2306,6 +2306,14 @@
         command_line->AppendSwitch(
             blink::switches::kUserAgentClientHintDisable);
       }
+
+#if defined(OS_ANDROID)
+      // Communicating to content/ for BackForwardCache.
+      if (prefs->HasPrefPath(policy::policy_prefs::kBackForwardCacheEnabled) &&
+          !prefs->GetBoolean(policy::policy_prefs::kBackForwardCacheEnabled)) {
+        command_line->AppendSwitch(switches::kDisableBackForwardCache);
+      }
+#endif  // defined(OS_ANDROID)
     }
 
     MaybeAppendBlinkSettingsSwitchForFieldTrial(browser_command_line,
diff --git a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
index 406fc9e..1f5b279 100644
--- a/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/spoken_feedback_browsertest.cc
@@ -230,16 +230,7 @@
 
 // Test Learn Mode by pressing a few keys in Learn Mode. Only available while
 // logged in.
-//
-// Disabled on msan: https://crbug.com/1111575.
-// Disabled on debug build: https://crbug.com/1111686.
-#if defined(MEMORY_SANITIZER) || !defined(NDEBUG)
-#define MAYBE_LearnModeHardwareKeys DISABLED_LearnModeHardwareKeys
-#else
-#define MAYBE_LearnModeHardwareKeys LearnModeHardwareKeys
-#endif
-IN_PROC_BROWSER_TEST_F(LoggedInSpokenFeedbackTest,
-                       MAYBE_LearnModeHardwareKeys) {
+IN_PROC_BROWSER_TEST_F(LoggedInSpokenFeedbackTest, LearnModeHardwareKeys) {
   EnableChromeVox();
   sm_.Call([this]() {
     extensions::browsertest_util::ExecuteScriptInBackgroundPageNoWait(
@@ -247,6 +238,9 @@
         "CommandHandler.onCommand('showKbExplorerPage');");
   });
   sm_.ExpectSpeech("ChromeVox Learn Mode");
+  sm_.ExpectSpeech(
+      "Press a qwerty key, refreshable braille key, or touch gesture to learn "
+      "its function. Press control with w or escape to exit.");
 
   // These are the default top row keys and their descriptions which live in
   // ChromeVox.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
index 35f6958..10023a3 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
@@ -123,12 +123,14 @@
   bool is_hidden = false;
   const std::string app_service_id = AppServiceIdFromAppId(app_id, profile_);
 
-  GetAppCache().ForEachApp([&is_hidden](const apps::AppUpdate& update) {
-    if (update.Readiness() == apps::mojom::Readiness::kUninstalledByUser)
-      return;
+  GetAppCache().ForOneApp(
+      app_service_id, [&is_hidden](const apps::AppUpdate& update) {
+        if (update.Readiness() == apps::mojom::Readiness::kUninstalledByUser)
+          return;
 
-    is_hidden = update.ShowInLauncher() == apps::mojom::OptionalBool::kFalse;
-  });
+        is_hidden =
+            update.ShowInLauncher() == apps::mojom::OptionalBool::kFalse;
+      });
 
   return is_hidden;
 }
diff --git a/chrome/browser/chromeos/crosapi/browser_manager.cc b/chrome/browser/chromeos/crosapi/browser_manager.cc
index ed64f8eb..4216491 100644
--- a/chrome/browser/chromeos/crosapi/browser_manager.cc
+++ b/chrome/browser/chromeos/crosapi/browser_manager.cc
@@ -23,6 +23,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/system/sys_info.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -96,6 +97,39 @@
       browser_util::kLaunchOnLoginPref);
 }
 
+// Checks that the stateful parition is executable. Returns true if it is.
+// Otherwise presents a warning dialog for the developer.
+bool VerifyStatefulPartitionIsExecutable() {
+  struct statvfs buf;
+  {
+    base::ScopedBlockingCall scoped_blocking_call(
+        FROM_HERE, base::BlockingType::MAY_BLOCK);
+    if (statvfs("/mnt/stateful_partition", &buf) < 0) {
+      PLOG(ERROR) << "statvfs() failed";
+      return false;
+    }
+  }
+  const bool is_executable = !(buf.f_flag & ST_NOEXEC);
+  if (is_executable)
+    return true;
+
+  message_center::MessageCenter* message_center =
+      message_center::MessageCenter::Get();
+  std::string notification_id = "stateful_noexec";
+  message_center->AddNotification(ash::CreateSystemNotification(
+      message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
+      base::ASCIIToUTF16("Cannot launch lacros-chrome"),
+      base::ASCIIToUTF16("/mnt/stateful_partition is marked as noexec."),
+      base::string16(),  // display_source
+      GURL(),
+      message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
+                                 notification_id),
+      message_center::RichNotificationData(),
+      /*delegate=*/nullptr, gfx::VectorIcon(),
+      message_center::SystemNotificationWarningLevel::NORMAL));
+  return false;
+}
+
 }  // namespace
 
 // static
@@ -222,31 +256,9 @@
     // common case where the device has been restarted and the partition is no
     // longer executable. We cannot simply check the return value of
     // base::LaunchProcess as that actually returns success.
-    struct statvfs buf;
-    {
-      base::ScopedBlockingCall scoped_blocking_call(
-          FROM_HERE, base::BlockingType::MAY_BLOCK);
-      if (statvfs("/mnt/stateful_partition", &buf) < 0) {
-        PLOG(ERROR) << "statvfs() failed";
-        return false;
-      }
-    }
-    const bool exec = !(buf.f_flag & ST_NOEXEC);
-    if (!exec) {
-      message_center::MessageCenter* message_center =
-          message_center::MessageCenter::Get();
-      std::string notification_id = "stateful_noexec";
-      message_center->AddNotification(ash::CreateSystemNotification(
-          message_center::NOTIFICATION_TYPE_SIMPLE, notification_id,
-          base::ASCIIToUTF16("Cannot launch lacros-chrome"),
-          base::ASCIIToUTF16("/mnt/stateful_partition is marked as noexec."),
-          base::string16(),  // display_source
-          GURL(),
-          message_center::NotifierId(
-              message_center::NotifierType::SYSTEM_COMPONENT, notification_id),
-          message_center::RichNotificationData(),
-          /*delegate=*/nullptr, gfx::VectorIcon(),
-          message_center::SystemNotificationWarningLevel::NORMAL));
+    if (base::SysInfo::IsRunningOnChromeOS() &&
+        !VerifyStatefulPartitionIsExecutable()) {
+      return false;
     }
   }
 
diff --git a/chrome/browser/chromeos/extensions/autotest_private/DEPS b/chrome/browser/chromeos/extensions/autotest_private/DEPS
index c1f2a976..26facd38 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/DEPS
+++ b/chrome/browser/chromeos/extensions/autotest_private/DEPS
@@ -11,6 +11,7 @@
     "+ui/message_center",
   ],
   "autotest_private_api\.h": [
+    "+ash/display/screen_orientation_controller.h",
     "+ash/rotator/screen_rotation_animator_observer.h",
   ]
 }
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 22bc8c1..4b684d9 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -552,6 +552,7 @@
       return display::Display::ROTATE_180;
     case api::autotest_private::RotationType::ROTATION_TYPE_ROTATE270:
       return display::Display::ROTATE_270;
+    case api::autotest_private::RotationType::ROTATION_TYPE_ROTATEANY:
     case api::autotest_private::RotationType::ROTATION_TYPE_NONE:
       break;
   }
@@ -3308,32 +3309,40 @@
   std::unique_ptr<api::autotest_private::WaitForDisplayRotation::Params> params(
       api::autotest_private::WaitForDisplayRotation::Params::Create(*args_));
   EXTENSION_FUNCTION_VALIDATE(params);
-  target_rotation_ = ToRotation(params->rotation);
-
   if (!base::StringToInt64(params->display_id, &display_id_)) {
     return RespondNow(Error(base::StrCat(
         {"Invalid display_id; expected string with numbers only, got ",
          params->display_id})));
   }
-  auto* root_window = ash::Shell::GetRootWindowForDisplayId(display_id_);
-  if (!root_window) {
-    return RespondNow(Error(base::StrCat(
-        {"Invalid display_id; no root window found for the display id ",
-         params->display_id})));
-  }
-  auto* animator = ash::ScreenRotationAnimator::GetForRootWindow(root_window);
-  if (!animator->IsRotating()) {
-    display::Display display;
-    display::Screen::GetScreen()->GetDisplayWithDisplayId(display_id_,
-                                                          &display);
-    // This should never fail.
-    DCHECK(display.is_valid());
-    return RespondNow(OneArgument(
-        std::make_unique<base::Value>(display.rotation() == target_rotation_)));
-  }
-  self_ = this;
 
-  animator->AddObserver(this);
+  if (params->rotation ==
+      api::autotest_private::RotationType::ROTATION_TYPE_ROTATEANY) {
+    display::Display display;
+    if (!display::Screen::GetScreen()->GetDisplayWithDisplayId(display_id_,
+                                                               &display)) {
+      return RespondNow(Error(base::StrCat(
+          {"Display is not found for display_id ", params->display_id})));
+    }
+    DCHECK(display.is_valid());
+    if (!display.IsInternal()) {
+      return RespondNow(
+          Error("RotateAny is valid only for the internal display"));
+    }
+    auto* screen_orientation_controller =
+        ash::Shell::Get()->screen_orientation_controller();
+    if (screen_orientation_controller->user_rotation_locked()) {
+      self_ = this;
+      screen_orientation_controller->AddObserver(this);
+      return RespondLater();
+    }
+    target_rotation_.reset();
+  } else {
+    target_rotation_ = ToRotation(params->rotation);
+  }
+
+  auto result = CheckScreenRotationAnimation();
+  if (result)
+    return RespondNow(std::move(result));
   return RespondLater();
 }
 
@@ -3348,10 +3357,51 @@
   display::Display display;
   display::Screen::GetScreen()->GetDisplayWithDisplayId(display_id_, &display);
   Respond(OneArgument(std::make_unique<base::Value>(
-      display.is_valid() && display.rotation() == target_rotation_)));
+      display.is_valid() && (!target_rotation_.has_value() ||
+                             display.rotation() == *target_rotation_))));
   self_.reset();
 }
 
+void AutotestPrivateWaitForDisplayRotationFunction::
+    OnUserRotationLockChanged() {
+  auto* screen_orientation_controller =
+      ash::Shell::Get()->screen_orientation_controller();
+  if (screen_orientation_controller->user_rotation_locked())
+    return;
+  screen_orientation_controller->RemoveObserver(this);
+  self_.reset();
+  target_rotation_.reset();
+  auto result = CheckScreenRotationAnimation();
+  // Wait for the rotation if unlocking causes rotation.
+  if (result)
+    Respond(std::move(result));
+}
+
+ExtensionFunction::ResponseValue
+AutotestPrivateWaitForDisplayRotationFunction::CheckScreenRotationAnimation() {
+  auto* root_window = ash::Shell::GetRootWindowForDisplayId(display_id_);
+  if (!root_window) {
+    return Error(base::StringPrintf(
+        "Invalid display_id; no root window found for the display id %" PRId64,
+        display_id_));
+  }
+  auto* animator = ash::ScreenRotationAnimator::GetForRootWindow(root_window);
+  if (!animator->IsRotating()) {
+    display::Display display;
+    display::Screen::GetScreen()->GetDisplayWithDisplayId(display_id_,
+                                                          &display);
+    // This should never fail.
+    DCHECK(display.is_valid());
+    return OneArgument(
+        std::make_unique<base::Value>(!target_rotation_.has_value() ||
+                                      display.rotation() == *target_rotation_));
+  }
+  self_ = this;
+
+  animator->AddObserver(this);
+  return nullptr;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // AutotestPrivateGetAppWindowListFunction
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
index 498d2b71..4e1a936 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include "ash/display/screen_orientation_controller.h"
 #include "ash/public/cpp/assistant/assistant_state.h"
 #include "ash/public/cpp/window_state_type.h"
 #include "ash/rotator/screen_rotation_animator_observer.h"
@@ -912,22 +913,29 @@
 
 class AutotestPrivateWaitForDisplayRotationFunction
     : public ExtensionFunction,
-      public ash::ScreenRotationAnimatorObserver {
+      public ash::ScreenRotationAnimatorObserver,
+      public ash::ScreenOrientationController::Observer {
  public:
   AutotestPrivateWaitForDisplayRotationFunction();
   DECLARE_EXTENSION_FUNCTION("autotestPrivate.waitForDisplayRotation",
                              AUTOTESTPRIVATE_WAITFORDISPLAYROTATION)
 
+  // ash::ScreenRotationAnimatorObserver:
   void OnScreenCopiedBeforeRotation() override;
   void OnScreenRotationAnimationFinished(ash::ScreenRotationAnimator* animator,
                                          bool canceled) override;
 
+  // ash::ScreenOrientationController::Observer:
+  void OnUserRotationLockChanged() override;
+
  private:
   ~AutotestPrivateWaitForDisplayRotationFunction() override;
   ResponseAction Run() override;
 
+  ResponseValue CheckScreenRotationAnimation();
+
   int64_t display_id_ = display::kInvalidDisplayId;
-  display::Display::Rotation target_rotation_ = display::Display::ROTATE_0;
+  base::Optional<display::Display::Rotation> target_rotation_;
   // A reference to keep the instance alive while waiting for rotation.
   scoped_refptr<ExtensionFunction> self_;
 };
diff --git a/chrome/browser/chromeos/note_taking_helper.cc b/chrome/browser/chromeos/note_taking_helper.cc
index 62461d4..0cadebf61 100644
--- a/chrome/browser/chromeos/note_taking_helper.cc
+++ b/chrome/browser/chromeos/note_taking_helper.cc
@@ -92,7 +92,7 @@
 
 // Gets the set of apps (more specifically, their app IDs) that are allowed to
 // be launched on the lock screen, if the feature is whitelisted using
-// |prefs::kNoteTakingAppsLockScreenWhitelist| preference. If the pref is not
+// |prefs::kNoteTakingAppsLockScreenAllowlist| preference. If the pref is not
 // set, this method will return null (in which case the white-list should not be
 // checked).
 // Note that |prefs::kNoteTakingrAppsAllowedOnLockScreen| is currently only
@@ -100,7 +100,7 @@
 std::unique_ptr<std::set<std::string>> GetAllowedLockScreenApps(
     PrefService* prefs) {
   const PrefService::Preference* allowed_lock_screen_apps_pref =
-      prefs->FindPreference(prefs::kNoteTakingAppsLockScreenWhitelist);
+      prefs->FindPreference(prefs::kNoteTakingAppsLockScreenAllowlist);
   if (!allowed_lock_screen_apps_pref ||
       allowed_lock_screen_apps_pref->IsDefaultValue()) {
     return nullptr;
@@ -355,7 +355,7 @@
 
   pref_change_registrar_.Init(profile->GetPrefs());
   pref_change_registrar_.Add(
-      prefs::kNoteTakingAppsLockScreenWhitelist,
+      prefs::kNoteTakingAppsLockScreenAllowlist,
       base::Bind(&NoteTakingHelper::OnAllowedNoteTakingAppsChanged,
                  base::Unretained(this)));
   OnAllowedNoteTakingAppsChanged();
diff --git a/chrome/browser/chromeos/note_taking_helper.h b/chrome/browser/chromeos/note_taking_helper.h
index 3d3dba2..ff70f3cd 100644
--- a/chrome/browser/chromeos/note_taking_helper.h
+++ b/chrome/browser/chromeos/note_taking_helper.h
@@ -262,7 +262,7 @@
       Profile* profile,
       const extensions::Extension* app);
 
-  // Called when kNoteTakingAppsLockScreenWhitelist pref changes for
+  // Called when kNoteTakingAppsLockScreenAllowlist pref changes for
   // |profile_with_enabled_lock_screen_apps_|.
   void OnAllowedNoteTakingAppsChanged();
 
@@ -313,7 +313,7 @@
   // and when |lock_screen_whitelist_state_| equals kAppsWhitelisted.
   std::set<std::string> lock_screen_apps_allowed_by_policy_;
 
-  // Tracks kNoteTakingAppsLockScreenWhitelist pref for the profile for which
+  // Tracks kNoteTakingAppsLockScreenAllowlist pref for the profile for which
   // lock screen apps are enabled.
   PrefChangeRegistrar pref_change_registrar_;
 
diff --git a/chrome/browser/chromeos/note_taking_helper_unittest.cc b/chrome/browser/chromeos/note_taking_helper_unittest.cc
index e473db6..0aa56d7 100644
--- a/chrome/browser/chromeos/note_taking_helper_unittest.cc
+++ b/chrome/browser/chromeos/note_taking_helper_unittest.cc
@@ -700,7 +700,7 @@
                    NoteTakingLockScreenSupport::kNotSupported}}));
 }
 
-// Verify that non-whitelisted apps cannot be enabled on lock screen.
+// Verify that non-allowlisted apps cannot be enabled on lock screen.
 TEST_F(NoteTakingHelperTest, CustomLockScreenEnabledApps) {
   Init(ENABLE_PALETTE);
 
@@ -715,7 +715,7 @@
                    NoteTakingLockScreenSupport::kNotSupported}}));
 }
 
-TEST_F(NoteTakingHelperTest, WhitelistedAndCustomAppsShowOnlyOnce) {
+TEST_F(NoteTakingHelperTest, AllowlistedAndCustomAppsShowOnlyOnce) {
   Init(ENABLE_PALETTE);
 
   scoped_refptr<const extensions::Extension> extension = CreateExtension(
@@ -1083,7 +1083,7 @@
   UninstallExtension(keep_extension.get(), profile());
   EXPECT_EQ(2, observer.num_updates());
 
-  // Non-whitelisted apps shouldn't trigger notifications.
+  // Non-allowlisted apps shouldn't trigger notifications.
   scoped_refptr<const extensions::Extension> other_extension =
       CreateExtension(crx_file::id_util::GenerateId("a"), "Some Other App");
   InstallExtension(other_extension.get(), profile());
@@ -1257,9 +1257,9 @@
                   {kUnsupportedAppName, kUnsupportedAppId, false /*preferred*/,
                    NoteTakingLockScreenSupport::kNotSupported}}));
 
-  // Whitelist prod app by policy.
+  // Allowlist prod app by policy.
   profile_prefs_->SetManagedPref(
-      prefs::kNoteTakingAppsLockScreenWhitelist,
+      prefs::kNoteTakingAppsLockScreenAllowlist,
       extensions::ListBuilder().Append(prod_app->id()).Build());
 
   // The preferred app's status hasn't changed, so the observers can remain
@@ -1275,9 +1275,9 @@
        {kUnsupportedAppName, kUnsupportedAppId, false /*preferred*/,
         NoteTakingLockScreenSupport::kNotSupported}}));
 
-  // Change whitelist so only dev app is whitelisted.
+  // Change allowlist so only dev app is allowlisted.
   profile_prefs_->SetManagedPref(
-      prefs::kNoteTakingAppsLockScreenWhitelist,
+      prefs::kNoteTakingAppsLockScreenAllowlist,
       extensions::ListBuilder().Append(dev_app->id()).Build());
 
   // The preferred app status changed, so observers are expected to be notified.
@@ -1304,9 +1304,9 @@
   EXPECT_EQ(std::vector<Profile*>{profile()}, observer.preferred_app_updates());
   observer.clear_preferred_app_updates();
 
-  // Policy with an empty whitelist - this should disallow all apps from the
+  // Policy with an empty allowlist - this should disallow all apps from the
   // lock screen.
-  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist,
+  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist,
                                  std::make_unique<base::ListValue>());
 
   // Preferred app changed notification is not expected if the preferred app is
@@ -1326,13 +1326,13 @@
   UninstallExtension(prod_app.get(), profile());
   UninstallExtension(unsupported_app.get(), profile());
 
-  profile_prefs_->RemoveManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist);
+  profile_prefs_->RemoveManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist);
   // No preferred app installed, so no update notification.
   EXPECT_TRUE(observer.preferred_app_updates().empty());
 }
 
 TEST_F(NoteTakingHelperTest,
-       UpdateLockScreenSupportStatusWhenWhitelistPolicyRemoved) {
+       UpdateLockScreenSupportStatusWhenAllowlistPolicyRemoved) {
   Init(ENABLE_PALETTE);
   TestObserver observer;
 
@@ -1347,9 +1347,9 @@
       {{kDevKeepAppName, NoteTakingHelper::kDevKeepExtensionId,
         true /*preferred*/, NoteTakingLockScreenSupport::kEnabled}}));
 
-  // Policy with an empty whitelist - this should disallow test app from running
+  // Policy with an empty allowlist - this should disallow test app from running
   // on lock screen.
-  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist,
+  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist,
                                  std::make_unique<base::ListValue>());
 
   // Preferred app settings changed - observers should be notified.
@@ -1362,9 +1362,9 @@
                    true /*preferred*/,
                    NoteTakingLockScreenSupport::kNotAllowedByPolicy}}));
 
-  // Remove the whitelist policy - the preferred app should become enabled on
+  // Remove the allowlist policy - the preferred app should become enabled on
   // lock screen again.
-  profile_prefs_->RemoveManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist);
+  profile_prefs_->RemoveManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist);
 
   EXPECT_EQ(std::vector<Profile*>{profile()}, observer.preferred_app_updates());
   observer.clear_preferred_app_updates();
@@ -1384,10 +1384,10 @@
       CreateAndInstallLockScreenApp(NoteTakingHelper::kDevKeepExtensionId,
                                     kDevKeepAppName, profile());
 
-  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist,
+  profile_prefs_->SetManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist,
                                  std::make_unique<base::ListValue>());
   // Verify that observers are not notified of preferred app change if preferred
-  // app is not set when whitelist policy changes.
+  // app is not set when allowlist policy changes.
   EXPECT_TRUE(observer.preferred_app_updates().empty());
 
   // Set test app as preferred note taking app.
@@ -1398,7 +1398,7 @@
   // Changing policy before the app's lock screen availability has been reported
   // to NoteTakingHelper clients is not expected to fire observers.
   profile_prefs_->SetManagedPref(
-      prefs::kNoteTakingAppsLockScreenWhitelist,
+      prefs::kNoteTakingAppsLockScreenAllowlist,
       extensions::ListBuilder().Append(app->id()).Build());
   EXPECT_TRUE(observer.preferred_app_updates().empty());
 
@@ -1452,8 +1452,8 @@
   // Enabling an app on lock screen in secondary profile should fail.
   EXPECT_FALSE(helper()->SetPreferredAppEnabledOnLockScreen(profile(), true));
 
-  // Policy with an empty whitelist.
-  profile_prefs->SetManagedPref(prefs::kNoteTakingAppsLockScreenWhitelist,
+  // Policy with an empty allowlist.
+  profile_prefs->SetManagedPref(prefs::kNoteTakingAppsLockScreenAllowlist,
                                 std::make_unique<base::ListValue>());
 
   // Changing policy should not notify observers in secondary profile.
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index 14b3d15..56847ce 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -345,7 +345,7 @@
   registry->RegisterStringPref(::prefs::kNoteTakingAppId, std::string());
   registry->RegisterBooleanPref(::prefs::kNoteTakingAppEnabledOnLockScreen,
                                 true);
-  registry->RegisterListPref(::prefs::kNoteTakingAppsLockScreenWhitelist);
+  registry->RegisterListPref(::prefs::kNoteTakingAppsLockScreenAllowlist);
   registry->RegisterBooleanPref(::prefs::kRestoreLastLockScreenNote, true);
   registry->RegisterDictionaryPref(
       ::prefs::kNoteTakingAppsLockScreenToastShown);
diff --git a/chrome/browser/chromeos/printing/print_servers_provider.cc b/chrome/browser/chromeos/printing/print_servers_provider.cc
index 6b74a483..658e03d 100644
--- a/chrome/browser/chromeos/printing/print_servers_provider.cc
+++ b/chrome/browser/chromeos/printing/print_servers_provider.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/chromeos/printing/print_servers_provider.h"
 
 #include <memory>
-#include <set>
 #include <vector>
 
 #include "base/json/json_reader.h"
@@ -156,17 +155,19 @@
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   }
 
-  void SetProfile(Profile* profile) override {
+  void SetAllowlistPref(PrefService* prefs,
+                        const std::string& allowlist_pref) override {
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-    if (profile_ != nullptr) {
+    if (prefs_ != nullptr && !allowlist_pref_.empty()) {
       // Some unit tests may create more than one profile with the same user.
       return;
     }
-    profile_ = profile;
-    pref_change_registrar_.Init(profile->GetPrefs());
+    prefs_ = prefs;
+    allowlist_pref_ = allowlist_pref;
+    pref_change_registrar_.Init(prefs);
     // Bind UpdateAllowlist() method and call it once.
     pref_change_registrar_.Add(
-        prefs::kExternalPrintServersAllowlist,
+        allowlist_pref_,
         base::BindRepeating(&PrintServersProviderImpl::UpdateAllowlist,
                             base::Unretained(this)));
     UpdateAllowlist();
@@ -222,28 +223,23 @@
     // The case when there is at least one unfinished task.
     if (last_processed_task_ != last_received_task_)
       return false;
-    // The case when a profile is not set.
-    if (profile_ == nullptr)
+    // The case when prefs are not set.
+    if (prefs_ == nullptr)
       return false;
     return true;
   }
 
   // Called when a new allowlist is available.
   void UpdateAllowlist() {
-    whitelist_.clear();
-    whitelist_is_set_ = false;
-    // Fetch and parse the whitelist.
-    const PrefService::Preference* pref = profile_->GetPrefs()->FindPreference(
-        prefs::kExternalPrintServersAllowlist);
+    allowlist_ = base::nullopt;
+    // Fetch and parse the allowlist.
+    const PrefService::Preference* pref =
+        prefs_->FindPreference(allowlist_pref_);
     if (pref != nullptr && !pref->IsDefaultValue()) {
-      const base::ListValue* list =
-          profile_->GetPrefs()->GetList(prefs::kExternalPrintServersAllowlist);
-      if (list != nullptr) {
-        whitelist_is_set_ = true;
-        for (const base::Value& value : *list) {
-          if (value.is_string()) {
-            whitelist_.insert(value.GetString());
-          }
+      allowlist_ = std::set<std::string>();
+      for (const base::Value& value : pref->GetValue()->GetList()) {
+        if (value.is_string()) {
+          allowlist_.value().insert(value.GetString());
         }
       }
     }
@@ -260,15 +256,15 @@
   // list is different than the previous one.
   bool CalculateResultantList() {
     std::vector<PrintServer> new_servers;
-    if (profile_ == nullptr) {
-      // |result_servers_| remains empty when profile is not set.
+    if (prefs_ == nullptr) {
+      // |result_servers_| remains empty when prefs is not set.
       return false;
     }
-    if (!whitelist_is_set_) {
+    if (!allowlist_.has_value()) {
       new_servers = servers_;
     } else {
       for (auto& print_server : servers_) {
-        if (whitelist_.count(print_server.GetId())) {
+        if (allowlist_.value().count(print_server.GetId())) {
           if (new_servers.size() == kMaxRecords) {
             LOG(WARNING) << "The list of resultant print servers read from "
                          << "policies is too long. Only the first "
@@ -320,14 +316,15 @@
   int last_processed_task_ = 0;
   // The current input list of servers.
   std::vector<PrintServer> servers_;
-  // The current whitelist.
-  bool whitelist_is_set_ = false;
-  std::set<std::string> whitelist_;
+  // The current allowlist.
+  base::Optional<std::set<std::string>> allowlist_ = base::nullopt;
   // The current resultant list of servers.
   std::vector<PrintServer> result_servers_;
 
-  Profile* profile_ = nullptr;
+  PrefService* prefs_ = nullptr;
   PrefChangeRegistrar pref_change_registrar_;
+  std::string allowlist_pref_;
+
   base::ObserverList<PrintServersProvider::Observer>::Unchecked observers_;
   base::WeakPtrFactory<PrintServersProviderImpl> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/chromeos/printing/print_servers_provider.h b/chrome/browser/chromeos/printing/print_servers_provider.h
index 4ccb6bb..a90438c 100644
--- a/chrome/browser/chromeos/printing/print_servers_provider.h
+++ b/chrome/browser/chromeos/printing/print_servers_provider.h
@@ -6,13 +6,14 @@
 #define CHROME_BROWSER_CHROMEOS_PRINTING_PRINT_SERVERS_PROVIDER_H_
 
 #include <memory>
+#include <set>
 #include <vector>
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/chromeos/printing/print_server.h"
 
-class Profile;
+class PrefService;
 
 namespace user_prefs {
 class PrefRegistrySyncable;
@@ -45,9 +46,9 @@
   static std::unique_ptr<PrintServersProvider> Create();
   virtual ~PrintServersProvider() = default;
 
-  // This method set profile to fetch non-external policies. It is needed to
-  // calculate resultant list of servers.
-  virtual void SetProfile(Profile* profile) = 0;
+  // This method sets the allowlist to calculate resultant list of servers.
+  virtual void SetAllowlistPref(PrefService* prefs,
+                                const std::string& allowlist_pref) = 0;
 
   // This method also calls directly OnServersChanged(...) from |observer|.
   virtual void AddObserver(Observer* observer) = 0;
diff --git a/chrome/browser/chromeos/printing/print_servers_provider_unittest.cc b/chrome/browser/chromeos/printing/print_servers_provider_unittest.cc
index 9237ad4..3bf2604 100644
--- a/chrome/browser/chromeos/printing/print_servers_provider_unittest.cc
+++ b/chrome/browser/chromeos/printing/print_servers_provider_unittest.cc
@@ -9,7 +9,6 @@
 
 #include "chrome/browser/chromeos/printing/print_server.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_profile.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -36,9 +35,11 @@
   }
 ])json";
 
-// An example whitelist.
-const std::vector<std::string> kPrintServersPolicyWhitelist1 = {"id3", "idX",
+// An example allowlist.
+const std::vector<std::string> kPrintServersPolicyAllowlist1 = {"id3", "idX",
                                                                 "id1"};
+// Test pref name for allowlist.
+std::string allowlist_pref_name_ = "test";
 // A different configuration file with print servers.
 constexpr char kPrintServersPolicyJson2[] = R"json(
 [
@@ -105,8 +106,8 @@
   return std::vector<PrintServer>({Server1(), Server2(), Server3()});
 }
 
-// Corresponding vector filtered with the whitelist defined above.
-std::vector<PrintServer> PrintServersPolicyData1Whitelist1() {
+// Corresponding vector filtered with the allowlist defined above.
+std::vector<PrintServer> PrintServersPolicyData1Allowlist1() {
   return std::vector<PrintServer>({Server1(), Server3()});
 }
 
@@ -164,10 +165,15 @@
       : external_servers_(PrintServersProvider::Create()) {}
 
  protected:
+  void SetUp() override {
+    pref_service_.registry()->RegisterListPref(allowlist_pref_name_);
+    external_servers_->SetAllowlistPref(&pref_service_, allowlist_pref_name_);
+  }
+
   // Everything must be called on Chrome_UIThread.
   content::BrowserTaskEnvironment task_environment_;
-  // User profile.
-  TestingProfile profile_;
+  // Test prefs.
+  sync_preferences::TestingPrefServiceSyncable pref_service_;
   // Tested object.
   std::unique_ptr<PrintServersProvider> external_servers_;
 };
@@ -189,7 +195,6 @@
 // After initialization "complete" flags = false.
 TEST_F(PrintServersProviderTest, InitialConditions) {
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   ASSERT_EQ(obs.GetCalls().size(), 1u);
   EXPECT_EQ(obs.GetCalls().back().complete, false);
@@ -201,7 +206,6 @@
 // ClearData() sets empty list and "complete" flag = true.
 TEST_F(PrintServersProviderTest, ClearData2) {
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->ClearData();
   ASSERT_EQ(obs.GetCalls().size(), 2u);
@@ -219,7 +223,6 @@
 TEST_F(PrintServersProviderTest, SetData) {
   auto blob1 = std::make_unique<std::string>(kPrintServersPolicyJson1);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->SetData(std::move(blob1));
   // single call from AddObserver, since SetData(...) is not processed yet
@@ -238,7 +241,6 @@
   auto blob1 = std::make_unique<std::string>(kPrintServersPolicyJson1);
   auto blob2 = std::make_unique<std::string>(kPrintServersPolicyJson2);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->SetData(std::move(blob1));
   // single call from AddObserver, since SetData(...) is not processed yet
@@ -260,7 +262,6 @@
 TEST_F(PrintServersProviderTest, SetDataClearData) {
   auto blob1 = std::make_unique<std::string>(kPrintServersPolicyJson1);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->SetData(std::move(blob1));
   // single call from AddObserver, since SetData(...) is not processed yet
@@ -281,7 +282,6 @@
 TEST_F(PrintServersProviderTest, ClearDataSetData) {
   auto blob1 = std::make_unique<std::string>(kPrintServersPolicyJson1);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->ClearData();
   external_servers_->AddObserver(&obs);
   // single call from AddObserver, but with effects of ClearData()
@@ -307,7 +307,6 @@
 TEST_F(PrintServersProviderTest, InvalidURLs) {
   auto blob3 = std::make_unique<std::string>(kPrintServersPolicyJson3);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->SetData(std::move(blob3));
   task_environment_.RunUntilIdle();
@@ -317,34 +316,30 @@
   external_servers_->RemoveObserver(&obs);
 }
 
-// Verify that whitelist works as expected.
-TEST_F(PrintServersProviderTest, Whitelist) {
+// Verify that allowlist works as expected.
+TEST_F(PrintServersProviderTest, Allowlist) {
   // The sequence from SetData test.
   auto blob1 = std::make_unique<std::string>(kPrintServersPolicyJson1);
   TestObserver obs;
-  external_servers_->SetProfile(&profile_);
   external_servers_->AddObserver(&obs);
   external_servers_->SetData(std::move(blob1));
-  // Apply an empty whitelist on the top.
-  auto* prefs = profile_.GetTestingPrefService();
+  // Apply an empty allowlist on the top.
   auto value = std::make_unique<base::ListValue>();
-  prefs->SetManagedPref(prefs::kExternalPrintServersAllowlist,
-                        std::move(value));
+  pref_service_.SetManagedPref(allowlist_pref_name_, std::move(value));
   // Check the resultant list - is is supposed to be empty.
   task_environment_.RunUntilIdle();
   ASSERT_FALSE(obs.GetCalls().empty());
   EXPECT_TRUE(obs.GetCalls().back().complete);
   EXPECT_TRUE(obs.GetCalls().back().servers.empty());
-  // Apply whitelist1.
+  // Apply allowlist1.
   value = std::make_unique<base::ListValue>();
-  for (const std::string& id : kPrintServersPolicyWhitelist1)
+  for (const std::string& id : kPrintServersPolicyAllowlist1)
     value->Append(base::Value(id));
-  prefs->SetManagedPref(prefs::kExternalPrintServersAllowlist,
-                        std::move(value));
+  pref_service_.SetManagedPref(allowlist_pref_name_, std::move(value));
   // Check the resultant list.
   task_environment_.RunUntilIdle();
   EXPECT_TRUE(obs.GetCalls().back().complete);
-  EXPECT_EQ(obs.GetCalls().back().servers, PrintServersPolicyData1Whitelist1());
+  EXPECT_EQ(obs.GetCalls().back().servers, PrintServersPolicyData1Allowlist1());
   // The end.
   external_servers_->RemoveObserver(&obs);
 }
diff --git a/chrome/browser/chromeos/printing/server_printers_provider.cc b/chrome/browser/chromeos/printing/server_printers_provider.cc
index 7cf270f..03b0e34 100644
--- a/chrome/browser/chromeos/printing/server_printers_provider.cc
+++ b/chrome/browser/chromeos/printing/server_printers_provider.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/chromeos/printing/print_servers_provider_factory.h"
 #include "chrome/browser/chromeos/printing/server_printers_fetcher.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
 #include "components/device_event_log/device_event_log.h"
 #include "url/gurl.h"
 
@@ -43,7 +44,8 @@
       : servers_provider_(
             PrintServersProviderFactory::Get()->GetForProfile(profile)) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    servers_provider_->SetProfile(profile);
+    servers_provider_->SetAllowlistPref(profile->GetPrefs(),
+                                        prefs::kExternalPrintServersAllowlist);
     servers_provider_->AddObserver(this);
   }
 
diff --git a/chrome/browser/data_saver/lite_video_browsertest.cc b/chrome/browser/data_saver/lite_video_browsertest.cc
index 9e5eabf..3dece8ee 100644
--- a/chrome/browser/data_saver/lite_video_browsertest.cc
+++ b/chrome/browser/data_saver/lite_video_browsertest.cc
@@ -95,7 +95,8 @@
 
   void TestMSEPlayback(const std::string& media_file,
                        const std::string& segment_duration,
-                       const std::string& segment_fetch_delay_before_end) {
+                       const std::string& segment_fetch_delay_before_end,
+                       bool has_subframe_video) {
     base::StringPairs query_params;
     std::string media_files = media_file;
     // Add few media segments, separated by ';'
@@ -109,8 +110,9 @@
     query_params.emplace_back("MSESegmentDurationMS", segment_duration);
     query_params.emplace_back("MSESegmentFetchDelayBeforeEndMS",
                               segment_fetch_delay_before_end);
-    RunMediaTestPage("mse_player.html", query_params,
-                     base::ASCIIToUTF16(media::kEnded));
+    RunMediaTestPage(
+        has_subframe_video ? "multi_frame_mse_player.html" : "mse_player.html",
+        query_params, base::ASCIIToUTF16(media::kEnded));
   }
 
   // Runs a html page with a list of URL query parameters.
@@ -121,7 +123,6 @@
     std::string query = media::GetURLQueryString(query_params);
     content::TitleWatcher title_watcher(
         browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
-
     EXPECT_TRUE(ui_test_utils::NavigateToURL(
         browser(), http_server_.GetURL("/" + html_page + "?" + query)));
     EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
@@ -137,17 +138,29 @@
 
   DISALLOW_COPY_AND_ASSIGN(LiteVideoBrowserTest);
 };
+// Fails occasionally on ChromeOS, MacOS, Win. http://crbug.com/1111570
+// Need to make tests more reliable but feature only targeted
+// for Android. Currently there are potential race conditions
+// on throttle timing and counts
+#if defined(OS_WIN) || defined(OS_MAC) || defined(OS_CHROMEOS)
+#define DISABLE_ON_WIN_MAC_CHROMEOS(x) DISABLED_##x
+#else
+#define DISABLE_ON_WIN_MAC_CHROMEOS(x) x
+#endif
 
-IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest, SimplePlayback) {
-  TestMSEPlayback("bear-vp9.webm", "2000", "2000");
+IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest,
+                       DISABLE_ON_WIN_MAC_CHROMEOS(SimplePlayback)) {
+  TestMSEPlayback("bear-vp9.webm", "2000", "2000", false);
 
   RetryForHistogramUntilCountReached(histogram_tester(),
                                      "Media.VideoHeight.Initial.MSE", 1);
 
   histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1);
-  histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 4);
-  histogram_tester().ExpectTotalCount(
-      "LiteVideo.HintAgent.StopThrottleDueToBufferUnderflow", 0);
+
+  // Verify that at least 1 request was throttled. There will be 5 requests
+  // made and the hint is available.
+  RetryForHistogramUntilCountReached(histogram_tester(),
+                                     "LiteVideo.URLLoader.ThrottleLatency", 1);
 }
 
 class LiteVideoWithLiteModeDisabledBrowserTest : public LiteVideoBrowserTest {
@@ -159,7 +172,7 @@
 
 IN_PROC_BROWSER_TEST_F(LiteVideoWithLiteModeDisabledBrowserTest,
                        VideoThrottleDisabled) {
-  TestMSEPlayback("bear-vp9.webm", "2000", "2000");
+  TestMSEPlayback("bear-vp9.webm", "2000", "2000", false);
 
   RetryForHistogramUntilCountReached(histogram_tester(),
                                      "Media.VideoHeight.Initial.MSE", 1);
@@ -168,6 +181,44 @@
   histogram_tester().ExpectTotalCount("LiteVideo.URLLoader.ThrottleLatency", 0);
 }
 
+IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest,
+                       MSEPlaybackStalledDueToBufferUnderflow) {
+  TestMSEPlayback("bear-vp9.webm", "2700", "500", false);
+
+  RetryForHistogramUntilCountReached(histogram_tester(),
+                                     "Media.VideoHeight.Initial.MSE", 1);
+
+  histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1);
+  // Verify some responses were throttled and some video stalls were
+  // encountered.
+  EXPECT_GE(1U, histogram_tester()
+                    .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency")
+                    .size());
+  EXPECT_GE(1U, histogram_tester()
+                    .GetAllSamples("LiteVideo.HintsAgent.StopThrottling")
+                    .size());
+}
+
+IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest,
+                       MSEPlaybackStalledDueToBufferUnderflow_WithSubframe) {
+  TestMSEPlayback("bear-vp9.webm", "2700", "500", true);
+
+  RetryForHistogramUntilCountReached(histogram_tester(),
+                                     "Media.VideoHeight.Initial.MSE", 1);
+
+  RetryForHistogramUntilCountReached(histogram_tester(),
+                                     "LiteVideo.HintAgent.HasHint", 2);
+  histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 2);
+  // Verify some responses were throttled and some video stalls were
+  // encountered.
+  EXPECT_GE(2U, histogram_tester()
+                    .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency")
+                    .size());
+  EXPECT_GE(2U, histogram_tester()
+                    .GetAllSamples("LiteVideo.HintsAgent.StopThrottling")
+                    .size());
+}
+
 class LiteVideoAndLiteModeDisabledBrowserTest : public LiteVideoBrowserTest {
  public:
   LiteVideoAndLiteModeDisabledBrowserTest()
@@ -177,7 +228,7 @@
 
 IN_PROC_BROWSER_TEST_F(LiteVideoAndLiteModeDisabledBrowserTest,
                        VideoThrottleDisabled) {
-  TestMSEPlayback("bear-vp9.webm", "2000", "2000");
+  TestMSEPlayback("bear-vp9.webm", "2000", "2000", false);
 
   RetryForHistogramUntilCountReached(histogram_tester(),
                                      "Media.VideoHeight.Initial.MSE", 1);
diff --git a/chrome/browser/data_saver/subresource_redirect_browsertest.cc b/chrome/browser/data_saver/subresource_redirect_browsertest.cc
index 3c18dc74..6c1993fb 100644
--- a/chrome/browser/data_saver/subresource_redirect_browsertest.cc
+++ b/chrome/browser/data_saver/subresource_redirect_browsertest.cc
@@ -30,7 +30,6 @@
 #include "components/optimization_guide/optimization_metadata.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/optimization_guide/proto/public_image_metadata.pb.h"
-#include "components/optimization_guide/test_hints_component_creator.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -392,9 +391,6 @@
   bool https_server_image_fail_ = false;
   bool compression_server_fail_ = false;
 
-  optimization_guide::testing::TestHintsComponentCreator
-      test_hints_component_creator_;
-
   DISALLOW_COPY_AND_ASSIGN(SubresourceRedirectBrowserTest);
 };
 
diff --git a/chrome/browser/enterprise/reporting/report_scheduler_browsertest.cc b/chrome/browser/enterprise/reporting/report_scheduler_browsertest.cc
index 64eab79..ad4c4a77 100644
--- a/chrome/browser/enterprise/reporting/report_scheduler_browsertest.cc
+++ b/chrome/browser/enterprise/reporting/report_scheduler_browsertest.cc
@@ -11,13 +11,13 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/enterprise/browser/reporting/common_pref_names.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index adb1562..522056d 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -15,6 +15,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
@@ -63,6 +64,7 @@
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/api_test_utils.h"
 #include "extensions/common/extension_builder.h"
+#include "extensions/common/extension_features.h"
 #include "google_apis/gaia/oauth2_mint_token_flow.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -153,16 +155,19 @@
     return function->GetError();
   }
 
-  base::Value* WaitForSingleResult(ExtensionFunction* function) {
+  void WaitForTwoResults(ExtensionFunction* function,
+                         base::Value* first_result,
+                         base::Value* second_result) {
     RunMessageLoopUntilResponse();
     EXPECT_TRUE(function->GetError().empty())
         << "Unexpected error: " << function->GetError();
-    const base::Value* single_result = NULL;
-    if (function->GetResultList() != NULL &&
-        function->GetResultList()->Get(0, &single_result)) {
-      return single_result->DeepCopy();
-    }
-    return NULL;
+    EXPECT_NE(nullptr, function->GetResultList());
+
+    const auto& result_list = function->GetResultList()->GetList();
+    EXPECT_EQ(2ul, result_list.size());
+
+    *first_result = result_list[0].Clone();
+    *second_result = result_list[1].Clone();
   }
 
  private:
@@ -187,8 +192,11 @@
     return async_function_runner_->WaitForError(function);
   }
 
-  base::Value* WaitForSingleResult(ExtensionFunction* function) {
-    return async_function_runner_->WaitForSingleResult(function);
+  void WaitForTwoResults(ExtensionFunction* function,
+                         base::Value* first_result,
+                         base::Value* second_result) {
+    return async_function_runner_->WaitForTwoResults(function, first_result,
+                                                     second_result);
   }
 
  private:
@@ -218,9 +226,11 @@
   };
 
   TestOAuth2MintTokenFlow(ResultType result,
+                          const std::set<std::string>& granted_scopes,
                           OAuth2MintTokenFlow::Delegate* delegate)
       : OAuth2MintTokenFlow(delegate, OAuth2MintTokenFlow::Parameters()),
         result_(result),
+        granted_scopes_(granted_scopes),
         delegate_(delegate) {}
 
   void Start(scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
@@ -237,7 +247,7 @@
         break;
       }
       case MINT_TOKEN_SUCCESS: {
-        delegate_->OnMintTokenSuccess(kAccessToken, 3600);
+        delegate_->OnMintTokenSuccess(kAccessToken, granted_scopes_, 3600);
         break;
       }
       case MINT_TOKEN_FAILURE: {
@@ -262,6 +272,7 @@
 
  private:
   ResultType result_;
+  const std::set<std::string>& granted_scopes_;
   OAuth2MintTokenFlow::Delegate* delegate_;
 };
 
@@ -340,8 +351,14 @@
   }
 
   void push_mint_token_result(TestOAuth2MintTokenFlow::ResultType result_type) {
-    push_mint_token_flow(
-        std::make_unique<TestOAuth2MintTokenFlow>(result_type, this));
+    const ExtensionTokenKey* token_key = GetExtensionTokenKeyForTest();
+    push_mint_token_result(result_type, token_key->scopes);
+  }
+
+  void push_mint_token_result(TestOAuth2MintTokenFlow::ResultType result_type,
+                              const std::set<std::string>& granted_scopes) {
+    push_mint_token_flow(std::make_unique<TestOAuth2MintTokenFlow>(
+        result_type, granted_scopes, this));
   }
 
   // Sets scope UI to not complete immediately. Call
@@ -846,6 +863,18 @@
     : public IdentityTestWithSignin,
       public signin::IdentityManager::DiagnosticsObserver {
  public:
+  explicit GetAuthTokenFunctionTest() : GetAuthTokenFunctionTest(true) {}
+
+  explicit GetAuthTokenFunctionTest(bool isReturnScopesEnabled) {
+    if (isReturnScopesEnabled) {
+      feature_list_.InitAndEnableFeature(
+          extensions_features::kReturnScopesInGetAuthToken);
+    } else {
+      feature_list_.InitAndDisableFeature(
+          extensions_features::kReturnScopesInGetAuthToken);
+    }
+  }
+
   std::string IssueLoginAccessTokenForAccount(const CoreAccountId& account_id) {
     std::string access_token = "access_token-" + account_id.ToString();
     identity_test_env()
@@ -949,6 +978,62 @@
 
   base::OnceClosure on_access_token_requested_;
 
+  void RunGetAuthTokenFunction(ExtensionFunction* function,
+                               const std::string& args,
+                               Browser* browser,
+                               std::string* access_token,
+                               std::set<std::string>* granted_scopes) {
+    EXPECT_TRUE(
+        utils::RunFunction(function, args, browser, api_test_utils::NONE));
+
+    EXPECT_TRUE(function->GetError().empty())
+        << "Unexpected error: " << function->GetError();
+    EXPECT_NE(nullptr, function->GetResultList());
+
+    const auto& result_list = function->GetResultList()->GetList();
+    EXPECT_EQ(2ul, result_list.size());
+
+    const auto& access_token_value = result_list[0];
+    const auto& granted_scopes_value = result_list[1];
+    EXPECT_TRUE(access_token_value.is_string());
+    EXPECT_TRUE(granted_scopes_value.is_list());
+
+    std::set<std::string> scopes;
+    for (const auto& scope : granted_scopes_value.GetList()) {
+      EXPECT_TRUE(scope.is_string());
+      scopes.insert(scope.GetString());
+    }
+
+    *access_token = access_token_value.GetString();
+    *granted_scopes = std::move(scopes);
+  }
+
+  void WaitForGetAuthTokenResults(
+      ExtensionFunction* function,
+      std::string* access_token,
+      std::set<std::string>* granted_scopes,
+      AsyncFunctionRunner* function_runner = nullptr) {
+    base::Value access_token_value;
+    base::Value granted_scopes_value;
+    if (function_runner == nullptr) {
+      WaitForTwoResults(function, &access_token_value, &granted_scopes_value);
+    } else {
+      function_runner->WaitForTwoResults(function, &access_token_value,
+                                         &granted_scopes_value);
+    }
+    EXPECT_TRUE(access_token_value.is_string());
+    EXPECT_TRUE(granted_scopes_value.is_list());
+
+    std::set<std::string> scopes;
+    for (const auto& scope : granted_scopes_value.GetList()) {
+      EXPECT_TRUE(scope.is_string());
+      scopes.insert(scope.GetString());
+    }
+
+    *access_token = access_token_value.GetString();
+    *granted_scopes = std::move(scopes);
+  }
+
  private:
   // signin::IdentityManager::DiagnosticsObserver:
   void OnAccessTokenRequested(const CoreAccountId& account_id,
@@ -959,6 +1044,7 @@
     std::move(on_access_token_requested_).Run();
   }
 
+  base::test::ScopedFeatureList feature_list_;
   base::HistogramTester histogram_tester_;
   std::string extension_id_;
   std::set<std::string> oauth_scopes_;
@@ -1184,11 +1270,13 @@
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_extension(extension.get());
   func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(
-      utils::RunFunctionAndReturnSingleResult(func.get(), "[]", browser()));
+
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                          &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
@@ -1204,11 +1292,13 @@
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_extension(extension.get());
   func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(
-      utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
+
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                          &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
@@ -1319,11 +1409,13 @@
   func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_login_ui_result(true);
   func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"interactive\": true}]", browser()));
+
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"interactive\": true}]", browser(),
+                          &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_TRUE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1356,11 +1448,12 @@
   func->set_login_ui_result(true);
   func->push_mint_token_result(TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS);
 
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"interactive\": true}]", browser()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"interactive\": true}]", browser(),
+                          &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_TRUE(func->login_ui_shown());
   EXPECT_TRUE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1533,11 +1626,12 @@
   func->set_extension(extension.get());
   func->push_mint_token_result(TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS);
 
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"interactive\": true}]", browser()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"interactive\": true}]", browser(),
+                          &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_TRUE(func->scope_ui_shown());
 
@@ -1611,10 +1705,12 @@
 
   QueueRequestComplete(type, &queued_request);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1648,10 +1744,12 @@
   // queued request clears.
   QueueRequestComplete(type, &queued_request);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_TRUE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1752,11 +1850,12 @@
   SetCachedToken(token);
 
   // Get a token. Should not require a GAIA request.
-  std::unique_ptr<base::Value> value(
-      utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                          &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1800,11 +1899,12 @@
         IdentityGetAuthTokenError::State::kUserNotSignedIn, 1);
   } else {
     // Use the account from Gaia cookies.
-    std::unique_ptr<base::Value> value(
-        utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
     std::string access_token;
-    EXPECT_TRUE(value->GetAsString(&access_token));
+    std::set<std::string> granted_scopes;
+    RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                            &granted_scopes);
     EXPECT_EQ(std::string(kAccessToken), access_token);
+    EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
     histogram_tester()->ExpectUniqueSample(
         kGetAuthTokenResultHistogramName,
         IdentityGetAuthTokenError::State::kNone, 1);
@@ -1867,10 +1967,12 @@
 
   QueueRequestComplete(type, &queued_request);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_FALSE(func->login_ui_shown());
   EXPECT_FALSE(func->scope_ui_shown());
   histogram_tester()->ExpectUniqueSample(
@@ -1896,11 +1998,12 @@
   func->set_login_ui_result(true);
   func->push_mint_token_result(TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS);
 
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"interactive\": true}]", browser()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"interactive\": true}]", browser(),
+                          &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_TRUE(func->login_ui_shown());
   EXPECT_TRUE(func->scope_ui_shown());
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND,
@@ -1928,10 +2031,12 @@
   // the new flow for the secondary account.
   func->push_mint_token_result(TestOAuth2MintTokenFlow::ISSUE_ADVICE_SUCCESS);
 
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"interactive\": true}]", browser()));
-  ASSERT_TRUE(value->is_string());
-  EXPECT_EQ(kAccessToken, value->GetString());
+  std::string access_token;
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"interactive\": true}]", browser(),
+                          &access_token, &granted_scopes);
+  EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   EXPECT_TRUE(func->scope_ui_shown());
   EXPECT_FALSE(GetCachedGaiaId().has_value());
   histogram_tester()->ExpectUniqueSample(
@@ -2066,10 +2171,12 @@
   std::string primary_account_access_token =
       IssueLoginAccessTokenForAccount(primary_account_id);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
             GetCachedToken(CoreAccountId()).status());
   EXPECT_THAT(func->login_access_tokens(),
@@ -2128,10 +2235,12 @@
   std::string primary_account_access_token =
       IssueLoginAccessTokenForAccount(primary_account_id);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
             GetCachedToken(CoreAccountId()).status());
   EXPECT_THAT(func->login_access_tokens(),
@@ -2162,10 +2271,12 @@
   std::string primary_account_access_token =
       IssueLoginAccessTokenForAccount(primary_account_id);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
             GetCachedToken(CoreAccountId()).status());
   EXPECT_THAT(func->login_access_tokens(),
@@ -2213,10 +2324,12 @@
   std::string secondary_account_access_token =
       IssueLoginAccessTokenForAccount(secondary_account_id);
 
-  std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
   EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
             GetCachedToken(secondary_account_id).status());
   EXPECT_THAT(func->login_access_tokens(),
@@ -2372,10 +2485,12 @@
     std::string secondary_account_access_token =
         IssueLoginAccessTokenForAccount(secondary_account.account_id);
 
-    std::unique_ptr<base::Value> value(WaitForSingleResult(func.get()));
-    EXPECT_TRUE(value->is_string());
-    std::string access_token = value->GetString();
-    EXPECT_EQ(kAccessToken, access_token);
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    WaitForGetAuthTokenResults(func.get(), &access_token, &granted_scopes);
+    EXPECT_EQ(std::string(kAccessToken), access_token);
+    EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
+
     EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
               GetCachedToken(secondary_account.account_id).status());
     EXPECT_EQ(secondary_account.gaia,
@@ -2397,11 +2512,13 @@
     scoped_refptr<FakeGetAuthTokenFunction> func(
         new FakeGetAuthTokenFunction());
     func->set_extension(extension);
-    std::unique_ptr<base::Value> value(
-        utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
-    EXPECT_TRUE(value->is_string());
-    std::string access_token = value->GetString();
+
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                            &granted_scopes);
     EXPECT_EQ(std::string(kAccessToken), access_token);
+    EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
     EXPECT_FALSE(func->login_ui_shown());
     EXPECT_FALSE(func->scope_ui_shown());
     histogram_tester()->ExpectUniqueSample(
@@ -2451,15 +2568,19 @@
   scope_ui_shown_loop.Run();
   func1->CompleteRemoteConsentDialog();
 
-  std::unique_ptr<base::Value> value1(
-      func1_runner.WaitForSingleResult(func1.get()));
-  ASSERT_NE(value1, nullptr);
-  EXPECT_EQ(base::Value(kAccessToken), *value1);
+  std::string access_token1;
+  std::set<std::string> granted_scopes1;
+  WaitForGetAuthTokenResults(func1.get(), &access_token1, &granted_scopes1,
+                             &func1_runner);
+  EXPECT_EQ(std::string(kAccessToken), access_token1);
+  EXPECT_EQ(func1->GetExtensionTokenKeyForTest()->scopes, granted_scopes1);
 
-  std::unique_ptr<base::Value> value2(
-      func2_runner.WaitForSingleResult(func2.get()));
-  ASSERT_NE(value2, nullptr);
-  EXPECT_EQ(base::Value(kAccessToken), *value2);
+  std::string access_token2;
+  std::set<std::string> granted_scopes2;
+  WaitForGetAuthTokenResults(func2.get(), &access_token2, &granted_scopes2,
+                             &func2_runner);
+  EXPECT_EQ(std::string(kAccessToken), access_token2);
+  EXPECT_EQ(func2->GetExtensionTokenKeyForTest()->scopes, granted_scopes2);
 
   // Only one consent ui should be shown.
   int total_scope_ui_shown = func1->scope_ui_shown() + func2->scope_ui_shown();
@@ -2519,15 +2640,19 @@
   scope_ui_shown_loop.Run();
   func2->CompleteRemoteConsentDialog();
 
-  std::unique_ptr<base::Value> value1(
-      func1_runner.WaitForSingleResult(func1.get()));
-  ASSERT_NE(value1, nullptr);
-  EXPECT_EQ(base::Value(kAccessToken), *value1);
+  std::string access_token1;
+  std::set<std::string> granted_scopes1;
+  WaitForGetAuthTokenResults(func1.get(), &access_token1, &granted_scopes1,
+                             &func1_runner);
+  EXPECT_EQ(std::string(kAccessToken), access_token1);
+  EXPECT_EQ(func1->GetExtensionTokenKeyForTest()->scopes, granted_scopes1);
 
-  std::unique_ptr<base::Value> value2(
-      func2_runner.WaitForSingleResult(func2.get()));
-  ASSERT_NE(value2, nullptr);
-  EXPECT_EQ(base::Value(kAccessToken), *value2);
+  std::string access_token2;
+  std::set<std::string> granted_scopes2;
+  WaitForGetAuthTokenResults(func2.get(), &access_token2, &granted_scopes2,
+                             &func2_runner);
+  EXPECT_EQ(std::string(kAccessToken), access_token2);
+  EXPECT_EQ(func2->GetExtensionTokenKeyForTest()->scopes, granted_scopes2);
 
   // Only one consent ui should be shown.
   int total_scope_ui_shown = func1->scope_ui_shown() + func2->scope_ui_shown();
@@ -2576,11 +2701,12 @@
   } else {
     // Extensions can show the login UI for secondary accounts, and get the auth
     // token.
-    std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-        func.get(), kFunctionParams, browser()));
     std::string access_token;
-    EXPECT_TRUE(value->GetAsString(&access_token));
+    std::set<std::string> granted_scopes;
+    RunGetAuthTokenFunction(func.get(), kFunctionParams, browser(),
+                            &access_token, &granted_scopes);
     EXPECT_EQ(std::string(kAccessToken), access_token);
+    EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
     EXPECT_TRUE(func->login_ui_shown());
     EXPECT_TRUE(func->scope_ui_shown());
     histogram_tester()->ExpectUniqueSample(
@@ -2596,13 +2722,15 @@
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_extension(extension.get());
   func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(
-      utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
+
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                          &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
 
   const ExtensionTokenKey* token_key = func->GetExtensionTokenKeyForTest();
+  EXPECT_EQ(token_key->scopes, granted_scopes);
   EXPECT_EQ(2ul, token_key->scopes.size());
   EXPECT_TRUE(base::Contains(token_key->scopes, "scope1"));
   EXPECT_TRUE(base::Contains(token_key->scopes, "scope2"));
@@ -2630,14 +2758,18 @@
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_extension(extension.get());
-  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"scopes\": [\"email\"]}]", browser()));
+
+  std::set<std::string> scopes = {"email"};
+  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS,
+                               scopes);
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{\"scopes\": [\"email\"]}]", browser(),
+                          &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
 
   const ExtensionTokenKey* token_key = func->GetExtensionTokenKeyForTest();
+  EXPECT_EQ(token_key->scopes, granted_scopes);
   EXPECT_EQ(1ul, token_key->scopes.size());
   EXPECT_TRUE(base::Contains(token_key->scopes, "email"));
   histogram_tester()->ExpectUniqueSample(
@@ -2650,14 +2782,19 @@
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
   scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
   func->set_extension(extension.get());
-  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult(
-      func.get(), "[{\"scopes\": [\"email\", \"foo\", \"bar\"]}]", browser()));
+
+  std::set<std::string> scopes = {"email", "foo", "bar"};
+  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS,
+                               scopes);
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(),
+                          "[{\"scopes\": [\"email\", \"foo\", \"bar\"]}]",
+                          browser(), &access_token, &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
 
   const ExtensionTokenKey* token_key = func->GetExtensionTokenKeyForTest();
+  EXPECT_EQ(token_key->scopes, granted_scopes);
   EXPECT_EQ(3ul, token_key->scopes.size());
   EXPECT_TRUE(base::Contains(token_key->scopes, "email"));
   EXPECT_TRUE(base::Contains(token_key->scopes, "foo"));
@@ -2732,11 +2869,13 @@
   scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
   func->set_extension(CreateTestExtension("ljacajndfccfgnfohlgkdphmbnpkjflk"));
   func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
-  std::unique_ptr<base::Value> value(
-      utils::RunFunctionAndReturnSingleResult(func.get(), "[{}]", browser()));
+
   std::string access_token;
-  EXPECT_TRUE(value->GetAsString(&access_token));
+  std::set<std::string> granted_scopes;
+  RunGetAuthTokenFunction(func.get(), "[{}]", browser(), &access_token,
+                          &granted_scopes);
   EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_EQ(func->GetExtensionTokenKeyForTest()->scopes, granted_scopes);
   histogram_tester()->ExpectUniqueSample(
       kGetAuthTokenResultHistogramName, IdentityGetAuthTokenError::State::kNone,
       1);
@@ -2744,6 +2883,72 @@
 
 #endif
 
+class GetAuthTokenFunctionReturnScopesDisabledTest
+    : public GetAuthTokenFunctionTest {
+ public:
+  explicit GetAuthTokenFunctionReturnScopesDisabledTest()
+      : GetAuthTokenFunctionTest(false) {}
+
+  void RunGetAuthTokenFunctionReturnScopesDisabled(ExtensionFunction* function,
+                                                   const std::string& args,
+                                                   Browser* browser,
+                                                   std::string* access_token) {
+    EXPECT_TRUE(
+        utils::RunFunction(function, args, browser, api_test_utils::NONE));
+
+    EXPECT_TRUE(function->GetError().empty())
+        << "Unexpected error: " << function->GetError();
+    EXPECT_NE(nullptr, function->GetResultList());
+
+    const auto& result_list = function->GetResultList()->GetList();
+    EXPECT_EQ(1ul, result_list.size());
+
+    const auto& access_token_value = result_list[0];
+    EXPECT_TRUE(access_token_value.is_string());
+
+    *access_token = access_token_value.GetString();
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionReturnScopesDisabledTest,
+                       NoOptionsSuccess) {
+  SignIn("primary@example.com");
+  scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
+  scoped_refptr<const Extension> extension(CreateExtension(CLIENT_ID | SCOPES));
+  func->set_extension(extension.get());
+  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_SUCCESS);
+
+  std::string access_token;
+  RunGetAuthTokenFunctionReturnScopesDisabled(func.get(), "[{}]", browser(),
+                                              &access_token);
+  EXPECT_EQ(std::string(kAccessToken), access_token);
+  EXPECT_FALSE(func->login_ui_shown());
+  EXPECT_FALSE(func->scope_ui_shown());
+  EXPECT_EQ(IdentityTokenCacheValue::CACHE_STATUS_TOKEN,
+            GetCachedToken(CoreAccountId()).status());
+  histogram_tester()->ExpectUniqueSample(
+      kGetAuthTokenResultHistogramName, IdentityGetAuthTokenError::State::kNone,
+      1);
+}
+
+// Whether or not returning scopes is enabled should not affect error handling.
+IN_PROC_BROWSER_TEST_F(GetAuthTokenFunctionReturnScopesDisabledTest,
+                       NonInteractiveMintFailure) {
+  SignIn("primary@example.com");
+  scoped_refptr<FakeGetAuthTokenFunction> func(new FakeGetAuthTokenFunction());
+  func->set_extension(CreateExtension(CLIENT_ID | SCOPES));
+  func->push_mint_token_result(TestOAuth2MintTokenFlow::MINT_TOKEN_FAILURE);
+  std::string error =
+      utils::RunFunctionAndReturnError(func.get(), "[{}]", browser());
+  EXPECT_TRUE(base::StartsWith(error, errors::kAuthFailure,
+                               base::CompareCase::INSENSITIVE_ASCII));
+  EXPECT_FALSE(func->login_ui_shown());
+  EXPECT_FALSE(func->scope_ui_shown());
+  histogram_tester()->ExpectUniqueSample(
+      kGetAuthTokenResultHistogramName,
+      IdentityGetAuthTokenError::State::kMintTokenAuthFailure, 1);
+}
+
 class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest {
  protected:
   bool InvalidateDefaultToken() {
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
index 4033c9d..0ec37d5 100644
--- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
+++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc
@@ -36,6 +36,7 @@
 #include "components/version_info/version_info.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "extensions/common/extension_features.h"
 #include "extensions/common/extension_l10n_util.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_urls.h"
@@ -90,6 +91,11 @@
   }
 }
 
+bool IsReturnScopesInGetAuthTokenEnabled() {
+  return base::FeatureList::IsEnabled(
+      extensions_features::kReturnScopesInGetAuthToken);
+}
+
 }  // namespace
 
 IdentityGetAuthTokenFunction::IdentityGetAuthTokenFunction()
@@ -327,9 +333,21 @@
 }
 
 void IdentityGetAuthTokenFunction::CompleteFunctionWithResult(
-    const std::string& access_token) {
+    const std::string& access_token,
+    const std::set<std::string>& granted_scopes) {
   RecordFunctionResult(IdentityGetAuthTokenError(), remote_consent_approved_);
-  CompleteAsyncRun(OneArgument(std::make_unique<base::Value>(access_token)));
+
+  if (IsReturnScopesInGetAuthTokenEnabled()) {
+    std::unique_ptr<base::Value> granted_scopes_value =
+        std::make_unique<base::Value>(base::Value::Type::LIST);
+    for (const auto& scope : granted_scopes)
+      granted_scopes_value->Append(scope);
+
+    CompleteAsyncRun(TwoArguments(std::make_unique<base::Value>(access_token),
+                                  std::move(granted_scopes_value)));
+  } else {
+    CompleteAsyncRun(OneArgument(std::make_unique<base::Value>(access_token)));
+  }
 }
 
 void IdentityGetAuthTokenFunction::CompleteFunctionWithError(
@@ -500,7 +518,7 @@
 
       case IdentityTokenCacheValue::CACHE_STATUS_TOKEN:
         CompleteMintTokenFlow();
-        CompleteFunctionWithResult(cache_entry.token());
+        CompleteFunctionWithResult(cache_entry.token(), token_key_.scopes);
         break;
 
       case IdentityTokenCacheValue::CACHE_STATUS_ADVICE:
@@ -530,7 +548,7 @@
     switch (cache_status) {
       case IdentityTokenCacheValue::CACHE_STATUS_TOKEN:
         CompleteMintTokenFlow();
-        CompleteFunctionWithResult(cache_entry.token());
+        CompleteFunctionWithResult(cache_entry.token(), token_key_.scopes);
         break;
       case IdentityTokenCacheValue::CACHE_STATUS_NOTFOUND:
       case IdentityTokenCacheValue::CACHE_STATUS_ADVICE:
@@ -551,6 +569,7 @@
 
 void IdentityGetAuthTokenFunction::OnMintTokenSuccess(
     const std::string& access_token,
+    const std::set<std::string>& granted_scopes,
     int time_to_live) {
   TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("identity", "OnMintTokenSuccess", this);
 
@@ -561,7 +580,7 @@
       ->SetCachedToken(token_key_, token);
 
   CompleteMintTokenFlow();
-  CompleteFunctionWithResult(access_token);
+  CompleteFunctionWithResult(access_token, granted_scopes);
 }
 
 void IdentityGetAuthTokenFunction::OnMintTokenFailure(
@@ -744,7 +763,7 @@
   }
 
   CompleteMintTokenFlow();
-  CompleteFunctionWithResult(access_token);
+  CompleteFunctionWithResult(access_token, token_key_.scopes);
 }
 
 void IdentityGetAuthTokenFunction::OnGaiaRemoteConsentFlowFailed(
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
index d7e476d9..42683afc 100644
--- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
+++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_GET_AUTH_TOKEN_FUNCTION_H_
 
 #include <memory>
+#include <set>
 #include <string>
 
 #include "base/callback_list.h"
@@ -167,7 +168,8 @@
   // Helpers to report async function results to the caller.
   void StartAsyncRun();
   void CompleteAsyncRun(ResponseValue response);
-  void CompleteFunctionWithResult(const std::string& access_token);
+  void CompleteFunctionWithResult(const std::string& access_token,
+                                  const std::set<std::string>& granted_scopes);
   void CompleteFunctionWithError(const IdentityGetAuthTokenError& error);
 
   // Whether a signin flow should be initiated in the user's current state.
@@ -183,6 +185,7 @@
 
   // OAuth2MintTokenFlow::Delegate implementation:
   void OnMintTokenSuccess(const std::string& access_token,
+                          const std::set<std::string>& granted_scopes,
                           int time_to_live) override;
   void OnMintTokenFailure(const GoogleServiceAuthError& error) override;
   void OnIssueAdviceSuccess(const IssueAdviceInfo& issue_advice) override;
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index 926deb0e..aadc301 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -55,9 +55,9 @@
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 #else
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #endif
 
 namespace {
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index d52b008a..3cc6589 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -388,6 +388,8 @@
   (*s_whitelist)[::prefs::kAccessibilityFocusHighlightEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
 #endif
+  (*s_whitelist)[::prefs::kCaretBrowsingEnabled] =
+      settings_api::PrefType::PREF_TYPE_BOOLEAN;
 
 #if defined(OS_CHROMEOS)
   // Accounts / Users / People.
diff --git a/chrome/browser/extensions/extension_override_apitest.cc b/chrome/browser/extensions/extension_override_apitest.cc
index 27eb05ee..6c8068577 100644
--- a/chrome/browser/extensions/extension_override_apitest.cc
+++ b/chrome/browser/extensions/extension_override_apitest.cc
@@ -232,6 +232,12 @@
         browser()->tab_strip_model()->GetActiveWebContents(),
         extension1_id));
   }
+
+  UnloadExtension(extension1_id);
+  content::WebContents* active_tab =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  EXPECT_TRUE(content::WaitForLoadStop(active_tab));
+  EXPECT_FALSE(ExtensionControlsPage(active_tab, extension1_id));
 }
 
 #if defined(OS_MAC)
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index 4bee70b..e06f65d 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -173,7 +173,7 @@
   if (Profile::FromBrowserContext(web_contents->GetBrowserContext()) != profile)
     return;
 
-  GURL url = web_contents->GetURL();
+  const GURL& url = web_contents->GetLastCommittedURL();
   if (!url.SchemeIs(content::kChromeUIScheme) || url.host_piece() != page)
     return;
 
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index ce1b752..ff752a6 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2241,16 +2241,6 @@
     "Tint contents composited using Viz with a shade of red to help debug and "
     "study overlay support.";
 
-const char kTLS13HardeningForLocalAnchorsName[] =
-    "TLS 1.3 hardening for local anchors";
-const char kTLS13HardeningForLocalAnchorsDescription[] =
-    "This option enables the TLS 1.3 downgrade hardening mechanism for "
-    "connections authenticated by local trust anchors. This improves security "
-    "for connections to TLS-1.3-capable servers while remaining compatible "
-    "with older servers. Firewalls and proxies that do not function when this "
-    "is enabled do not implement TLS 1.2 correctly or securely and must be "
-    "updated.";
-
 const char kTopChromeTouchUiName[] = "Touch UI Layout";
 const char kTopChromeTouchUiDescription[] =
     "Enables touch UI layout in the browser's top chrome.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index b4972c88..b8c8c59 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1291,9 +1291,6 @@
 extern const char kTintCompositedContentName[];
 extern const char kTintCompositedContentDescription[];
 
-extern const char kTLS13HardeningForLocalAnchorsName[];
-extern const char kTLS13HardeningForLocalAnchorsDescription[];
-
 extern const char kTopChromeTouchUiName[];
 extern const char kTopChromeTouchUiDescription[];
 
diff --git a/chrome/browser/focus_ring_browsertest.cc b/chrome/browser/focus_ring_browsertest.cc
new file mode 100644
index 0000000..7edd7e1
--- /dev/null
+++ b/chrome/browser/focus_ring_browsertest.cc
@@ -0,0 +1,175 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
+#include "cc/test/pixel_comparator.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/interactive_test_utils.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "ui/base/ui_base_features.h"
+
+// TODO(crbug.com/958242): Move the baselines to skia gold for easier
+//   rebaselining when all platforms are supported
+
+// To rebaseline this test on all platforms:
+// 1. Run a CQ+1 dry run.
+// 2. Click the failing bots for android, windows, mac, and linux.
+// 3. Find the failing interactive_ui_browsertests step.
+// 4. Click the "Deterministic failure" link for the failing test case.
+// 5. Copy the "Actual pixels" data url and paste into browser.
+// 6. Save the image into your chromium checkout in
+//    chrome/test/data/focus_rings.
+
+#if defined(OS_MAC)
+// Mac has subtle rendering differences between different versions of MacOS, so
+// we account for them with these fuzzy pixel comparators. These two comparators
+// are used in different tests in order to keep the matching somewhat strict.
+const cc::FuzzyPixelComparator mac_strict_comparator(
+    /* discard_alpha */ true,
+    /* error_pixels_percentage_limit */ 3.f,
+    /* small_error_pixels_percentage_limit */ 0.f,
+    /* avg_abs_error_limit */ 20.f,
+    /* max_abs_error_limit */ 49.f,
+    /* small_error_threshold */ 0);
+const cc::FuzzyPixelComparator mac_loose_comparator(
+    /* discard_alpha */ true,
+    /* error_pixels_percentage_limit */ 8.7f,
+    /* small_error_pixels_percentage_limit */ 0.f,
+    /* avg_abs_error_limit */ 20.f,
+    /* max_abs_error_limit */ 43.f,
+    /* small_error_threshold */ 0);
+#endif
+
+class FocusRingBrowserTest : public InProcessBrowserTest {
+ public:
+  FocusRingBrowserTest() {
+    feature_list_.InitWithFeatures({features::kFormControlsRefresh}, {});
+  }
+
+  void SetUp() override {
+    EnablePixelOutput(/*force_device_scale_factor=*/1.f);
+    InProcessBrowserTest::SetUp();
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    InProcessBrowserTest::SetUpCommandLine(command_line);
+
+    // The --disable-lcd-text flag helps text render more similarly on
+    // different bots and platform.
+    command_line->AppendSwitch(switches::kDisableLCDText);
+  }
+
+  void RunTest(const std::string& screenshot_filename,
+               const std::string& body_html,
+               int screenshot_width,
+               int screenshot_height,
+               const cc::PixelComparator& comparator) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+
+    ASSERT_TRUE(features::IsFormControlsRefreshEnabled());
+
+    base::FilePath dir_test_data;
+    ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data));
+
+    std::string platform_suffix;
+#if defined(OS_MAC)
+    platform_suffix = "_mac";
+#elif defined(OS_WIN)
+    platform_suffix = "_win";
+#elif defined(OS_CHROMEOS)
+    platform_suffix = "_chromeos";
+#endif
+
+    base::FilePath golden_filepath =
+        dir_test_data.AppendASCII("focus_rings")
+            .AppendASCII(screenshot_filename + ".png");
+
+    base::FilePath golden_filepath_platform =
+        golden_filepath.InsertBeforeExtensionASCII(platform_suffix);
+    if (base::PathExists(golden_filepath_platform)) {
+      golden_filepath = golden_filepath_platform;
+    }
+
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    ASSERT_TRUE(content::NavigateToURL(
+        web_contents,
+        GURL("data:text/html,<!DOCTYPE html><body>" + body_html + "</body>")));
+    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
+
+    EXPECT_TRUE(CompareWebContentsOutputToReference(
+        web_contents, golden_filepath,
+        gfx::Size(screenshot_width, screenshot_height), comparator));
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, Checkbox) {
+#if defined(OS_MAC)
+  cc::FuzzyPixelComparator comparator = mac_strict_comparator;
+#else
+  cc::ExactPixelComparator comparator(/*discard_alpha=*/true);
+#endif
+  RunTest("focus_ring_browsertest_checkbox",
+          "<input type=checkbox autofocus>"
+          "<input type=checkbox>",
+          /* screenshot_width */ 60,
+          /* screenshot_height */ 40, comparator);
+}
+
+IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, Radio) {
+#if defined(OS_MAC)
+  cc::FuzzyPixelComparator comparator = mac_loose_comparator;
+#else
+  cc::ExactPixelComparator comparator(/*discard_alpha=*/true);
+#endif
+  RunTest("focus_ring_browsertest_radio",
+          "<input type=radio autofocus>"
+          "<input type=radio>",
+          /* screenshot_width */ 60,
+          /* screenshot_height */ 40, comparator);
+}
+
+IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, Button) {
+#if defined(OS_MAC)
+  cc::FuzzyPixelComparator comparator = mac_strict_comparator;
+#else
+  cc::ExactPixelComparator comparator(/*discard_alpha=*/true);
+#endif
+  RunTest("focus_ring_browsertest_button",
+          "<button autofocus style=\"width:40px;height:20px;\"></button>"
+          "<br>"
+          "<br>"
+          "<button style=\"width:40px;height:20px;\"></button>",
+          /* screenshot_width */ 80,
+          /* screenshot_height */ 80, comparator);
+}
+
+IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, Anchor) {
+#if defined(OS_MAC)
+  cc::FuzzyPixelComparator comparator = mac_strict_comparator;
+#else
+  cc::ExactPixelComparator comparator(/*discard_alpha=*/true);
+#endif
+  RunTest("focus_ring_browsertest_anchor",
+          "<div style='text-align: center; width: 80px;'>"
+          "  <a href='foo' autofocus>---- ---<br>---</a>"
+          "</div>"
+          "<br>"
+          "<div style='text-align: center; width: 80px;'>"
+          "  <a href='foo'>---- ---<br>---</a>"
+          "</div>",
+          /* screenshot_width */ 90,
+          /* screenshot_height */ 130, comparator);
+}
diff --git a/chrome/browser/image_editor/internal/BUILD.gn b/chrome/browser/image_editor/internal/BUILD.gn
index 12c1e6d..408e6458 100644
--- a/chrome/browser/image_editor/internal/BUILD.gn
+++ b/chrome/browser/image_editor/internal/BUILD.gn
@@ -9,5 +9,9 @@
 android_library("java") {
   sources = [ "android/java/src/org/chromium/chrome/browser/image_editor/ImageEditorDialogCoordinatorImpl.java" ]
 
-  deps = [ "//chrome/browser/image_editor/public:java" ]
+  deps = [
+    "//chrome/browser/image_editor/public:java",
+    "//chrome/browser/share:java",
+    "//chrome/browser/tab:java",
+  ]
 }
diff --git a/chrome/browser/lite_video/lite_video_observer.cc b/chrome/browser/lite_video/lite_video_observer.cc
index afd08c2b..978fb5b 100644
--- a/chrome/browser/lite_video/lite_video_observer.cc
+++ b/chrome/browser/lite_video/lite_video_observer.cc
@@ -157,4 +157,26 @@
                               : base::RandInt(0, 1);
 }
 
+void LiteVideoObserver::MediaBufferUnderflow(const content::MediaPlayerId& id) {
+  content::RenderFrameHost* render_frame_host = id.render_frame_host;
+
+  if (!render_frame_host || !render_frame_host->GetProcess())
+    return;
+
+  mojo::AssociatedRemote<blink::mojom::PreviewsResourceLoadingHintsReceiver>
+      loading_hints_agent;
+
+  if (render_frame_host->GetRemoteAssociatedInterfaces()) {
+    render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
+        &loading_hints_agent);
+    loading_hints_agent->StopThrottlingMediaRequests();
+  }
+
+  // TODO(crbug/1101563 Update the user blocklist. This needs additional
+  // work to operate on local state mapping the current render frame id
+  // to the navigation's origin.
+
+  // TODO(crbug/1097792): Flush a UKM event for this render frame host.
+}
+
 WEB_CONTENTS_USER_DATA_KEY_IMPL(LiteVideoObserver)
diff --git a/chrome/browser/lite_video/lite_video_observer.h b/chrome/browser/lite_video/lite_video_observer.h
index 820a9d0..e730ded7 100644
--- a/chrome/browser/lite_video/lite_video_observer.h
+++ b/chrome/browser/lite_video/lite_video_observer.h
@@ -10,6 +10,7 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/lite_video/lite_video_navigation_metrics.h"
 #include "chrome/browser/lite_video/lite_video_user_blocklist.h"
+#include "content/public/browser/media_player_id.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
@@ -38,6 +39,7 @@
   // content::WebContentsObserver.
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
+  void MediaBufferUnderflow(const content::MediaPlayerId& id) override;
 
   // Determines the LiteVideoDecision based on |hint| and the coinflip
   // holdback state.
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
index 663d1d0..073b8d5 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
@@ -222,7 +222,8 @@
                      weak_ptr_factory_.GetWeakPtr(), route_id, sink,
                      cast_source));
   logger_->LogInfo(mojom::LogCategory::kRoute, kLoggerComponent,
-                   "Launched a session", sink.id(), cast_source.source_id(),
+                   "Sent a Launch Session request.", sink.id(),
+                   cast_source.source_id(),
                    MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
 
   std::move(params.callback)
@@ -579,6 +580,11 @@
 void CastActivityManager::OnSessionRemoved(const MediaSinkInternal& sink) {
   auto activity_it = FindActivityBySink(sink);
   if (activity_it != activities_.end()) {
+    logger_->LogInfo(
+        mojom::LogCategory::kRoute, kLoggerComponent,
+        "Session removed by the receiver.", sink.sink().id(),
+        MediaRoute::GetMediaSourceIdFromMediaRouteId(activity_it->first),
+        MediaRoute::GetPresentationIdFromMediaRouteId(activity_it->first));
     RemoveActivity(activity_it, PresentationConnectionState::TERMINATED,
                    PresentationConnectionCloseReason::CLOSED);
   }
@@ -756,16 +762,13 @@
     SendFailedToCastIssue(sink.sink().id(), route_id);
     return;
   }
-  logger_->LogInfo(mojom::LogCategory::kRoute, kLoggerComponent,
-                   "Received a LaunchSession response with status OK.",
-                   sink.id(), cast_source.source_id(),
-                   MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
 
   auto session = CastSession::From(sink, *response.receiver_status);
   if (!session) {
     logger_->LogError(mojom::LogCategory::kRoute, kLoggerComponent,
-                      "Unable to get session from launch response", sink.id(),
-                      cast_source.source_id(),
+                      "Unable to get session from launch response. Cast "
+                      "session is not launched.",
+                      sink.id(), cast_source.source_id(),
                       MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
     RemoveActivity(activity_it, PresentationConnectionState::CLOSED,
                    PresentationConnectionCloseReason::CONNECTION_ERROR);
@@ -787,6 +790,10 @@
 
   activity_it->second->SetOrUpdateSession(*session, sink, hash_token_);
   NotifyAllOnRoutesUpdated();
+  logger_->LogInfo(mojom::LogCategory::kRoute, kLoggerComponent,
+                   "Successfully Launched the session.", sink.id(),
+                   cast_source.source_id(),
+                   MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
 }
 
 void CastActivityManager::HandleStopSessionResponse(
@@ -808,14 +815,16 @@
     std::move(callback).Run(base::nullopt, RouteRequestResult::OK);
 
     logger_->LogInfo(mojom::LogCategory::kRoute, kLoggerComponent,
-                     "Terminated a route successfully.", "",
-                     MediaRoute::GetMediaSourceIdFromMediaRouteId(route_id),
+                     "Terminated a route successfully after receiving "
+                     "StopSession response OK.",
+                     "", MediaRoute::GetMediaSourceIdFromMediaRouteId(route_id),
                      MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
   } else {
-    std::move(callback).Run("Failed to terminate route",
-                            RouteRequestResult::UNKNOWN_ERROR);
-    logger_->LogError(mojom::LogCategory::kRoute, kLoggerComponent,
-                      "Failed to terminate route.", "",
+    std::string error_msg =
+        "StopSession response is not OK. Failed to terminate route.";
+    std::move(callback).Run(error_msg, RouteRequestResult::UNKNOWN_ERROR);
+    logger_->LogError(mojom::LogCategory::kRoute, kLoggerComponent, error_msg,
+                      "",
                       MediaRoute::GetMediaSourceIdFromMediaRouteId(route_id),
                       MediaRoute::GetPresentationIdFromMediaRouteId(route_id));
   }
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.cc b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
index 4844f22..43669b1 100644
--- a/chrome/browser/media/router/providers/cast/mirroring_activity.cc
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
@@ -133,14 +133,6 @@
 }
 
 MirroringActivity::~MirroringActivity() {
-  // Usually mirroring will have already been stopped by this point, but when
-  // Chrome is shutting down, this is our first indication that mirroring needs
-  // to stop.  Without this call, if a user shuts down Chrome while mirroring,
-  // the receiver will continue to show the last mirrored frame for several
-  // seconds, which could be bad if the user was shutting down Chrome
-  // specifically to prevent someone from seeing what they were mirroring!
-  StopMirroring();
-
   if (did_start_mirroring_timestamp_) {
     base::UmaHistogramLongTimes(
         kHistogramSessionLength,
diff --git a/chrome/browser/nearby_sharing/certificates/BUILD.gn b/chrome/browser/nearby_sharing/certificates/BUILD.gn
index e9686f3..eb798ad4 100644
--- a/chrome/browser/nearby_sharing/certificates/BUILD.gn
+++ b/chrome/browser/nearby_sharing/certificates/BUILD.gn
@@ -41,6 +41,8 @@
   sources = [
     "fake_nearby_share_certificate_manager.cc",
     "fake_nearby_share_certificate_manager.h",
+    "fake_nearby_share_certificate_storage.cc",
+    "fake_nearby_share_certificate_storage.h",
     "test_util.cc",
     "test_util.h",
   ]
@@ -49,6 +51,8 @@
     ":certificates",
     "//base",
     "//chrome/browser/nearby_sharing/proto",
+    "//components/leveldb_proto",
+    "//components/prefs",
     "//crypto",
   ]
 }
diff --git a/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.cc b/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.cc
new file mode 100644
index 0000000..6a5d8dd
--- /dev/null
+++ b/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.cc
@@ -0,0 +1,168 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.h"
+
+#include <utility>
+
+#include "chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h"
+
+FakeNearbyShareCertificateStorage::Factory::Factory() = default;
+
+FakeNearbyShareCertificateStorage::Factory::~Factory() = default;
+
+std::unique_ptr<NearbyShareCertificateStorage>
+FakeNearbyShareCertificateStorage::Factory::CreateInstance(
+    PrefService* pref_service,
+    std::unique_ptr<
+        leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+        proto_database) {
+  latest_pref_service_ = pref_service;
+  latest_proto_database_ = std::move(proto_database);
+
+  auto instance = std::make_unique<FakeNearbyShareCertificateStorage>();
+  instances_.push_back(instance.get());
+
+  return instance;
+}
+
+FakeNearbyShareCertificateStorage::ReplacePublicCertificatesCall::
+    ReplacePublicCertificatesCall(
+        const std::vector<nearbyshare::proto::PublicCertificate>&
+            public_certificates,
+        ResultCallback callback)
+    : public_certificates(public_certificates), callback(std::move(callback)) {}
+
+FakeNearbyShareCertificateStorage::ReplacePublicCertificatesCall::
+    ReplacePublicCertificatesCall(ReplacePublicCertificatesCall&& other) =
+        default;
+
+FakeNearbyShareCertificateStorage::ReplacePublicCertificatesCall::
+    ~ReplacePublicCertificatesCall() = default;
+
+FakeNearbyShareCertificateStorage::AddPublicCertificatesCall::
+    AddPublicCertificatesCall(
+        const std::vector<nearbyshare::proto::PublicCertificate>&
+            public_certificates,
+        ResultCallback callback)
+    : public_certificates(public_certificates), callback(std::move(callback)) {}
+
+FakeNearbyShareCertificateStorage::AddPublicCertificatesCall::
+    AddPublicCertificatesCall(AddPublicCertificatesCall&& other) = default;
+
+FakeNearbyShareCertificateStorage::AddPublicCertificatesCall::
+    ~AddPublicCertificatesCall() = default;
+
+FakeNearbyShareCertificateStorage::RemoveExpiredPublicCertificatesCall::
+    RemoveExpiredPublicCertificatesCall(base::Time now, ResultCallback callback)
+    : now(now), callback(std::move(callback)) {}
+
+FakeNearbyShareCertificateStorage::RemoveExpiredPublicCertificatesCall::
+    RemoveExpiredPublicCertificatesCall(
+        RemoveExpiredPublicCertificatesCall&& other) = default;
+
+FakeNearbyShareCertificateStorage::RemoveExpiredPublicCertificatesCall::
+    ~RemoveExpiredPublicCertificatesCall() = default;
+
+FakeNearbyShareCertificateStorage::FakeNearbyShareCertificateStorage() =
+    default;
+
+FakeNearbyShareCertificateStorage::~FakeNearbyShareCertificateStorage() =
+    default;
+
+bool FakeNearbyShareCertificateStorage::IsInitialized() {
+  return is_initialized_;
+}
+
+void FakeNearbyShareCertificateStorage::Initialize(ResultCallback callback) {
+  initialize_callbacks_.push_back(std::move(callback));
+}
+
+std::vector<std::string>
+FakeNearbyShareCertificateStorage::GetPublicCertificateIds() const {
+  return public_certificate_ids_;
+}
+
+void FakeNearbyShareCertificateStorage::GetPublicCertificates(
+    PublicCertificateCallback callback) {
+  get_public_certificates_callbacks_.push_back(std::move(callback));
+}
+
+base::Optional<std::vector<NearbySharePrivateCertificate>>
+FakeNearbyShareCertificateStorage::GetPrivateCertificates() const {
+  return private_certificates_;
+}
+
+base::Optional<base::Time>
+FakeNearbyShareCertificateStorage::NextPrivateCertificateExpirationTime()
+    const {
+  return next_private_certificate_expiration_time_;
+}
+
+base::Optional<base::Time>
+FakeNearbyShareCertificateStorage::NextPublicCertificateExpirationTime() const {
+  return next_public_certificate_expiration_time_;
+}
+
+void FakeNearbyShareCertificateStorage::ReplacePrivateCertificates(
+    const std::vector<NearbySharePrivateCertificate>& private_certificates) {
+  replace_private_certificates_calls_.push_back(private_certificates);
+}
+
+void FakeNearbyShareCertificateStorage::ReplacePublicCertificates(
+    const std::vector<nearbyshare::proto::PublicCertificate>&
+        public_certificates,
+    ResultCallback callback) {
+  replace_public_certificates_calls_.emplace_back(public_certificates,
+                                                  std::move(callback));
+}
+
+void FakeNearbyShareCertificateStorage::AddPublicCertificates(
+    const std::vector<nearbyshare::proto::PublicCertificate>&
+        public_certificates,
+    ResultCallback callback) {
+  add_public_certificates_calls_.emplace_back(public_certificates,
+                                              std::move(callback));
+}
+
+void FakeNearbyShareCertificateStorage::RemoveExpiredPublicCertificates(
+    base::Time now,
+    ResultCallback callback) {
+  remove_expired_public_certificates_calls_.emplace_back(now,
+                                                         std::move(callback));
+}
+
+void FakeNearbyShareCertificateStorage::ClearPrivateCertificates() {
+  ++num_clear_private_certificates_calls_;
+}
+
+void FakeNearbyShareCertificateStorage::ClearPublicCertificates(
+    ResultCallback callback) {
+  clear_public_certificates_callbacks_.push_back(std::move(callback));
+}
+
+void FakeNearbyShareCertificateStorage::SetIsInitialized(bool is_initialized) {
+  is_initialized_ = is_initialized;
+}
+
+void FakeNearbyShareCertificateStorage::SetPublicCertificateIds(
+    const std::vector<std::string>& ids) {
+  public_certificate_ids_ = ids;
+}
+
+void FakeNearbyShareCertificateStorage::SetPrivateCertificates(
+    base::Optional<std::vector<NearbySharePrivateCertificate>>
+        private_certificates) {
+  private_certificates_ = std::move(private_certificates);
+}
+
+void FakeNearbyShareCertificateStorage::SetNextPrivateCertificateExpirationTime(
+    base::Optional<base::Time> time) {
+  next_private_certificate_expiration_time_ = time;
+}
+
+void FakeNearbyShareCertificateStorage::SetNextPublicCertificateExpirationTime(
+    base::Optional<base::Time> time) {
+  next_public_certificate_expiration_time_ = time;
+}
diff --git a/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.h b/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.h
new file mode 100644
index 0000000..ae1166c
--- /dev/null
+++ b/chrome/browser/nearby_sharing/certificates/fake_nearby_share_certificate_storage.h
@@ -0,0 +1,187 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NEARBY_SHARING_CERTIFICATES_FAKE_NEARBY_SHARE_CERTIFICATE_STORAGE_H_
+#define CHROME_BROWSER_NEARBY_SHARING_CERTIFICATES_FAKE_NEARBY_SHARE_CERTIFICATE_STORAGE_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/time/time.h"
+#include "chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h"
+#include "chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h"
+#include "chrome/browser/nearby_sharing/proto/rpc_resources.pb.h"
+#include "components/leveldb_proto/public/proto_database.h"
+
+class PrefService;
+
+// A fake implementation of NearbyShareCertificateStorage, along with a fake
+// factory, to be used in tests.
+class FakeNearbyShareCertificateStorage : public NearbyShareCertificateStorage {
+ public:
+  // Factory that creates FakeNearbyShareCertificateStorage instances. Use
+  // in NearbyShareCertificateStorageImpl::Factory::SetFactoryForTesting()
+  // in unit tests.
+  class Factory : public NearbyShareCertificateStorageImpl::Factory {
+   public:
+    Factory();
+    ~Factory() override;
+
+    // Returns all FakeNearbyShareCertificateStorage instances created by
+    // CreateInstance().
+    std::vector<FakeNearbyShareCertificateStorage*>& instances() {
+      return instances_;
+    }
+
+    PrefService* latest_pref_service() { return latest_pref_service_; }
+
+    leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>*
+    latest_proto_database() {
+      return latest_proto_database_.get();
+    }
+
+   private:
+    // NearbyShareCertificateStorageImpl::Factory:
+    std::unique_ptr<NearbyShareCertificateStorage> CreateInstance(
+        PrefService* pref_service,
+        std::unique_ptr<
+            leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+            proto_database) override;
+
+    std::vector<FakeNearbyShareCertificateStorage*> instances_;
+    PrefService* latest_pref_service_ = nullptr;
+    std::unique_ptr<
+        leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+        latest_proto_database_;
+  };
+
+  struct ReplacePublicCertificatesCall {
+    ReplacePublicCertificatesCall(
+        const std::vector<nearbyshare::proto::PublicCertificate>&
+            public_certificates,
+        ResultCallback callback);
+    ReplacePublicCertificatesCall(ReplacePublicCertificatesCall&& other);
+    ~ReplacePublicCertificatesCall();
+
+    std::vector<nearbyshare::proto::PublicCertificate> public_certificates;
+    ResultCallback callback;
+  };
+
+  struct AddPublicCertificatesCall {
+    AddPublicCertificatesCall(
+        const std::vector<nearbyshare::proto::PublicCertificate>&
+            public_certificates,
+        ResultCallback callback);
+    AddPublicCertificatesCall(AddPublicCertificatesCall&& other);
+    ~AddPublicCertificatesCall();
+
+    std::vector<nearbyshare::proto::PublicCertificate> public_certificates;
+    ResultCallback callback;
+  };
+
+  struct RemoveExpiredPublicCertificatesCall {
+    RemoveExpiredPublicCertificatesCall(base::Time now,
+                                        ResultCallback callback);
+    RemoveExpiredPublicCertificatesCall(
+        RemoveExpiredPublicCertificatesCall&& other);
+    ~RemoveExpiredPublicCertificatesCall();
+
+    base::Time now;
+    ResultCallback callback;
+  };
+
+  FakeNearbyShareCertificateStorage();
+  ~FakeNearbyShareCertificateStorage() override;
+
+  void SetIsInitialized(bool is_initialized);
+  void SetPublicCertificateIds(const std::vector<std::string>& ids);
+  void SetPrivateCertificates(
+      base::Optional<std::vector<NearbySharePrivateCertificate>>
+          private_certificates);
+  void SetNextPrivateCertificateExpirationTime(base::Optional<base::Time> time);
+  void SetNextPublicCertificateExpirationTime(base::Optional<base::Time> time);
+
+  std::vector<ResultCallback>& initialize_callbacks() {
+    return initialize_callbacks_;
+  }
+
+  std::vector<PublicCertificateCallback>& get_public_certificates_callbacks() {
+    return get_public_certificates_callbacks_;
+  }
+
+  std::vector<std::vector<NearbySharePrivateCertificate>>&
+  replace_private_certificates_calls() {
+    return replace_private_certificates_calls_;
+  }
+
+  std::vector<ReplacePublicCertificatesCall>&
+  replace_public_certificates_calls() {
+    return replace_public_certificates_calls_;
+  }
+
+  std::vector<AddPublicCertificatesCall>& add_public_certificates_calls() {
+    return add_public_certificates_calls_;
+  }
+
+  std::vector<RemoveExpiredPublicCertificatesCall>&
+  remove_expired_public_certificates_calls() {
+    return remove_expired_public_certificates_calls_;
+  }
+
+  size_t num_clear_private_certificates_calls() {
+    return num_clear_private_certificates_calls_;
+  }
+
+  std::vector<ResultCallback>& clear_public_certificates_callbacks() {
+    return clear_public_certificates_callbacks_;
+  }
+
+ private:
+  // NearbyShareCertificateStorage:
+  bool IsInitialized() override;
+  void Initialize(ResultCallback callback) override;
+  std::vector<std::string> GetPublicCertificateIds() const override;
+  void GetPublicCertificates(PublicCertificateCallback callback) override;
+  base::Optional<std::vector<NearbySharePrivateCertificate>>
+  GetPrivateCertificates() const override;
+  base::Optional<base::Time> NextPrivateCertificateExpirationTime()
+      const override;
+  base::Optional<base::Time> NextPublicCertificateExpirationTime()
+      const override;
+  void ReplacePrivateCertificates(
+      const std::vector<NearbySharePrivateCertificate>& private_certificates)
+      override;
+  void ReplacePublicCertificates(
+      const std::vector<nearbyshare::proto::PublicCertificate>&
+          public_certificates,
+      ResultCallback callback) override;
+  void AddPublicCertificates(
+      const std::vector<nearbyshare::proto::PublicCertificate>&
+          public_certificates,
+      ResultCallback callback) override;
+  void RemoveExpiredPublicCertificates(base::Time now,
+                                       ResultCallback callback) override;
+  void ClearPrivateCertificates() override;
+  void ClearPublicCertificates(ResultCallback callback) override;
+
+  bool is_initialized_ = false;
+  size_t num_clear_private_certificates_calls_ = 0;
+  base::Optional<base::Time> next_private_certificate_expiration_time_;
+  base::Optional<base::Time> next_public_certificate_expiration_time_;
+  std::vector<std::string> public_certificate_ids_;
+  base::Optional<std::vector<NearbySharePrivateCertificate>>
+      private_certificates_;
+  std::vector<ResultCallback> initialize_callbacks_;
+  std::vector<PublicCertificateCallback> get_public_certificates_callbacks_;
+  std::vector<std::vector<NearbySharePrivateCertificate>>
+      replace_private_certificates_calls_;
+  std::vector<ReplacePublicCertificatesCall> replace_public_certificates_calls_;
+  std::vector<AddPublicCertificatesCall> add_public_certificates_calls_;
+  std::vector<RemoveExpiredPublicCertificatesCall>
+      remove_expired_public_certificates_calls_;
+  std::vector<ResultCallback> clear_public_certificates_callbacks_;
+};
+
+#endif  // CHROME_BROWSER_NEARBY_SHARING_CERTIFICATES_FAKE_NEARBY_SHARE_CERTIFICATE_STORAGE_H_
diff --git a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h
index fe193c25..365de40 100644
--- a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h
+++ b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage.h
@@ -36,8 +36,7 @@
   virtual std::vector<std::string> GetPublicCertificateIds() const = 0;
 
   // Returns all public certificates currently in storage. No RPC call is made.
-  virtual void GetPublicCertificates(
-      PublicCertificateCallback callback) const = 0;
+  virtual void GetPublicCertificates(PublicCertificateCallback callback) = 0;
 
   // Returns all private certificates currently in storage. Will return
   // base::nullopt if deserialization from prefs fails -- not expected to happen
diff --git a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
index 9a613999..6cef398 100644
--- a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
+++ b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
@@ -3,11 +3,13 @@
 // found in the LICENSE file.
 
 #include <algorithm>
+#include <utility>
 #include <vector>
 
 #include "chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h"
 
 #include "base/base64url.h"
+#include "base/memory/ptr_util.h"
 #include "base/optional.h"
 #include "base/util/values/values_util.h"
 #include "base/values.h"
@@ -67,6 +69,34 @@
 }
 }  // namespace
 
+// static
+NearbyShareCertificateStorageImpl::Factory*
+    NearbyShareCertificateStorageImpl::Factory::test_factory_ = nullptr;
+
+// static
+std::unique_ptr<NearbyShareCertificateStorage>
+NearbyShareCertificateStorageImpl::Factory::Create(
+    PrefService* pref_service,
+    std::unique_ptr<
+        leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+        proto_database) {
+  if (test_factory_) {
+    return test_factory_->CreateInstance(pref_service,
+                                         std::move(proto_database));
+  }
+
+  return base::WrapUnique(new NearbyShareCertificateStorageImpl(
+      pref_service, std::move(proto_database)));
+}
+
+// static
+void NearbyShareCertificateStorageImpl::Factory::SetFactoryForTesting(
+    Factory* test_factory) {
+  test_factory_ = test_factory;
+}
+
+NearbyShareCertificateStorageImpl::Factory::~Factory() = default;
+
 NearbyShareCertificateStorageImpl::NearbyShareCertificateStorageImpl(
     PrefService* pref_service,
     std::unique_ptr<
@@ -238,7 +268,7 @@
 }
 
 void NearbyShareCertificateStorageImpl::GetPublicCertificates(
-    PublicCertificateCallback callback) const {
+    PublicCertificateCallback callback) {
   db_->LoadEntries(std::move(callback));
 }
 
diff --git a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h
index 9d47c28..3c6cc6de 100644
--- a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h
+++ b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.h
@@ -25,18 +25,33 @@
 // certificates.
 class NearbyShareCertificateStorageImpl : public NearbyShareCertificateStorage {
  public:
+  class Factory {
+   public:
+    static std::unique_ptr<NearbyShareCertificateStorage> Create(
+        PrefService* pref_service,
+        std::unique_ptr<
+            leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+            proto_database);
+    static void SetFactoryForTesting(Factory* test_factory);
+
+   protected:
+    virtual ~Factory();
+    virtual std::unique_ptr<NearbyShareCertificateStorage> CreateInstance(
+        PrefService* pref_service,
+        std::unique_ptr<
+            leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+            proto_database) = 0;
+
+   private:
+    static Factory* test_factory_;
+  };
+
   using ExpirationList = std::vector<std::pair<std::string, base::Time>>;
 
   // Registers the prefs used by this class to the given |registry|.
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
-  NearbyShareCertificateStorageImpl(
-      PrefService* pref_service,
-      std::unique_ptr<
-          leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
-          proto_database);
   ~NearbyShareCertificateStorageImpl() override;
-
   NearbyShareCertificateStorageImpl(NearbyShareCertificateStorageImpl&) =
       delete;
   void operator=(NearbyShareCertificateStorageImpl&) = delete;
@@ -45,7 +60,7 @@
   bool IsInitialized() override;
   void Initialize(ResultCallback callback) override;
   std::vector<std::string> GetPublicCertificateIds() const override;
-  void GetPublicCertificates(PublicCertificateCallback callback) const override;
+  void GetPublicCertificates(PublicCertificateCallback callback) override;
   base::Optional<std::vector<NearbySharePrivateCertificate>>
   GetPrivateCertificates() const override;
   base::Optional<base::Time> NextPrivateCertificateExpirationTime()
@@ -69,6 +84,12 @@
   void ClearPublicCertificates(ResultCallback callback) override;
 
  private:
+  NearbyShareCertificateStorageImpl(
+      PrefService* pref_service,
+      std::unique_ptr<
+          leveldb_proto::ProtoDatabase<nearbyshare::proto::PublicCertificate>>
+          proto_database);
+
   void OnDatabaseInitialized(ResultCallback callback,
                              leveldb_proto::Enums::InitStatus status);
 
diff --git a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl_unittest.cc b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl_unittest.cc
index eabee0c..1ec7602 100644
--- a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl_unittest.cc
+++ b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl_unittest.cc
@@ -141,7 +141,7 @@
     // to ensure test coverage of FetchPublicCertificateExpirations.
     PrepopulatePublicCertificates();
 
-    cert_store_ = std::make_unique<NearbyShareCertificateStorageImpl>(
+    cert_store_ = NearbyShareCertificateStorageImpl::Factory::Create(
         pref_service_.get(), std::move(db));
   }
 
@@ -204,7 +204,7 @@
   std::unique_ptr<TestingPrefServiceSimple> pref_service_;
   std::map<std::string, nearbyshare::proto::PublicCertificate> db_entries_;
   leveldb_proto::test::FakeDB<nearbyshare::proto::PublicCertificate>* db_;
-  std::unique_ptr<NearbyShareCertificateStorageImpl> cert_store_;
+  std::unique_ptr<NearbyShareCertificateStorage> cert_store_;
   std::vector<nearbyshare::proto::PublicCertificate> public_certificates_;
 };
 
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index bb01967..911dc8db 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -53,6 +53,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/storage_partition.h"
+#include "content/public/browser/storage_partition_config.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/network_service_util.h"
@@ -306,8 +307,11 @@
 
   content::StoragePartition* GetStoragePartitionForContextType(
       NetworkContextType network_context_type) {
-    const GURL kOnDiskUrl("chrome-guest://foo/persist");
-    const GURL kInMemoryUrl("chrome-guest://foo/");
+    const auto kOnDiskConfig = content::StoragePartitionConfig::Create(
+        "foo", /*partition_name=*/"", /*in_memory=*/false);
+    const auto kInMemoryConfig = content::StoragePartitionConfig::Create(
+        "foo", /*partition_name=*/"", /*in_memory=*/true);
+
     switch (network_context_type) {
       case NetworkContextType::kSystem:
       case NetworkContextType::kSafeBrowsing:
@@ -321,15 +325,15 @@
         return content::BrowserContext::GetDefaultStoragePartition(
             incognito_->profile());
       case NetworkContextType::kOnDiskApp:
-        return content::BrowserContext::GetStoragePartitionForSite(
-            browser()->profile(), kOnDiskUrl);
+        return content::BrowserContext::GetStoragePartition(
+            browser()->profile(), kOnDiskConfig);
       case NetworkContextType::kInMemoryApp:
-        return content::BrowserContext::GetStoragePartitionForSite(
-            browser()->profile(), kInMemoryUrl);
+        return content::BrowserContext::GetStoragePartition(
+            browser()->profile(), kInMemoryConfig);
       case NetworkContextType::kOnDiskAppWithIncognitoProfile:
         DCHECK(incognito_);
-        return content::BrowserContext::GetStoragePartitionForSite(
-            incognito_->profile(), kOnDiskUrl);
+        return content::BrowserContext::GetStoragePartition(
+            incognito_->profile(), kOnDiskConfig);
     }
     NOTREACHED();
     return nullptr;
diff --git a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
index 8e43c62..a1c42c75 100644
--- a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
+++ b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
@@ -421,7 +421,7 @@
       optimization_guide::proto::GetHintsResponse get_hints_response;
 
       optimization_guide::proto::Hint* hint = get_hints_response.add_hints();
-      hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+      hint->set_key_representation(optimization_guide::proto::HOST);
       hint->set_key(https_url_.host());
       optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
       page_hint->set_page_pattern("page pattern");
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
index 55785ad..e1a5dcb 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
@@ -565,7 +565,8 @@
   if (optimization_guide::switches::ShouldOverrideFetchHintsTimer()) {
     SetLastHintsFetchAttemptTime(clock_->Now());
     FetchTopHostsHints();
-  } else {
+  } else if (!top_hosts_hints_fetch_timer_.IsRunning()) {
+    // Only Schedule this is the time is not already running.
     ScheduleTopHostsHintsFetch();
   }
 }
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
index e5c170ac..01ed3e6 100644
--- a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
@@ -89,7 +89,7 @@
 
   for (const auto& host : hosts) {
     optimization_guide::proto::Hint* hint = get_hints_response->add_hints();
-    hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint->set_key_representation(optimization_guide::proto::HOST);
     hint->set_key(host);
     optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
     page_hint->set_page_pattern("page pattern");
@@ -346,7 +346,7 @@
     optimization_guide::proto::Configuration config;
     optimization_guide::proto::Hint* hint1 = config.add_hints();
     hint1->set_key("somedomain.org");
-    hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint1->set_key_representation(optimization_guide::proto::HOST);
     hint1->set_version("someversion");
     optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
     page_hint1->set_page_pattern("/news/");
@@ -494,7 +494,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
   optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("noscript_default_2g");
   optimization_guide::proto::Optimization* optimization =
@@ -570,7 +570,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
   optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("noscript_default_2g");
   optimization_guide::proto::Optimization* optimization =
@@ -615,7 +615,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint1 = config.add_hints();
   hint1->set_key("somedomain.org");
-  hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint1->set_key_representation(optimization_guide::proto::HOST);
   hint1->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("/news/");
@@ -1318,7 +1318,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
   hint->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("/news/");
@@ -1359,7 +1359,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
   hint->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("/news/");
@@ -1397,7 +1397,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
   hint->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("/news/");
@@ -1538,7 +1538,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint1 = config.add_hints();
   hint1->set_key("host.com");
-  hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint1->set_key_representation(optimization_guide::proto::HOST);
   hint1->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("https://m.host.com");
@@ -1584,7 +1584,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint1 = config.add_hints();
   hint1->set_key("notfiltered.com");
-  hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint1->set_key_representation(optimization_guide::proto::HOST);
   hint1->set_version("someversion");
   optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("https://notfiltered.com");
diff --git a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_my.xtb b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_my.xtb
index b92af6d..b7ff9056 100644
--- a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_my.xtb
+++ b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_my.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="my">
-<translation id="2670599755795384625">စကားဝှက် ပြန်စရန် စစ်ဆေးမှု</translation>
+<translation id="2670599755795384625">စကားဝှက်စစ်ဆေးမှု ပြန်စရန်</translation>
 <translation id="5539342724706569402">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တွင် ထည့်သွင်းခဲ့သည်</translation>
 <translation id="7744192722284567281">ဒေတာကျိုးပေါက်မှုတွင် တွေ့ထားသည်</translation>
 <translation id="808894953321890993">စကားဝှက် ပြောင်းရန်</translation>
diff --git a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_pa.xtb b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_pa.xtb
index 2701081..8b129f6 100644
--- a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_pa.xtb
+++ b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_pa.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pa">
-<translation id="2670599755795384625">ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation>
+<translation id="2670599755795384625">ਪਾਸਵਰਡ ਦੀ ਜਾਂਚ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</translation>
 <translation id="5539342724706569402">ਧੋਖੇਬਾਜ਼ ਸਾਈਟ 'ਤੇ ਦਾਖਲ ਕੀਤਾ</translation>
 <translation id="7744192722284567281">ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਮਿਲਿਆ</translation>
 <translation id="808894953321890993">ਪਾਸਵਰਡ ਬਦਲੋ</translation>
diff --git a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_zh-TW.xtb b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_zh-TW.xtb
index e3c7313..573ef33 100644
--- a/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_zh-TW.xtb
+++ b/chrome/browser/password_check/android/internal/java/strings/translations/android_password_check_strings_zh-TW.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
-<translation id="2670599755795384625">重新啟動密碼檢查</translation>
+<translation id="2670599755795384625">重新啟動密碼檢查流程</translation>
 <translation id="5539342724706569402">已在詐騙網站上輸入</translation>
 <translation id="7744192722284567281">發生資料侵害事件</translation>
 <translation id="808894953321890993">變更密碼</translation>
diff --git a/chrome/browser/pdf/pdf_extension_util.cc b/chrome/browser/pdf/pdf_extension_util.cc
index e61a2e43..9374718 100644
--- a/chrome/browser/pdf/pdf_extension_util.cc
+++ b/chrome/browser/pdf/pdf_extension_util.cc
@@ -63,6 +63,7 @@
     {"tooltipPrint", IDS_PDF_TOOLTIP_PRINT},
     {"tooltipRotateCW", IDS_PDF_TOOLTIP_ROTATE_CW},
     {"tooltipRotateCCW", IDS_PDF_TOOLTIP_ROTATE_CCW},
+    {"annotationsShowToggle", IDS_PDF_ANNOTATIONS_SHOW_TOGGLE},
 #if defined(OS_CHROMEOS)
     {"tooltipAnnotate", IDS_PDF_ANNOTATION_ANNOTATE},
     {"annotationDocumentTooLarge", IDS_PDF_ANNOTATION_DOCUMENT_TOO_LARGE},
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h b/chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h
index 67905cc..8368e8fb 100644
--- a/chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h
+++ b/chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h
@@ -5,7 +5,7 @@
 #ifndef CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_DESKTOP_H_
 #define CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_DESKTOP_H_
 
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 
 #include "chrome/browser/enterprise/reporting/reporting_delegate_factory_desktop.h"
 
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h
index 9c61615f..a3efb71b 100644
--- a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h
+++ b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher.h
@@ -14,8 +14,8 @@
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/time/time.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/ui/enterprise_startup_dialog.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 
 class ChromeBrowserCloudManagementRegisterWatcherTest;
 
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc
index 365c3e43..8149cc2 100644
--- a/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc
+++ b/chrome/browser/policy/chrome_browser_cloud_management_register_watcher_unittest.cc
@@ -11,9 +11,9 @@
 #include "base/strings/string16.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h"
 #include "chrome/browser/ui/enterprise_startup_dialog.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc
index 1c2f0236..7d33a139 100644
--- a/chrome/browser/policy/chrome_browser_policy_connector.cc
+++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -49,8 +49,8 @@
 #endif
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_cloud_management_controller_desktop.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
 #endif
 
diff --git a/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest.cc b/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest.cc
index 064491c..8a1423d 100644
--- a/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest.cc
+++ b/chrome/browser/policy/cloud/chrome_browser_cloud_management_browsertest.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/device_identity/device_oauth2_token_service.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
 #include "chrome/browser/net/system_network_context_manager.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/common/chrome_paths.h"
@@ -37,6 +36,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/policy/core/common/cloud/chrome_browser_cloud_management_metrics.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index be13d0a..250e8e7 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -588,9 +588,6 @@
   { key::kTotalMemoryLimitMb,
     prefs::kTotalMemoryLimitMb,
     base::Value::Type::INTEGER },
-  { key::kTLS13HardeningForLocalAnchorsEnabled,
-    prefs::kTLS13HardeningForLocalAnchorsEnabled,
-    base::Value::Type::BOOLEAN },
   { key::kCorsMitigationList,
     prefs::kCorsMitigationList,
     base::Value::Type::LIST },
@@ -623,6 +620,9 @@
   { key::kAuthAndroidNegotiateAccountType,
     prefs::kAuthAndroidNegotiateAccountType,
     base::Value::Type::STRING },
+  { key::kBackForwardCacheEnabled,
+    prefs::kMixedFormsWarningsEnabled,
+    base::Value::Type::BOOLEAN },
 #else  // defined(OS_ANDROID)
   { key::kDefaultInsecureContentSetting,
     prefs::kManagedDefaultInsecureContentSetting,
@@ -1707,8 +1707,8 @@
       std::make_unique<chromeos::KeyPermissionsPolicyHandler>(chrome_schema));
   handlers->AddHandler(std::make_unique<DefaultGeolocationPolicyHandler>());
   handlers->AddHandler(std::make_unique<extensions::ExtensionListPolicyHandler>(
-      key::kNoteTakingAppsLockScreenWhitelist,
-      prefs::kNoteTakingAppsLockScreenWhitelist, false /*allow_wildcards*/));
+      key::kNoteTakingAppsLockScreenAllowlist,
+      prefs::kNoteTakingAppsLockScreenAllowlist, false /*allow_wildcards*/));
   handlers->AddHandler(
       std::make_unique<SecondaryGoogleAccountSigninPolicyHandler>());
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index cc3f9ad..1bc91e8 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -2142,7 +2142,7 @@
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     // An app requires lockScreen permission to be enabled as a lock screen app.
-    // This permission is protected by a whitelist, so the test app has to be
+    // This permission is protected by a allowlist, so the test app has to be
     // allowlisted as well.
     command_line->AppendSwitchASCII(
         extensions::switches::kAllowlistedExtensionID, kTestAppId);
@@ -2163,7 +2163,7 @@
   void SetPolicyValue(base::Optional<base::Value> value) {
     PolicyMap policies;
     if (value) {
-      policies.Set(key::kNoteTakingAppsLockScreenWhitelist,
+      policies.Set(key::kNoteTakingAppsLockScreenAllowlist,
                    POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
                    POLICY_SOURCE_CLOUD, std::move(value), nullptr);
     }
@@ -2211,7 +2211,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NoteTakingOnLockScreenPolicyTest,
-                       WhitelistLockScreenNoteTakingAppByPolicy) {
+                       AllowlistLockScreenNoteTakingAppByPolicy) {
   scoped_refptr<const extensions::Extension> app =
       LoadUnpackedExtension("lock_screen_apps/app_launch");
   ASSERT_TRUE(app);
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc
index 1db33c3..209d2a21 100644
--- a/chrome/browser/policy/profile_policy_connector.cc
+++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -224,6 +224,9 @@
 #if defined(OS_CHROMEOS)
   migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
       policy::key::kDeviceNativePrinters, policy::key::kDevicePrinters));
+  migrators.push_back(std::make_unique<LegacyChromePolicyMigrator>(
+      policy::key::kNoteTakingAppsLockScreenWhitelist,
+      policy::key::kNoteTakingAppsLockScreenAllowlist));
 
   ConfigurationPolicyProvider* user_policy_delegate_candidate =
       configuration_policy_provider ? configuration_policy_provider
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 57496bd4..0dab3c2 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -727,6 +727,10 @@
   registry->RegisterIntegerPref(kSameVersionStartupCount, 0);
   registry->RegisterBooleanPref(
       policy::policy_prefs::kUserAgentClientHintsEnabled, true);
+#if defined(OS_ANDROID)
+  registry->RegisterBooleanPref(policy::policy_prefs::kBackForwardCacheEnabled,
+                                true);
+#endif  // defined(OS_ANDROID)
 
   // Below this point is for platform-specific and compile-time conditional
   // calls. Please follow the helper-function-first-then-direct-calls pattern
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 2e782d6..d7c13de 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1238,6 +1238,16 @@
   // flag attached to the profile.
   signin_util::EnsureUserSignoutAllowedIsInitializedForProfile(profile);
   signin_util::EnsurePrimaryAccountAllowedForProfile(profile);
+
+#if !defined(OS_ANDROID)
+  // Caret browsing mode preference is not persisted between browser sessions,
+  // unless the command-line switch is also set - because otherwise it can be
+  // confusing if users don't realize that it was set.
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  profile->GetPrefs()->SetBoolean(
+      prefs::kCaretBrowsingEnabled,
+      command_line->HasSwitch(switches::kEnableCaretBrowsing));
+#endif
 }
 
 void ProfileManager::DoFinalInitForServices(Profile* profile,
diff --git a/chrome/browser/promo_browser_command/BUILD.gn b/chrome/browser/promo_browser_command/BUILD.gn
new file mode 100644
index 0000000..b2b355c09
--- /dev/null
+++ b/chrome/browser/promo_browser_command/BUILD.gn
@@ -0,0 +1,9 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojo_bindings") {
+  sources = [ "promo_browser_command.mojom" ]
+}
diff --git a/chrome/browser/promo_browser_command/OWNERS b/chrome/browser/promo_browser_command/OWNERS
new file mode 100644
index 0000000..cdadf0ef
--- /dev/null
+++ b/chrome/browser/promo_browser_command/OWNERS
@@ -0,0 +1,6 @@
+file://chrome/browser/ui/webui/new_tab_page/OWNERS
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+# COMPONENT: UI>Browser>NewTabPage
diff --git a/chrome/browser/promo_browser_command/README b/chrome/browser/promo_browser_command/README
new file mode 100644
index 0000000..98d9c20
--- /dev/null
+++ b/chrome/browser/promo_browser_command/README
@@ -0,0 +1,11 @@
+This directory contains the Mojo definitions for the NTP promo browser commands,
+i.e, the set of browser commands sent by the NTP promos and understood by the
+browser. These commands may trigger side-effect-free actions in the browser such
+as navigating to a chrome:// URL or initiating a helpful flow.
+
+These mojo definitions are accessible to Desktop and Android. The implementer of
+the handler interface in promo_browser_command.mojom chooses which commands to
+handle and which ones to ignore depending on the platform or the milestone.
+
+The Desktop implementations for these commands are located at:
+//chrome/browser/ui/webui/new_tab_page/promo_browser_command/
diff --git a/chrome/browser/promo_browser_command/promo_browser_command.mojom b/chrome/browser/promo_browser_command/promo_browser_command.mojom
new file mode 100644
index 0000000..90e01f97
--- /dev/null
+++ b/chrome/browser/promo_browser_command/promo_browser_command.mojom
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module promo_browser_command.mojom;
+
+// The set of browser commands sent by the NTP promos and understood by the
+// browser. They may trigger actions in the browser such as navigating to a
+// chrome:// URL or initiating a helpful flow. The implementer of the
+// CommandHandler interface chooses which commands to handle and which ones to
+// ignore depending on the platform or the milestone. Note that the
+// implementations of these commands must be side-effect-free.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// Please update enums.xml upon addition of new commands.
+enum Command {
+  kUnknownCommand = 0,
+};
+
+// Click information needed to determine user's desired window disposition using
+// ui::DispositionFromClick().
+struct ClickInfo {
+  bool middle_button;
+  bool alt_key;
+  bool ctrl_key;
+  bool meta_key;
+  bool shift_key;
+};
+
+// Browser-side handler for requests from JS.
+interface CommandHandler {
+  // Executes the command with the given ID and click information. Returns
+  // whether or not the command was executed.
+  ExecuteCommand(Command command_id, ClickInfo click_info)
+      => (bool command_executed);
+};
diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc
index b463588..8996948 100644
--- a/chrome/browser/renderer_preferences_util.cc
+++ b/chrome/browser/renderer_preferences_util.cc
@@ -12,9 +12,11 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/pref_names.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/browser/renderer_preferences_util.h"
 #include "media/media_buildflags.h"
 #include "third_party/blink/public/common/peerconnection/webrtc_ip_handling_policy.h"
@@ -102,7 +104,14 @@
   prefs->enable_encrypted_media =
       pref_service->GetBoolean(prefs::kEnableEncryptedMedia);
   prefs->webrtc_ip_handling_policy = std::string();
-  // Handling the backward compatibility of previous boolean verions of policy
+#if !defined(OS_ANDROID)
+  prefs->caret_browsing_enabled =
+      pref_service->GetBoolean(prefs::kCaretBrowsingEnabled);
+  content::BrowserAccessibilityState::GetInstance()->SetCaretBrowsingState(
+      prefs->caret_browsing_enabled);
+#endif
+
+  // Handling the backward compatibility of previous boolean versions of policy
   // controls.
   if (!pref_service->HasPrefPath(prefs::kWebRTCIPHandlingPolicy)) {
     if (!pref_service->GetBoolean(prefs::kWebRTCNonProxiedUdpEnabled)) {
diff --git a/chrome/browser/resources/chrome_urls_disabled_page/app.html b/chrome/browser/resources/chrome_urls_disabled_page/app.html
index 848d642..2714883 100644
--- a/chrome/browser/resources/chrome_urls_disabled_page/app.html
+++ b/chrome/browser/resources/chrome_urls_disabled_page/app.html
@@ -5,10 +5,10 @@
     <meta name="viewport"
       content="initial-scale=1, minimum-scale=1,width=device-width">
     <title>$i18n{disabledPageHeader}</title>
-    <link rel="import" href="chrome://resources/html/polymer.html">
-    <link rel="import" href="chrome://resources/cr_elements/icons.html">
-    <link rel="import" href="chrome://resources/html/i18n_behavior.html">
-    <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+    <script type="module"
+        src="chrome://resources/cr_elements/icons.m.js"></script>
+    <script type="module"
+        src="chrome://resources/polymer/v3_0/iron-icon/iron-icon.js"></script>
     <style>
       body {
         --header-color:  #202124;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.html b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.html
index cfb62dd..f85a89d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.html
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.html
@@ -20,7 +20,7 @@
 </head>
 <body>
   <h2 class="i18n" msgid="kbexplorer_title">ChromeVox Learn Mode</h2>
-  <p id="instruction" tabindex=-1 class="i18n" msgid="kbexplorer_instructions">
+  <p id="instruction" aria-live="polite">
     Press any key to learn its name. Ctrl + W will close learn mode.
   </p>
 </body>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.js
index b514284..717e0fc 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer.js
@@ -56,9 +56,8 @@
             .backgroundWindow['BrailleBackground']['getInstance']()['getTranslatorManager']()['getDefaultTranslator']();
 
     ChromeVoxKbHandler.commandHandler = KbExplorer.onCommand;
-    $('instruction').focus();
 
-    KbExplorer.output(Msgs.getMsg('learn_mode_intro'));
+    $('instruction').textContent = Msgs.getMsg('learn_mode_intro');
     KbExplorer.shouldFlushSpeech_ = true;
   }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
index cf88817..194d432 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode_test.js
@@ -30,7 +30,7 @@
               return;
             }
 
-            mockFeedback.expectSpeech(/Starting Learn Mode/);
+            mockFeedback.expectSpeech(/Press a qwerty key/);
             callback(mockFeedback, evt);
           });
       CommandHandler.onCommand('showKbExplorerPage');
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
index 8b0decde..55ce0b41 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
+++ b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -2308,8 +2308,8 @@
   <message desc="Hint for how to start editing a text field while exploring the screen using touch exploration." name="IDS_CHROMEVOX_HINT_DOUBLE_TAP_TO_EDIT">
     Double tap to start editing
   </message>
-  <message desc="Describes Learn Mode when the mode is initially entered." name="IDS_CHROMEVOX_LEARN_MODE_INTRO">
-    Starting Learn Mode. Press a qwerty key, refreshable braille key, or touch gesture to learn its function. Press control with w or escape to exit.
+  <message desc="Describes Learn Mode when the mode is initially entered with text-to-speech." name="IDS_CHROMEVOX_LEARN_MODE_INTRO" is_accessibility_with_no_ui="true">
+    Press a qwerty key, refreshable braille key, or touch gesture to learn its function. Press control with w or escape to exit.
   </message>
   <message desc="Output when leaving Learn Mode." name="IDS_CHROMEVOX_LEARN_MODE_OUTTRO">
     Stopping Learn Mode
diff --git a/chrome/browser/resources/pdf/constants.js b/chrome/browser/resources/pdf/constants.js
index b2c734d..e803bc89 100644
--- a/chrome/browser/resources/pdf/constants.js
+++ b/chrome/browser/resources/pdf/constants.js
@@ -2,6 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+/** @enum {string} */
+export const DisplayAnnotationsAction = {
+  DISPLAY_ANNOTATIONS: 'display-annotations',
+  HIDE_ANNOTATIONS: 'hide-annotations',
+};
+
 /**
  * Enumeration of page fitting types.
  * @enum {string}
diff --git a/chrome/browser/resources/pdf/controller.js b/chrome/browser/resources/pdf/controller.js
index 864535635..5fcc87da 100644
--- a/chrome/browser/resources/pdf/controller.js
+++ b/chrome/browser/resources/pdf/controller.js
@@ -72,7 +72,16 @@
   /** @abstract */
   rotateCounterclockwise() {}
 
-  /** @abstract */
+  /**
+   * @param {boolean} displayAnnotations
+   * @abstract
+   */
+  setDisplayAnnotations(displayAnnotations) {}
+
+  /**
+   * @param {boolean} enableTwoUpView
+   * @abstract
+   */
   setTwoUpView(enableTwoUpView) {}
 
   /** Triggers printing of the current document. */
@@ -264,6 +273,14 @@
   }
 
   /** @override */
+  setDisplayAnnotations(displayAnnotations) {
+    this.postMessage_({
+      type: 'displayAnnotations',
+      display: displayAnnotations,
+    });
+  }
+
+  /** @override */
   setTwoUpView(enableTwoUpView) {
     this.postMessage_({
       type: 'setTwoUpView',
diff --git a/chrome/browser/resources/pdf/elements/shared-css.html b/chrome/browser/resources/pdf/elements/shared-css.html
index e5d605d..d4ea432 100644
--- a/chrome/browser/resources/pdf/elements/shared-css.html
+++ b/chrome/browser/resources/pdf/elements/shared-css.html
@@ -21,6 +21,8 @@
         --cr-primary-text-color: var(--google-grey-200);
         --cr-menu-background-focus-color: rgba(var(--google-grey-800-rgb), .6);
         --cr-menu-background-sheen: rgba(255, 255, 255, .06);
+        --cr-separator-line: var(--cr-separator-height) solid
+            rgba(255, 255, 255, .1);
       }
 
   </style>
diff --git a/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.html b/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.html
index c5efbd60..5ef4718 100644
--- a/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.html
+++ b/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.html
@@ -130,6 +130,10 @@
     margin-inline-end: 12px;
     width: 16px;
   }
+
+  #show-annotations-button {
+    border-top: var(--cr-separator-line);
+  }
 </style>
 <!-- TODO(dpapad): Add aria-label and title for all buttons -->
 <div id="toolbar">
@@ -204,6 +208,14 @@
     </span>
     $i18n{twoUpViewEnable}
   </button>
+
+  <button id="show-annotations-button"
+      class="dropdown-item" on-click="onShowAnnotationsClick_">
+    <span class="check-container">
+      <iron-icon icon="pdf:check" hidden="[[!displayAnnotations_]]"></iron-icon>
+    </span>
+    $i18n{annotationsShowToggle}
+  </button>
 </cr-action-menu>
 
 <if expr="chromeos">
diff --git a/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.js b/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.js
index b598f9d..2d1e3bd 100644
--- a/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.js
+++ b/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.js
@@ -5,6 +5,7 @@
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
 import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
 import './icons.js';
 // <if expr="chromeos">
@@ -71,7 +72,6 @@
         observer: 'viewportZoomChanged_',
       },
 
-      /** @private {boolean} */
       twoUpViewEnabled_: Boolean,
 
       fittingType_: Number,
@@ -103,6 +103,9 @@
     this.loading_ = true;
 
     /** @private {boolean} */
+    this.displayAnnotations_ = true;
+
+    /** @private {boolean} */
     this.twoUpViewEnabled_ = false;
 
     /** @private {?number} */
@@ -166,6 +169,13 @@
   }
 
   /** @private */
+  onShowAnnotationsClick_() {
+    this.displayAnnotations_ = !this.displayAnnotations_;
+    this.dispatchEvent(new CustomEvent(
+        'display-annotations-changed', {detail: this.displayAnnotations_}));
+  }
+
+  /** @private */
   onSinglePageViewClick_() {
     this.twoUpViewEnabled_ = false;
     this.dispatchEvent(new CustomEvent(
diff --git a/chrome/browser/resources/pdf/ink_controller.js b/chrome/browser/resources/pdf/ink_controller.js
index 4eae9a6..02e10ae 100644
--- a/chrome/browser/resources/pdf/ink_controller.js
+++ b/chrome/browser/resources/pdf/ink_controller.js
@@ -78,6 +78,9 @@
   }
 
   /** @override */
+  setDisplayAnnotations(displayAnnotations) {}
+
+  /** @override */
   setTwoUpView(enableTwoUpView) {
     // TODO(dstockwell): Implement two up view.
   }
diff --git a/chrome/browser/resources/pdf/pdf_viewer.html b/chrome/browser/resources/pdf/pdf_viewer.html
index 799e1d44..a58fd63 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.html
+++ b/chrome/browser/resources/pdf/pdf_viewer.html
@@ -119,6 +119,7 @@
     pdf-annotations-enabled="[[pdfAnnotationsEnabled_]]"
 </if>
     on-change-page="onChangePage_"
+    on-display-annotations-changed="onDisplayAnnotationsChanged_"
     on-dropdown-opened="onDropdownOpened_"
     on-fit-to-changed="onFitToChanged" on-zoom-in="onZoomIn"
     on-sidenav-toggle-click="onSidenavToggleClick_"
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js
index 60d607e8..618394b 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -530,6 +530,14 @@
    * @param {!Event} e
    * @private
    */
+  onDisplayAnnotationsChanged_(e) {
+    this.currentController.setDisplayAnnotations(e.detail);
+  }
+
+  /**
+   * @param {!Event} e
+   * @private
+   */
   onScroll_(e) {
     this.pluginController.updateScroll(e.target.scrollLeft, e.target.scrollTop);
   }
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.html b/chrome/browser/resources/settings/a11y_page/a11y_page.html
index 41a1cee..1388671 100644
--- a/chrome/browser/resources/settings/a11y_page/a11y_page.html
+++ b/chrome/browser/resources/settings/a11y_page/a11y_page.html
@@ -14,6 +14,14 @@
             on-click="onCaptionsClick_"
             external$="[[captionSettingsOpensExternally_]]">
         </cr-link-row>
+        <template is="dom-if" if="[[enableLiveCaption_]]">
+          <settings-toggle-button
+              pref="{{prefs.accessibility.captions.live_caption_enabled}}"
+              on-change="onA11yLiveCaptionChange_"
+              label="$i18n{captionsEnableLiveCaptionTitle}"
+              sub-label="[[enableLiveCaptionSubtitle_]]">
+          </settings-toggle-button>
+        </template>
         <settings-toggle-button
             class="hr"
             hidden$="[[!showFocusHighlightOption_]]"
@@ -22,20 +30,19 @@
         </settings-toggle-button>
         <settings-toggle-button
             class="hr"
+            pref="{{prefs.settings.a11y.caretbrowsing.enabled}}"
+            on-change="onA11yCaretBrowsingChange_"
+            label="$i18n{caretBrowsingTitle}"
+            sub-label="$i18n{caretBrowsingSubtitle}">
+        </settings-toggle-button>
+        <settings-toggle-button
+            class="hr"
             hidden$="[[!showAccessibilityLabelsSetting_]]"
             pref="{{prefs.settings.a11y.enable_accessibility_image_labels}}"
             on-change="onA11yImageLabelsChange_"
             label="$i18n{accessibleImageLabelsTitle}"
             sub-label="$i18n{accessibleImageLabelsSubtitle}">
         </settings-toggle-button>
-        <template is="dom-if" if="[[enableLiveCaption_]]">
-          <settings-toggle-button
-              pref="{{prefs.accessibility.captions.live_caption_enabled}}"
-              on-change="onA11yLiveCaptionChange_"
-              label="$i18n{captionsEnableLiveCaptionTitle}"
-              sub-label="$i18n{captionsEnableLiveCaptionSubtitle}">
-          </settings-toggle-button>
-        </template>
 </if>
         <cr-link-row class="hr" label="$i18n{moreFeaturesLink}"
             on-click="onMoreFeaturesLinkClick_" sub-label="$i18n{a11yWebStore}"
diff --git a/chrome/browser/resources/settings/a11y_page/a11y_page.js b/chrome/browser/resources/settings/a11y_page/a11y_page.js
index 0b8c7789..44955aa 100644
--- a/chrome/browser/resources/settings/a11y_page/a11y_page.js
+++ b/chrome/browser/resources/settings/a11y_page/a11y_page.js
@@ -64,6 +64,17 @@
     },
 
     /**
+     * The subtitle to display under the Live Caption heading. Generally, this
+     * is a generic subtitle describing the feature. While the SODA model is
+     * being downloading, this displays the download progress.
+     * @private
+     */
+    enableLiveCaptionSubtitle_: {
+      type: String,
+      value: loadTimeData.getString('captionsEnableLiveCaptionSubtitle'),
+    },
+
+    /**
      * Whether to show the focus highlight setting.
      * Depends on feature flag for focus highlight.
      * @private {boolean}
@@ -122,7 +133,15 @@
     this.addWebUIListener(
         'screen-reader-state-changed',
         this.onScreenReaderStateChanged_.bind(this));
-    chrome.send('getScreenReaderState');
+
+    // <if expr="not chromeos">
+    this.addWebUIListener(
+        'enable-live-caption-subtitle-changed',
+        this.onEnableLiveCaptionSubtitleChanged_.bind(this));
+    // </if>
+
+    // Enables javascript and gets the screen reader state.
+    chrome.send('a11yPageReady');
   },
 
   /**
@@ -139,6 +158,20 @@
    * @private
    * @param {!Event} event
    */
+  onA11yCaretBrowsingChange_(event) {
+    if (event.target.checked) {
+      chrome.metricsPrivate.recordUserAction(
+          'Accessibility.CaretBrowsing.EnableWithSettings');
+    } else {
+      chrome.metricsPrivate.recordUserAction(
+          'Accessibility.CaretBrowsing.DisableWithSettings');
+    }
+  },
+
+  /**
+   * @private
+   * @param {!Event} event
+   */
   onA11yImageLabelsChange_(event) {
     const a11yImageLabelsOn = event.target.checked;
     if (a11yImageLabelsOn) {
@@ -156,6 +189,15 @@
     chrome.metricsPrivate.recordBoolean(
         'Accessibility.LiveCaption.ToggleEnabled', a11yLiveCaptionOn);
   },
+
+  /**
+   * @private
+   * @param {!string} enableLiveCaptionSubtitle The message sent from the webui
+   *     to be displayed as a subtitle to Live Captions.
+   */
+  onEnableLiveCaptionSubtitleChanged_(enableLiveCaptionSubtitle) {
+    this.enableLiveCaptionSubtitle_ = enableLiveCaptionSubtitle;
+  },
   // </if>
 
   // <if expr="chromeos">
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
index 77e28c5..97b792b 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
@@ -80,7 +80,9 @@
     this.addWebUIListener(
         'screen-reader-state-changed',
         this.onScreenReaderStateChanged_.bind(this));
-    chrome.send('getScreenReaderState');
+
+    // Enables javascript and gets the screen reader state.
+    chrome.send('a11yPageReady');
   },
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.js b/chrome/browser/resources/settings/chromeos/os_settings.js
index 90adcc82..374c2277 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings.js
@@ -17,18 +17,16 @@
 import './os_people_page/account_manager.m.js';
 import './os_people_page/kerberos_accounts.m.js';
 
-// clang-format off
-export {AmbientModeBrowserProxyImpl} from './ambient_mode_page/ambient_mode_browser_proxy.m.js';
-export {CrSettingsPrefs} from '../prefs/prefs_types.m.js';
-export {AccountManagerBrowserProxy,AccountManagerBrowserProxyImpl} from '../people_page/account_manager_browser_proxy.m.js';
 export {LifetimeBrowserProxy, LifetimeBrowserProxyImpl} from '../lifetime_browser_proxy.m.js';
-export {bluetoothApis} from './bluetooth_page/bluetooth_page.m.js';
-export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.m.js';
-export {MultiDeviceSettingsMode, MultiDeviceFeature, MultiDeviceFeatureState, MultiDevicePageContentData, SmartLockSignInEnabledState} from './multidevice_page/multidevice_constants.m.js';
-export {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_page/multidevice_browser_proxy.m.js';
-export {KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode,KerberosErrorType} from './os_people_page/kerberos_accounts_browser_proxy.m.js';
+export {AccountManagerBrowserProxy, AccountManagerBrowserProxyImpl} from '../people_page/account_manager_browser_proxy.m.js';
+export {CrSettingsPrefs} from '../prefs/prefs_types.m.js';
 export {Route, Router} from '../router.m.js';
+export {AmbientModeBrowserProxyImpl} from './ambient_mode_page/ambient_mode_browser_proxy.m.js';
+export {bluetoothApis} from './bluetooth_page/bluetooth_page.m.js';
+export {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_page/multidevice_browser_proxy.m.js';
+export {MultiDeviceFeature, MultiDeviceFeatureState, MultiDevicePageContentData, MultiDeviceSettingsMode, SmartLockSignInEnabledState} from './multidevice_page/multidevice_constants.m.js';
+export {KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode, KerberosErrorType} from './os_people_page/kerberos_accounts_browser_proxy.m.js';
+export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.m.js';
 export {routes} from './os_route.m.js';
+export {ChangePictureBrowserProxy, ChangePictureBrowserProxyImpl} from './personalization_page/change_picture_browser_proxy.m.js';
 export {WallpaperBrowserProxyImpl} from './personalization_page/wallpaper_browser_proxy.m.js';
-export {ChangePictureBrowserProxy,ChangePictureBrowserProxyImpl} from './personalization_page/change_picture_browser_proxy.m.js';
-// clang-format on
diff --git a/chrome/browser/safe_browsing/dm_token_utils.cc b/chrome/browser/safe_browsing/dm_token_utils.cc
index caf3d7b1..5647350a3 100644
--- a/chrome/browser/safe_browsing/dm_token_utils.cc
+++ b/chrome/browser/safe_browsing/dm_token_utils.cc
@@ -13,9 +13,9 @@
 #include "components/user_manager/user.h"
 #else
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 #endif
 
 namespace safe_browsing {
diff --git a/chrome/browser/ssl/ssl_config_service_manager_pref.cc b/chrome/browser/ssl/ssl_config_service_manager_pref.cc
index 4cc8f907..b9d9f40b 100644
--- a/chrome/browser/ssl/ssl_config_service_manager_pref.cc
+++ b/chrome/browser/ssl/ssl_config_service_manager_pref.cc
@@ -152,7 +152,6 @@
   // The local_state prefs.
   BooleanPrefMember rev_checking_enabled_;
   BooleanPrefMember rev_checking_required_local_anchors_;
-  BooleanPrefMember tls13_hardening_for_local_anchors_enabled_;
   StringPrefMember ssl_version_min_;
   StringPrefMember ssl_version_max_;
   StringListPrefMember h2_client_cert_coalescing_host_patterns_;
@@ -169,11 +168,6 @@
     PrefService* local_state) {
   DCHECK(local_state);
 
-  local_state->SetDefaultPrefValue(
-      prefs::kTLS13HardeningForLocalAnchorsEnabled,
-      base::Value(base::FeatureList::IsEnabled(
-          features::kTLS13HardeningForLocalAnchors)));
-
   PrefChangeRegistrar::NamedChangeCallback local_state_callback =
       base::BindRepeating(&SSLConfigServiceManagerPref::OnPreferenceChanged,
                           base::Unretained(this), local_state);
@@ -183,9 +177,6 @@
   rev_checking_required_local_anchors_.Init(
       prefs::kCertRevocationCheckingRequiredLocalAnchors, local_state,
       local_state_callback);
-  tls13_hardening_for_local_anchors_enabled_.Init(
-      prefs::kTLS13HardeningForLocalAnchorsEnabled, local_state,
-      local_state_callback);
   ssl_version_min_.Init(prefs::kSSLVersionMin, local_state,
                         local_state_callback);
   ssl_version_max_.Init(prefs::kSSLVersionMax, local_state,
@@ -210,9 +201,6 @@
       prefs::kCertRevocationCheckingRequiredLocalAnchors,
       default_verifier_config.require_rev_checking_local_anchors);
   net::SSLContextConfig default_context_config;
-  registry->RegisterBooleanPref(
-      prefs::kTLS13HardeningForLocalAnchorsEnabled,
-      default_context_config.tls13_hardening_for_local_anchors_enabled);
   registry->RegisterStringPref(prefs::kSSLVersionMin, std::string());
   registry->RegisterStringPref(prefs::kSSLVersionMax, std::string());
   registry->RegisterListPref(prefs::kCipherSuiteBlacklist);
@@ -261,8 +249,6 @@
     config->rev_checking_enabled = false;
   config->rev_checking_required_local_anchors =
       rev_checking_required_local_anchors_.GetValue();
-  config->tls13_hardening_for_local_anchors_enabled =
-      tls13_hardening_for_local_anchors_enabled_.GetValue();
   std::string version_min_str = ssl_version_min_.GetValue();
   std::string version_max_str = ssl_version_max_.GetValue();
 
diff --git a/chrome/browser/ssl/ssl_config_service_manager_pref_unittest.cc b/chrome/browser/ssl/ssl_config_service_manager_pref_unittest.cc
index f39c09f..ea1eb05 100644
--- a/chrome/browser/ssl/ssl_config_service_manager_pref_unittest.cc
+++ b/chrome/browser/ssl/ssl_config_service_manager_pref_unittest.cc
@@ -305,57 +305,3 @@
 
   EXPECT_TRUE(observed_configs_[0]->rev_checking_required_local_anchors);
 }
-
-// Tests that the TLS 1.3 hardening pref correctly interacts with the feature
-// flag.
-TEST_F(SSLConfigServiceManagerPrefTest, TLS13HardeningForLocalAnchorsDisabled) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(features::kTLS13HardeningForLocalAnchors);
-
-  TestingPrefServiceSimple local_state;
-  SSLConfigServiceManager::RegisterPrefs(local_state.registry());
-
-  std::unique_ptr<SSLConfigServiceManager> config_manager =
-      SetUpConfigServiceManager(&local_state);
-
-  // With the feature disabled, the hardening is disabled by default.
-  EXPECT_FALSE(initial_config_->tls13_hardening_for_local_anchors_enabled);
-
-  // It can be enabled via preference.
-  local_state.SetUserPref(prefs::kTLS13HardeningForLocalAnchorsEnabled,
-                          std::make_unique<base::Value>(true));
-  ASSERT_NO_FATAL_FAILURE(WaitForUpdate());
-  EXPECT_TRUE(observed_configs_[0]->tls13_hardening_for_local_anchors_enabled);
-
-  // It can then be disabled again.
-  local_state.SetUserPref(prefs::kTLS13HardeningForLocalAnchorsEnabled,
-                          std::make_unique<base::Value>(false));
-  ASSERT_NO_FATAL_FAILURE(WaitForUpdate());
-  EXPECT_FALSE(observed_configs_[1]->tls13_hardening_for_local_anchors_enabled);
-}
-
-// Tests that the TLS 1.3 hardening pref correctly sets the corresponding value
-// in SSL configs.
-TEST_F(SSLConfigServiceManagerPrefTest,
-       TLS13HardeningForLocalAnchorsFeatureEnabled) {
-  TestingPrefServiceSimple local_state;
-  SSLConfigServiceManager::RegisterPrefs(local_state.registry());
-
-  std::unique_ptr<SSLConfigServiceManager> config_manager =
-      SetUpConfigServiceManager(&local_state);
-
-  // The hardening is enabled by default.
-  EXPECT_TRUE(initial_config_->tls13_hardening_for_local_anchors_enabled);
-
-  // It can be disabled via preferences.
-  local_state.SetUserPref(prefs::kTLS13HardeningForLocalAnchorsEnabled,
-                          std::make_unique<base::Value>(false));
-  ASSERT_NO_FATAL_FAILURE(WaitForUpdate());
-  EXPECT_FALSE(observed_configs_[0]->tls13_hardening_for_local_anchors_enabled);
-
-  // It can then be enabled again.
-  local_state.SetUserPref(prefs::kTLS13HardeningForLocalAnchorsEnabled,
-                          std::make_unique<base::Value>(true));
-  ASSERT_NO_FATAL_FAILURE(WaitForUpdate());
-  EXPECT_TRUE(observed_configs_[1]->tls13_hardening_for_local_anchors_enabled);
-}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
index 124f9927..d16f6bc 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -165,12 +165,6 @@
     Integer getLaunchTypeAtInitialTabCreation();
 
     /**
-     * @return the last time this tab was shown or the time of its initialization if it wasn't yet
-     *         shown.
-     */
-    long getTimestampMillis();
-
-    /**
      * @return {@code true} if the Tab is in incognito mode.
      */
     boolean isIncognito();
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
index fd6e4b7..32fb1e2 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -31,6 +31,7 @@
             CriticalPersistedTabData.class;
 
     private static final int UNSPECIFIED_THEME_COLOR = Color.TRANSPARENT;
+    private static final long INVALID_TIMESTAMP = -1;
 
     private int mParentId;
     private int mRootId;
@@ -140,7 +141,7 @@
         // CriticalPersistedTabData is initialized with default values
         CriticalPersistedTabData criticalPersistedTabData =
                 new CriticalPersistedTabData(tab, Tab.INVALID_TAB_ID, tab.getId(),
-                        tab.getTimestampMillis(), null, -1, "", UNSPECIFIED_THEME_COLOR,
+                        INVALID_TIMESTAMP, null, -1, "", UNSPECIFIED_THEME_COLOR,
                         tab.getLaunchTypeAtInitialTabCreation() == null
                                 ? TabLaunchType.FROM_LINK
                                 : tab.getLaunchTypeAtInitialTabCreation(),
@@ -336,6 +337,14 @@
     }
 
     /**
+     * set the timetsamp
+     * @param timestamp the timestamp
+     */
+    public void setTimestampMillis(long timestamp) {
+        mTimestampMillis = timestamp;
+    }
+
+    /**
      * @return content state bytes for the {@link Tab}
      */
     public WebContentsState getWebContentsState() {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 97fe5ec2ac..d55ba84 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1349,6 +1349,8 @@
       "webui/new_tab_page/new_tab_page_handler.h",
       "webui/new_tab_page/new_tab_page_ui.cc",
       "webui/new_tab_page/new_tab_page_ui.h",
+      "webui/new_tab_page/promo_browser_command/promo_browser_command_handler.cc",
+      "webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h",
       "webui/new_tab_page/untrusted_source.cc",
       "webui/new_tab_page/untrusted_source.h",
       "webui/ntp/app_icon_webui_handler.cc",
@@ -1491,6 +1493,7 @@
       "//chrome/browser/nearby_sharing/logging:util",
       "//chrome/browser/nearby_sharing/proto",
       "//chrome/browser/profile_resetter:profile_reset_report_proto",
+      "//chrome/browser/promo_browser_command:mojo_bindings",
       "//chrome/browser/resource_coordinator:tab_metrics_event_proto",
       "//chrome/browser/resource_coordinator/tab_ranker",
       "//chrome/browser/safe_browsing:advanced_protection",
@@ -3206,6 +3209,8 @@
       "views/accessibility/caption_bubble_controller_views.h",
       "views/accessibility/caption_bubble_model.cc",
       "views/accessibility/caption_bubble_model.h",
+      "views/accessibility/caret_browsing_dialog_delegate.cc",
+      "views/accessibility/caret_browsing_dialog_delegate.h",
       "views/accessibility/invert_bubble_view.cc",
       "views/accessibility/invert_bubble_view.h",
       "views/accessibility/non_accessible_image_view.cc",
@@ -3379,12 +3384,16 @@
       "views/extensions/extensions_toolbar_button.h",
       "views/extensions/extensions_toolbar_container.cc",
       "views/extensions/extensions_toolbar_container.h",
+      "views/feature_promos/feature_promo_bubble_params.cc",
+      "views/feature_promos/feature_promo_bubble_params.h",
       "views/feature_promos/feature_promo_bubble_timeout.cc",
       "views/feature_promos/feature_promo_bubble_timeout.h",
       "views/feature_promos/feature_promo_bubble_view.cc",
       "views/feature_promos/feature_promo_bubble_view.h",
       "views/feature_promos/feature_promo_colors.cc",
       "views/feature_promos/feature_promo_colors.h",
+      "views/feature_promos/feature_promo_controller.cc",
+      "views/feature_promos/feature_promo_controller.h",
       "views/feature_promos/global_media_controls_promo_controller.cc",
       "views/feature_promos/global_media_controls_promo_controller.h",
       "views/feature_promos/reopen_tab_promo_controller.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index fb921c7..7cdf2a6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">النقر على الكلمة للبحث عنها فورًا أو الاطلاع على الإجراءات ذات الصلة</translation>
 <translation id="2760989362628427051">تفعيل المظهر الداكن عند تفعيل المظهر الداكن للجهاز أو ميزة "توفير شحن البطارية"</translation>
 <translation id="2762000892062317888">الآن</translation>
+<translation id="2771869497727323769">يتعذَّر إنشاء رابط للنص. يمكنك مشاركة رابط الصفحة في تطبيق.</translation>
 <translation id="2777555524387840389">عدد الثواني المتبقية: <ph name="SECONDS" /></translation>
 <translation id="2779651927720337254">تعذَّر التنزيل</translation>
 <translation id="2781151931089541271">يتبقى ثانية واحدة</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">تحديث</translation>
 <translation id="4738836084190194332">آخر مزامنة: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">‏خطأ TWA: <ph name="ERROR_CODE" /> في <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">فتح علامة تبويب جديدة</translation>
 <translation id="4759238208242260848">الملفات التي تم تنزيلها</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{اكتملت عملية تنزيل واحدة.}zero{اكتملت # عملية تنزيل.}two{اكتملت عمليتا تنزيل (#).}few{اكتملت # عمليات تنزيل.}many{اكتملت # عملية تنزيل.}other{اكتملت # عملية تنزيل.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">الخصوصية</translation>
 <translation id="5087580092889165836">إضافة بطاقة</translation>
 <translation id="509429900233858213">حدث خطأ.</translation>
+<translation id="5100748015044654621">يمكنك مشاركة رابط للنص المحدَّد في تطبيق.</translation>
 <translation id="510275257476243843">يتبقى ساعة واحدة</translation>
 <translation id="5123685120097942451">علامة تبويب "التصفُّح المتخفي"</translation>
 <translation id="5127805178023152808">المزامنة غير مفعّلة</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">ستظهر هنا كلمات المرور المحفوظة.</translation>
 <translation id="8569404424186215731">منذ <ph name="DATE" /></translation>
 <translation id="8571213806525832805">الأسابيع الـ4 الأخيرة</translation>
+<translation id="8572344201470131220">تم نسخ الصورة.</translation>
 <translation id="8583805026567836021">محو بيانات الحساب</translation>
 <translation id="860043288473659153">اسم حامل البطاقة</translation>
 <translation id="8616006591992756292">‏قد يتضمّن حسابك على Google نماذج أخرى من سجلّ التصفّح في <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">استخدام الهاتف كمفتاح أمان</translation>
 <translation id="8990209962746788689">يتعذّر إنشاء رمز الاستجابة السريعة.</translation>
 <translation id="8993760627012879038">فتح علامة تبويب جديدة في وضع التصفّح المتخفّي</translation>
+<translation id="8996847606757455498">اختيار مقدِّم خدمة آخر</translation>
 <translation id="8998729206196772491">‏يتم تسجيل دخولك باستخدام حساب تتم إدارته من خلال <ph name="MANAGED_DOMAIN" /> ومنح مشرفه الحق في التحكم في بياناتك على Chrome. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي الخروج من Chrome إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزَّنة على حسابك في Google.</translation>
 <translation id="9028914725102941583">تفعيل المزامنة لمشاركة المحتوى مع جهاز آخر</translation>
 <translation id="9040142327097499898">الإشعارات مسموح بها. وتحديد الموقع الجغرافي متوقف لهذا الجهاز.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
index b6dd12bc..fcb014b1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Dərhal axtarmaq və əlaqədar fəaliyyətə baxmaq üçün söz yazın</translation>
 <translation id="2760989362628427051">Cihazın tünd tema və ya Enerjiyə Qənaət rejimi aktiv olduqda tünd temanı aktiv edin</translation>
 <translation id="2762000892062317888">indicə</translation>
+<translation id="2771869497727323769">Mətnə keçid yaratmaq olmur. Tətbiqdə səhifəyə keçidi paylaşın.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> saniyə qaldı</translation>
 <translation id="2779651927720337254">alınmadı</translation>
 <translation id="2781151931089541271">1 saniyə qaldı</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stellaj Açıcı</translation>
 <translation id="473775607612524610">Güncəlləşdirin</translation>
 <translation id="4738836084190194332">Sonuncu dəfə sinxronizasiya olunub: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA xətası: <ph name="VIOLATED_URL" /> bölməsində <ph name="ERROR_CODE" /></translation>
 <translation id="4749960740855309258">Yeni panel açın</translation>
 <translation id="4759238208242260848">Endirmələr</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 endirmə tamamlandı.}other{# endirmə tamamlandı.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Məxfilik</translation>
 <translation id="5087580092889165836">Kart əlavə edin</translation>
 <translation id="509429900233858213">Xəta baş verdi.</translation>
+<translation id="5100748015044654621">Tətbiqdə vurğulanmış mətnə keçidi paylaşın</translation>
 <translation id="510275257476243843">1 saat qaldı</translation>
 <translation id="5123685120097942451">Aanonim tab</translation>
 <translation id="5127805178023152808">Sinx deaktivdir</translation>
@@ -973,6 +976,7 @@
 <translation id="8562452229998620586">Saxlanmış parollar burada görünəcək.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> tarixindən etibarən</translation>
 <translation id="8571213806525832805">Son 4 həftə</translation>
+<translation id="8572344201470131220">Şəkil Kopyalanıb</translation>
 <translation id="8583805026567836021">Hesab datası silinir</translation>
 <translation id="860043288473659153">Kart sahibinin adı</translation>
 <translation id="8616006591992756292"><ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> linkində Google Hesabına məxsus axtarış tarixçəsinin başqa formaları ola bilər.</translation>
@@ -1015,6 +1019,7 @@
 <translation id="8988028529677883095">Təhlükəsizlik açarı kimi telefondan istifadə edin</translation>
 <translation id="8990209962746788689">QR kod yaratmaq olmur</translation>
 <translation id="8993760627012879038">Incognito rejimində yeni panel açın</translation>
+<translation id="8996847606757455498">Başqa provayder seçin</translation>
 <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> tərəfindən idarə olunan hesab ilə daxil olursunuz və onun administratoruna Chrome datanız üzərində nəzarəti verirsiniz. Datanız həmişəlik bu hesab ilə əlaqələndiriləcək. Chrome'dan çıxmaq datanızı bu cihazdan siləcək, lakin data Google Hesabında qalacaq.</translation>
 <translation id="9028914725102941583">Cihazlar arasında paylaşım etmək üçün sinxronizasiyanı aktiv edin</translation>
 <translation id="9040142327097499898">Bildirişlərə icazə verilib. Bu cihazın məkanı deaktivdir.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
index dc0593c..7af7a46 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Каб выканаць імгненны пошук або паглядзець звязаныя са словам дзеянні, націсніце на яго</translation>
 <translation id="2760989362628427051">Выкарыстоўваць цёмную тэму, калі на прыладзе ўключаны рэжым эканоміі зараду або цёмная тэма</translation>
 <translation id="2762000892062317888">толькі што</translation>
+<translation id="2771869497727323769">Не ўдалося стварыць спасылку на тэкст. Абагульце спасылку на старонку ў праграме.</translation>
 <translation id="2777555524387840389">Засталося <ph name="SECONDS" /> с</translation>
 <translation id="2779651927720337254">не выканана</translation>
 <translation id="2781151931089541271">Засталася 1 секунда</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Размотчык стэка</translation>
 <translation id="473775607612524610">Абнавіць</translation>
 <translation id="4738836084190194332">Апошняя сінхранізацыя: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Памылка TWA: <ph name="ERROR_CODE" /> на старонцы <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Адкрыць новую ўкладку</translation>
 <translation id="4759238208242260848">Спампоўкі</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 спампоўка завершана.}one{# спампоўка завершана.}few{# спампоўкі завершана.}many{# спамповак завершана.}other{# спампоўкі завершана.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Прыватнасць</translation>
 <translation id="5087580092889165836">Дадаць картку</translation>
 <translation id="509429900233858213">Адбылася памылка.</translation>
+<translation id="5100748015044654621">Абагульце спасылку на вылучаны тэкст у праграме</translation>
 <translation id="510275257476243843">Засталася 1 гадзіна</translation>
 <translation id="5123685120097942451">Укладка інкогніта</translation>
 <translation id="5127805178023152808">Сінхранізацыя выключана</translation>
@@ -706,7 +709,7 @@
 <translation id="6532866250404780454">Не будуць паказвацца сайты, наведаныя вамі ў Chrome. Усе таймеры сайтаў будуць выдалены.</translation>
 <translation id="6534565668554028783">Чаканне адказу ад Google заняло занадта шмат часу</translation>
 <translation id="6539092367496845964">Нешта пайшло не так. Паўтарыце спробу пазней.</translation>
-<translation id="6541983376925655882">{NUM_HOURS,plural, =1{Праверка праводзілася дзень таму}one{Праверка праводзілася # дзень таму}few{Праверка праводзілася # дні таму}many{Праверка праводзілася # дзён таму}other{Праверка праводзілася # дня таму}}</translation>
+<translation id="6541983376925655882">{NUM_HOURS,plural, =1{Праверка праводзілася гадзіну таму}one{Праверка праводзілася # гадзіну таму}few{Праверка праводзілася # гадзіны таму}many{Праверка праводзілася # гадзін таму}other{Праверка праводзілася # гадзіны таму}}</translation>
 <translation id="6545017243486555795">Ачысціць усе даныя</translation>
 <translation id="6560414384669816528">Пошук праз Sogou</translation>
 <translation id="656065428026159829">Яшчэ</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Захаваныя паролі з'явяцца тут.</translation>
 <translation id="8569404424186215731">з <ph name="DATE" /></translation>
 <translation id="8571213806525832805">За апошнія 4 тыдні</translation>
+<translation id="8572344201470131220">Відарыс скапіраваны</translation>
 <translation id="8583805026567836021">Ідзе выдаленне даных уліковага запісу</translation>
 <translation id="860043288473659153">Імя ўладальніка карткі</translation>
 <translation id="8616006591992756292">На старонцы <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> могуць размяшчацца іншыя формы гісторыі прагляду сайтаў для вашага Уліковага запісу Google.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Выкарыстоўваць тэлефон як ключ бяспекі</translation>
 <translation id="8990209962746788689">Не ўдалося стварыць QR-код</translation>
 <translation id="8993760627012879038">Адкрыць новую ўкладку ў рэжыме інкогніта</translation>
+<translation id="8996847606757455498">Выбраць іншага пастаўшчыка</translation>
 <translation id="8998729206196772491">Вы ўваходзіце праз уліковы запіс, які кіруецца даменам <ph name="MANAGED_DOMAIN" />, што дае адміністратару кантроль над вашымі данымі з браўзера Chrome. Вашы даныя будуць назаўсёды прывязаны да гэтага ўліковага запісу. Калі выйсці з браўзера Chrome, вашы даныя будуць выдалены з гэтай прылады, але застануцца ва Уліковым запісе Google.</translation>
 <translation id="9028914725102941583">Каб абагульваць файлы паміж прыладамі, уключыце сінхранізацыю</translation>
 <translation id="9040142327097499898">Апавяшчэнні дазволены. Вызначэнне месцазнаходжання для гэтай прылады выключана.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
index 324637230..1712d99 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Klepnutím na slovo můžete okamžitě vyhledávat nebo zobrazit související akce</translation>
 <translation id="2760989362628427051">Zapnout tmavý motiv, když je na zařízení zapnutý tmavý motiv nebo spořič baterie</translation>
 <translation id="2762000892062317888">právě teď</translation>
+<translation id="2771869497727323769">Odkaz na text nelze vytvořit. Odkaz na stránku sdílejte v aplikaci.</translation>
 <translation id="2777555524387840389">Zbývá: <ph name="SECONDS" /> s</translation>
 <translation id="2779651927720337254">nezdařilo se</translation>
 <translation id="2781151931089541271">Zbývá: 1 s</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Rozbalovač zásobníku</translation>
 <translation id="473775607612524610">Aktualizovat</translation>
 <translation id="4738836084190194332">Poslední synchronizace: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Chyba TWA: <ph name="ERROR_CODE" /> na adrese <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Otevření nové karty</translation>
 <translation id="4759238208242260848">Stažené soubory</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{Stažení 1 souboru bylo dokončeno.}few{Stažení # souborů bylo dokončeno.}many{Stažení # souboru bylo dokončeno.}other{Stažení # souborů bylo dokončeno.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Ochrana soukromí</translation>
 <translation id="5087580092889165836">Přidat kartu</translation>
 <translation id="509429900233858213">Došlo k chybě.</translation>
+<translation id="5100748015044654621">Odkaz na zvýrazněný text sdílejte v aplikaci</translation>
 <translation id="510275257476243843">Zbývá: 1 h</translation>
 <translation id="5123685120097942451">Anonymní karta</translation>
 <translation id="5127805178023152808">Synchronizace je vypnuta</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Zde se zobrazí uložená hesla.</translation>
 <translation id="8569404424186215731">od <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Poslední 4 týdny</translation>
+<translation id="8572344201470131220">Obrázek byl zkopírován</translation>
 <translation id="8583805026567836021">Mazání dat účtu</translation>
 <translation id="860043288473659153">Jméno držitele karty</translation>
 <translation id="8616006591992756292">Na stránce <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Používat telefon jako bezpečnostní klíč</translation>
 <translation id="8990209962746788689">QR kód nelze vytvořit</translation>
 <translation id="8993760627012879038">Otevřít novou kartu v anonymním režimu</translation>
+<translation id="8996847606757455498">Vybrat jiného poskytovatele</translation>
 <translation id="8998729206196772491">Přihlašujete se pomocí účtu spravovaného doménou <ph name="MANAGED_DOMAIN" /> a poskytujete jeho správci kontrolu nad svými daty prohlížeče Chrome. Vaše data budou trvale přidružena k tomuto účtu. Odhlášením z Chromu svá data smažete z tohoto zařízení, ve vašem účtu Google však uložena zůstanou.</translation>
 <translation id="9028914725102941583">Chcete-li umožnit sdílení mezi zařízeními, zapněte synchronizaci</translation>
 <translation id="9040142327097499898">Oznámení jsou povolena. Poloha je v tomto zařízení vypnutá.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index cc97f9dc..dcbcc94a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -104,7 +104,7 @@
 <translation id="1853692000353488670">Ezkutuko moduko fitxa berria</translation>
 <translation id="1856325424225101786">Oinarrizko modua berrezarri nahi duzu?</translation>
 <translation id="1868024384445905608">Chrome-k orain bizkorrago deskargatzen ditu fitxategiak</translation>
-<translation id="1874760110381325409">Google-ko kontuarekin hasiko duzu saioa\n(horrek ez du aktibatuko Chrome-ren Sinkronizazioa).</translation>
+<translation id="1874760110381325409">Google-ko kontuarekin hasiko duzu saioa\n(ez da aktibatuko Chrome-ren Sinkronizazioa).</translation>
 <translation id="1883903952484604915">Nire fitxategiak</translation>
 <translation id="1919950603503897840">Hautatu kontaktuak</translation>
 <translation id="1925021887439448749">Idatzi web-helbide pertsonalizatua</translation>
@@ -777,7 +777,7 @@
 <translation id="7063006564040364415">Ezin izan da sinkronizazio-zerbitzarira konektatu</translation>
 <translation id="7071521146534760487">Kudeatu kontua</translation>
 <translation id="7077143737582773186">SD txartela</translation>
-<translation id="7080806333218412752">URLak Arakatze segurua eginbideari bidaltzen dizkio egiazta ditzan. Gainera, orrien, deskargen, luzapenen jardueren eta sistemaren informazioaren lagin txikiak bidaltzen ditu mehatxu berriak aurkitzen laguntzeko. Saioa hasita daukazunean, datu horiek Google-ko kontuarekin lotzen ditu aldi baterako, Google-ren aplikazioetan babestuta egon zaitezen.</translation>
+<translation id="7080806333218412752">URLak Arakatze segurua eginbideari bidaltzen dizkio egiazta ditzan. Gainera, orrien, deskargen, luzapenetako jardueren eta sistemaren informazioaren lagin txikiak bidaltzen ditu mehatxu berriak aurkitzen laguntzeko. Saioa hasita daukazunean, datu horiek Google-ko kontuarekin lotzen ditu aldi baterako, Google-ren aplikazioetan babestuta egon zaitezen.</translation>
 <translation id="7121362699166175603">Helbide-barrako historia eta osatze automatikoak garbitzen ditu. Google-ko kontuko historia arakatzeko beste modu batzuk aurki zenitzake <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunean.</translation>
 <translation id="7128355412245153445">Ikusi webgune nagusiak eta duela gutxiko istorioak Hasiera botoia sakatzen duzunean</translation>
 <translation id="7138678301420049075">Beste bat</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
index f3217f0..c73d6c7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Mag-tap ng salita upang hanapin agad ito o tingnan ang mga nauugnay na pagkilos</translation>
 <translation id="2760989362628427051">I-on ang madilim na tema kapag naka-on ang madilim na tema o Pangtipid sa Baterya ng iyong device</translation>
 <translation id="2762000892062317888">ngayon lang</translation>
+<translation id="2771869497727323769">Hindi makagawa ng link sa text. Ibahagi sa isang app ang link sa page.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> (na) segundo na lang ang natitira</translation>
 <translation id="2779651927720337254">nabigo</translation>
 <translation id="2781151931089541271">1 segundo na lang ang natitira</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">I-update</translation>
 <translation id="4738836084190194332">Huling na-sync: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Error sa TWA: <ph name="ERROR_CODE" /> sa <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Magbukas ng bagong tab</translation>
 <translation id="4759238208242260848">Mga Download </translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{Tapos na ang 1 pag-download.}one{Tapos na ang # pag-download.}other{Tapos na ang # na pag-download.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Privacy</translation>
 <translation id="5087580092889165836">Magdagdag ng card</translation>
 <translation id="509429900233858213">May naganap na error.</translation>
+<translation id="5100748015044654621">Ibahagi sa isang app ang link sa naka-highlight na text</translation>
 <translation id="510275257476243843">1 oras na lang ang natitira</translation>
 <translation id="5123685120097942451">Tab na incognito</translation>
 <translation id="5127805178023152808">Naka-off ang pag-sync</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Lalabas dito ang mga naka-save na password.</translation>
 <translation id="8569404424186215731">simula noong <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Huling 4 na linggo</translation>
+<translation id="8572344201470131220">Nakopya ang Larawan</translation>
 <translation id="8583805026567836021">Kini-clear ang data ng account</translation>
 <translation id="860043288473659153">Pangalan ng cardholder</translation>
 <translation id="8616006591992756292">Maaaring may iba pang anyo ng history ng pag-browse ang iyong Google Account sa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Gamitin ang telepono bilang security key</translation>
 <translation id="8990209962746788689">Hindi magawa ang QR code</translation>
 <translation id="8993760627012879038">Magbukas ng bagong tab sa Incognito mode</translation>
+<translation id="8996847606757455498">Pumili ng ibang provider</translation>
 <translation id="8998729206196772491">Nagsa-sign in ka gamit ang isang account na pinamamahalaan ng <ph name="MANAGED_DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chrome. Permanenteng mauugnay ang iyong data sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chrome, ngunit mananatili itong naka-store sa iyong Google Account.</translation>
 <translation id="9028914725102941583">I-on ang pag-sync para makapagbahagi sa mga device</translation>
 <translation id="9040142327097499898">Pinapayagan ang mga notification. Naka-off ang lokasyon para sa device na ito.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
index df860ac..a49db554 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -899,7 +899,7 @@
 <translation id="8027863900915310177">Choisissez l'endroit où enregistrer le téléchargement</translation>
 <translation id="8035133914807600019">Nouveau dossier...</translation>
 <translation id="8037750541064988519">Il reste <ph name="DAYS" /> jours</translation>
-<translation id="8037801708772278989">Dernière vérification : maintenant</translation>
+<translation id="8037801708772278989">Dernière vérification : à l'instant</translation>
 <translation id="804335162455518893">Carte SD introuvable</translation>
 <translation id="805047784848435650">En fonction de votre historique de navigation</translation>
 <translation id="8051695050440594747"><ph name="MEGABYTES" /> Mo disponible(s)</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 a54661c..b9d9244 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
@@ -104,7 +104,7 @@
 <translation id="1853692000353488670">नया गुप्त टैब</translation>
 <translation id="1856325424225101786">लाइट मोड रीसेट करें?</translation>
 <translation id="1868024384445905608">Chrome अब ज़्यादा तेज़ी से फ़ाइलें डाउनलोड करता है</translation>
-<translation id="1874760110381325409">आप अपने Google खाते से साइन इन हो जाएंगे (यह Chrome सिंक की सुविधा को चालू नहीं करता)</translation>
+<translation id="1874760110381325409">आप अपने Google खाते से साइन इन हो जाएंगे\n(इससे Chrome सिंक की सुविधा चालू नहीं होगी)</translation>
 <translation id="1883903952484604915">मेरी फ़ाइलें</translation>
 <translation id="1919950603503897840">संपर्कों को चुनें</translation>
 <translation id="1925021887439448749">पसंद के मुताबिक वेब पता डालें</translation>
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">इंस्टैंट सर्च या मिलती-जुलती कार्रवाई देखने के लिए किसी शब्द पर टैप करें</translation>
 <translation id="2760989362628427051">अपने डिवाइस की गहरे रंग वाली थीम या 'बैटरी सेवर' चालू होने पर गहरे रंग वाली थीम चालू करें</translation>
 <translation id="2762000892062317888">अभी-अभी</translation>
+<translation id="2771869497727323769">हाइलाइट किए गए टेक्स्ट का लिंक नहीं बनाया जा सकता. पेज के लिंक को किसी ऐप्लिकेशन में शेयर करें.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> सेकंड शेष</translation>
 <translation id="2779651927720337254">डाउनलोड नहीं हो सका</translation>
 <translation id="2781151931089541271">1 सेकंड शेष</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">स्टैक अनवाइंडर</translation>
 <translation id="473775607612524610">अपडेट करें</translation>
 <translation id="4738836084190194332">अंतिम बार सिंक किया गया: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA गड़बड़ी: <ph name="VIOLATED_URL" /> में <ph name="ERROR_CODE" /></translation>
 <translation id="4749960740855309258">नया टैब खोलें</translation>
 <translation id="4759238208242260848">डाउनलोड</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 डाउनलोड पूरा हुआ.}one{# डाउनलोड पूरे हुए.}other{# डाउनलोड पूरे हुए.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">निजता</translation>
 <translation id="5087580092889165836">कार्ड जोड़ें</translation>
 <translation id="509429900233858213">कोई गड़बड़ी हुई.</translation>
+<translation id="5100748015044654621">हाइलाइट किए गए टेक्स्ट के लिंक को किसी ऐप्लिकेशन में शेयर करें</translation>
 <translation id="510275257476243843">1 घंटा शेष</translation>
 <translation id="5123685120097942451">गुप्त टैब</translation>
 <translation id="5127805178023152808">समन्वयन बंद है</translation>
@@ -777,7 +780,7 @@
 <translation id="7063006564040364415">समन्‍वयन सर्वर से कनेक्‍ट नहीं किया जा सका.</translation>
 <translation id="7071521146534760487">खाता प्रबंधित करें</translation>
 <translation id="7077143737582773186">SD कार्ड</translation>
-<translation id="7080806333218412752">सुरक्षित ब्राउज़िंग की सेवा को जांच के लिए यूआरएल भेजता है. नए खतरों का पता लगाने के लिए पेज के नमूने, डाउनलोड, एक्सटेंशन की गतिविधि, और सिस्टम की जानकारी भी भेजता है. आपके साइन इन होने पर, थोड़ी देर के लिए इस डेटा को आपके Google खाते से जोड़ता है. ऐसा सभी Google ऐप्लिकेशन पर आपको सुरक्षित रखने के लिए किया जाता है.</translation>
+<translation id="7080806333218412752">जांच करने के लिए, सुरक्षित ब्राउज़िंग की सेवा को यूआरएल भेजता है. नए खतरों का पता लगाने के लिए पेज के नमूने, डाउनलोड, एक्सटेंशन की गतिविधि, और सिस्टम की जानकारी भी भेजता है. आपके साइन इन होने पर, थोड़ी देर के लिए इस डेटा को आपके Google खाते से जोड़ता है. ऐसा सभी Google ऐप्लिकेशन पर आपको सुरक्षित रखने के लिए किया जाता है.</translation>
 <translation id="7121362699166175603">पता बार मेंअपने-आपपूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
 <translation id="7128355412245153445">होम बटन पर टैप करके, अपनी पसंदीदा साइटें और हाल ही की खबरें देखें</translation>
 <translation id="7138678301420049075">अन्य</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">सहेजे गए पासवर्ड यहां दिखाई देंगे.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> से</translation>
 <translation id="8571213806525832805">पिछले चार हफ़्ते</translation>
+<translation id="8572344201470131220">इमेज कॉपी की गई</translation>
 <translation id="8583805026567836021">खाते का डेटा साफ़ हो रहा है</translation>
 <translation id="860043288473659153">कार्डधारक का नाम</translation>
 <translation id="8616006591992756292">आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">फ़ोन को सुरक्षा कुंजी की तरह इस्तेमाल करें</translation>
 <translation id="8990209962746788689">क्यूआर कोड नहीं बन पा रहा है</translation>
 <translation id="8993760627012879038">गुप्त मोड में नया टैब खोलें</translation>
+<translation id="8996847606757455498">सेवा देने वाली कोई और कंपनी चुनें</translation>
 <translation id="8998729206196772491">आप <ph name="MANAGED_DOMAIN" /> से प्रबंधित खाते में साइन इन कर रहे हैं और उसके एडमिन को अपने Chrome डेटा पर नियंत्रण दे रहे हैं. आपका डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. Chrome से साइन आउट करने से आपका डेटा इस डिवाइस से मिट जाएगा, लेकिन वह आपके Google खाते में बना रहेगा.</translation>
 <translation id="9028914725102941583">सभी डिवाइस पर शेयर करने के लिए सिंक की सुविधा चालू करें</translation>
 <translation id="9040142327097499898">सूचनाओं की अनुमति है. इस डिवाइस के लिए स्थान की जानकारी बंद है.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
index e79b792..dbb9f11 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Бірден іздеу үшін сөзді түртіңіз не ұқсас әрекеттерді қараңыз</translation>
 <translation id="2760989362628427051">Құрылғыдағы қараңғы тақырып немесе Battery saver режимі қосылып тұрғанда, қараңғы тақырыпты қосу</translation>
 <translation id="2762000892062317888">жаңа ғана</translation>
+<translation id="2771869497727323769">Мәтіннің сілтемесін жасау мүмкін емес. Қолданбада беттің сілтемесін бөлісіңіз.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> сек қалды</translation>
 <translation id="2779651927720337254">қате шықты</translation>
 <translation id="2781151931089541271">1 сек қалды</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">Жаңарту</translation>
 <translation id="4738836084190194332">Соңғы синхрондалған уақыты: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA қатесі: <ph name="VIOLATED_URL" /> бетінде <ph name="ERROR_CODE" /> қатесі пайда болды.</translation>
 <translation id="4749960740855309258">Жаңа қойынды ашу</translation>
 <translation id="4759238208242260848">Жүктеп алынғандар</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 файл жүктеп алынды.}other{# файл жүктеп алынды.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Құпиялылық</translation>
 <translation id="5087580092889165836">Несие картасын қосу</translation>
 <translation id="509429900233858213">Қате орын алды.</translation>
+<translation id="5100748015044654621">Қолданбада бөлектелген мәтіннің сілтемесін бөлісіңіз.</translation>
 <translation id="510275257476243843">1 сағат қалды</translation>
 <translation id="5123685120097942451">Инкогнито қойындысы</translation>
 <translation id="5127805178023152808">Синхрондау өшірулі</translation>
@@ -777,7 +780,7 @@
 <translation id="7063006564040364415">Синхрондау серверіне қосылу мүмкін емес.</translation>
 <translation id="7071521146534760487">Есептік жазбаны басқару</translation>
 <translation id="7077143737582773186">SD картасы</translation>
-<translation id="7080806333218412752">Оларды тексеру үшін URL сілтемелерін "Қауіпсіз шолу" функциясына жібереді. Сонымен қатар жаңа қауіптерді анықтауға көмектесу үшін беттердің шағын үлгісін, жүктеп алынған файлдарды, кеңейтім әрекетін және жүйе туралы ақпаратты жібереді. Google қолданбаларында сізді қорғау үшін, есептік жазбаға кірген кезіңізде, деректердің сілтемелерін уақытша байланыстырады.</translation>
+<translation id="7080806333218412752">Оларды тексеру үшін URL сілтемелерін "Қауіпсіз шолу" функциясына жібереді. Сонымен қатар жаңа қауіптерді анықтауға көмектесу үшін беттердің, жүктеп алынған файлдардың, кеңейтімдерді пайдаланудың шағын үлгісін және жүйе туралы ақпаратты жібереді. Google қолданбаларында сізді қорғау үшін, есептік жазбаға кірген кезіңізде, деректер мен есептік жазбаны уақытша байланыстырады.</translation>
 <translation id="7121362699166175603">Мекенжай жолағында тарих пен автотолтыруларды өшіреді. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> сайтында Google есептік жазбасымен шолу тарихының басқа да үлгілері болуы мүмкін.</translation>
 <translation id="7128355412245153445">Негізгі экран түймесін түрткен кезде, үздік сайттар мен соңғы жаңалықтарды көру</translation>
 <translation id="7138678301420049075">Басқа</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Сақталған құпия сөздер мына жерде пайда болады.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> бері</translation>
 <translation id="8571213806525832805">Соңғы 4 апта</translation>
+<translation id="8572344201470131220">Сурет көшірілді.</translation>
 <translation id="8583805026567836021">Есептік жазба деректерін өшіру</translation>
 <translation id="860043288473659153">Карта иесінің аты-жөні</translation>
 <translation id="8616006591992756292"><ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> мекенжайында Google есептік жазбасымен шолу тарихының басқа да үлгілері болуы мүмкін.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Телефонды қауіпсіздік кілті ретінде пайдалану</translation>
 <translation id="8990209962746788689">QR кодын жасау мүмкін емес</translation>
 <translation id="8993760627012879038">Жаңа қойындыны инкогнито режимінде ашу</translation>
+<translation id="8996847606757455498">Басқа провайдер таңдау</translation>
 <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> басқаратын есептік жазбамен кірудесіз және оның әкімшісіне Chrome деректерін басқару құқығы берілуде. Деректер бұл есептік жазбаға біржола байланыстырылады. Chrome жүйесінен шыққанда, деректер бұл құрылғыдан жойылады, бірақ Google есептік жазбасында сақталады.</translation>
 <translation id="9028914725102941583">Барлық құрылғылармен бөлісу үшін синхрондауды іске қосыңыз.</translation>
 <translation id="9040142327097499898">Хабарландыруларға рұқсат етілген. Орынды анықтау қызметі бұл құрылғыда өшірулі.</translation>
@@ -1041,7 +1046,7 @@
 <translation id="9137013805542155359">Түпнұсқаны көрсету</translation>
 <translation id="9155898266292537608">Сонымен қатар сөзді түрту арқылы іздеуге болады</translation>
 <translation id="9169507124922466868">Навигация тарихы жартылай ашық.</translation>
-<translation id="9199368092038462496">{NUM_MINS,plural, =1{1 минут бұрын тексерілді}other{# минут бұрын тексерілді}}</translation>
+<translation id="9199368092038462496">{NUM_MINS,plural, =1{1 минут бұрын тексерілді.}other{# минут бұрын тексерілді.}}</translation>
 <translation id="9204836675896933765">1 файл қалды</translation>
 <translation id="9206873250291191720">A</translation>
 <translation id="9209888181064652401">Қоңырау шалу мүмкін емес</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
index 841ad366..8d03ace 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">ចុចពាក្យណាមួយ​ដើម្បី​ស្វែងរក​ភ្លាមៗ ឬមើល​សកម្មភាព​ដែល​ទាក់ទង</translation>
 <translation id="2760989362628427051">បើក​រចនាប័ទ្មងងឹត ពេលបើក​កម្មវិធីសន្សំថ្ម ឬរចនាប័ទ្មងងឹត​នៅលើ​ឧបករណ៍របស់អ្នក</translation>
 <translation id="2762000892062317888">អំបាញ់មិញនេះ</translation>
+<translation id="2771869497727323769">មិនអាចបង្កើតតំណចូលទៅកាន់អត្ថបទបានទេ។ ចែករំលែកតំណ​ចូលទៅកាន់ទំព័រនៅក្នុងកម្មវិធី។</translation>
 <translation id="2777555524387840389">នៅសល់ <ph name="SECONDS" /> វិនាទីទៀត</translation>
 <translation id="2779651927720337254">បានបរាជ័យ</translation>
 <translation id="2781151931089541271">នៅសល់ 1 វិនាទីទៀត</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">ឧបករណ៍ត្រឡប់​លំដាប់​ធ្វើប្រតិបត្តិការវិញ</translation>
 <translation id="473775607612524610">ធ្វើបច្ចុប្បន្នភាព</translation>
 <translation id="4738836084190194332">ធ្វើសមកាលកម្មចុងក្រោយ៖ <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA មានបញ្ហា៖ <ph name="ERROR_CODE" /> នៅលើ <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">បើកផ្ទាំងថ្មី</translation>
 <translation id="4759238208242260848">ទាញយក</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{ការទាញយក 1 បាន​បញ្ចប់។}other{ការទាញយក # បាន​បញ្ចប់។}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">ឯកជនភាព</translation>
 <translation id="5087580092889165836">បន្ថែមកាត</translation>
 <translation id="509429900233858213">កំហុសឆ្គងបានកើតឡើង។</translation>
+<translation id="5100748015044654621">ចែករំលែកតំណចូលទៅកាន់អត្ថបទដែលបានរំលេចនៅក្នុងកម្មវិធី</translation>
 <translation id="510275257476243843">នៅសល់ 1 ម៉ោងទៀត</translation>
 <translation id="5123685120097942451">ផ្ទាំង​អនាមិក</translation>
 <translation id="5127805178023152808">សមកម្មបានបិទ</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">ពាក្យសម្ងាត់ដែលបានរក្សាទុកលេចឡើងទីនេះ។</translation>
 <translation id="8569404424186215731">ចាប់តាំងពីថ្ងៃទី <ph name="DATE" /></translation>
 <translation id="8571213806525832805">4 សប្តាហ៍មុន</translation>
+<translation id="8572344201470131220">បានចម្លង​រូបភាព</translation>
 <translation id="8583805026567836021">កំពុងជម្រះទិន្នន័យគណនី</translation>
 <translation id="860043288473659153">ឈ្មោះ​ម្ចាស់​កាត</translation>
 <translation id="8616006591992756292">គណនី Google របស់អ្នកអាចនឹងមានទម្រង់ប្រវត្តិរុករកផ្សេងទៀតនៅ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ។</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">ប្រើ​ទូរសព្ទ​ធ្វើជាសោសុវត្ថិភាព</translation>
 <translation id="8990209962746788689">មិនអាចបង្កើតកូដ QR បានទេ</translation>
 <translation id="8993760627012879038">បើកផ្ទាំងថ្មីនៅក្នុងមុខងារអនាមិក</translation>
+<translation id="8996847606757455498">ជ្រើសរើស​ក្រុមហ៊ុនផ្ដល់សេវា​ផ្សេងទៀត</translation>
 <translation id="8998729206196772491">អ្នកកំពុងចូលដោយប្រើគណនីដែលគ្រប់គ្រងដោយ <ph name="MANAGED_DOMAIN" /> និងកំពុងផ្តល់ឲ្យអ្នកគ្រប់គ្រងរបស់វានូវលទ្ធភាពគ្រប់គ្រងទិន្នន័យ Chrome របស់អ្នក។ ទិន្នន័យរបស់អ្នកនឹងភ្ជាប់ជាមួយគណនីនេះជាអចិន្ត្រៃយ៍។ ការចេញពី Chrome នឹងលុបទិន្នន័យរបស់អ្នកចេញពីឧបករណ៍នេះ ប៉ុន្តែវានឹងនៅតែត្រូវបានរក្សាទុកក្នុងគណនី Google របស់អ្នកដដែល។</translation>
 <translation id="9028914725102941583">បើក​សមកាលកម្ម ដើម្បី​ចែករំលែកនៅលើ​ឧបករណ៍​នានា</translation>
 <translation id="9040142327097499898">ការជូន​ដំណឹង​ត្រូវបាន​អនុញ្ញាត។ ទីតាំង​ត្រូវ​បាន​បិទសម្រាប់ឧបករណ៍​នេះ។</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index 05e73ae..196d361 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Сөздү ыкчам издөө же окшош аракеттерди көрүү үчүн таптап коюңуз</translation>
 <translation id="2760989362628427051">Түзмөгүңүз кубатты үнөмдөө режиминде иштегенде, Батареяны үнөмдөгүчтү күйгүзүңүз</translation>
 <translation id="2762000892062317888">жаңы эле</translation>
+<translation id="2771869497727323769">Текстке шилтеме түзүлгөн жок. Колдонмодогу барактын шилтемесин бөлүшүңүз.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> сек. калды</translation>
 <translation id="2779651927720337254">ката</translation>
 <translation id="2781151931089541271">1 сек. калды</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Ороосун ачуу</translation>
 <translation id="473775607612524610">Жаңыртуу</translation>
 <translation id="4738836084190194332">Акыркы жолу качан шайкештирилген: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA катасы: <ph name="ERROR_CODE" /> – <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Жаңы өтмөк ачуу</translation>
 <translation id="4759238208242260848">Жүктөлүп алынгандар</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 жүктөп алуу аяктады.}other{# жүктөп алуу аяктады.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Купуялык</translation>
 <translation id="5087580092889165836">Карточка кошуу</translation>
 <translation id="509429900233858213">Ката кетти.</translation>
+<translation id="5100748015044654621">Колдонмодогу бөлүнүп көрсөтүлгөн тексттин шилтемесин бөлүшүңүз.</translation>
 <translation id="510275257476243843">1 саат калды</translation>
 <translation id="5123685120097942451">Жашыруун өтмөк</translation>
 <translation id="5127805178023152808">Шайкештештирүү өчүк</translation>
@@ -777,7 +780,7 @@
 <translation id="7063006564040364415">Шайкештештирүү серверине туташкан жок.</translation>
 <translation id="7071521146534760487">Аккаунтту башкаруу</translation>
 <translation id="7077143737582773186">SD-карта</translation>
-<translation id="7080806333218412752">URL даректерин текшерүү үчүн Коопсуз серептөөгө жөнөтөт. Барактардын чакан үлгүлөрүн, жүктөлүп алынган файлдарды, кеңейтүүлөрдүн аракеттерин жана тутум маалыматын жөнөтүп, жаңы коркунучтарды аныктоого жардам берет. Google колдонмолорунда коопсуздугуңузду коргоо үчүн аккаунтуңуз менен кирип турганда бул маалыматты Google аккаунтуңуз менен байланыштырат.</translation>
+<translation id="7080806333218412752">URL даректерин текшерүү үчүн Коопсуз серептөөгө жөнөтөт. Барактардын чакан үлгүлөрүн, жүктөлүп алынган файлдарды, кеңейтүүлөрдүн аракеттерин жана тутум маалыматын жөнөтүп, жаңы коркунучтарды аныктоого жардам берет. Google колдонмолорунда коопсуздугуңузду коргоо үчүн аккаунтуңуз менен кирип турганда, бул маалыматты Google аккаунтуңуз менен байланыштырат.</translation>
 <translation id="7121362699166175603">Таржымал жана дарек тилкесиндеги автоматтык түрдө бүтүрүлгөн сөздөр тазаланат. Google аккаунтуңуздун серептөө таржымалынын башка түрлөрү <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> дарегинде болушу мүмкүн.</translation>
 <translation id="7128355412245153445">Башкы бет баскычын таптаган сайын эң көп колдонгон сайттарыңыз жана акыркы окуяларыңыз көрүнөт</translation>
 <translation id="7138678301420049075">Башка</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Сакталган сырсөздөр бул жерден көрүнөт.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> бери</translation>
 <translation id="8571213806525832805">Акыркы 4 апта</translation>
+<translation id="8572344201470131220">Сүрөт көчүрүлдү</translation>
 <translation id="8583805026567836021">Аккаунттун дайындары тазаланууда</translation>
 <translation id="860043288473659153">Карта ээсинин аты</translation>
 <translation id="8616006591992756292">Google аккаунтуңуздун серептөө таржымалынын башка түрлөрү <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> дарегинде болушу мүмкүн.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Телефонду Коопсуздук ачкычы катары колдонуу</translation>
 <translation id="8990209962746788689">QR коду түзүлгөн жок</translation>
 <translation id="8993760627012879038">Жаңы өтмөктү жашыруун режимде ачуу</translation>
+<translation id="8996847606757455498">Башка провайдерди тандоо</translation>
 <translation id="8998729206196772491">Сиз <ph name="MANAGED_DOMAIN" /> доменинин администратору тарабынан башкарылган аккаунтка кирип жатасыз. Ал мындан тарта сиздин аккаунтуңузга байланган Chrome дайын-даректериңизды башкарып калат. Chrome аккаунткан чыксаңыз, бул түзмөктөн дайын-даректериңиз жок кылынып, бирок Google Каттоо эсебинде сакталып кала берет.</translation>
 <translation id="9028914725102941583">Бардык түзмөктөр менен бөлүшүү үчүн шайкештирүүнү күйгүзүңүз</translation>
 <translation id="9040142327097499898">Билдирүүлөргө уруксат берилди. Жайгашкан жерди аныктоо жөндөөсү бул түзмөктө өчүрүлгөн.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
index ddf1c9b..4500925 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Pieskarieties vārdam, lai meklētu tūlīt vai skatītu saistītas darbības.</translation>
 <translation id="2760989362628427051">Ieslēgt tumšo motīvu, kad ierīcē ir ieslēgts tumšais motīvs vai akumulatora enerģijas taupīšanas režīms</translation>
 <translation id="2762000892062317888">tikko</translation>
+<translation id="2771869497727323769">Nevar izveidot saiti uz tekstu. Kopīgojiet lapas saiti lietotnē.</translation>
 <translation id="2777555524387840389">Atlikušas <ph name="SECONDS" /> s</translation>
 <translation id="2779651927720337254">neizdevās</translation>
 <translation id="2781151931089541271">Atlikusi 1 s</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Steka atbrīvotājs</translation>
 <translation id="473775607612524610">Atjaunināt</translation>
 <translation id="4738836084190194332">Pēdējoreiz sinhronizēts: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA kļūda: <ph name="ERROR_CODE" /> vietnē <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Atvērt jaunu cilni</translation>
 <translation id="4759238208242260848">Lejupielādes</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 lejupielāde ir pabeigta.}zero{# lejupielādes ir pabeigtas.}one{# lejupielāde ir pabeigta.}other{# lejupielādes ir pabeigtas.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Konfidencialitāte</translation>
 <translation id="5087580092889165836">Pievienot karti</translation>
 <translation id="509429900233858213">Radās kļūda.</translation>
+<translation id="5100748015044654621">Kopīgot saiti uz atzīmēto tekstu lietotnē</translation>
 <translation id="510275257476243843">Atlikusi 1 h</translation>
 <translation id="5123685120097942451">Inkognito cilne</translation>
 <translation id="5127805178023152808">Sinhronizācija izslēgta</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Šeit tiks parādītas saglabātās paroles.</translation>
 <translation id="8569404424186215731">kopš šāda datuma: <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Pēdējās 4 nedēļas</translation>
+<translation id="8572344201470131220">Attēls ir nokopēts.</translation>
 <translation id="8583805026567836021">Konta datu dzēšana</translation>
 <translation id="860043288473659153">Bankas kartes īpašnieka vārds</translation>
 <translation id="8616006591992756292">Jūsu Google kontam var būt citu veidu pārlūkošanas vēstures dati vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Izmantot tālruni kā drošības atslēgu</translation>
 <translation id="8990209962746788689">Nevar izveidot QR kodu</translation>
 <translation id="8993760627012879038">Atvērt jaunu cilni inkognito režīmā</translation>
+<translation id="8996847606757455498">Izvēlēties citu nodrošinātāju</translation>
 <translation id="8998729206196772491">Jūs pierakstāties kontā, kas tiek pārvaldīts domēnā <ph name="MANAGED_DOMAIN" />, un sniedzat tā administratoram kontroli pār saviem Chrome datiem. Jūsu dati tiks neatgriezeniski saistīti ar šo kontu. Izrakstoties no pārlūka Chrome, jūsu dati tiks dzēsti no šīs ierīces, taču tie tiks saglabāti jūsu Google kontā.</translation>
 <translation id="9028914725102941583">Sinhronizācijas ieslēgšana, lai kopīgotu saturu vairākās ierīcēs</translation>
 <translation id="9040142327097499898">Paziņojumi ir atļauti. Atrašanās vietas noteikšana šai ierīcei ir izslēgta.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
index b68daff6..f4cfcd1f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">പെട്ടെന്ന് തിരയാനോ ബന്ധപ്പെട്ട പ്രവർത്തനങ്ങൾ കാണാനോ ഒരു വാക്കിൽ ടാപ്പ് ചെയ്യുക</translation>
 <translation id="2760989362628427051">നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഇരുണ്ട തീമോ ബാറ്ററി ലാഭിക്കലോ ഓണായിരിക്കുമ്പോൾ ഇരുണ്ട തീം ഓണാക്കുക</translation>
 <translation id="2762000892062317888">ഇപ്പോൾ</translation>
+<translation id="2771869497727323769">ടെക്സ്റ്റിലേക്കുള്ള ലിങ്ക് സൃഷ്ടിക്കാനാകില്ല. പേജിലേക്കുള്ള ലിങ്ക് ആപ്പിൽ പങ്കിടുക.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> സെക്കൻഡ് ശേഷിക്കുന്നു</translation>
 <translation id="2779651927720337254">പരാജയപ്പെട്ടു</translation>
 <translation id="2781151931089541271">ഒരു സെക്കൻഡ് ശേഷിക്കുന്നു</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">സ്‌റ്റാക്ക് അൺവൈൻഡർ</translation>
 <translation id="473775607612524610">അപ്ഡേറ്റ് ചെയ്യുക</translation>
 <translation id="4738836084190194332">അവസാനം സമന്വയിപ്പിച്ചത്: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA പിശക്: <ph name="VIOLATED_URL" /> എന്നതിലെ <ph name="ERROR_CODE" /></translation>
 <translation id="4749960740855309258">പുതിയൊരു ടാബ് തുറക്കുക</translation>
 <translation id="4759238208242260848">ഡൌണ്‍ലോഡുകള്‍</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{ഒരു ഡൗൺലോഡ് പൂർത്തിയായി.}other{# ഡൗൺലോഡുകൾ പൂർത്തിയായി.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">സ്വകാര്യത</translation>
 <translation id="5087580092889165836">കാർഡ് ചേർക്കുക</translation>
 <translation id="509429900233858213">ഒരു പിശക് സംഭവിച്ചു.</translation>
+<translation id="5100748015044654621">ഹൈലൈറ്റ് ചെയ്ത ടെക്സ്റ്റിലേക്കുള്ള ലിങ്ക് ആപ്പിൽ പങ്കിടുക</translation>
 <translation id="510275257476243843">ഒരു മണിക്കൂർ ശേഷിക്കുന്നു</translation>
 <translation id="5123685120097942451">അദൃശ്യ ടാബ്</translation>
 <translation id="5127805178023152808">സമന്വയം ഓഫാണ്</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">സംരക്ഷിച്ച പാസ്‌വേഡുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> മുതൽ</translation>
 <translation id="8571213806525832805">കഴിഞ്ഞ 4 ആഴ്ച</translation>
+<translation id="8572344201470131220">ചിത്രം പകർത്തി</translation>
 <translation id="8583805026567836021">അക്കൗണ്ട് ഡാറ്റ മായ്‌ക്കുന്നു</translation>
 <translation id="860043288473659153">കാർഡിന്റെ ഉടമയുടെ പേര്</translation>
 <translation id="8616006591992756292">നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">സുരക്ഷാ കീയായി ഫോൺ ഉപയോഗിക്കുക</translation>
 <translation id="8990209962746788689">QR കോഡ് സൃഷ്‌ടിക്കാനായില്ല</translation>
 <translation id="8993760627012879038">അദൃശ്യ മോഡിൽ പുതിയൊരു വിൻഡോ തുറക്കുക</translation>
+<translation id="8996847606757455498">മറ്റൊരു ദാതാവിനെ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ട് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുകയും ഇതിന്റെ അഡ്‌മിനിസ്‌ട്രേറ്റർക്ക് നിങ്ങളുടെ Chrome വിവരങ്ങളിന്മേൽ നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു. വിവരങ്ങളെ ഈ അക്കൗണ്ടുമായി ശാശ്വതമായി ബന്ധിപ്പിക്കും. Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുന്നത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരങ്ങളെ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവയെ സൂക്ഷിക്കുന്നതാണ്.</translation>
 <translation id="9028914725102941583">ഉപകരണങ്ങളിലുടനീളം പങ്കിടാൻ സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
 <translation id="9040142327097499898">അറിയിപ്പുകൾ അനുവദിക്കപ്പെട്ടിരിക്കുന്നു. ഈ ഉപകരണത്തിന്‍റെ ലൊക്കേഷൻ ഓഫാണ്.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
index c77cec8..ce5dabab 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -790,7 +790,7 @@
 <translation id="7173114856073700355">सेटिंग्ज उघडा</translation>
 <translation id="7177466738963138057">तुम्ही हे नंतर सेटिंग्ज मध्ये बदलू शकता.</translation>
 <translation id="7180611975245234373">रिफ्रेश करा</translation>
-<translation id="7187993566681480880">तुम्हाला Chrome वर सुरक्षित ठेवते आणि तुम्ही साइन इन केलेले असताना इतर Google अ‍ॅप्समध्ये तुमच्या सुरक्षिततेत सुधारणा करण्यासाठी वापरले जाऊ शकते.</translation>
+<translation id="7187993566681480880">तुम्हाला Chrome वर सुरक्षित ठेवते आणि तुम्ही साइन इन केलेले असताना इतर Google अ‍ॅप्समध्ये तुमच्या सुरक्षेत सुधारणा करण्यासाठी वापरले जाऊ शकते.</translation>
 <translation id="7189372733857464326">Google Play सेवांंनी अपडेट करणे समाप्त करण्याची प्रतीक्षा करीत आहे</translation>
 <translation id="7191430249889272776">पार्श्वभूमीवर उघडा असलेला टॅब.</translation>
 <translation id="723171743924126238">इमेज निवडा</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
index 665c3fb0..52c2b9f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -789,7 +789,7 @@
 <translation id="7173114856073700355">ဆက်တင်များ ဖွင့်ရန်</translation>
 <translation id="7177466738963138057">၎င်းကို နောက်ပိုင်းတွင် ဆက်တင်များထဲ၌ ပြန်ပြောင်းနိုင်ပါသည်</translation>
 <translation id="7180611975245234373">ပြန်လည်စတင်ရန်</translation>
-<translation id="7187993566681480880">Chrome တွင် ဘေးကင်းစေပြီး သင်လက်မှတ်ထိုးဝင်သည့်အခါ အခြား Google အက်ပ်များတွင် သင့်လုံခြုံရေး ပိုကောင်းမွန်စေရန် အသုံးပြုရမည်။</translation>
+<translation id="7187993566681480880">Chrome တွင် ဘေးကင်းစေပြီး အခြား Google အက်ပ်များတွင် သင်လက်မှတ်ထိုးဝင်ထားသည့်အခါ လုံခြုံရေး ပိုကောင်းမွန်စေရန်လည်း သုံးနိုင်သည်။</translation>
 <translation id="7189372733857464326">Google Play ဝန်ဆောင်မှုများ အပ်ဒိတ်လုပ်နေဆဲ ဖြစ်ပါသည်</translation>
 <translation id="7191430249889272776">တဲဘ်ကို နောက်ခံမှာ ဖွင့်ထား။</translation>
 <translation id="723171743924126238">ပုံများကို ရွေးရန်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
index 5039a21..70bb867 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Trykk på et ord for å søke umiddelbart eller se relaterte handlinger</translation>
 <translation id="2760989362628427051">Slå på mørkt tema når batterisparing eller enhetsinnstillingen for mørkt tema er på</translation>
 <translation id="2762000892062317888">akkurat nå</translation>
+<translation id="2771869497727323769">Kan ikke opprette noen link til teksten. Del en link til siden i en app.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekunder igjen</translation>
 <translation id="2779651927720337254">mislyktes</translation>
 <translation id="2781151931089541271">1 sekund igjen</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">Oppdater</translation>
 <translation id="4738836084190194332">Sist synkronisert: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA-feil: <ph name="ERROR_CODE" /> på <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Åpne en ny fane</translation>
 <translation id="4759238208242260848">Nedlastinger</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 nedlasting er fullført.}other{# nedlastinger er fullført.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Personvern</translation>
 <translation id="5087580092889165836">Legg til et kort</translation>
 <translation id="509429900233858213">Det oppsto en feil.</translation>
+<translation id="5100748015044654621">Del en link til den merkede teksten i en app</translation>
 <translation id="510275257476243843">1 time igjen</translation>
 <translation id="5123685120097942451">Inkognitofane</translation>
 <translation id="5127805178023152808">Synkronisering er slått av</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Lagrede passord listes opp her.</translation>
 <translation id="8569404424186215731">siden <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Siste 4 uker</translation>
+<translation id="8572344201470131220">Bildet ble kopiert</translation>
 <translation id="8583805026567836021">Fjerner kontodata …</translation>
 <translation id="860043288473659153">Kortinnehavers navn</translation>
 <translation id="8616006591992756292">Det kan hende Google-kontoen din har andre typer nettleserlogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Bruk telefonen som sikkerhetsnøkkel</translation>
 <translation id="8990209962746788689">Kan ikke opprette QR-kode</translation>
 <translation id="8993760627012879038">Åpne en ny fane i inkognitomodus</translation>
+<translation id="8996847606757455498">Velg en annen leverandør</translation>
 <translation id="8998729206196772491">Du logger på med en konto som administreres av <ph name="MANAGED_DOMAIN" />, og du gir administratoren for dette domenet kontroll over Chrome-dataene dine. Dataene dine blir permanent knyttet til denne kontoen. Når du logger av Chrome, slettes dataene dine fra denne enheten, men de fortsetter å være lagret i Google-kontoen din.</translation>
 <translation id="9028914725102941583">Slå på synkronisering for å dele på tvers av enheter</translation>
 <translation id="9040142327097499898">Varsler er tillatt. Posisjon er slått av for denne enheten.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index c724d98..a3b411c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Atinge un cuvânt pentru a căuta instantaneu sau pentru a vedea acțiuni conexe</translation>
 <translation id="2760989362628427051">Activează tema întunecată când este activată tema întunecată sau Economisirea bateriei pentru dispozitiv</translation>
 <translation id="2762000892062317888">adineauri</translation>
+<translation id="2771869497727323769">Nu s-a putut crea linkul spre text. Trimite linkul spre pagină dintr-o aplicație.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> sec. rămase</translation>
 <translation id="2779651927720337254">nereușită</translation>
 <translation id="2781151931089541271">1 sec. rămasă</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Instrument de derulare a stivei</translation>
 <translation id="473775607612524610">Actualizează</translation>
 <translation id="4738836084190194332">Ultima sincronizare: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Eroare TWA: <ph name="ERROR_CODE" /> la <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Deschide o filă nouă</translation>
 <translation id="4759238208242260848">Descărcări</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{O descărcare finalizată.}few{# descărcări finalizate.}other{# de descărcări finalizate.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Confidențialitate</translation>
 <translation id="5087580092889165836">Adaugă un card</translation>
 <translation id="509429900233858213">A apărut o eroare.</translation>
+<translation id="5100748015044654621">Trimite linkul spre textul evidențiat dintr-o aplicație</translation>
 <translation id="510275257476243843">1 oră rămasă</translation>
 <translation id="5123685120097942451">Filă incognito</translation>
 <translation id="5127805178023152808">Sincronizarea este dezactivată</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Parolele salvate vor fi afișate aici.</translation>
 <translation id="8569404424186215731">începând cu <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Ultimele 4 săptămâni</translation>
+<translation id="8572344201470131220">Imaginea a fost copiată</translation>
 <translation id="8583805026567836021">Se șterg datele contului</translation>
 <translation id="860043288473659153">Nume titular de card</translation>
 <translation id="8616006591992756292">Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Folosește telefonul ca pe o cheie de securitate</translation>
 <translation id="8990209962746788689">Nu s-a putut crea codul QR</translation>
 <translation id="8993760627012879038">Deschide o filă nouă în modul incognito</translation>
+<translation id="8996847606757455498">Alege alt furnizor</translation>
 <translation id="8998729206196772491">Te conectezi cu un cont gestionat de <ph name="MANAGED_DOMAIN" /> și acorzi administratorului acestuia controlul asupra datelor Chrome. Datele vor fi asociate definitiv acestui cont. Dacă te deconectezi de la Chrome, datele se vor șterge de pe acest dispozitiv, dar vor rămâne stocate în Contul Google.</translation>
 <translation id="9028914725102941583">Activează sincronizarea ca să trimiți de pe un dispozitiv pe altul</translation>
 <translation id="9040142327097499898">Notificările sunt permise. Locația este dezactivată pentru acest dispozitiv.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
index 76c2bac..9d8d9d5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -777,7 +777,7 @@
 <translation id="7063006564040364415">Не удалось связаться с сервером синхронизации</translation>
 <translation id="7071521146534760487">Настройки аккаунта</translation>
 <translation id="7077143737582773186">SD-карта</translation>
-<translation id="7080806333218412752">Обеспечивает отправку URL на проверку по критериям Безопасного просмотра. Также с целью выявления новых угроз отправляется на анализ небольшая выборка страниц, скачанных файлов, сведений об использовании расширений и информация о системе. Когда выполнен вход в аккаунт Google, между этими данными и аккаунтом временно устанавливается связь, чтобы вы были защищены во время работы с различными приложениями Google.</translation>
+<translation id="7080806333218412752">Обеспечивает отправку URL на проверку по критериям Безопасного просмотра. Кроме того с целью выявления новых угроз отправляется на анализ небольшая выборка страниц, скачанных файлов и сведений об использовании расширений, а также информация о системе. Когда выполнен вход в аккаунт Google, между этими данными и аккаунтом временно устанавливается связь, чтобы вы были защищены во время работы с различными приложениями Google.</translation>
 <translation id="7121362699166175603">Удаление истории и вариантов автозаполнения в адресной строке. Информация о других ваших действиях в Интернете может также храниться на странице <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
 <translation id="7128355412245153445">Нужные сайты и недавние статьи – одним нажатием кнопки.</translation>
 <translation id="7138678301420049075">Другое</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index 91e1d2f8..a322401f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Dotaknite se besede, če želite dinamično iskati ali prikazati sorodna dejanja</translation>
 <translation id="2760989362628427051">Vklop temne teme, ko je v napravi vklopljena temna tema ali je vklopljeno varčevanje z energijo akumulatorja</translation>
 <translation id="2762000892062317888">pravkar</translation>
+<translation id="2771869497727323769">Povezave do besedila ni mogoče ustvariti. Delite povezavo do strani v aplikaciji.</translation>
 <translation id="2777555524387840389">Še <ph name="SECONDS" /> s</translation>
 <translation id="2779651927720337254">ni uspelo</translation>
 <translation id="2781151931089541271">Še 1 s</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Modul za odstranitev sklada</translation>
 <translation id="473775607612524610">Posodobi</translation>
 <translation id="4738836084190194332">Zadnja sinhronizacija: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Napaka TWA: <ph name="ERROR_CODE" /> na <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Odpiranje novega zavihka</translation>
 <translation id="4759238208242260848">Prenosi</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 prenos je končan.}one{# prenos je končan.}two{# prenosa sta končana.}few{# prenosi so končani.}other{# prenosov je končanih.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Zasebnost</translation>
 <translation id="5087580092889165836">Dodaj kartico</translation>
 <translation id="509429900233858213">Napaka.</translation>
+<translation id="5100748015044654621">Delite povezavo do označenega besedila v aplikaciji</translation>
 <translation id="510275257476243843">Še 1 h</translation>
 <translation id="5123685120097942451">Zavihek brez beleženja zgodovine</translation>
 <translation id="5127805178023152808">Sinhroniziranje je izklopljeno</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Shranjena gesla bodo prikazana tukaj.</translation>
 <translation id="8569404424186215731">od <ph name="DATE" /></translation>
 <translation id="8571213806525832805">Zadnji 4 tedni</translation>
+<translation id="8572344201470131220">Slika je bila kopirana</translation>
 <translation id="8583805026567836021">Brisanje podatkov računa</translation>
 <translation id="860043288473659153">Ime imetnika kartice</translation>
 <translation id="8616006591992756292">V Google Računu so morda druge vrste zgodovine brskanja na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Uporaba telefona kot varnostnega ključa</translation>
 <translation id="8990209962746788689">Kode QR ni mogoče ustvariti</translation>
 <translation id="8993760627012879038">Odpiranje novega zavihka brez beleženja zgodovine</translation>
+<translation id="8996847606757455498">Izberi drugega ponudnika:</translation>
 <translation id="8998729206196772491">Prijavljate se z računom, ki ga upravlja <ph name="MANAGED_DOMAIN" />, in nadzor nad podatki v Chromu predajate skrbniku. Vaši podatki bodo trajno povezani s tem računom. Če se odjavite iz Chroma, boste izbrisali podatke iz te naprave, vendar bodo še naprej shranjeni v Google Računu.</translation>
 <translation id="9028914725102941583">Vklopite sinhronizacijo, če želite deliti z drugimi napravami</translation>
 <translation id="9040142327097499898">Obvestila so dovoljena. Lokacija je izklopljena za to napravo.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
index 4c8afbc..4d5728a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Trokit një fjalë për të kërkuar në çast ose për të parë veprimet e lidhura</translation>
 <translation id="2760989362628427051">Aktivizo temën e errët kur tema e errët ose "Kursyesi i baterisë" i pajisjes është aktiv</translation>
 <translation id="2762000892062317888">pikërisht tani</translation>
+<translation id="2771869497727323769">Lidhja për te teksti nuk mund të krijohet. Ndaje lidhjen për te faqja në një aplikacion.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> sekonda të mbetura</translation>
 <translation id="2779651927720337254">dështoi</translation>
 <translation id="2781151931089541271">1 sekondë e mbetur</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Moduli i zbërthimit të stivës</translation>
 <translation id="473775607612524610">Përditësoje</translation>
 <translation id="4738836084190194332">Sinkronizimi i fundit: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">Gabim i TWA: <ph name="ERROR_CODE" /> në <ph name="VIOLATED_URL" /></translation>
 <translation id="4749960740855309258">Hap një skedë të re</translation>
 <translation id="4759238208242260848">Shkarkimet</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 shkarkim përfundoi.}other{# shkarkime përfunduan.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Privatësia</translation>
 <translation id="5087580092889165836">Shto kartë</translation>
 <translation id="509429900233858213">Ndodhi një gabim.</translation>
+<translation id="5100748015044654621">Ndaj lidhjen për te teksti i theksuar në një aplikacion</translation>
 <translation id="510275257476243843">1 orë e mbetur</translation>
 <translation id="5123685120097942451">Skeda "e fshehtë"</translation>
 <translation id="5127805178023152808">Sinkronizimi është joaktiv</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Fjalëkalimet e ruajtura do të shfaqen këtu.</translation>
 <translation id="8569404424186215731">që nga data <ph name="DATE" /></translation>
 <translation id="8571213806525832805">4 javët e fundit</translation>
+<translation id="8572344201470131220">Imazhi u kopjua</translation>
 <translation id="8583805026567836021">Po pastron të dhënat e llogarisë</translation>
 <translation id="860043288473659153">Emri i mbajtësit të kartës</translation>
 <translation id="8616006591992756292">Llogaria jote e Google mund të ketë forma të tjera të historikut të shfletimit në <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Përdore telefonin si çelës sigurie</translation>
 <translation id="8990209962746788689">Kodi QR nuk mund të krijohet</translation>
 <translation id="8993760627012879038">Hap një skedë të re në "Modalitetin e fshehtë"</translation>
+<translation id="8996847606757455498">Zgjidh një ofrues tjetër</translation>
 <translation id="8998729206196772491">Po identifikohesh me një llogari të menaxhuar nga <ph name="MANAGED_DOMAIN" /> dhe po i jep administratorit të saj kontroll mbi të dhënat e tua të Chrome. Duke dalë nga Chrome do të fshihen të dhënat e tua nga kjo pajisje, por do të mbeten të ruajtura në llogarinë tënde të Google.</translation>
 <translation id="9028914725102941583">Aktivizo sinkronizimin për të ndarë mes pajisjeve</translation>
 <translation id="9040142327097499898">Njoftimet janë të lejuara. Vendndodhja është joaktive për këtë pajisje.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index cadf5ba..c918d91 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">Tegishli qidiruv natijalari va amallarni ko‘rish uchun so‘z ustiga bosing</translation>
 <translation id="2760989362628427051">Qurilmangizda tungi mavzu yoki Quvvat tejash rejimi yoqilganda tungi mavzu faollashadi</translation>
 <translation id="2762000892062317888">hozirgina</translation>
+<translation id="2771869497727323769">Matnli havola yaratilmadi. Havolani ilova ichidagi sahifada ulashing.</translation>
 <translation id="2777555524387840389"><ph name="SECONDS" /> soniya qoldi</translation>
 <translation id="2779651927720337254">xatolik:</translation>
 <translation id="2781151931089541271">1 soniya qoldi</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">Yangilash</translation>
 <translation id="4738836084190194332">Oxirgi sinxronizatsiya: <ph name="WHEN" /></translation>
+<translation id="474698142248234220">TWA xatosi: <ph name="ERROR_CODE" /> – <ph name="VIOLATED_URL" /> sahifasida</translation>
 <translation id="4749960740855309258">Yangi varaq ochish</translation>
 <translation id="4759238208242260848">Yuklanmalar</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{1 ta fayl yuklab olindi.}other{# ta fayl yuklab olindi.}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">Shaxsiy ma’lumotlar</translation>
 <translation id="5087580092889165836">Yangi karta qo‘shish</translation>
 <translation id="509429900233858213">Xatolik yuz berdi.</translation>
+<translation id="5100748015044654621">Havola ilova ichida ajratilgan matn sifatida ulashildi</translation>
 <translation id="510275257476243843">1 soat qoldi</translation>
 <translation id="5123685120097942451">Inkognito varaq</translation>
 <translation id="5127805178023152808">Sinxronizatsiya o‘chiq</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">Saqlangan parollar bu yerda paydo bo‘ladi.</translation>
 <translation id="8569404424186215731"><ph name="DATE" /> sanasidan beri</translation>
 <translation id="8571213806525832805">Oxirgi 4 hafta</translation>
+<translation id="8572344201470131220">Rasmdan nusxa olindi</translation>
 <translation id="8583805026567836021">Hisob ma’lumotlari tozalanmoqda</translation>
 <translation id="860043288473659153">Karta egasining ismi</translation>
 <translation id="8616006591992756292">Google hisobingiz orqali bajargan internetdagi faoliyatingizni <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> orqali ko‘rishingiz mumkin.</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">Telefonni elektron kalit sifatida ishlatish</translation>
 <translation id="8990209962746788689">QR-kod yaratilmadi</translation>
 <translation id="8993760627012879038">Yangi varaqni inkognito rejimida ochish</translation>
+<translation id="8996847606757455498">Boshqa provayderni tanlang</translation>
 <translation id="8998729206196772491"><ph name="MANAGED_DOMAIN" /> domenida boshqariladigan hisobga kirish bilan siz administratorga Chrome ma’lumotlaringizni boshqarishiga rozilik bildirasiz. Barcha Chrome ma’lumotlaringiz bu hisobga butunlay bog‘langan. Agar hisobdan chiqadigan bo‘lsangiz, bu qurilmadagi barcha ma’lumotlaringiz o‘chib ketadi, lekin Google hisobingizda saqlanib qoladi.</translation>
 <translation id="9028914725102941583">Qurilmalararo ulashish uchun sinxronizatsiyani yoqing</translation>
 <translation id="9040142327097499898">Bu qurilmada bildirishnomalar yoniq, lekin joylashuv moduli o‘chiq.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index 9271a00..8f0951c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -220,6 +220,7 @@
 <translation id="2744248271121720757">輕按字詞即可搜尋,或查看相關操作</translation>
 <translation id="2760989362628427051">在裝置啟用深色主題背景或開啟「省電模式」後啟用深色主題背景</translation>
 <translation id="2762000892062317888">剛剛</translation>
+<translation id="2771869497727323769">無法建立文字連結。請在應用程式中分享頁面連結。</translation>
 <translation id="2777555524387840389">尚餘 <ph name="SECONDS" /> 秒</translation>
 <translation id="2779651927720337254">失敗</translation>
 <translation id="2781151931089541271">尚餘 1 秒</translation>
@@ -460,6 +461,7 @@
 <translation id="4732120983431207637">Stack Unwinder</translation>
 <translation id="473775607612524610">更新</translation>
 <translation id="4738836084190194332">最後同步處理時間:<ph name="WHEN" /></translation>
+<translation id="474698142248234220"><ph name="VIOLATED_URL" /> 上發生 TWA 錯誤:<ph name="ERROR_CODE" /></translation>
 <translation id="4749960740855309258">開啟新分頁</translation>
 <translation id="4759238208242260848">下載</translation>
 <translation id="4763829664323285145">{FILE_COUNT,plural, =1{已完成 1 項下載。}other{已完成 # 項下載。}}</translation>
@@ -509,6 +511,7 @@
 <translation id="5040262127954254034">私隱權</translation>
 <translation id="5087580092889165836">加入新卡</translation>
 <translation id="509429900233858213">發生錯誤。</translation>
+<translation id="5100748015044654621">請在應用程式中分享已突顯文字的連結</translation>
 <translation id="510275257476243843">尚餘 1 小時</translation>
 <translation id="5123685120097942451">無痕式分頁</translation>
 <translation id="5127805178023152808">同步處理已停用</translation>
@@ -975,6 +978,7 @@
 <translation id="8562452229998620586">已儲存的密碼會顯示在這裡。</translation>
 <translation id="8569404424186215731">自 <ph name="DATE" />起</translation>
 <translation id="8571213806525832805">過去 4 週</translation>
+<translation id="8572344201470131220">已複製圖片</translation>
 <translation id="8583805026567836021">正在清除帳戶數據</translation>
 <translation id="860043288473659153">持卡人姓名</translation>
 <translation id="8616006591992756292">您的 Google 帳戶在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的瀏覽記錄。</translation>
@@ -1017,6 +1021,7 @@
 <translation id="8988028529677883095">讓手機成為安全密鑰</translation>
 <translation id="8990209962746788689">無法建立二維條碼</translation>
 <translation id="8993760627012879038">在無痕模式中開啟新分頁</translation>
+<translation id="8996847606757455498">選擇其他供應商</translation>
 <translation id="8998729206196772491">您即將登入由 <ph name="MANAGED_DOMAIN" /> 管理的帳戶,並讓帳戶管理員控制您的 Chrome 資料。您的資料將與這個帳戶建立永久連結。如果您登出 Chrome,系統將刪除此裝置上的資料,但這些資料仍會保留在您的 Google 帳戶中。</translation>
 <translation id="9028914725102941583">開啟同步功能,即可在所有裝置上分享內容</translation>
 <translation id="9040142327097499898">允許顯示通知。此裝置的位置資訊功能已關閉。</translation>
diff --git a/chrome/browser/ui/ash/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
index 79c4466..acda4e9 100644
--- a/chrome/browser/ui/ash/clipboard_history_browsertest.cc
+++ b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
@@ -35,61 +35,8 @@
       ->GetItems();
 }
 
-bool IsClipboardDataListExpected(
-    const std::list<ui::ClipboardData>& clipboard_data,
-    const std::vector<std::string>& expected_text_data) {
-  if (clipboard_data.size() != expected_text_data.size())
-    return false;
-
-  auto iter = clipboard_data.cbegin();
-  int index = 0;
-  while (iter != clipboard_data.cend()) {
-    if (iter->text() != expected_text_data[index])
-      return false;
-
-    iter++;
-    index++;
-  }
-
-  return true;
-}
-
 }  // namespace
 
-class ClipboardHistoryBrowserTest : public InProcessBrowserTest {
- public:
-  ClipboardHistoryBrowserTest() : InProcessBrowserTest() {
-    feature_list_.InitAndEnableFeature(chromeos::features::kClipboardHistory);
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-// Verify clipboard history's basic feature, i.e. recording clipboard data and
-// returning data following the most recent ordering
-// (https://crbug.com/1109263).
-IN_PROC_BROWSER_TEST_F(ClipboardHistoryBrowserTest, VerifyBasics) {
-  const std::string unique_data1("A");
-  SetClipboardText(unique_data1);
-
-  const int iteration = 10;
-  const std::string unique_data2("B");
-  const std::string unique_data3("C");
-
-  // Save duplicate data multiple times.
-  for (int i = 0; i < iteration; i++) {
-    SetClipboardText(unique_data2);
-    SetClipboardText(unique_data3);
-  }
-
-  const std::list<ui::ClipboardData> data = GetClipboardData();
-  const std::vector<std::string> expected_text_data = {
-      unique_data3, unique_data2, unique_data1};
-
-  EXPECT_TRUE(IsClipboardDataListExpected(data, expected_text_data));
-}
-
 // Verify clipboard history's features in the multiprofile environment.
 class ClipboardHistoryWithMultiProfileBrowserTest
     : public chromeos::LoginManagerTest {
diff --git a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
index d0c22e26..cea9bafb 100644
--- a/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
+++ b/chrome/browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc
@@ -34,9 +34,9 @@
 constexpr char kChromeAcceleratorsHash[] = "ef0b7eb1a1dabd26e964c6593e4698a4";
 #else
 // The total number of Chrome accelerators (available on Chrome OS).
-constexpr int kChromeAcceleratorsTotalNum = 94;
+constexpr int kChromeAcceleratorsTotalNum = 95;
 // The hash of Chrome accelerators (available on Chrome OS).
-constexpr char kChromeAcceleratorsHash[] = "f22167989af00d94f8de75cbc89b977e";
+constexpr char kChromeAcceleratorsHash[] = "7d5afdffb1dcc73c3f6f73107b5d6651";
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
 const char* BooleanToString(bool value) {
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 9abf94c..af2aa93 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -661,6 +661,9 @@
     case IDC_PROFILING_ENABLED:
       content::Profiling::Toggle();
       break;
+    case IDC_CARET_BROWSING_TOGGLE:
+      ToggleCaretBrowsing(browser_);
+      break;
 
     case IDC_SHOW_BOOKMARK_MANAGER:
       ShowBookmarkManager(browser_);
@@ -985,6 +988,7 @@
   command_updater_.UpdateCommandEnabled(
       IDC_SHOW_SAVE_LOCAL_CARD_SIGN_IN_PROMO_IF_APPLICABLE, true);
   command_updater_.UpdateCommandEnabled(IDC_CLOSE_SIGN_IN_PROMO, true);
+  command_updater_.UpdateCommandEnabled(IDC_CARET_BROWSING_TOGGLE, true);
 
   UpdateShowSyncState(true);
 
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 34be9e1..c6d345e2 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -105,6 +105,7 @@
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/common/page_state.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
@@ -1467,6 +1468,31 @@
                                              .CanViewSource();
 }
 
+void ToggleCaretBrowsing(Browser* browser) {
+  PrefService* prefService = browser->profile()->GetPrefs();
+  bool enabled = prefService->GetBoolean(prefs::kCaretBrowsingEnabled);
+
+  if (enabled) {
+    base::RecordAction(base::UserMetricsAction(
+        "Accessibility.CaretBrowsing.DisableWithKeyboard"));
+    prefService->SetBoolean(prefs::kCaretBrowsingEnabled, false);
+    return;
+  }
+
+  // Show a confirmation dialog, unless either (1) the command-line
+  // flag was used, or (2) the user previously checked the box
+  // indicating not to ask them next time.
+  if (prefService->GetBoolean(prefs::kShowCaretBrowsingDialog) &&
+      !base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableCaretBrowsing)) {
+    browser->window()->ShowCaretBrowsingDialog();
+  } else {
+    base::RecordAction(base::UserMetricsAction(
+        "Accessibility.CaretBrowsing.EnableWithKeyboard"));
+    prefService->SetBoolean(prefs::kCaretBrowsingEnabled, true);
+  }
+}
+
 #if !defined(TOOLKIT_VIEWS)
 base::Optional<int> GetKeyboardFocusedTabIndex(const Browser* browser) {
   return base::nullopt;
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h
index 1b08601f..caf7a7f 100644
--- a/chrome/browser/ui/browser_commands.h
+++ b/chrome/browser/ui/browser_commands.h
@@ -202,6 +202,7 @@
 // the tabbed Browser.
 Browser* OpenInChrome(Browser* hosted_app_browser);
 bool CanViewSource(const Browser* browser);
+void ToggleCaretBrowsing(Browser* browser);
 
 base::Optional<int> GetKeyboardFocusedTabIndex(const Browser* browser);
 
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
index dc15062..f294df5 100644
--- a/chrome/browser/ui/browser_ui_prefs.cc
+++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -142,6 +142,11 @@
       prefs::kExternalProtocolDialogShowAlwaysOpenCheckbox, true);
   registry->RegisterBooleanPref(prefs::kScreenCaptureAllowed, true);
 
+#if !defined(OS_ANDROID)
+  registry->RegisterBooleanPref(prefs::kCaretBrowsingEnabled, false);
+  registry->RegisterBooleanPref(prefs::kShowCaretBrowsingDialog, true);
+#endif
+
 #if !defined(OS_CHROMEOS)
   registry->RegisterBooleanPref(prefs::kAccessibilityFocusHighlightEnabled,
                                 false);
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index f60bdf38..f13076b 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -492,6 +492,9 @@
       content::RenderFrameHost* frame,
       content::EyeDropperListener* listener) = 0;
 
+  // Shows a confirmation dialog about enabling caret browsing.
+  virtual void ShowCaretBrowsingDialog() = 0;
+
  protected:
   friend class BrowserCloseManager;
   friend class BrowserView;
diff --git a/chrome/browser/ui/prefs/pref_watcher.cc b/chrome/browser/ui/prefs/pref_watcher.cc
index 623cea7a..af8ceaa 100644
--- a/chrome/browser/ui/prefs/pref_watcher.cc
+++ b/chrome/browser/ui/prefs/pref_watcher.cc
@@ -91,6 +91,11 @@
   profile_pref_change_registrar_.Add(prefs::kWebRTCUDPPortRange,
                                      renderer_callback);
 
+#if !defined(OS_ANDROID)
+  profile_pref_change_registrar_.Add(prefs::kCaretBrowsingEnabled,
+                                     renderer_callback);
+#endif
+
 #if !defined(OS_MAC)
   profile_pref_change_registrar_.Add(prefs::kFullscreenAllowed,
                                      renderer_callback);
diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc
index 0a146390..372ba32 100644
--- a/chrome/browser/ui/views/accelerator_table.cc
+++ b/chrome/browser/ui/views/accelerator_table.cc
@@ -24,11 +24,14 @@
 // Do not use Ctrl-Alt as a shortcut modifier, as it is used by i18n keyboards:
 // http://blogs.msdn.com/b/oldnewthing/archive/2004/03/29/101121.aspx
 const AcceleratorMapping kAcceleratorMap[] = {
-    // To add an accelerator to macOS that uses modifier keys, either:
-    //   1) Update MainMenu.xib to include a new menu item with the appropriate
-    //      modifier.
-    //   2) Update GetShortcutsNotPresentInMainMenu() in
-    //      global_keyboard_shortcuts_mac.mm.
+// To add an accelerator to macOS that uses modifier keys, either:
+//   1) Update MainMenu.xib to include a new menu item with the appropriate
+//      modifier.
+//   2) Update GetShortcutsNotPresentInMainMenu() in
+//      global_keyboard_shortcuts_mac.mm.
+#if !defined(OS_CHROMEOS)
+    {ui::VKEY_F7, ui::EF_NONE, IDC_CARET_BROWSING_TOGGLE},
+#endif
     {ui::VKEY_F12, ui::EF_NONE, IDC_DEV_TOOLS_TOGGLE},
     {ui::VKEY_ESCAPE, ui::EF_NONE, IDC_CLOSE_FIND_OR_STOP},
 
@@ -146,6 +149,8 @@
     {ui::VKEY_BROWSER_STOP, ui::EF_NONE, IDC_STOP},
     // On Chrome OS, Search + Esc is used to call out task manager.
     {ui::VKEY_ESCAPE, ui::EF_COMMAND_DOWN, IDC_TASK_MANAGER},
+    {ui::VKEY_7, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN,
+     IDC_CARET_BROWSING_TOGGLE},
 #else  // !OS_CHROMEOS
     {ui::VKEY_ESCAPE, ui::EF_SHIFT_DOWN, IDC_TASK_MANAGER},
     {ui::VKEY_LMENU, ui::EF_NONE, IDC_FOCUS_MENU_BAR},
diff --git a/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc
new file mode 100644
index 0000000..d3f7039
--- /dev/null
+++ b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc
@@ -0,0 +1,96 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/metrics/user_metrics.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/constrained_window/constrained_window_views.h"
+#include "components/prefs/pref_service.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/views/controls/button/checkbox.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/widget/widget.h"
+
+// static
+void CaretBrowsingDialogDelegate::Show(gfx::NativeWindow parent_window,
+                                       PrefService* pref_service) {
+  // When the window closes, it will delete itself.
+  constrained_window::CreateBrowserModalDialogViews(
+      new CaretBrowsingDialogDelegate(pref_service), parent_window)
+      ->Show();
+}
+
+CaretBrowsingDialogDelegate::CaretBrowsingDialogDelegate(
+    PrefService* pref_service)
+    : pref_service_(pref_service) {
+  base::RecordAction(
+      base::UserMetricsAction("Accessibility.CaretBrowsing.ShowDialog"));
+  SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kVertical, gfx::Insets(),
+      ChromeLayoutProvider::Get()->GetDistanceMetric(
+          views::DISTANCE_RELATED_CONTROL_VERTICAL)));
+
+  set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
+      views::TEXT, views::CONTROL));
+
+  base::string16 message_text =
+      l10n_util::GetStringUTF16(IDS_ENABLE_CARET_BROWSING_INFO);
+
+  auto* message_label = AddChildView(std::make_unique<views::Label>(
+      message_text, views::style::CONTEXT_MESSAGE_BOX_BODY_TEXT));
+  message_label->SetMultiLine(true);
+
+  do_not_ask_checkbox_ = AddChildView(std::make_unique<views::Checkbox>(
+      l10n_util::GetStringUTF16(IDS_CARET_BROWSING_DO_NOT_ASK)));
+
+  SetTitle(l10n_util::GetStringUTF16(IDS_ENABLE_CARET_BROWSING_TITLE));
+
+  DialogDelegate::SetButtonLabel(
+      ui::DIALOG_BUTTON_OK,
+      l10n_util::GetStringUTF16(IDS_ENABLE_CARET_BROWSING_TURN_ON));
+
+  SetShowCloseButton(false);
+
+  const auto on_accept = [](PrefService* pref_service,
+                            views::Checkbox* do_not_ask_checkbox) {
+    base::RecordAction(
+        base::UserMetricsAction("Accessibility.CaretBrowsing.AcceptDialog"));
+    pref_service->SetBoolean(prefs::kCaretBrowsingEnabled, true);
+    if (do_not_ask_checkbox->GetChecked()) {
+      base::RecordAction(
+          base::UserMetricsAction("Accessibility.CaretBrowsing.DoNotAsk"));
+      pref_service->SetBoolean(prefs::kShowCaretBrowsingDialog, false);
+    }
+  };
+  SetAcceptCallback(
+      base::BindOnce(on_accept, pref_service_, do_not_ask_checkbox_));
+
+  const auto on_cancel = []() {
+    base::RecordAction(
+        base::UserMetricsAction("Accessibility.CaretBrowsing.CancelDialog"));
+  };
+  SetCancelCallback(base::BindOnce(on_cancel));
+}
+
+CaretBrowsingDialogDelegate::~CaretBrowsingDialogDelegate() {}
+
+ui::ModalType CaretBrowsingDialogDelegate::GetModalType() const {
+  return ui::MODAL_TYPE_WINDOW;
+}
+
+gfx::Size CaretBrowsingDialogDelegate::CalculatePreferredSize() const {
+  const int width = ChromeLayoutProvider::Get()->GetDistanceMetric(
+                        DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) -
+                    margins().width();
+  return gfx::Size(width, GetHeightForWidth(width));
+}
diff --git a/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.h b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.h
new file mode 100644
index 0000000..a0a07a42
--- /dev/null
+++ b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.h
@@ -0,0 +1,40 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_CARET_BROWSING_DIALOG_DELEGATE_H_
+#define CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_CARET_BROWSING_DIALOG_DELEGATE_H_
+
+#include "ui/gfx/native_widget_types.h"
+#include "ui/views/window/dialog_delegate.h"
+
+class PrefService;
+
+namespace views {
+class Checkbox;
+}
+
+// A dialog box that confirms that the user wants to enable caret browsing.
+class CaretBrowsingDialogDelegate : public views::DialogDelegateView {
+ public:
+  static void Show(gfx::NativeWindow parent_window, PrefService* pref_service);
+
+ private:
+  explicit CaretBrowsingDialogDelegate(PrefService* pref_service);
+  CaretBrowsingDialogDelegate(const CaretBrowsingDialogDelegate&) = delete;
+  CaretBrowsingDialogDelegate& operator=(const CaretBrowsingDialogDelegate&) =
+      delete;
+  ~CaretBrowsingDialogDelegate() override;
+
+  // DialogDelegateView.
+  ui::ModalType GetModalType() const override;
+  gfx::Size CalculatePreferredSize() const override;
+
+  PrefService* pref_service_;
+
+  // Checkbox where the user can say they don't want to be asked when they
+  // toggle caret browsing next time.
+  views::Checkbox* do_not_ask_checkbox_ = nullptr;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_CARET_BROWSING_DIALOG_DELEGATE_H_
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.cc
new file mode 100644
index 0000000..56055b1b
--- /dev/null
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.cc
@@ -0,0 +1,12 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
+
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_timeout.h"
+
+FeaturePromoBubbleParams::FeaturePromoBubbleParams() = default;
+FeaturePromoBubbleParams::~FeaturePromoBubbleParams() = default;
+FeaturePromoBubbleParams::FeaturePromoBubbleParams(FeaturePromoBubbleParams&&) =
+    default;
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h
new file mode 100644
index 0000000..c430b4b
--- /dev/null
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h
@@ -0,0 +1,68 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_BUBBLE_PARAMS_H_
+#define CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_BUBBLE_PARAMS_H_
+
+#include <memory>
+
+#include "base/optional.h"
+#include "ui/base/accelerators/accelerator.h"
+#include "ui/views/bubble/bubble_border.h"
+
+class FeaturePromoBubbleTimeout;
+
+// Describes the content and appearance of an in-product help bubble.
+// |body_string_specifier|, |anchor_view|, and |arrow| are required, all
+// other fields have good defaults. For consistency between different
+// in-product help flows, avoid changing more fields than necessary.
+struct FeaturePromoBubbleParams {
+  FeaturePromoBubbleParams();
+  ~FeaturePromoBubbleParams();
+
+  FeaturePromoBubbleParams(FeaturePromoBubbleParams&&);
+
+  // Promo contents:
+
+  // The main promo text. Must be set to a valid string specifier.
+  int body_string_specifier = -1;
+
+  // Title shown larger at top of bubble. Optional.
+  base::Optional<int> title_string_specifier;
+
+  // String to be announced when bubble is shown. Optional.
+  base::Optional<int> screenreader_string_specifier;
+
+  // A keyboard accelerator to access the feature. If
+  // |screenreader_string_specifier| is set and contains a
+  // placeholder, this is filled in.
+  base::Optional<ui::Accelerator> feature_accelerator;
+
+  // Positioning and sizing:
+
+  // View bubble is positioned relative to. Required.
+  views::View* anchor_view = nullptr;
+
+  // Determines position relative to |anchor_view|. Required. Note
+  // that contrary to the name, no visible arrow is shown.
+  views::BubbleBorder::Arrow arrow = views::BubbleBorder::TOP_LEFT;
+
+  // If set, determines the width of the bubble. Prefer the default if
+  // possible.
+  base::Optional<int> preferred_width;
+
+  enum class ActivationAction {
+    DO_NOT_ACTIVATE,
+    ACTIVATE,
+  };
+
+  // Determines whether the bubble's widget can be activated, and
+  // activates it on creation if so.
+  ActivationAction activation_action = ActivationAction::DO_NOT_ACTIVATE;
+
+  // Changes the bubble timeout. Intended for tests, avoid use.
+  std::unique_ptr<FeaturePromoBubbleTimeout> timeout;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_BUBBLE_PARAMS_H_
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
index df170bb..0775282 100644
--- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.cc
@@ -11,6 +11,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_timeout.h"
 #include "components/variations/variations_associated_data.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -39,11 +40,7 @@
 
 }  // namespace
 
-FeaturePromoBubbleView::CreateParams::CreateParams() = default;
-FeaturePromoBubbleView::CreateParams::~CreateParams() = default;
-FeaturePromoBubbleView::CreateParams::CreateParams(CreateParams&&) = default;
-
-FeaturePromoBubbleView::FeaturePromoBubbleView(CreateParams params)
+FeaturePromoBubbleView::FeaturePromoBubbleView(FeaturePromoBubbleParams params)
     : BubbleDialogDelegateView(params.anchor_view, params.arrow),
       activation_action_(params.activation_action),
       feature_promo_bubble_timeout_(std::move(params.timeout)),
@@ -118,7 +115,8 @@
     body_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   }
 
-  if (params.activation_action == ActivationAction::DO_NOT_ACTIVATE) {
+  if (params.activation_action ==
+      FeaturePromoBubbleParams::ActivationAction::DO_NOT_ACTIVATE) {
     SetCanActivate(false);
     set_shadow(views::BubbleBorder::BIG_SHADOW);
   }
@@ -141,7 +139,8 @@
 FeaturePromoBubbleView::~FeaturePromoBubbleView() = default;
 
 // static
-FeaturePromoBubbleView* FeaturePromoBubbleView::Create(CreateParams params) {
+FeaturePromoBubbleView* FeaturePromoBubbleView::Create(
+    FeaturePromoBubbleParams params) {
   return new FeaturePromoBubbleView(std::move(params));
 }
 
@@ -165,7 +164,8 @@
 
 gfx::Rect FeaturePromoBubbleView::GetBubbleBounds() {
   gfx::Rect bounds = BubbleDialogDelegateView::GetBubbleBounds();
-  if (activation_action_ == ActivationAction::DO_NOT_ACTIVATE) {
+  if (activation_action_ ==
+      FeaturePromoBubbleParams::ActivationAction::DO_NOT_ACTIVATE) {
     if (base::i18n::IsRTL())
       bounds.Offset(5, 0);
     else
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h
index aef4b49..11014513 100644
--- a/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_timeout.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -19,7 +20,6 @@
 }
 
 namespace ui {
-class Accelerator;
 class MouseEvent;
 }  // namespace ui
 
@@ -28,67 +28,17 @@
 // deferred context.
 class FeaturePromoBubbleView : public views::BubbleDialogDelegateView {
  public:
-  enum class ActivationAction {
-    DO_NOT_ACTIVATE,
-    ACTIVATE,
-  };
-
-  // Parameters to determine the promo's contents and appearance. Only
-  // |body_string_specifier|, |anchor_view|, and |arrow| are required.
-  struct CreateParams {
-    CreateParams();
-    ~CreateParams();
-
-    CreateParams(CreateParams&&);
-
-    // Promo contents:
-
-    // The main promo text. Must be set to a valid string specifier.
-    int body_string_specifier = -1;
-
-    // Title shown larger at top of bubble. Optional.
-    base::Optional<int> title_string_specifier;
-
-    // String to be announced when bubble is shown. Optional.
-    base::Optional<int> screenreader_string_specifier;
-
-    // A keyboard accelerator to access the feature. If
-    // |screenreader_string_specifier| is set and contains a
-    // placeholder, this is filled in.
-    base::Optional<ui::Accelerator> feature_accelerator;
-
-    // Positioning and sizing:
-
-    // View bubble is positioned relative to. Required.
-    views::View* anchor_view = nullptr;
-
-    // Determines position relative to |anchor_view|. Required. Note
-    // that contrary to the name, no visible arrow is shown.
-    views::BubbleBorder::Arrow arrow;
-
-    // If set, determines the width of the bubble. Prefer the default if
-    // possible.
-    base::Optional<int> preferred_width;
-
-    // Determines whether the bubble's widget can be activated, and
-    // activates it on creation if so.
-    ActivationAction activation_action = ActivationAction::DO_NOT_ACTIVATE;
-
-    // Changes the bubble timeout. Intended for tests, avoid use.
-    std::unique_ptr<FeaturePromoBubbleTimeout> timeout;
-  };
-
   ~FeaturePromoBubbleView() override;
 
   // Creates the promo. The returned pointer is only valid until the
   // widget is destroyed. It must not be manually deleted by the caller.
-  static FeaturePromoBubbleView* Create(CreateParams params);
+  static FeaturePromoBubbleView* Create(FeaturePromoBubbleParams params);
 
   // Closes the promo bubble.
   void CloseBubble();
 
  private:
-  explicit FeaturePromoBubbleView(CreateParams params);
+  explicit FeaturePromoBubbleView(FeaturePromoBubbleParams params);
 
   // BubbleDialogDelegateView:
   bool OnMousePressed(const ui::MouseEvent& event) override;
@@ -102,7 +52,7 @@
   }
   gfx::Size CalculatePreferredSize() const override;
 
-  const ActivationAction activation_action_;
+  const FeaturePromoBubbleParams::ActivationAction activation_action_;
 
   base::string16 accessible_name_;
 
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_controller.cc b/chrome/browser/ui/views/feature_promos/feature_promo_controller.cc
new file mode 100644
index 0000000..28454b0
--- /dev/null
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_controller.cc
@@ -0,0 +1,131 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
+
+#include <utility>
+
+#include "base/logging.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/views/chrome_view_class_properties.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
+#include "components/feature_engagement/public/tracker.h"
+
+FeaturePromoController::FeaturePromoController(Profile* profile)
+    : tracker_(
+          feature_engagement::TrackerFactory::GetForBrowserContext(profile)) {
+  DCHECK(tracker_);
+}
+
+FeaturePromoController::~FeaturePromoController() {
+  if (!promo_bubble_) {
+    DCHECK_EQ(current_iph_feature_, nullptr);
+    return;
+  }
+
+  DCHECK(current_iph_feature_);
+
+  promo_bubble_->GetWidget()->Close();
+}
+
+bool FeaturePromoController::MaybeShowPromo(const base::Feature& iph_feature,
+                                            FeaturePromoBubbleParams params) {
+  if (!tracker_->ShouldTriggerHelpUI(iph_feature))
+    return false;
+
+  // If the tracker says we should trigger, but we have a promo
+  // currently showing, there is a bug somewhere in here.
+  DCHECK(!current_iph_feature_);
+
+  params.anchor_view->SetProperty(kHasInProductHelpPromoKey, true);
+  anchor_view_tracker_.SetView(params.anchor_view);
+
+  current_iph_feature_ = &iph_feature;
+  promo_bubble_ = FeaturePromoBubbleView::Create(std::move(params));
+  widget_observer_.Add(promo_bubble_->GetWidget());
+
+  return true;
+}
+
+bool FeaturePromoController::BubbleIsShowing(
+    const base::Feature& iph_feature) const {
+  return promo_bubble_ && current_iph_feature_ == &iph_feature;
+}
+
+void FeaturePromoController::CloseBubble(const base::Feature& iph_feature) {
+  DCHECK_EQ(&iph_feature, current_iph_feature_);
+  DCHECK(promo_bubble_);
+  promo_bubble_->GetWidget()->Close();
+}
+
+void FeaturePromoController::UpdateBubbleForAnchorBoundsChange() {
+  if (!promo_bubble_)
+    return;
+  promo_bubble_->OnAnchorBoundsChanged();
+}
+
+FeaturePromoController::PromoHandle
+FeaturePromoController::CloseBubbleAndContinuePromo(
+    const base::Feature& iph_feature) {
+  DCHECK_EQ(&iph_feature, current_iph_feature_);
+  DCHECK(promo_bubble_);
+
+  widget_observer_.Remove(promo_bubble_->GetWidget());
+  promo_bubble_->GetWidget()->Close();
+  promo_bubble_ = nullptr;
+
+  if (anchor_view_tracker_.view())
+    anchor_view_tracker_.view()->SetProperty(kHasInProductHelpPromoKey, false);
+
+  return PromoHandle(weak_ptr_factory_.GetWeakPtr());
+}
+
+void FeaturePromoController::OnWidgetClosing(views::Widget* widget) {
+  DCHECK(promo_bubble_);
+  DCHECK_EQ(widget, promo_bubble_->GetWidget());
+  HandleBubbleClosed();
+}
+
+void FeaturePromoController::OnWidgetDestroying(views::Widget* widget) {
+  DCHECK(promo_bubble_);
+  DCHECK_EQ(widget, promo_bubble_->GetWidget());
+  HandleBubbleClosed();
+}
+
+void FeaturePromoController::FinishContinuedPromo() {
+  DCHECK(current_iph_feature_);
+  DCHECK(!promo_bubble_);
+  tracker_->Dismissed(*current_iph_feature_);
+  current_iph_feature_ = nullptr;
+}
+
+void FeaturePromoController::HandleBubbleClosed() {
+  DCHECK(current_iph_feature_);
+
+  tracker_->Dismissed(*current_iph_feature_);
+  widget_observer_.Remove(promo_bubble_->GetWidget());
+
+  current_iph_feature_ = nullptr;
+  promo_bubble_ = nullptr;
+
+  if (anchor_view_tracker_.view())
+    anchor_view_tracker_.view()->SetProperty(kHasInProductHelpPromoKey, false);
+}
+
+FeaturePromoController::PromoHandle::PromoHandle(
+    base::WeakPtr<FeaturePromoController> controller)
+    : controller_(std::move(controller)) {}
+
+FeaturePromoController::PromoHandle::~PromoHandle() {
+  if (controller_)
+    controller_->FinishContinuedPromo();
+}
+
+FeaturePromoController::PromoHandle::PromoHandle(PromoHandle&& other) = default;
+
+FeaturePromoController::PromoHandle&
+FeaturePromoController::PromoHandle::operator=(PromoHandle&& other) = default;
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_controller.h b/chrome/browser/ui/views/feature_promos/feature_promo_controller.h
new file mode 100644
index 0000000..81ae3cb
--- /dev/null
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_controller.h
@@ -0,0 +1,115 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_CONTROLLER_H_
+#define CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_CONTROLLER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "ui/views/view_tracker.h"
+#include "ui/views/widget/widget.h"
+#include "ui/views/widget/widget_observer.h"
+
+class FeaturePromoBubbleView;
+struct FeaturePromoBubbleParams;
+class Profile;
+
+namespace base {
+struct Feature;
+}
+
+namespace feature_engagement {
+class Tracker;
+}
+
+// Manages display of in-product help promos. All IPH displays in Top
+// Chrome should go through here.
+class FeaturePromoController : public views::WidgetObserver {
+ public:
+  explicit FeaturePromoController(Profile* profile);
+  ~FeaturePromoController() override;
+
+  // Starts the promo if possible. Returns whether it started.
+  // |iph_feature| must be an IPH feature defined in
+  // components/feature_engagement/public/feature_list.cc. Note that
+  // this is different than the feature that the IPH is for.
+  bool MaybeShowPromo(const base::Feature& iph_feature,
+                      FeaturePromoBubbleParams params);
+
+  // Returns whether a bubble is showing for the given IPH. Note that if
+  // this is false, a promo might still be in progress; for example, a
+  // promo may have continued into a menu in which case the bubble is no
+  // longer showing.
+  bool BubbleIsShowing(const base::Feature& iph_feature) const;
+
+  // Close the bubble for |iph_feature| and end the promo. If no promo
+  // is showing for |iph_feature|, or the promo has continued past the
+  // bubble, calling this is an error.
+  void CloseBubble(const base::Feature& iph_feature);
+
+  class PromoHandle;
+
+  // Like CloseBubble() but does not end the promo yet. The caller takes
+  // ownership of the promo (e.g. to show a highlight in a menu or on a
+  // button). The returned PromoHandle represents this ownership.
+  PromoHandle CloseBubbleAndContinuePromo(const base::Feature& iph_feature);
+
+  // Repositions the bubble (if showing) relative to the anchor view.
+  // This should be called whenever the anchor view is potentially
+  // moved. It is safe to call this if a bubble is not showing.
+  void UpdateBubbleForAnchorBoundsChange();
+
+  // When a caller wants to take ownership of the promo after a bubble
+  // is closed, this handle is given. It must be dropped in a timely
+  // fashion to ensure everything is cleaned up. If it isn't, it will
+  // make the IPH backend think it's still shwoing and block all other
+  // IPH indefinitely.
+  class PromoHandle {
+   public:
+    explicit PromoHandle(base::WeakPtr<FeaturePromoController> controller);
+    PromoHandle(PromoHandle&&);
+    ~PromoHandle();
+
+    PromoHandle& operator=(PromoHandle&&);
+
+   private:
+    base::WeakPtr<FeaturePromoController> controller_;
+  };
+
+  // views::WidgetObserver:
+  void OnWidgetClosing(views::Widget* widget) override;
+  void OnWidgetDestroying(views::Widget* widget) override;
+
+  FeaturePromoBubbleView* promo_bubble_for_testing() { return promo_bubble_; }
+  const FeaturePromoBubbleView* promo_bubble_for_testing() const {
+    return promo_bubble_;
+  }
+
+ private:
+  // Called when PromoHandle is destroyed to finish the promo.
+  void FinishContinuedPromo();
+
+  void HandleBubbleClosed();
+
+  // IPH backend that is notified of user events and decides whether to
+  // trigger IPH.
+  feature_engagement::Tracker* const tracker_;
+
+  // Non-null as long as a promo is showing. Corresponds to an IPH
+  // feature registered with |tracker_|.
+  const base::Feature* current_iph_feature_ = nullptr;
+
+  // The bubble currently showing, if any.
+  FeaturePromoBubbleView* promo_bubble_ = nullptr;
+
+  // Stores the bubble anchor view so we can set/unset a highlight on
+  // it.
+  views::ViewTracker anchor_view_tracker_;
+
+  ScopedObserver<views::Widget, views::WidgetObserver> widget_observer_{this};
+
+  base::WeakPtrFactory<FeaturePromoController> weak_ptr_factory_{this};
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_FEATURE_PROMOS_FEATURE_PROMO_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_controller_unittest.cc b/chrome/browser/ui/views/feature_promos/feature_promo_controller_unittest.cc
new file mode 100644
index 0000000..311a9885
--- /dev/null
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_controller_unittest.cc
@@ -0,0 +1,205 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
+
+#include "base/bind.h"
+#include "base/feature_list.h"
+#include "base/optional.h"
+#include "chrome/browser/feature_engagement/tracker_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/views/chrome_view_class_properties.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
+#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/feature_engagement/test/mock_tracker.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "ui/views/bubble/bubble_border.h"
+#include "ui/views/test/widget_test.h"
+
+using ::testing::_;
+using ::testing::AnyNumber;
+using ::testing::NiceMock;
+using ::testing::Ref;
+using ::testing::Return;
+
+namespace {
+base::Feature kTestIPHFeature{"TestIPHFeature",
+                              base::FEATURE_ENABLED_BY_DEFAULT};
+}  // namespace
+
+class FeaturePromoControllerTest : public TestWithBrowserView {
+ public:
+  void SetUp() override {
+    TestWithBrowserView::SetUp();
+    controller_ = browser_view()->feature_promo_controller();
+
+    mock_tracker_ =
+        static_cast<NiceMock<feature_engagement::test::MockTracker>*>(
+            feature_engagement::TrackerFactory::GetForBrowserContext(
+                profile()));
+  }
+
+  TestingProfile::TestingFactories GetTestingFactories() override {
+    TestingProfile::TestingFactories factories =
+        TestWithBrowserView::GetTestingFactories();
+    factories.emplace_back(
+        feature_engagement::TrackerFactory::GetInstance(),
+        base::BindRepeating(FeaturePromoControllerTest::MakeTestTracker));
+    return factories;
+  }
+
+ protected:
+  views::View* GetAnchorView() {
+    return browser_view()->toolbar()->app_menu_button();
+  }
+
+  FeaturePromoBubbleParams DefaultBubbleParams() {
+    FeaturePromoBubbleParams params;
+    params.body_string_specifier = IDS_REOPEN_TAB_PROMO;
+    params.anchor_view = GetAnchorView();
+    params.arrow = views::BubbleBorder::TOP_RIGHT;
+    return params;
+  }
+
+  FeaturePromoController* controller_;
+  NiceMock<feature_engagement::test::MockTracker>* mock_tracker_;
+
+ private:
+  static std::unique_ptr<KeyedService> MakeTestTracker(
+      content::BrowserContext* context) {
+    auto tracker =
+        std::make_unique<NiceMock<feature_engagement::test::MockTracker>>();
+
+    // Allow other code to call into the tracker.
+    EXPECT_CALL(*tracker, NotifyEvent(_)).Times(AnyNumber());
+    EXPECT_CALL(*tracker, ShouldTriggerHelpUI(_))
+        .Times(AnyNumber())
+        .WillRepeatedly(Return(false));
+
+    return tracker;
+  }
+};
+
+TEST_F(FeaturePromoControllerTest, AsksBackendToShowPromo) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(false));
+  EXPECT_FALSE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+  EXPECT_FALSE(controller_->BubbleIsShowing(kTestIPHFeature));
+  EXPECT_FALSE(controller_->promo_bubble_for_testing());
+}
+
+TEST_F(FeaturePromoControllerTest, ShowsBubble) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(true));
+  EXPECT_TRUE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+  EXPECT_TRUE(controller_->BubbleIsShowing(kTestIPHFeature));
+  EXPECT_TRUE(controller_->promo_bubble_for_testing());
+}
+
+TEST_F(FeaturePromoControllerTest, PromoEndsWhenRequested) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(true));
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0);
+  ASSERT_TRUE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+
+  // Only valid before the widget is closed.
+  FeaturePromoBubbleView* const bubble =
+      controller_->promo_bubble_for_testing();
+  ASSERT_TRUE(bubble);
+
+  EXPECT_TRUE(controller_->BubbleIsShowing(kTestIPHFeature));
+  views::test::WidgetClosingObserver widget_observer(bubble->GetWidget());
+
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(1);
+  controller_->CloseBubble(kTestIPHFeature);
+  EXPECT_FALSE(controller_->BubbleIsShowing(kTestIPHFeature));
+  EXPECT_FALSE(controller_->promo_bubble_for_testing());
+
+  // Ensure the widget does close.
+  widget_observer.Wait();
+}
+
+TEST_F(FeaturePromoControllerTest, PromoEndsOnBubbleClosure) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(true));
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0);
+  ASSERT_TRUE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+
+  // Only valid before the widget is closed.
+  FeaturePromoBubbleView* const bubble =
+      controller_->promo_bubble_for_testing();
+  ASSERT_TRUE(bubble);
+
+  EXPECT_TRUE(controller_->BubbleIsShowing(kTestIPHFeature));
+  views::test::WidgetClosingObserver widget_observer(bubble->GetWidget());
+
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(1);
+  bubble->GetWidget()->Close();
+  widget_observer.Wait();
+
+  EXPECT_FALSE(controller_->BubbleIsShowing(kTestIPHFeature));
+  EXPECT_FALSE(controller_->promo_bubble_for_testing());
+}
+
+TEST_F(FeaturePromoControllerTest, ContinuedPromoDefersBackendDismissed) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(true));
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0);
+  ASSERT_TRUE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+
+  // Only valid before the widget is closed.
+  FeaturePromoBubbleView* const bubble =
+      controller_->promo_bubble_for_testing();
+  ASSERT_TRUE(bubble);
+
+  EXPECT_TRUE(controller_->BubbleIsShowing(kTestIPHFeature));
+  views::test::WidgetClosingObserver widget_observer(bubble->GetWidget());
+
+  // First check that CloseBubbleAndContinuePromo() actually closes the
+  // bubble, but doesn't yet tell the backend the promo finished.
+
+  base::Optional<FeaturePromoController::PromoHandle> promo_handle =
+      controller_->CloseBubbleAndContinuePromo(kTestIPHFeature);
+  EXPECT_FALSE(controller_->BubbleIsShowing(kTestIPHFeature));
+  EXPECT_FALSE(controller_->promo_bubble_for_testing());
+
+  // Ensure the widget does close.
+  widget_observer.Wait();
+
+  // Check handle destruction causes the backend to be notified.
+
+  EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(1);
+  promo_handle.reset();
+}
+
+TEST_F(FeaturePromoControllerTest, PropertySetOnAnchorViewWhileBubbleOpen) {
+  EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kTestIPHFeature)))
+      .Times(1)
+      .WillOnce(Return(true));
+
+  EXPECT_FALSE(GetAnchorView()->GetProperty(kHasInProductHelpPromoKey));
+
+  ASSERT_TRUE(
+      controller_->MaybeShowPromo(kTestIPHFeature, DefaultBubbleParams()));
+  EXPECT_TRUE(GetAnchorView()->GetProperty(kHasInProductHelpPromoKey));
+
+  controller_->CloseBubble(kTestIPHFeature);
+  EXPECT_FALSE(GetAnchorView()->GetProperty(kHasInProductHelpPromoKey));
+}
diff --git a/chrome/browser/ui/views/feature_promos/feature_promo_dialog_browsertest.cc b/chrome/browser/ui/views/feature_promos/feature_promo_dialog_browsertest.cc
index fde098f..67e8e57 100644
--- a/chrome/browser/ui/views/feature_promos/feature_promo_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/feature_promos/feature_promo_dialog_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
@@ -23,7 +24,7 @@
     // We use an arbitrary string because there are no test-only
     // strings.
     int placeholder_string = IDS_REOPEN_TAB_PROMO;
-    FeaturePromoBubbleView::CreateParams bubble_params;
+    FeaturePromoBubbleParams bubble_params;
     bubble_params.body_string_specifier = placeholder_string;
     bubble_params.anchor_view = app_menu_button;
     bubble_params.arrow = views::BubbleBorder::TOP_RIGHT;
diff --git a/chrome/browser/ui/views/feature_promos/global_media_controls_promo_controller.cc b/chrome/browser/ui/views/feature_promos/global_media_controls_promo_controller.cc
index 64b9c886..f9b80de8 100644
--- a/chrome/browser/ui/views/feature_promos/global_media_controls_promo_controller.cc
+++ b/chrome/browser/ui/views/feature_promos/global_media_controls_promo_controller.cc
@@ -10,6 +10,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/ui/in_product_help/global_media_controls_in_product_help.h"
 #include "chrome/browser/ui/in_product_help/global_media_controls_in_product_help_factory.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_timeout.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -49,7 +50,7 @@
 
   // Here, we open the promo bubble.
   // TODO(https://crbug.com/991585): Supply a screenreader string too.
-  FeaturePromoBubbleView::CreateParams bubble_params;
+  FeaturePromoBubbleParams bubble_params;
   bubble_params.body_string_specifier = IDS_GLOBAL_MEDIA_CONTROLS_PROMO;
   bubble_params.anchor_view = owner_;
   bubble_params.arrow = views::BubbleBorder::Arrow::TOP_RIGHT;
diff --git a/chrome/browser/ui/views/feature_promos/reopen_tab_promo_controller.cc b/chrome/browser/ui/views/feature_promos/reopen_tab_promo_controller.cc
index f90c9a634..3a01692 100644
--- a/chrome/browser/ui/views/feature_promos/reopen_tab_promo_controller.cc
+++ b/chrome/browser/ui/views/feature_promos/reopen_tab_promo_controller.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/ui/in_product_help/reopen_tab_in_product_help.h"
 #include "chrome/browser/ui/in_product_help/reopen_tab_in_product_help_factory.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_timeout.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -58,7 +59,7 @@
       browser_view_->GetAccelerator(IDC_RESTORE_TAB, &accelerator);
   DCHECK(has_accelerator);
 
-  FeaturePromoBubbleView::CreateParams bubble_params;
+  FeaturePromoBubbleParams bubble_params;
   bubble_params.body_string_specifier = IDS_REOPEN_TAB_PROMO;
   bubble_params.screenreader_string_specifier =
       IDS_REOPEN_TAB_PROMO_SCREENREADER;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 1b0f7bb3..92274e8 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -77,6 +77,7 @@
 #include "chrome/browser/ui/views/accelerator_table.h"
 #include "chrome/browser/ui/views/accessibility/accessibility_focus_highlight.h"
 #include "chrome/browser/ui/views/accessibility/caption_bubble_controller_views.h"
+#include "chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.h"
 #include "chrome/browser/ui/views/accessibility/invert_bubble_view.h"
 #include "chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
@@ -87,6 +88,7 @@
 #include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h"
 #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h"
 #include "chrome/browser/ui/views/eye_dropper/eye_dropper.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
 #include "chrome/browser/ui/views/find_bar_host.h"
 #include "chrome/browser/ui/views/frame/app_menu_button.h"
 #include "chrome/browser/ui/views/frame/browser_view_layout.h"
@@ -541,10 +543,14 @@
   tab_strip_region_view_ = top_container_->AddChildView(
       std::make_unique<TabStripRegionView>(std::move(tabstrip)));
 
-  // Must be destroyed before the tab strip.
+  feature_promo_controller_ =
+      std::make_unique<FeaturePromoController>(browser_->profile());
+
+  // Must be destroyed before the tab strip and |feature_promo_controller_|.
   tab_groups_iph_controller_ = std::make_unique<TabGroupsIPHController>(
-      browser_.get(), base::BindRepeating(&TabStrip::GetTabViewForPromoAnchor,
-                                          base::Unretained(tabstrip_)));
+      browser_.get(), feature_promo_controller_.get(),
+      base::BindRepeating(&TabStrip::GetTabViewForPromoAnchor,
+                          base::Unretained(tabstrip_)));
 
   // Create WebViews early so |webui_tab_strip_| can observe their size.
   auto devtools_web_view =
@@ -2688,10 +2694,7 @@
         ->UpdateAnchorPosition();
   }
 
-#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
-  if (webui_tab_strip_)
-    webui_tab_strip_->UpdatePromoBubbleBounds();
-#endif  // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
+  feature_promo_controller_->UpdateBubbleForAnchorBoundsChange();
 }
 
 void BrowserView::OnGestureEvent(ui::GestureEvent* event) {
@@ -2888,7 +2891,7 @@
       // downloads bar.
       webui_tab_strip_ = top_container_->AddChildView(
           std::make_unique<WebUITabStripContainerView>(
-              browser_.get(), contents_container_, top_container_,
+              this, contents_container_, top_container_,
               GetLocationBarView()->omnibox_view()));
       loading_bar_ = top_container_->AddChildView(
           std::make_unique<TopContainerLoadingBar>(browser_.get()));
@@ -3361,6 +3364,11 @@
   GetWidget()->ShowEmojiPanel();
 }
 
+void BrowserView::ShowCaretBrowsingDialog() {
+  CaretBrowsingDialogDelegate::Show(GetNativeWindow(),
+                                    GetProfile()->GetPrefs());
+}
+
 std::unique_ptr<content::EyeDropper> BrowserView::OpenEyeDropper(
     content::RenderFrameHost* frame,
     content::EyeDropperListener* listener) {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 02cdd82..9f615c0 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -60,6 +60,7 @@
 class ContentsLayoutManager;
 class DownloadShelfView;
 class ExclusiveAccessBubbleViews;
+class FeaturePromoController;
 class FullscreenControlHost;
 class InfoBarContainerView;
 class LocationBarView;
@@ -293,6 +294,10 @@
     return tab_groups_iph_controller_.get();
   }
 
+  FeaturePromoController* feature_promo_controller() {
+    return feature_promo_controller_.get();
+  }
+
   // BrowserWindow:
   void Show() override;
   void ShowInactive() override;
@@ -440,6 +445,7 @@
   void UnhideDownloadShelf();
 
   void ShowEmojiPanel() override;
+  void ShowCaretBrowsingDialog() override;
 
   std::unique_ptr<content::EyeDropper> OpenEyeDropper(
       content::RenderFrameHost* frame,
@@ -894,6 +900,7 @@
   std::unique_ptr<AccessibilityFocusHighlight> accessibility_focus_highlight_;
 
   std::unique_ptr<TabGroupsIPHController> tab_groups_iph_controller_;
+  std::unique_ptr<FeaturePromoController> feature_promo_controller_;
 
   mutable base::WeakPtrFactory<BrowserView> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
index 1deee14663..eccb4bd 100644
--- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
@@ -35,8 +35,10 @@
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/chrome_view_class_properties.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_colors.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/tabs/tab_group_editor_bubble_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
@@ -321,12 +323,12 @@
   bool drag_in_progress_ = false;
 };
 
-class WebUITabStripContainerView::IPHController : public TabStripModelObserver,
-                                                  public views::WidgetObserver {
+class WebUITabStripContainerView::IPHController : public TabStripModelObserver {
  public:
-  explicit IPHController(Browser* browser)
+  explicit IPHController(Browser* browser,
+                         FeaturePromoController* promo_controller)
       : browser_(browser),
-        widget_observer_(this),
+        promo_controller_(promo_controller),
         iph_tracker_(feature_engagement::TrackerFactory::GetForBrowserContext(
             browser_->profile())) {
     browser_->tab_strip_model()->AddObserver(this);
@@ -349,21 +351,13 @@
     iph_tracker_->NotifyEvent(feature_engagement::events::kWebUITabStripClosed);
   }
 
-  void UpdatePromoBounds() {
-    if (!promo_)
-      return;
-    promo_->OnAnchorBoundsChanged();
-  }
-
   // Ends the promo if it's showing.
   void AbortPromo() {
-    if (!promo_)
+    if (!promo_controller_->BubbleIsShowing(
+            feature_engagement::kIPHWebUITabStripFeature))
       return;
-
-    widget_observer_.Remove(promo_->GetWidget());
-    promo_->GetWidget()->CloseWithReason(
-        views::Widget::ClosedReason::kUnspecified);
-    PromoBubbleDismissed();
+    promo_controller_->CloseBubble(
+        feature_engagement::kIPHWebUITabStripFeature);
   }
 
   // TabStripModelObserver:
@@ -376,11 +370,6 @@
     if (change.type() != TabStripModelChange::kInserted)
       return;
 
-    // Abort if we shouldn't show IPH right now.
-    if (!iph_tracker_->ShouldTriggerHelpUI(
-            feature_engagement::kIPHWebUITabStripFeature))
-      return;
-
     views::View* const anchor_view = anchor_.view();
 
     // In the off chance this is called while the browser is being destroyed,
@@ -388,51 +377,29 @@
     if (!anchor_view)
       return;
 
-    anchor_view->SetProperty(kHasInProductHelpPromoKey, true);
-
-    FeaturePromoBubbleView::CreateParams bubble_params;
+    FeaturePromoBubbleParams bubble_params;
     bubble_params.body_string_specifier = IDS_WEBUI_TAB_STRIP_PROMO;
     bubble_params.anchor_view = anchor_view;
     bubble_params.arrow = views::BubbleBorder::TOP_RIGHT;
-
-    promo_ = FeaturePromoBubbleView::Create(std::move(bubble_params));
-    promo_->set_close_on_deactivate(false);
-    widget_observer_.Add(promo_->GetWidget());
-  }
-
-  // views::WidgetObserver:
-  void OnWidgetDestroying(views::Widget* widget) override {
-    // This call should only happen at the end of IPH.
-    DCHECK_EQ(widget, promo_->GetWidget());
-    widget_observer_.Remove(widget);
-    PromoBubbleDismissed();
+    promo_controller_->MaybeShowPromo(
+        feature_engagement::kIPHWebUITabStripFeature, std::move(bubble_params));
   }
 
  private:
-  void PromoBubbleDismissed() {
-    promo_ = nullptr;
-    iph_tracker_->Dismissed(feature_engagement::kIPHWebUITabStripFeature);
-    views::View* const anchor_view = anchor_.view();
-    if (anchor_view)
-      anchor_view->SetProperty(kHasInProductHelpPromoKey, false);
-  }
-
   Browser* const browser_;
-  ScopedObserver<views::Widget, views::WidgetObserver> widget_observer_;
+  FeaturePromoController* const promo_controller_;
   feature_engagement::Tracker* const iph_tracker_;
   views::ViewTracker anchor_;
-
-  FeaturePromoBubbleView* promo_ = nullptr;
 };
 
 WebUITabStripContainerView::WebUITabStripContainerView(
-    Browser* browser,
+    BrowserView* browser_view,
     views::View* tab_contents_container,
     views::View* drag_handle,
     views::View* omnibox)
-    : browser_(browser),
+    : browser_(browser_view->browser()),
       web_view_(AddChildView(
-          std::make_unique<WebUITabStripWebView>(browser->profile()))),
+          std::make_unique<WebUITabStripWebView>(browser_->profile()))),
       tab_contents_container_(tab_contents_container),
       auto_closer_(std::make_unique<AutoCloser>(
           base::Bind(&WebUITabStripContainerView::CloseForEventOutsideTabStrip,
@@ -441,7 +408,9 @@
           omnibox)),
       drag_to_open_handler_(
           std::make_unique<DragToOpenHandler>(this, drag_handle)),
-      iph_controller_(std::make_unique<IPHController>(browser_)) {
+      iph_controller_(std::make_unique<IPHController>(
+          browser_,
+          browser_view->feature_promo_controller())) {
   TRACE_EVENT0("ui", "WebUITabStripContainerView.Init");
   DCHECK(UseTouchableTabStrip(browser_));
   animation_.SetTweenType(gfx::Tween::Type::FAST_OUT_SLOW_IN);
@@ -550,10 +519,6 @@
   return tab_counter;
 }
 
-void WebUITabStripContainerView::UpdatePromoBubbleBounds() {
-  iph_controller_->UpdatePromoBounds();
-}
-
 void WebUITabStripContainerView::SetVisibleForTesting(bool visible) {
   SetContainerTargetVisibility(visible);
   animation_.SetCurrentValue(visible ? 1.0 : 0.0);
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h
index bf197628..4e7baac6 100644
--- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.h
@@ -38,6 +38,7 @@
 }  // namespace views
 
 class Browser;
+class BrowserView;
 
 class WebUITabStripContainerView : public TabStripUIEmbedder,
                                    public gfx::AnimationDelegate,
@@ -45,7 +46,7 @@
                                    public views::ButtonListener,
                                    public views::ViewObserver {
  public:
-  WebUITabStripContainerView(Browser* browser,
+  WebUITabStripContainerView(BrowserView* browser_view,
                              views::View* tab_contents_container,
                              views::View* drag_handle,
                              views::View* omnibox);
@@ -66,10 +67,6 @@
   // Control button. Must only be called once.
   std::unique_ptr<views::View> CreateTabCounter();
 
-  // Should be called on BrowserView re-layout. If IPH is showing,
-  // updates the promo for the new tab counter location.
-  void UpdatePromoBubbleBounds();
-
   // Clicking the tab counter button opens and closes the container with
   // an animation, so it is unsuitable for an interactive test. This
   // should be called instead. View::SetVisible() isn't sufficient since
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
index 743a12a..b3f8b62 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/ui/content_settings/content_setting_image_model.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/content_setting_bubble_contents.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -237,13 +238,13 @@
   // directly after the animation is shown.
   if (web_contents &&
       content_setting_image_model_->ShouldShowPromo(web_contents)) {
-    FeaturePromoBubbleView::CreateParams bubble_params;
+    FeaturePromoBubbleParams bubble_params;
     bubble_params.body_string_specifier =
         IDS_NOTIFICATIONS_QUIET_PERMISSION_NEW_REQUEST_PROMO;
     bubble_params.anchor_view = this;
     bubble_params.arrow = views::BubbleBorder::TOP_RIGHT;
     bubble_params.activation_action =
-        FeaturePromoBubbleView::ActivationAction::ACTIVATE;
+        FeaturePromoBubbleParams::ActivationAction::ACTIVATE;
     bubble_params.preferred_width = promo_width;
 
     // Owned by its native widget. Will be destroyed as its widget is destroyed.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 0bc4b6c..2a9b619 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -2275,19 +2275,15 @@
 
 gfx::Range OmniboxViewViews::GetSimplifiedDomainBounds(
     std::vector<gfx::Range>* ranges_surrounding_simplified_domain) {
-  // If provided, |ranges_surrounding_simplified_domain| should be empty.
-  DCHECK(!ranges_surrounding_simplified_domain ||
-         ranges_surrounding_simplified_domain->empty());
+  DCHECK(ranges_surrounding_simplified_domain);
+  DCHECK(ranges_surrounding_simplified_domain->empty());
 
   base::string16 text = GetText();
   url::Component host = GetHostComponentAfterTrivialSubdomain();
-  if (ranges_surrounding_simplified_domain) {
-    ranges_surrounding_simplified_domain->emplace_back(host.end(), text.size());
-  }
+  ranges_surrounding_simplified_domain->emplace_back(host.end(), text.size());
 
   if (!OmniboxFieldTrial::ShouldElideToRegistrableDomain()) {
-    if (ranges_surrounding_simplified_domain)
-      ranges_surrounding_simplified_domain->emplace_back(0, host.begin);
+    ranges_surrounding_simplified_domain->emplace_back(0, host.begin);
     return gfx::Range(host.begin, host.end());
   }
 
@@ -2298,18 +2294,14 @@
           url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
 
   if (simplified_domain.empty()) {
-    if (ranges_surrounding_simplified_domain)
-      ranges_surrounding_simplified_domain->emplace_back(0, host.begin);
+    ranges_surrounding_simplified_domain->emplace_back(0, host.begin);
     return gfx::Range(host.begin, host.end());
   }
 
   size_t simplified_domain_pos =
       text.find(base::ASCIIToUTF16(simplified_domain));
   DCHECK_NE(simplified_domain_pos, std::string::npos);
-  if (ranges_surrounding_simplified_domain) {
-    ranges_surrounding_simplified_domain->emplace_back(0,
-                                                       simplified_domain_pos);
-  }
+  ranges_surrounding_simplified_domain->emplace_back(0, simplified_domain_pos);
   return gfx::Range(simplified_domain_pos, host.end());
 }
 
@@ -2379,9 +2371,12 @@
          OmniboxFieldTrial::ShouldRevealPathQueryRefOnHover());
   DCHECK(IsURLEligibleForSimplifiedDomainEliding());
 
+  std::vector<gfx::Range> ranges_surrounding_simplified_domain;
+  gfx::Range simplified_domain_bounds =
+      GetSimplifiedDomainBounds(&ranges_surrounding_simplified_domain);
+
   // The simplified domain string must be a substring of the current display
   // text in order to elide to it.
-  gfx::Range simplified_domain_bounds = GetSimplifiedDomainBounds(nullptr);
   if (GetRenderText()->GetDisplayText().find(GetText().substr(
           simplified_domain_bounds.start(), simplified_domain_bounds.end())) ==
       std::string::npos) {
@@ -2417,6 +2412,12 @@
   GetRenderText()->SetDisplayOffset(
       GetRenderText()->GetUpdatedDisplayOffset().x() -
       (simplified_domain_rect.x() - old_bounds.x()));
+
+  // GetSubstringBounds() rounds outward internally, so there may be small
+  // portions of text still showing. Set the ranges surrounding the simplified
+  // domain to transparent so that these artifacts don't show.
+  for (const auto& range : ranges_surrounding_simplified_domain)
+    ApplyColor(SK_ColorTRANSPARENT, range);
 }
 
 void OmniboxViewViews::ShowFullURL() {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
index adfd31f..821e2ca 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
@@ -1408,19 +1408,20 @@
   ExpectFullUrlDisplayed();
 }
 
-// Checks that |render_text|'s current display rect and offset does not display
+// Checks that |view|'s current display rect and offset does not display
 // |path|, and also does not display |subdomain_and_scheme| if
 // |should_elide_to_registrable_domain| is true.
 //
 // |subdomain_and_scheme| is assumed to be a prefix of |hostname_and_scheme|.
 // |subdomain_and_scheme| and |subdomain| should include a trailing ".", and
 // |path| should include a leading "/".
-void ExpectElidedToSimplifiedDomain(gfx::RenderText* render_text,
+void ExpectElidedToSimplifiedDomain(TestingOmniboxView* view,
                                     const base::string16& scheme,
                                     const base::string16& subdomain,
                                     const base::string16& hostname_and_scheme,
                                     const base::string16& path,
                                     bool should_elide_to_registrable_domain) {
+  gfx::RenderText* render_text = view->GetRenderText();
   gfx::Rect subdomain_and_scheme_rect;
   for (const auto& rect : render_text->GetSubstringBounds(
            gfx::Range(0, scheme.size() + subdomain.size()))) {
@@ -1452,6 +1453,9 @@
     // |registrable_domain_rect|.
     EXPECT_EQ(registrable_domain_rect.x() - subdomain_and_scheme_rect.x(),
               -1 * render_text->GetUpdatedDisplayOffset().x());
+    // The scheme and subdomain should be transparent.
+    EXPECT_EQ(SK_ColorTRANSPARENT, view->GetLatestColorForRange(gfx::Range(
+                                       0, scheme.size() + subdomain.size())));
   } else {
     // When elision to registrable domain is disabled, the scheme should be
     // hidden but the subdomain should not be.
@@ -1468,7 +1472,15 @@
     // of different adjacent substring bounds could overlap.
     EXPECT_EQ(hostname_rect.x() - subdomain_and_scheme_rect.x(),
               -1 * render_text->GetUpdatedDisplayOffset().x());
+    // The scheme should be transparent.
+    EXPECT_EQ(SK_ColorTRANSPARENT,
+              view->GetLatestColorForRange(gfx::Range(0, scheme.size())));
   }
+  // The path should be transparent.
+  EXPECT_EQ(SK_ColorTRANSPARENT,
+            view->GetLatestColorForRange(
+                gfx::Range(hostname_and_scheme.size(),
+                           hostname_and_scheme.size() + path.size())));
 }
 
 // Checks that |render_text|'s current display rect and offset displays all of
@@ -1510,29 +1522,6 @@
   return render_text->display_rect().Intersects(path_rect);
 }
 
-// Returns true if the last color applied to the path (assumed to begin after
-// |hostname_and_scheme| ends) in |omnibox_view| was transparent.
-bool IsPathTransparent(TestingOmniboxView* omnibox_view,
-                       const base::string16& display_url,
-                       const base::string16& hostname_and_scheme) {
-  base::Optional<SkColor> last_path_color =
-      omnibox_view->GetLatestColorForRange(
-          gfx::Range(hostname_and_scheme.size(), display_url.size()));
-  return last_path_color.has_value() && *last_path_color == SK_ColorTRANSPARENT;
-}
-
-// Returns true if the last color applied to the given subdomain and scheme
-// (assumed to be at the beginning of the URL) in |omnibox_view| was
-// transparent.
-bool IsSubdomainTransparent(TestingOmniboxView* omnibox_view,
-                            const base::string16& subdomain_and_scheme) {
-  base::Optional<SkColor> last_subdomain_color =
-      omnibox_view->GetLatestColorForRange(
-          gfx::Range(0, subdomain_and_scheme.size()));
-  return last_subdomain_color.has_value() &&
-         *last_subdomain_color == SK_ColorTRANSPARENT;
-}
-
 class OmniboxViewViewsNoSimplifiedDomainTest : public OmniboxViewViewsTest {
  public:
   OmniboxViewViewsNoSimplifiedDomainTest()
@@ -1590,7 +1579,7 @@
   SetUpSimplifiedDomainTest();
   gfx::RenderText* render_text = omnibox_view()->GetRenderText();
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1615,7 +1604,7 @@
   // After the extended hover threshold has elapsed, the display text shouldn't
   // have changed yet.
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1627,10 +1616,14 @@
   ASSERT_NO_FATAL_FAILURE(ExpectUnelidedFromSimplifiedDomain(
       render_text, gfx::Range(0, kSimplifiedDomainDisplayUrl.size())));
   EXPECT_FALSE(hover_animation->IsAnimating());
-  EXPECT_FALSE(IsPathTransparent(omnibox_view(), kSimplifiedDomainDisplayUrl,
-                                 kSimplifiedDomainDisplayUrlHostnameAndScheme));
-  EXPECT_FALSE(IsSubdomainTransparent(
-      omnibox_view(), kSimplifiedDomainDisplayUrlSubdomainAndScheme));
+  // Check that the path and subdomain are not transparent.
+  EXPECT_NE(SK_ColorTRANSPARENT,
+            omnibox_view()->GetLatestColorForRange(
+                gfx::Range(kSimplifiedDomainDisplayUrlHostnameAndScheme.size(),
+                           kSimplifiedDomainDisplayUrl.size())));
+  EXPECT_NE(SK_ColorTRANSPARENT,
+            omnibox_view()->GetLatestColorForRange(gfx::Range(
+                0, kSimplifiedDomainDisplayUrlSubdomainAndScheme.size())));
 
   // Now exit the mouse. At this point the elision animation should run.
   omnibox_view()->OnMouseExited(CreateMouseEvent(ui::ET_MOUSE_EXITED, {0, 0}));
@@ -1643,16 +1636,10 @@
   hover_animation_as_element->Step(base::TimeTicks() +
                                    base::TimeDelta::FromSeconds(1));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
-  EXPECT_TRUE(IsPathTransparent(omnibox_view(), kSimplifiedDomainDisplayUrl,
-                                kSimplifiedDomainDisplayUrlHostnameAndScheme));
-  if (ShouldElideToRegistrableDomain()) {
-    EXPECT_TRUE(IsSubdomainTransparent(
-        omnibox_view(), kSimplifiedDomainDisplayUrlSubdomainAndScheme));
-  }
 }
 
 class OmniboxViewViewsHideOnInteractionAndRevealOnHoverTest
@@ -1691,7 +1678,6 @@
 TEST_P(OmniboxViewViewsHideOnInteractionAndRevealOnHoverTest,
        UserInteractionAndHover) {
   SetUpSimplifiedDomainTest();
-  gfx::RenderText* render_text = omnibox_view()->GetRenderText();
 
   content::MockNavigationHandle navigation;
   navigation.set_is_same_document(false);
@@ -1715,16 +1701,10 @@
   elide_as_element->SetStartTime(base::TimeTicks());
   elide_as_element->Step(base::TimeTicks() + base::TimeDelta::FromSeconds(1));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
-  EXPECT_TRUE(IsPathTransparent(omnibox_view(), kSimplifiedDomainDisplayUrl,
-                                kSimplifiedDomainDisplayUrlHostnameAndScheme));
-  if (ShouldElideToRegistrableDomain()) {
-    EXPECT_TRUE(IsSubdomainTransparent(
-        omnibox_view(), kSimplifiedDomainDisplayUrlSubdomainAndScheme));
-  }
 
   // A second user interaction should not run the animation again.
   omnibox_view()->DidGetUserInteraction(blink::WebKeyboardEvent());
@@ -1749,10 +1729,14 @@
   ASSERT_NO_FATAL_FAILURE(ExpectUnelidedFromSimplifiedDomain(
       omnibox_view()->GetRenderText(),
       gfx::Range(0, kSimplifiedDomainDisplayUrl.size())));
-  EXPECT_FALSE(IsPathTransparent(omnibox_view(), kSimplifiedDomainDisplayUrl,
-                                 kSimplifiedDomainDisplayUrlHostnameAndScheme));
-  EXPECT_FALSE(IsSubdomainTransparent(
-      omnibox_view(), kSimplifiedDomainDisplayUrlSubdomainAndScheme));
+  // The path and scheme/subdomain should not be transparent.
+  EXPECT_NE(SK_ColorTRANSPARENT,
+            omnibox_view()->GetLatestColorForRange(
+                gfx::Range(kSimplifiedDomainDisplayUrlHostnameAndScheme.size(),
+                           kSimplifiedDomainDisplayUrl.size())));
+  EXPECT_NE(SK_ColorTRANSPARENT,
+            omnibox_view()->GetLatestColorForRange(gfx::Range(
+                0, kSimplifiedDomainDisplayUrlSubdomainAndScheme.size())));
 }
 
 // Tests that mouse clicks do not count as user interactions and elide the URL.
@@ -1780,7 +1764,6 @@
 // bounds change.
 TEST_P(OmniboxViewViewsHideOnInteractionAndRevealOnHoverTest, BoundsChanged) {
   SetUpSimplifiedDomainTest();
-  gfx::RenderText* render_text = omnibox_view()->GetRenderText();
 
   content::MockNavigationHandle navigation;
   navigation.set_is_same_document(false);
@@ -1821,7 +1804,7 @@
   EXPECT_TRUE(elide_animation->IsAnimating());
   omnibox_view()->OnBoundsChanged(gfx::Rect());
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1831,10 +1814,9 @@
 // bounds change when only reveal-on-hover is enabled.
 TEST_P(OmniboxViewViewsRevealOnHoverTest, BoundsChanged) {
   SetUpSimplifiedDomainTest();
-  gfx::RenderText* render_text = omnibox_view()->GetRenderText();
 
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1842,7 +1824,7 @@
   // After the bounds change, the URL should remain elided.
   omnibox_view()->OnBoundsChanged(gfx::Rect());
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1857,7 +1839,7 @@
   EXPECT_TRUE(unelide_animation->IsAnimating());
   omnibox_view()->OnBoundsChanged(gfx::Rect());
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -1877,7 +1859,6 @@
   omnibox_view()->model()->ResetDisplayTexts();
   omnibox_view()->RevertAll();
   omnibox_view()->OnThemeChanged();
-  gfx::RenderText* render_text = omnibox_view()->GetRenderText();
 
   content::MockNavigationHandle navigation;
   navigation.set_is_same_document(false);
@@ -1936,7 +1917,8 @@
   // field trial is set because the "www." should be elided as a trivial
   // subdomain.
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, base::ASCIIToUTF16("https://"), base::ASCIIToUTF16("www."),
+      omnibox_view(), base::ASCIIToUTF16("https://"),
+      base::ASCIIToUTF16("www."),
       base::ASCIIToUTF16("https://www.example.test"),
       base::ASCIIToUTF16("/foo"),
       /* should_elide_to_registrable_domain=*/true));
@@ -1966,7 +1948,8 @@
   elide_as_element->SetStartTime(base::TimeTicks());
   elide_as_element->Step(base::TimeTicks() + base::TimeDelta::FromSeconds(2));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, base::ASCIIToUTF16("https://"), base::ASCIIToUTF16("www."),
+      omnibox_view(), base::ASCIIToUTF16("https://"),
+      base::ASCIIToUTF16("www."),
       base::ASCIIToUTF16("https://www.example.test"),
       base::ASCIIToUTF16("/foo"),
       /* should_elide_to_registrable_domain=*/true));
@@ -2144,7 +2127,8 @@
     // to the registrable domain because the www subdomain is considered
     // trivial.
     ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-        render_text, base::ASCIIToUTF16("https://"), base::ASCIIToUTF16("www."),
+        omnibox_view(), base::ASCIIToUTF16("https://"),
+        base::ASCIIToUTF16("www."),
         base::ASCIIToUTF16("https://www.example.test"),
         base::ASCIIToUTF16("/foo"),
         true /* should elide to registrable domain */));
@@ -2357,7 +2341,7 @@
   elide_as_element->SetStartTime(base::TimeTicks());
   elide_as_element->Step(base::TimeTicks() + base::TimeDelta::FromSeconds(1));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -2369,7 +2353,7 @@
     navigation.set_is_same_document(true);
     omnibox_view()->DidFinishNavigation(&navigation);
     ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-        render_text, kSimplifiedDomainDisplayUrlScheme,
+        omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
         kSimplifiedDomainDisplayUrlSubdomain,
         kSimplifiedDomainDisplayUrlHostnameAndScheme,
         kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -2527,7 +2511,7 @@
   elide_as_element->SetStartTime(base::TimeTicks());
   elide_as_element->Step(base::TimeTicks() + base::TimeDelta::FromSeconds(1));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -2547,7 +2531,7 @@
     navigation.set_render_frame_host(subframe);
     omnibox_view()->DidFinishNavigation(&navigation);
     ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-        render_text, kSimplifiedDomainDisplayUrlScheme,
+        omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
         kSimplifiedDomainDisplayUrlSubdomain,
         kSimplifiedDomainDisplayUrlHostnameAndScheme,
         kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -2574,7 +2558,7 @@
   elide_as_element->SetStartTime(base::TimeTicks());
   elide_as_element->Step(base::TimeTicks() + base::TimeDelta::FromSeconds(1));
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      render_text, kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
@@ -2621,7 +2605,7 @@
   omnibox_view()->OnFocus();
   omnibox_view()->OnBlur();
   ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
-      omnibox_view()->GetRenderText(), kSimplifiedDomainDisplayUrlScheme,
+      omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
       kSimplifiedDomainDisplayUrlSubdomain,
       kSimplifiedDomainDisplayUrlHostnameAndScheme,
       kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
index 32d4fc9..34511b2 100644
--- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
+++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
 #include "chrome/browser/ui/views/passwords/credentials_item_view.h"
 #include "chrome/browser/ui/views/passwords/password_items_view.h"
@@ -715,14 +716,14 @@
   bool close_save_bubble_on_deactivate_original_value = close_on_deactivate();
   set_close_on_deactivate(false);
 
-  FeaturePromoBubbleView::CreateParams bubble_params;
+  FeaturePromoBubbleParams bubble_params;
   bubble_params.body_string_specifier = body_string_specificer;
   bubble_params.title_string_specifier = title_string_specificer;
   bubble_params.anchor_view = destination_dropdown_;
   bubble_params.arrow = views::BubbleBorder::RIGHT_CENTER;
   bubble_params.preferred_width = kAccountStoragePromoWidth;
   bubble_params.activation_action =
-      FeaturePromoBubbleView::ActivationAction::ACTIVATE;
+      FeaturePromoBubbleParams::ActivationAction::ACTIVATE;
 
   account_storage_promo_ =
       FeaturePromoBubbleView::Create(std::move(bubble_params));
diff --git a/chrome/browser/ui/views/tab_search/tab_search_bubble_view.cc b/chrome/browser/ui/views/tab_search/tab_search_bubble_view.cc
index bfb8ec7..75c19b1 100644
--- a/chrome/browser/ui/views/tab_search/tab_search_bubble_view.cc
+++ b/chrome/browser/ui/views/tab_search/tab_search_bubble_view.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ui/views/tab_search/tab_search_bubble_view.h"
 
+#include "base/metrics/histogram_functions.h"
+#include "base/timer/elapsed_timer.h"
 #include "chrome/browser/ui/webui/tab_search/tab_search_ui.h"
 #include "chrome/common/webui_url_constants.h"
 #include "ui/views/controls/webview/webview.h"
@@ -31,7 +33,12 @@
                    TabSearchBubbleView* parent)
       : WebView(browser_context), parent_(parent) {}
 
-  ~TabSearchWebView() override = default;
+  ~TabSearchWebView() override {
+    if (timer_.has_value()) {
+      UmaHistogramMediumTimes("Tabs.TabSearch.WindowDisplayedDuration",
+                              timer_->Elapsed());
+    }
+  }
 
   // views::WebView:
   void PreferredSizeChanged() override {
@@ -56,6 +63,9 @@
   void DocumentOnLoadCompletedInMainFrame() override {
     GetWidget()->Show();
     GetWebContents()->Focus();
+
+    // Track window open times from when the bubble is first shown.
+    timer_ = base::ElapsedTimer();
   }
 
   void DidStopLoading() override {
@@ -71,6 +81,9 @@
 
   // What we should set the preferred width to once TabSearch has loaded.
   gfx::Size pending_preferred_size_;
+
+  // Time the Tab Search window has been open.
+  base::Optional<base::ElapsedTimer> timer_;
 };
 
 }  // namespace
diff --git a/chrome/browser/ui/views/tabs/tab_groups_iph_controller.cc b/chrome/browser/ui/views/tabs/tab_groups_iph_controller.cc
index d6e3cb38..b9bc7d0 100644
--- a/chrome/browser/ui/views/tabs/tab_groups_iph_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_groups_iph_controller.cc
@@ -12,7 +12,9 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_params.h"
 #include "chrome/browser/ui/views/feature_promos/feature_promo_bubble_view.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/feature_engagement/public/event_constants.h"
 #include "components/feature_engagement/public/feature_constants.h"
@@ -20,48 +22,52 @@
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/widget/widget.h"
 
-TabGroupsIPHController::TabGroupsIPHController(Browser* browser,
-                                               GetTabViewCallback get_tab_view)
-    : tracker_(feature_engagement::TrackerFactory::GetForBrowserContext(
+namespace {
+
+// The index of the tab we'd like to anchor our bubble to.
+constexpr int kPreferredAnchorTab = 2;
+
+}  // namespace
+
+TabGroupsIPHController::TabGroupsIPHController(
+    Browser* browser,
+    FeaturePromoController* promo_controller,
+    GetTabViewCallback get_tab_view)
+    : promo_controller_(promo_controller),
+      tracker_(feature_engagement::TrackerFactory::GetForBrowserContext(
           browser->profile())),
       get_tab_view_(std::move(get_tab_view)) {
+  DCHECK(promo_controller_);
   DCHECK(tracker_);
   browser->tab_strip_model()->AddObserver(this);
 }
 
-TabGroupsIPHController::~TabGroupsIPHController() {
-  if (!promo_widget_)
-    return;
-
-  // If we are destroyed before the promo, close it and stop observing it.
-  promo_widget_->Close();
-  HandlePromoClose();
-}
+TabGroupsIPHController::~TabGroupsIPHController() = default;
 
 bool TabGroupsIPHController::ShouldHighlightContextMenuItem() {
   // If the bubble is currently showing, the promo hasn't timed out yet.
   // The promo should continue into the context menu as a highlighted
   // item.
-  return promo_widget_ != nullptr;
+  return promo_controller_->BubbleIsShowing(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature);
 }
 
 void TabGroupsIPHController::TabContextMenuOpened() {
-  if (!promo_widget_)
+  if (!promo_controller_->BubbleIsShowing(
+          feature_engagement::kIPHDesktopTabGroupsNewGroupFeature))
     return;
 
   // Assume that the context menu code checked
   // ShouldHighlightContextMenuItem() and is correctly showing the promo
   // there.
-  showing_in_menu_ = true;
-  promo_widget_->Close();
+  promo_handle_for_menu_ = promo_controller_->CloseBubbleAndContinuePromo(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature);
 }
 
 void TabGroupsIPHController::TabContextMenuClosed() {
-  if (!showing_in_menu_)
+  if (!promo_handle_for_menu_)
     return;
-
-  showing_in_menu_ = false;
-  Dismissed();
+  promo_handle_for_menu_.reset();
 }
 
 void TabGroupsIPHController::OnTabStripModelChanged(
@@ -75,22 +81,13 @@
 
   tracker_->NotifyEvent(feature_engagement::events::kSixthTabOpened);
 
-  if (!tracker_->ShouldTriggerHelpUI(
-          feature_engagement::kIPHDesktopTabGroupsNewGroupFeature)) {
-    return;
-  }
-
-  FeaturePromoBubbleView::CreateParams bubble_params;
+  FeaturePromoBubbleParams bubble_params;
   bubble_params.body_string_specifier = IDS_TAB_GROUPS_NEW_GROUP_PROMO;
-  bubble_params.anchor_view = get_tab_view_.Run(2);
+  bubble_params.anchor_view = get_tab_view_.Run(kPreferredAnchorTab);
   bubble_params.arrow = views::BubbleBorder::TOP_LEFT;
-  promo_widget_ =
-      FeaturePromoBubbleView::Create(std::move(bubble_params))->GetWidget();
-
-  // We must notify the backend when the promo is dismissed. Observing
-  // the promo's widget and notifying on close is the most
-  // straightforward way to do this.
-  widget_observer_.Add(promo_widget_);
+  promo_controller_->MaybeShowPromo(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature,
+      std::move(bubble_params));
 }
 
 void TabGroupsIPHController::OnTabGroupChanged(const TabGroupChange& change) {
@@ -99,30 +96,3 @@
 
   tracker_->NotifyEvent(feature_engagement::events::kTabGroupCreated);
 }
-
-void TabGroupsIPHController::OnWidgetClosing(views::Widget* widget) {
-  DCHECK_EQ(widget, promo_widget_);
-  HandlePromoClose();
-}
-
-void TabGroupsIPHController::OnWidgetDestroying(views::Widget* widget) {
-  DCHECK_EQ(widget, promo_widget_);
-  HandlePromoClose();
-}
-
-void TabGroupsIPHController::HandlePromoClose() {
-  widget_observer_.Remove(promo_widget_);
-  promo_widget_ = nullptr;
-
-  // If the promo continued into the context menu, it hasn't been
-  // dismissed yet. We wait on notifying the backend until the menu
-  // closes at which point the promo is complete.
-  if (!showing_in_menu_)
-    Dismissed();
-}
-
-void TabGroupsIPHController::Dismissed() {
-  DCHECK_EQ(promo_widget_, nullptr);
-  DCHECK(!showing_in_menu_);
-  tracker_->Dismissed(feature_engagement::kIPHDesktopTabGroupsNewGroupFeature);
-}
diff --git a/chrome/browser/ui/views/tabs/tab_groups_iph_controller.h b/chrome/browser/ui/views/tabs/tab_groups_iph_controller.h
index dd321af3..a1e21f6 100644
--- a/chrome/browser/ui/views/tabs/tab_groups_iph_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_groups_iph_controller.h
@@ -6,9 +6,11 @@
 #define CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUPS_IPH_CONTROLLER_H_
 
 #include "base/callback_forward.h"
+#include "base/optional.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
@@ -25,21 +27,25 @@
 // Manages in-product help for tab groups. Watches for relevant events
 // in a browser window, communicates them to the IPH backend, and
 // displays IPH when appropriate.
-class TabGroupsIPHController : public TabStripModelObserver,
-                               public views::WidgetObserver {
+class TabGroupsIPHController : public TabStripModelObserver {
  public:
+  // Callback with an argument N that should return the Nth tab view in
+  // the tab strip for bubble anchoring. If N is not valid, it should
+  // return any tab view.
   using GetTabViewCallback = base::RepeatingCallback<views::View*(int)>;
 
   // |browser| is the browser window that this instance will track and
-  // will show IPH in if needed. |get_tab_view| is a callback with an
-  // argument N that should return the Nth tab view in the tab strip for
-  // bubble anchoring. If N is not valid, it should return any tab view.
-  TabGroupsIPHController(Browser* browser, GetTabViewCallback get_tab_view);
+  // will show IPH in if needed. |promo_controller| is the window's
+  // FeaturePromoController, used to start promos. |get_tab_view| should
+  // get an appropriate tab to anchor the bubble in |browser|.
+  TabGroupsIPHController(Browser* browser,
+                         FeaturePromoController* promo_controller,
+                         GetTabViewCallback get_tab_view);
   ~TabGroupsIPHController() override;
 
   // Whether the add-to-new-group item in the tab context menu should be
-  // highlighted. Must be checked before TabContextMenuOpened() is
-  // called.
+  // highlighted. Must be checked just before TabContextMenuOpened() is
+  // called on the same task.
   bool ShouldHighlightContextMenuItem();
 
   // Should be called when a tab context menu is opened.
@@ -55,32 +61,18 @@
       const TabStripSelectionChange& selection) override;
   void OnTabGroupChanged(const TabGroupChange& change) override;
 
-  // views::WidgetObserver:
-  void OnWidgetClosing(views::Widget* widget) override;
-  void OnWidgetDestroying(views::Widget* widget) override;
-
-  views::Widget* promo_widget_for_testing() { return promo_widget_; }
-
  private:
-  void HandlePromoClose();
-
-  // Notify the backend that the promo finished.
-  void Dismissed();
+  FeaturePromoController* const promo_controller_;
 
   // The IPH backend for the profile.
   feature_engagement::Tracker* const tracker_;
 
   GetTabViewCallback get_tab_view_;
 
-  // The promo bubble's widget. Only non-null while it is showing.
-  views::Widget* promo_widget_ = nullptr;
-
-  // True if the user opened a tab context menu while the bubble was
-  // showing. A promo is now showing in the menu. When true, we wait
-  // until the menu is closed to notify the backend of dismissal.
-  bool showing_in_menu_ = false;
-
-  ScopedObserver<views::Widget, views::WidgetObserver> widget_observer_{this};
+  // A handle given by |promo_controller_| if we show a context menu
+  // promo. When destroyed this notifies |promo_controller_| we are
+  // done.
+  base::Optional<FeaturePromoController::PromoHandle> promo_handle_for_menu_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_TABS_TAB_GROUPS_IPH_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/tabs/tab_groups_iph_controller_unittest.cc b/chrome/browser/ui/views/tabs/tab_groups_iph_controller_unittest.cc
index 0cb4fd9..3e51ce3 100644
--- a/chrome/browser/ui/views/tabs/tab_groups_iph_controller_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_groups_iph_controller_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/views/feature_promos/feature_promo_controller.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/views/chrome_test_widget.h"
@@ -55,8 +56,11 @@
         .Times(AnyNumber())
         .WillRepeatedly(Return(false));
 
+    promo_controller_ =
+        std::make_unique<FeaturePromoController>(browser()->profile());
+
     iph_controller_ = std::make_unique<TabGroupsIPHController>(
-        browser(),
+        browser(), promo_controller_.get(),
         base::BindRepeating(&TabGroupsIPHControllerTest::GetAnchorView,
                             base::Unretained(this)));
   }
@@ -78,6 +82,7 @@
 
  protected:
   feature_engagement::test::MockTracker* mock_tracker_;
+  std::unique_ptr<FeaturePromoController> promo_controller_;
   std::unique_ptr<TabGroupsIPHController> iph_controller_;
 };
 
@@ -123,26 +128,6 @@
   browser()->tab_strip_model()->AddToNewGroup({0});
 }
 
-TEST_F(TabGroupsIPHControllerTest, DismissedOnBubbleClosedBeforeMenuOpened) {
-  EXPECT_CALL(*mock_tracker_,
-              ShouldTriggerHelpUI(
-                  Ref(feature_engagement::kIPHDesktopTabGroupsNewGroupFeature)))
-      .Times(1)
-      .WillOnce(Return(true));
-
-  for (int i = 0; i < 6; ++i)
-    chrome::NewTab(browser());
-
-  ASSERT_TRUE(iph_controller_->promo_widget_for_testing());
-
-  EXPECT_CALL(
-      *mock_tracker_,
-      Dismissed(Ref(feature_engagement::kIPHDesktopTabGroupsNewGroupFeature)))
-      .Times(1);
-
-  iph_controller_->promo_widget_for_testing()->Close();
-}
-
 TEST_F(TabGroupsIPHControllerTest, DismissedOnMenuClosed) {
   EXPECT_CALL(*mock_tracker_,
               ShouldTriggerHelpUI(
@@ -153,9 +138,11 @@
   for (int i = 0; i < 6; ++i)
     chrome::NewTab(browser());
 
-  EXPECT_TRUE(iph_controller_->promo_widget_for_testing());
+  EXPECT_TRUE(promo_controller_->BubbleIsShowing(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature));
   iph_controller_->TabContextMenuOpened();
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
+  EXPECT_FALSE(promo_controller_->BubbleIsShowing(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature));
 
   EXPECT_CALL(
       *mock_tracker_,
@@ -163,7 +150,8 @@
       .Times(1);
 
   iph_controller_->TabContextMenuClosed();
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
+  EXPECT_FALSE(promo_controller_->BubbleIsShowing(
+      feature_engagement::kIPHDesktopTabGroupsNewGroupFeature));
 }
 
 TEST_F(TabGroupsIPHControllerTest, ShowsContextMenuHighlightIfAppropriate) {
@@ -187,34 +175,3 @@
   iph_controller_->TabContextMenuClosed();
   EXPECT_FALSE(iph_controller_->ShouldHighlightContextMenuItem());
 }
-
-TEST_F(TabGroupsIPHControllerTest, DoesNothingIfDisallowed) {
-  EXPECT_CALL(*mock_tracker_,
-              ShouldTriggerHelpUI(
-                  Ref(feature_engagement::kIPHDesktopTabGroupsNewGroupFeature)))
-      .Times(1)
-      .WillOnce(Return(false));
-  EXPECT_CALL(
-      *mock_tracker_,
-      Dismissed(Ref(feature_engagement::kIPHDesktopTabGroupsNewGroupFeature)))
-      .Times(0);
-
-  EXPECT_FALSE(iph_controller_->ShouldHighlightContextMenuItem());
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
-
-  for (int i = 0; i < 6; ++i)
-    chrome::NewTab(browser());
-
-  EXPECT_FALSE(iph_controller_->ShouldHighlightContextMenuItem());
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
-
-  iph_controller_->TabContextMenuOpened();
-
-  EXPECT_FALSE(iph_controller_->ShouldHighlightContextMenuItem());
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
-
-  iph_controller_->TabContextMenuClosed();
-
-  EXPECT_FALSE(iph_controller_->ShouldHighlightContextMenuItem());
-  EXPECT_FALSE(iph_controller_->promo_widget_for_testing());
-}
diff --git a/chrome/browser/ui/webui/new_tab_page/promo_browser_command/README b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/README
new file mode 100644
index 0000000..44db37f
--- /dev/null
+++ b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/README
@@ -0,0 +1,7 @@
+This directory contains the Desktop implementations of the promo browser
+commands located at:
+//chrome/browser/promo_browser_command/promo_browser_command.mojom
+
+All changes to this directory should be run by //ipc/SECURITY_OWNERS in addition
+to the NTP owners in order to ensure the implementations of the promo browser
+commands are side-effect-free.
diff --git a/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.cc b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.cc
new file mode 100644
index 0000000..da4c1f1
--- /dev/null
+++ b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.cc
@@ -0,0 +1,66 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h"
+
+#include "base/metrics/histogram_functions.h"
+#include "chrome/browser/command_updater_impl.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/promos/promo_service.h"
+#include "chrome/browser/ui/browser.h"
+#include "ui/base/window_open_disposition.h"
+
+using promo_browser_command::mojom::ClickInfoPtr;
+using promo_browser_command::mojom::Command;
+using promo_browser_command::mojom::CommandHandler;
+
+// static
+const char PromoBrowserCommandHandler::kPromoBrowserCommandHistogramName[] =
+    "NewTabPage.Promos.PromoBrowserCommand";
+
+PromoBrowserCommandHandler::PromoBrowserCommandHandler(
+    mojo::PendingReceiver<CommandHandler> pending_page_handler,
+    Profile* profile)
+    : profile_(profile),
+      command_updater_(std::make_unique<CommandUpdaterImpl>(this)),
+      page_handler_(this, std::move(pending_page_handler)) {
+  // Explicitly enable supported commands.
+  command_updater_->UpdateCommandEnabled(
+      static_cast<int>(Command::kUnknownCommand), true);
+}
+
+PromoBrowserCommandHandler::~PromoBrowserCommandHandler() = default;
+
+void PromoBrowserCommandHandler::ExecuteCommand(
+    Command command_id,
+    ClickInfoPtr click_info,
+    ExecuteCommandCallback callback) {
+  const auto disposition = ui::DispositionFromClick(
+      click_info->middle_button, click_info->alt_key, click_info->ctrl_key,
+      click_info->meta_key, click_info->shift_key);
+  const bool command_executed = command_updater_->ExecuteCommandWithDisposition(
+      static_cast<int>(command_id), disposition);
+  std::move(callback).Run(command_executed);
+}
+
+void PromoBrowserCommandHandler::ExecuteCommandWithDisposition(
+    int id,
+    WindowOpenDisposition disposition) {
+  const auto command = static_cast<Command>(id);
+  base::UmaHistogramEnumeration(kPromoBrowserCommandHistogramName, command);
+
+  switch (command) {
+    case Command::kUnknownCommand:
+      // Nothing to do.
+      break;
+    default:
+      NOTREACHED() << "Unspecified behavior for command " << id;
+      break;
+  }
+}
+
+void PromoBrowserCommandHandler::SetCommandUpdaterForTesting(
+    std::unique_ptr<CommandUpdater> command_updater) {
+  command_updater_ = std::move(command_updater);
+}
diff --git a/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h
new file mode 100644
index 0000000..a41057d05
--- /dev/null
+++ b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h
@@ -0,0 +1,55 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_PROMO_BROWSER_COMMAND_PROMO_BROWSER_COMMAND_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_PROMO_BROWSER_COMMAND_PROMO_BROWSER_COMMAND_HANDLER_H_
+
+#include <memory>
+
+#include "chrome/browser/command_updater_delegate.h"
+#include "chrome/browser/promo_browser_command/promo_browser_command.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "ui/base/window_open_disposition.h"
+
+class CommandUpdater;
+class Profile;
+class PromoBrowserCommandHandlerTest;
+
+// Handles promo browser commands send from JS.
+class PromoBrowserCommandHandler
+    : public CommandUpdaterDelegate,
+      public promo_browser_command::mojom::CommandHandler {
+ public:
+  static const char kPromoBrowserCommandHistogramName[];
+
+  PromoBrowserCommandHandler(
+      mojo::PendingReceiver<promo_browser_command::mojom::CommandHandler>
+          pending_page_handler,
+      Profile* profile);
+  ~PromoBrowserCommandHandler() override;
+
+  // promo_browser_command::mojom::CommandHandler:
+  void ExecuteCommand(promo_browser_command::mojom::Command command_id,
+                      promo_browser_command::mojom::ClickInfoPtr click_info,
+                      ExecuteCommandCallback callback) override;
+
+  // CommandUpdaterDelegate:
+  void ExecuteCommandWithDisposition(
+      int command_id,
+      WindowOpenDisposition disposition) override;
+
+ private:
+  friend class PromoBrowserCommandHandlerTest;
+
+  void SetCommandUpdaterForTesting(
+      std::unique_ptr<CommandUpdater> command_updater);
+  CommandUpdater* command_updater() { return command_updater_.get(); }
+
+  Profile* profile_;
+  std::unique_ptr<CommandUpdater> command_updater_;
+  mojo::Receiver<promo_browser_command::mojom::CommandHandler> page_handler_;
+};
+
+#endif  // CHROME_BROWSER_UI_WEBUI_NEW_TAB_PAGE_PROMO_BROWSER_COMMAND_PROMO_BROWSER_COMMAND_HANDLER_H_
diff --git a/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler_unittest.cc
new file mode 100644
index 0000000..26a686b
--- /dev/null
+++ b/chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler_unittest.cc
@@ -0,0 +1,117 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/run_loop.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/command_updater_impl.h"
+#include "chrome/browser/promo_browser_command/promo_browser_command.mojom.h"
+#include "chrome/browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class MockCommandUpdater : public CommandUpdaterImpl {
+ public:
+  explicit MockCommandUpdater(CommandUpdaterDelegate* delegate)
+      : CommandUpdaterImpl(delegate) {}
+  ~MockCommandUpdater() override = default;
+
+  MOCK_CONST_METHOD1(IsCommandEnabled, bool(int id));
+  MOCK_CONST_METHOD1(SupportsCommand, bool(int id));
+};
+
+// Callback used for testing PromoBrowserCommandHandler::ExecuteCommand().
+void ExecuteCommandCallback(base::OnceClosure quit_closure,
+                            bool* expected_command_executed,
+                            bool command_executed) {
+  *expected_command_executed = command_executed;
+  std::move(quit_closure).Run();
+}
+
+}  // namespace
+
+using promo_browser_command::mojom::ClickInfo;
+using promo_browser_command::mojom::ClickInfoPtr;
+using promo_browser_command::mojom::Command;
+using promo_browser_command::mojom::CommandHandler;
+
+class PromoBrowserCommandHandlerTest : public testing::Test {
+ public:
+  PromoBrowserCommandHandlerTest() = default;
+  ~PromoBrowserCommandHandlerTest() override = default;
+
+  void SetUp() override {
+    command_handler_ = std::make_unique<PromoBrowserCommandHandler>(
+        mojo::PendingReceiver<CommandHandler>(), &profile_);
+    command_handler_->SetCommandUpdaterForTesting(
+        std::make_unique<MockCommandUpdater>(command_handler_.get()));
+  }
+
+  void TearDown() override { testing::Test::TearDown(); }
+
+  MockCommandUpdater* mock_command_updater() {
+    return static_cast<MockCommandUpdater*>(
+        command_handler_->command_updater());
+  }
+
+  bool ExecuteCommand(Command command_id, ClickInfoPtr click_info) {
+    base::RunLoop run_loop;
+    bool command_executed = false;
+    command_handler_->ExecuteCommand(
+        Command::kUnknownCommand, ClickInfo::New(),
+        base::BindOnce(&ExecuteCommandCallback, run_loop.QuitClosure(),
+                       &command_executed));
+    run_loop.Run();
+    return command_executed;
+  }
+
+ protected:
+  content::BrowserTaskEnvironment task_environment_;
+  TestingProfile profile_;
+  std::unique_ptr<PromoBrowserCommandHandler> command_handler_;
+};
+
+TEST_F(PromoBrowserCommandHandlerTest, SupportedCommands) {
+  base::HistogramTester histogram_tester;
+
+  // Unsupported commands do not get executed and no histogram is logged.
+  EXPECT_CALL(*mock_command_updater(),
+              SupportsCommand(static_cast<int>(Command::kUnknownCommand)))
+      .WillOnce(testing::Return(false));
+
+  EXPECT_FALSE(ExecuteCommand(Command::kUnknownCommand, ClickInfo::New()));
+  histogram_tester.ExpectTotalCount(
+      PromoBrowserCommandHandler::kPromoBrowserCommandHistogramName, 0);
+
+  // Disabled commands do not get executed and no histogram is logged.
+  EXPECT_CALL(*mock_command_updater(),
+              SupportsCommand(static_cast<int>(Command::kUnknownCommand)))
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*mock_command_updater(),
+              IsCommandEnabled(static_cast<int>(Command::kUnknownCommand)))
+      .WillOnce(testing::Return(false));
+
+  EXPECT_FALSE(ExecuteCommand(Command::kUnknownCommand, ClickInfo::New()));
+  histogram_tester.ExpectTotalCount(
+      PromoBrowserCommandHandler::kPromoBrowserCommandHistogramName, 0);
+
+  // Only supported and enabled commands get executed for which a histogram is
+  // logged.
+  EXPECT_CALL(*mock_command_updater(),
+              SupportsCommand(static_cast<int>(Command::kUnknownCommand)))
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*mock_command_updater(),
+              IsCommandEnabled(static_cast<int>(Command::kUnknownCommand)))
+      .WillOnce(testing::Return(true));
+
+  EXPECT_TRUE(ExecuteCommand(Command::kUnknownCommand, ClickInfo::New()));
+  histogram_tester.ExpectBucketCount(
+      PromoBrowserCommandHandler::kPromoBrowserCommandHistogramName, 0, 1);
+}
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
index 7727acbd..d3778238 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
@@ -4,6 +4,9 @@
 
 #include "chrome/browser/ui/webui/settings/accessibility_main_handler.h"
 
+#include <utility>
+#include <vector>
+
 #include "base/bind.h"
 #include "base/values.h"
 #include "chrome/browser/accessibility/accessibility_state_utils.h"
@@ -15,20 +18,49 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
+
 #if !defined(OS_CHROMEOS)
+#include "base/check_op.h"
+#include "base/numerics/ranges.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/component_updater/soda_component_installer.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/prefs/pref_service.h"
+#include "components/update_client/crx_update_item.h"
 #include "content/public/browser/browser_accessibility_state.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+int GetDownloadProgress(int64_t downloaded_bytes, int64_t total_bytes) {
+  if (downloaded_bytes == -1 || total_bytes == -1 || total_bytes == 0)
+    return -1;
+  DCHECK_LE(downloaded_bytes, total_bytes);
+  return 100 *
+         base::ClampToRange(double{downloaded_bytes} / total_bytes, 0.0, 1.0);
+}
+
+}  // namespace
+
 #endif  // !defined(OS_CHROMEOS)
 
 namespace settings {
 
+#if defined(OS_CHROMEOS)
 AccessibilityMainHandler::AccessibilityMainHandler() = default;
+#else
+AccessibilityMainHandler::AccessibilityMainHandler(PrefService* prefs)
+    : prefs_(prefs) {}
+#endif  // defined(OS_CHROMEOS)
 
 AccessibilityMainHandler::~AccessibilityMainHandler() = default;
 
 void AccessibilityMainHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(
-      "getScreenReaderState",
-      base::BindRepeating(&AccessibilityMainHandler::HandleGetScreenReaderState,
+      "a11yPageReady",
+      base::BindRepeating(&AccessibilityMainHandler::HandleA11yPageReady,
                           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "confirmA11yImageLabels",
@@ -44,16 +76,20 @@
           base::BindRepeating(
               &AccessibilityMainHandler::OnAccessibilityStatusChanged,
               base::Unretained(this)));
+#else
+  component_updater_observer_.Add(g_browser_process->component_updater());
 #endif  // defined(OS_CHROMEOS)
 }
 
 void AccessibilityMainHandler::OnJavascriptDisallowed() {
 #if defined(OS_CHROMEOS)
   accessibility_subscription_.reset();
+#else
+  component_updater_observer_.RemoveAll();
 #endif  // defined(OS_CHROMEOS)
 }
 
-void AccessibilityMainHandler::HandleGetScreenReaderState(
+void AccessibilityMainHandler::HandleA11yPageReady(
     const base::ListValue* args) {
   AllowJavascript();
   SendScreenReaderStateChanged();
@@ -87,6 +123,53 @@
     SendScreenReaderStateChanged();
   }
 }
+#else
+void AccessibilityMainHandler::OnEvent(Events event, const std::string& id) {
+  if (id != component_updater::SODAComponentInstallerPolicy::GetExtensionId())
+    return;
+
+  switch (event) {
+    case Events::COMPONENT_UPDATE_FOUND:
+    case Events::COMPONENT_UPDATE_READY:
+    case Events::COMPONENT_WAIT:
+    case Events::COMPONENT_UPDATE_DOWNLOADING:
+    case Events::COMPONENT_UPDATE_UPDATING: {
+      update_client::CrxUpdateItem item;
+      g_browser_process->component_updater()->GetComponentDetails(id, &item);
+      const int progress =
+          GetDownloadProgress(item.downloaded_bytes, item.total_bytes);
+      if (progress == -1) {
+        SendLiveCaptionDownloadError();
+      } else {
+        FireWebUIListener(
+            "enable-live-caption-subtitle-changed",
+            base::Value(l10n_util::GetStringFUTF16Int(
+                IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_PROGRESS,
+                progress)));
+      }
+    } break;
+    case Events::COMPONENT_UPDATED:
+    case Events::COMPONENT_NOT_UPDATED:
+      FireWebUIListener(
+          "enable-live-caption-subtitle-changed",
+          base::Value(l10n_util::GetStringUTF16(
+              IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE)));
+      break;
+    case Events::COMPONENT_UPDATE_ERROR:
+      SendLiveCaptionDownloadError();
+      break;
+    case Events::COMPONENT_CHECKING_FOR_UPDATES:
+      // Do nothing.
+      break;
+  }
+}
+
+void AccessibilityMainHandler::SendLiveCaptionDownloadError() {
+  prefs_->SetBoolean(prefs::kLiveCaptionEnabled, false);
+  FireWebUIListener("enable-live-caption-subtitle-changed",
+                    base::Value(l10n_util::GetStringUTF16(
+                        IDS_SETTINGS_CAPTIONS_LIVE_CAPTION_DOWNLOAD_ERROR)));
+}
 #endif  // defined(OS_CHROMEOS)
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.h b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
index c37f966..eeb8e70 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.h
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
@@ -5,23 +5,42 @@
 #ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_
 #define CHROME_BROWSER_UI_WEBUI_SETTINGS_ACCESSIBILITY_MAIN_HANDLER_H_
 
+#include <memory>
+#include <string>
+
 #include "base/macros.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
+
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
+#else
+#include "base/scoped_observer.h"
+#include "components/component_updater/component_updater_service.h"
 #endif  // defined(OS_CHROMEOS)
 
 namespace base {
 class ListValue;
 }
 
+class PrefService;
+
 namespace settings {
 
 // Settings handler for the main accessibility settings page,
 // chrome://settings/accessibility.
+// TODO(1055150) Implement the SODA download progress handling on ChromeOS and
+// remove the ChromeOS-only class declaration.
+#if defined(OS_CHROMEOS)
 class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler {
  public:
   AccessibilityMainHandler();
+#else
+class AccessibilityMainHandler : public ::settings::SettingsPageUIHandler,
+                                 public component_updater::ServiceObserver {
+ public:
+  explicit AccessibilityMainHandler(PrefService* prefs);
+#endif  // defined(OS_CHROMEOS)
+
   ~AccessibilityMainHandler() override;
 
   // SettingsPageUIHandler implementation.
@@ -29,7 +48,7 @@
   void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
-  void HandleGetScreenReaderState(const base::ListValue* args);
+  void HandleA11yPageReady(const base::ListValue* args);
   void HandleCheckAccessibilityImageLabels(const base::ListValue* args);
 
  private:
@@ -42,7 +61,15 @@
   std::unique_ptr<chromeos::AccessibilityStatusSubscription>
       accessibility_subscription_;
 #else
+  // component_updater::ServiceObserver:
+  void OnEvent(Events event, const std::string& id) override;
 
+  void SendLiveCaptionDownloadError();
+
+  PrefService* prefs_;
+  ScopedObserver<component_updater::ComponentUpdateService,
+                 component_updater::ComponentUpdateService::Observer>
+      component_updater_observer_{this};
 #endif  // defined(OS_CHROMEOS)
 
   DISALLOW_COPY_AND_ASSIGN(AccessibilityMainHandler);
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index f77bf499..f015d54 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -204,6 +204,8 @@
      IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_TITLE},
     {"captionsEnableLiveCaptionSubtitle",
      IDS_SETTINGS_CAPTIONS_ENABLE_LIVE_CAPTION_SUBTITLE},
+    {"caretBrowsingTitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_TITLE},
+    {"caretBrowsingSubtitle", IDS_SETTINGS_ENABLE_CARET_BROWSING_SUBTITLE},
 #if defined(OS_CHROMEOS)
     {"manageAccessibilityFeatures",
      IDS_SETTINGS_ACCESSIBILITY_MANAGE_ACCESSIBILITY_FEATURES},
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index c8c5f644..06bf166 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -178,7 +178,12 @@
           CreateForProfile(profile));
 #endif
 
+#if defined(OS_CHROMEOS)
   AddSettingsPageUIHandler(std::make_unique<AccessibilityMainHandler>());
+#else
+  AddSettingsPageUIHandler(
+      std::make_unique<AccessibilityMainHandler>(profile->GetPrefs()));
+#endif  // defined(OS_CHROMEOS)
   AddSettingsPageUIHandler(std::make_unique<BrowserLifetimeHandler>());
   AddSettingsPageUIHandler(
       std::make_unique<ClearBrowsingDataHandler>(web_ui, profile));
diff --git a/chrome/browser/ui/webui/tab_search/BUILD.gn b/chrome/browser/ui/webui/tab_search/BUILD.gn
index 092303f..59b54f3 100644
--- a/chrome/browser/ui/webui/tab_search/BUILD.gn
+++ b/chrome/browser/ui/webui/tab_search/BUILD.gn
@@ -6,4 +6,6 @@
 
 mojom("mojo_bindings") {
   sources = [ "tab_search.mojom" ]
+
+  public_deps = [ "//mojo/public/mojom/base" ]
 }
diff --git a/chrome/browser/ui/webui/tab_search/tab_search.mojom b/chrome/browser/ui/webui/tab_search/tab_search.mojom
index c320367..1baa596 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search.mojom
+++ b/chrome/browser/ui/webui/tab_search/tab_search.mojom
@@ -4,6 +4,8 @@
 
 module tab_search.mojom;
 
+import "mojo/public/mojom/base/time.mojom";
+
 // Collection of WindowTabs of a profile.
 struct ProfileTabs {
   array<WindowTabs> windows;
@@ -66,6 +68,9 @@
 
   // Switch to a specific tab.
   SwitchToTab(SwitchToTabInfo switch_to_tab_info);
+
+  // Records the time taken to render the initial list of tabs.
+  RecordInitialTabsRenderTime(mojo_base.mojom.TimeDelta render_time);
 };
 
 // WebUI-side handler for requests from the browser.
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
index b1aa4089..f2a7108 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/base64.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
@@ -115,6 +116,11 @@
   details.browser->window()->Activate();
 }
 
+void TabSearchPageHandler::RecordInitialTabsRenderTime(
+    base::TimeDelta render_time) {
+  UmaHistogramTimes("Tabs.TabSearch.WebUI.InitialTabsRenderTime", render_time);
+}
+
 tab_search::mojom::TabPtr TabSearchPageHandler::GetTabData(
     TabStripModel* tab_strip_model,
     content::WebContents* contents,
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
index 3dc96b1..56d1180 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
+++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.h
@@ -39,6 +39,7 @@
   void GetTabGroups(GetTabGroupsCallback callback) override;
   void SwitchToTab(
       tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) override;
+  void RecordInitialTabsRenderTime(base::TimeDelta render_time) override;
 
   // TabStripModelObserver:
   void OnTabStripModelChanged(
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
index 228f2c1..2390be7 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_ui.cc
@@ -28,7 +28,10 @@
 
 TabSearchUI::TabSearchUI(content::WebUI* web_ui)
     : ui::MojoWebUIController(web_ui,
-                              true /* Needed for webui browser tests */) {
+                              true /* Needed for webui browser tests */),
+      webui_load_timer_(web_ui->GetWebContents(),
+                        "Tabs.TabSearch.WebUI.LoadDocumentTime",
+                        "Tabs.TabSearch.WebUI.LoadCompletedTime") {
 #if BUILDFLAG(ENABLE_TAB_SEARCH)
   content::WebUIDataSource* source =
       content::WebUIDataSource::Create(chrome::kChromeUITabSearchHost);
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_ui.h b/chrome/browser/ui/webui/tab_search/tab_search_ui.h
index ba03a58..3b678f61 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_ui.h
+++ b/chrome/browser/ui/webui/tab_search/tab_search_ui.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/ui/webui/tab_search/tab_search.mojom.h"
+#include "chrome/browser/ui/webui/webui_load_timer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -46,6 +47,8 @@
   mojo::Receiver<tab_search::mojom::PageHandlerFactory> page_factory_receiver_{
       this};
 
+  WebuiLoadTimer webui_load_timer_;
+
   WEB_UI_CONTROLLER_TYPE_DECL();
 };
 
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index 3b7b513..ef97221 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -35,6 +35,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/common/content_features.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/url_loader_interceptor.h"
 #include "extensions/browser/extension_registry.h"
@@ -796,6 +797,211 @@
             DisplayMode::kStandalone);
 }
 
+// A dedicated test fixture for DisplayOverride, which is supported
+// only for the new web apps mode, and requires a command line switch
+// to enable manifest parsing.
+class ManifestUpdateManagerBrowserTest_DisplayOverride
+    : public ManifestUpdateManagerBrowserTest {
+ public:
+  ManifestUpdateManagerBrowserTest_DisplayOverride() {
+    scoped_feature_list_.InitAndEnableFeature(
+        features::kWebAppManifestDisplayOverride);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckFindsDisplayOverrideChange) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      "display_override": $1,
+      "icons": $2
+    }
+  )";
+
+  OverrideManifest(kManifestTemplate,
+                   {R"([ "browser", "standalone" ])", kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  OverrideManifest(kManifestTemplate,
+                   {R"([ "browser", "minimal-ui" ])", kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpdated);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpdated, 1);
+  AwaitShortcutsUpdated(kInstallableIconTopLeftColor);
+
+  std::vector<DisplayMode> app_display_mode_override =
+      GetProvider().registrar().GetAppDisplayModeOverride(app_id);
+
+  ASSERT_EQ(2u, app_display_mode_override.size());
+  EXPECT_EQ(DisplayMode::kBrowser, app_display_mode_override[0]);
+  EXPECT_EQ(DisplayMode::kMinimalUi, app_display_mode_override[1]);
+}
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckFindsNewDisplayOverride) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      $1
+      "icons": $2
+    }
+  )";
+
+  // No display_override in manifest
+  OverrideManifest(kManifestTemplate, {"", kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  // Add display_override field
+  OverrideManifest(kManifestTemplate,
+                   {R"("display_override": [ "minimal-ui", "standalone" ],)",
+                    kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpdated);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpdated, 1);
+  AwaitShortcutsUpdated(kInstallableIconTopLeftColor);
+
+  std::vector<DisplayMode> app_display_mode_override =
+      GetProvider().registrar().GetAppDisplayModeOverride(app_id);
+
+  ASSERT_EQ(2u, app_display_mode_override.size());
+  EXPECT_EQ(DisplayMode::kMinimalUi, app_display_mode_override[0]);
+  EXPECT_EQ(DisplayMode::kStandalone, app_display_mode_override[1]);
+}
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckFindsDeletedDisplayOverride) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      $1
+      "icons": $2
+    }
+  )";
+
+  // Ensure display_override exists in initial manifest
+  OverrideManifest(kManifestTemplate,
+                   {R"("display_override": [ "fullscreen", "minimal-ui" ],)",
+                    kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  // Remove display_override from manifest
+  OverrideManifest(kManifestTemplate, {"", kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpdated);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpdated, 1);
+  AwaitShortcutsUpdated(kInstallableIconTopLeftColor);
+
+  std::vector<DisplayMode> app_display_mode_override =
+      GetProvider().registrar().GetAppDisplayModeOverride(app_id);
+
+  ASSERT_EQ(0u, app_display_mode_override.size());
+}
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckFindsInvalidDisplayOverride) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      "display_override": $1,
+      "icons": $2
+    }
+  )";
+
+  OverrideManifest(kManifestTemplate,
+                   {R"([ "browser", "fullscreen" ])", kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  ASSERT_EQ(2u,
+            GetProvider().registrar().GetAppDisplayModeOverride(app_id).size());
+
+  // display_override contains only invalid values
+  OverrideManifest(kManifestTemplate,
+                   {R"( [ "invalid", 7 ])", kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpdated);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpdated, 1);
+  AwaitShortcutsUpdated(kInstallableIconTopLeftColor);
+
+  std::vector<DisplayMode> app_display_mode_override =
+      GetProvider().registrar().GetAppDisplayModeOverride(app_id);
+
+  ASSERT_EQ(0u, app_display_mode_override.size());
+}
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckIgnoresDisplayOverrideInvalidChange) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      $1
+      "icons": $2
+    }
+  )";
+
+  // No display_override in manifest
+  OverrideManifest(kManifestTemplate, {"", kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  // display_override contains only invalid values
+  OverrideManifest(
+      kManifestTemplate,
+      {R"("display_override": [ "invalid", 7 ],)", kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpToDate);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpToDate, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest_DisplayOverride,
+                       CheckIgnoresDisplayOverrideChange) {
+  constexpr char kManifestTemplate[] = R"(
+    {
+      "name": "Test app name",
+      "start_url": ".",
+      "scope": "/",
+      "display": "standalone",
+      "display_override": $1,
+      "icons": $2
+    }
+  )";
+
+  OverrideManifest(kManifestTemplate,
+                   {R"([ "browser", "fullscreen" ])", kInstallableIconList});
+  AppId app_id = InstallWebApp();
+
+  // display_override contains an additional invalid value
+  OverrideManifest(
+      kManifestTemplate,
+      {R"([ "invalid", "browser", "fullscreen" ])", kInstallableIconList});
+  EXPECT_EQ(GetResultAfterPageLoad(GetAppURL(), &app_id),
+            ManifestUpdateResult::kAppUpToDate);
+  histogram_tester_.ExpectBucketCount(kUpdateHistogramName,
+                                      ManifestUpdateResult::kAppUpToDate, 1);
+}
+
 IN_PROC_BROWSER_TEST_P(ManifestUpdateManagerBrowserTest,
                        CheckFindsIconContentChange) {
   constexpr char kManifest[] = R"(
@@ -1330,4 +1536,10 @@
                                            ProviderType::kWebApps),
                          ProviderTypeParamToString);
 
+// DisplayOverride is supported only for the new web apps mode
+INSTANTIATE_TEST_SUITE_P(All,
+                         ManifestUpdateManagerBrowserTest_DisplayOverride,
+                         ::testing::Values(ProviderType::kWebApps),
+                         ProviderTypeParamToString);
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/manifest_update_task.cc b/chrome/browser/web_applications/manifest_update_task.cc
index 76dcc40..acb176d 100644
--- a/chrome/browser/web_applications/manifest_update_task.cc
+++ b/chrome/browser/web_applications/manifest_update_task.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/web_applications/components/web_app_ui_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/web_application_info.h"
+#include "content/public/common/content_features.h"
 #include "ui/gfx/skia_util.h"
 
 namespace web_app {
@@ -159,6 +160,12 @@
     return true;
   }
 
+  if (base::FeatureList::IsEnabled(features::kWebAppManifestDisplayOverride) &&
+      web_application_info_->display_override !=
+          registrar_.GetAppDisplayModeOverride(app_id_)) {
+    return true;
+  }
+
   if (web_application_info_->icon_infos != registrar_.GetAppIconInfos(app_id_))
     return true;
 
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 953a100..416d8c42 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1596193635-6128c4835e91dec9617eb88a5ffdf98aa76979d0.profdata
+chrome-mac-master-1596218359-82effd1166d6978a93311943498771c13a6160db.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index edc1710..d814639 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1596192746-6fea58b93463f5fc9ccbb164a8054cb0a38af6db.profdata
+chrome-win32-master-1596214766-ef32b2ce97242365d96c5d969f5553eac2e23ec9.profdata
diff --git a/chrome/chrome_cleaner/chrome_utils/extension_file_logger_unittest.cc b/chrome/chrome_cleaner/chrome_utils/extension_file_logger_unittest.cc
index 712b01f5..af3b78c 100644
--- a/chrome/chrome_cleaner/chrome_utils/extension_file_logger_unittest.cc
+++ b/chrome/chrome_cleaner/chrome_utils/extension_file_logger_unittest.cc
@@ -19,18 +19,18 @@
 
 namespace {
 
-const base::char16 kExtensionId1[] = L"extension1";
-const base::char16 kTestFileName1[] = L"file1.file";
+const wchar_t kExtensionId1[] = L"extension1";
+const wchar_t kTestFileName1[] = L"file1.file";
 
-const base::char16 kExtensionId2[] = L"extension2";
-const base::char16 kTestFileName2[] = L"file2.file";
+const wchar_t kExtensionId2[] = L"extension2";
+const wchar_t kTestFileName2[] = L"file2.file";
 
-const base::char16 kExtensionId3[] = L"extension3";
-const base::char16 kTestFileName3[] = L"file3.file";
+const wchar_t kExtensionId3[] = L"extension3";
+const wchar_t kTestFileName3[] = L"file3.file";
 
-const base::char16 kExtensionId4[] = L"generic-extension-name";
+const wchar_t kExtensionId4[] = L"generic-extension-name";
 
-const base::char16 kExtensionId5[] = L"ghost-extension";
+const wchar_t kExtensionId5[] = L"ghost-extension";
 
 }  // namespace
 
diff --git a/chrome/chrome_cleaner/chrome_utils/extensions_util.cc b/chrome/chrome_cleaner/chrome_utils/extensions_util.cc
index 5d519b2..a4ed41e4 100644
--- a/chrome/chrome_cleaner/chrome_utils/extensions_util.cc
+++ b/chrome/chrome_cleaner/chrome_utils/extensions_util.cc
@@ -62,7 +62,7 @@
 // Extension IDs that are expected to be in external_extensions.json, or have
 // been in past versions, gathered from
 // chrome/browser/resources/default_apps/external_extensions.json
-constexpr std::array<const base::char16*, 8> default_extension_whitelist = {
+constexpr std::array<const wchar_t*, 8> default_extension_whitelist = {
     L"blpcfgokakmgnkcojhhkbfbldkacnbeo", L"pjkljhegncpnkpknbcohdijeoejaedia",
     L"apdfllckaahabafndbhieahigkjlhalf", L"aohghmighlieiainnegkcijnfilokake",
     L"aapocclcgogkmnckokdopfmhonfmgoek", L"felcaaldnbdncclmgdcncolpebgiejap",
@@ -123,7 +123,7 @@
       base::string16 entry;
       GetRegistryValueAsString(forcelist_it.Value(), forcelist_it.ValueSize(),
                                forcelist_it.Type(), &entry);
-      if (base::UTF16ToUTF8(entry.substr(0, kExtensionIdLength)) ==
+      if (base::WideToUTF8(entry.substr(0, kExtensionIdLength)) ==
           extension.id.AsString()) {
         keys.push_back(forcelist_it.Name());
       }
@@ -167,7 +167,7 @@
   scoped_refptr<RefValue> saved_json =
       base::WrapRefCounted(new RefValue(json->Clone()));
   for (const auto& entry : *extension_settings) {
-    const base::string16& extension_id = base::UTF8ToUTF16(entry.first);
+    const base::string16& extension_id = base::UTF8ToWide(entry.first);
     const std::unique_ptr<base::Value>& settings_value = entry.second;
 
     if (settings_value->is_dict()) {
@@ -208,7 +208,7 @@
 
     counter->Increment();
     json_parser->Parse(
-        base::UTF16ToUTF8(extension_settings),
+        base::WideToUTF8(extension_settings),
         base::BindOnce(&GetExtensionSettingsPoliciesFromParsedJson,
                        extension_settings_keys[i], policies, counter, type));
   }
@@ -236,7 +236,7 @@
   scoped_refptr<RefValue> saved_json =
       base::WrapRefCounted(new RefValue(json->Clone()));
   for (const auto& entry : *default_extensions) {
-    base::string16 extension_id = base::UTF8ToUTF16(entry.first);
+    base::string16 extension_id = base::UTF8ToWide(entry.first);
     if (!base::Contains(default_extension_whitelist, extension_id)) {
       policies->emplace_back(extension_id, extensions_file, saved_json);
     }
@@ -272,7 +272,7 @@
   scoped_refptr<RefValue> saved_json =
       base::WrapRefCounted(new RefValue(json->Clone()));
   for (const auto& entry : *extension_settings_dictionary) {
-    base::string16 extension_id = base::UTF8ToUTF16(entry.first);
+    base::string16 extension_id = base::UTF8ToWide(entry.first);
     policies->emplace_back(extension_id, extensions_file, saved_json);
   }
 }
diff --git a/chrome/chrome_cleaner/chrome_utils/extensions_util_unittest.cc b/chrome/chrome_cleaner/chrome_utils/extensions_util_unittest.cc
index c658152e7..a8d420f 100644
--- a/chrome/chrome_cleaner/chrome_utils/extensions_util_unittest.cc
+++ b/chrome/chrome_cleaner/chrome_utils/extensions_util_unittest.cc
@@ -107,7 +107,7 @@
   GetExtensionForcelistRegistryPolicies(&policies);
   for (ExtensionPolicyRegistryEntry& policy : policies) {
     ForceInstalledExtension extension(
-        ExtensionID::Create(base::UTF16ToUTF8(policy.extension_id)).value(),
+        ExtensionID::Create(base::WideToUTF8(policy.extension_id)).value(),
         POLICY_EXTENSION_FORCELIST, "", "");
     extension.policy_registry_entry =
         std::make_shared<ExtensionPolicyRegistryEntry>(std::move(policy));
@@ -217,7 +217,7 @@
   std::vector<ForceInstalledExtension> extensions;
   for (ExtensionPolicyFile& policy : policies) {
     ForceInstalledExtension extension(
-        ExtensionID::Create(base::UTF16ToUTF8(policy.extension_id)).value(),
+        ExtensionID::Create(base::WideToUTF8(policy.extension_id)).value(),
         DEFAULT_APPS_EXTENSION, "", "");
     extension.policy_file =
         std::make_shared<ExtensionPolicyFile>(std::move(policy));
@@ -318,7 +318,7 @@
   base::Value json_result = policies[0].json->data.Clone();
   for (ExtensionPolicyRegistryEntry& policy : policies) {
     ForceInstalledExtension extension(
-        ExtensionID::Create(base::UTF16ToUTF8(policy.extension_id)).value(),
+        ExtensionID::Create(base::WideToUTF8(policy.extension_id)).value(),
         POLICY_EXTENSION_SETTINGS, "", "");
     extension.policy_registry_entry =
         std::make_shared<ExtensionPolicyRegistryEntry>(std::move(policy));
@@ -366,7 +366,7 @@
   base::Value json_result = policies[0].json->data.Clone();
   for (ExtensionPolicyRegistryEntry& policy : policies) {
     ForceInstalledExtension extension(
-        ExtensionID::Create(base::UTF16ToUTF8(policy.extension_id)).value(),
+        ExtensionID::Create(base::WideToUTF8(policy.extension_id)).value(),
         POLICY_EXTENSION_SETTINGS, "", "");
     extension.policy_registry_entry =
         std::make_shared<ExtensionPolicyRegistryEntry>(std::move(policy));
@@ -464,7 +464,7 @@
   std::vector<ForceInstalledExtension> extensions;
   for (ExtensionPolicyFile& policy : policies) {
     ForceInstalledExtension extension(
-        ExtensionID::Create(base::UTF16ToUTF8(policy.extension_id)).value(),
+        ExtensionID::Create(base::WideToUTF8(policy.extension_id)).value(),
         POLICY_MASTER_PREFERENCES, "", "");
     extension.policy_file =
         std::make_shared<ExtensionPolicyFile>(std::move(policy));
diff --git a/chrome/chrome_cleaner/components/system_report_component_unittest.cc b/chrome/chrome_cleaner/components/system_report_component_unittest.cc
index 7237c2c..4e41319c 100644
--- a/chrome/chrome_cleaner/components/system_report_component_unittest.cc
+++ b/chrome/chrome_cleaner/components/system_report_component_unittest.cc
@@ -79,14 +79,12 @@
 const ReportTestData kExtensionPolicyEmpty{
     HKEY_LOCAL_MACHINE, kChromePoliciesAllowlistKeyPath, L"test1", L""};
 
-constexpr base::char16 kTestingExtensionId1[] =
-    L"ababababcdcdcdcdefefefefghghghgh";
-constexpr base::char16 kTestingExtensionId1WithUpdateUrl[] =
+constexpr wchar_t kTestingExtensionId1[] = L"ababababcdcdcdcdefefefefghghghgh";
+constexpr wchar_t kTestingExtensionId1WithUpdateUrl[] =
     L"ababababcdcdcdcdefefefefghghghgh;https://clients2.google.com/service/"
     L"update2/crx";
-constexpr base::char16 kTestingExtensionId2[] =
-    L"aaaabbbbccccddddeeeeffffgggghhhh";
-constexpr base::char16 kTestingExtensionId2WithUpdateUrl[] =
+constexpr wchar_t kTestingExtensionId2[] = L"aaaabbbbccccddddeeeeffffgggghhhh";
+constexpr wchar_t kTestingExtensionId2WithUpdateUrl[] =
     L"aaaabbbbccccddddeeeeffffgggghhhh;https://clients2.google.com/service/"
     L"update2/crx";
 
@@ -248,7 +246,7 @@
 bool SomeComponentContainsPath(const RepeatedPtrField<Component>& components,
                                const base::FilePath& path) {
   const std::string name = path.BaseName().MaybeAsASCII();
-  const std::string sanitized_path = base::UTF16ToUTF8(SanitizePath(path));
+  const std::string sanitized_path = base::WideToUTF8(SanitizePath(path));
   for (const auto component : components) {
     if (component.name() == name &&
         component.file_information().path() == sanitized_path) {
@@ -308,10 +306,10 @@
 
     std::unordered_set<base::string16> expected_files(
         extension_id_to_filenames_map
-            .at(base::UTF8ToUTF16(installed_extension.extension_id()))
+            .at(base::UTF8ToWide(installed_extension.extension_id()))
             .begin(),
         extension_id_to_filenames_map
-            .at(base::UTF8ToUTF16(installed_extension.extension_id()))
+            .at(base::UTF8ToWide(installed_extension.extension_id()))
             .end());
 
     if (static_cast<size_t>(extension_files.size()) != expected_files.size())
@@ -321,7 +319,7 @@
 
     for (const auto& file : extension_files) {
       base::string16 file_name =
-          base::FilePath(base::UTF8ToUTF16(file.path())).BaseName().value();
+          base::FilePath(base::UTF8ToWide(file.path())).BaseName().value();
 
       if (expected_files.find(file_name) == expected_files.end())
         return ::testing::AssertionFailure()
@@ -465,8 +463,8 @@
       SomeComponentContainsPath(system_report.processes(), module_path));
 
   EXPECT_TRUE(RegistryEntryCollected(
-      system_report.registry_values(), base::UTF16ToASCII(kRunKeyPath),
-      base::UTF16ToASCII(kRunTestName), base::UTF16ToASCII(kRunTestValue)));
+      system_report.registry_values(), base::WideToASCII(kRunKeyPath),
+      base::WideToASCII(kRunTestName), base::WideToASCII(kRunTestValue)));
 
   EXPECT_TRUE(InstalledProgramCollected(system_report.installed_programs(),
                                         kFakeProgram));
@@ -488,9 +486,8 @@
 
   EXPECT_TRUE(RegistryEntryCollected(
       GetChromeCleanerReport().system_report().registry_values(),
-      base::UTF16ToASCII(kNameServerKeyPath),
-      base::UTF16ToASCII(kNameServerName),
-      base::UTF16ToASCII(kNameServerValue)));
+      base::WideToASCII(kNameServerKeyPath), base::WideToASCII(kNameServerName),
+      base::WideToASCII(kNameServerValue)));
 }
 
 TEST_F(SystemReportComponentTest, ReportNameServerBadValue) {
@@ -506,7 +503,7 @@
 
   EXPECT_FALSE(RegistryKeyCollected(
       GetChromeCleanerReport().system_report().registry_values(),
-      base::UTF16ToASCII(kNameServerKeyPath)));
+      base::WideToASCII(kNameServerKeyPath)));
 }
 
 TEST_F(SystemReportComponentTest, ReportNameServerNonExistent) {
@@ -514,7 +511,7 @@
 
   EXPECT_FALSE(RegistryKeyCollected(
       GetChromeCleanerReport().system_report().registry_values(),
-      base::UTF16ToASCII(kNameServerKeyPath)));
+      base::WideToASCII(kNameServerKeyPath)));
 }
 
 TEST_F(SystemReportComponentTest, ReportExtensionPolicies) {
@@ -536,9 +533,9 @@
   for (const auto& extension_policy : extension_policies) {
     EXPECT_TRUE(
         RegistryEntryCollected(system_report.registry_values(),
-                               base::UTF16ToASCII(extension_policy.key_path),
-                               base::UTF16ToASCII(extension_policy.name),
-                               base::UTF16ToASCII(extension_policy.value)));
+                               base::WideToASCII(extension_policy.key_path),
+                               base::WideToASCII(extension_policy.name),
+                               base::WideToASCII(extension_policy.value)));
   }
 }
 
@@ -554,7 +551,7 @@
   component_.CreateFullSystemReport();
   EXPECT_FALSE(RegistryKeyCollected(
       GetChromeCleanerReport().system_report().registry_values(),
-      base::UTF16ToASCII(kExtensionPolicyEmpty.key_path)));
+      base::WideToASCII(kExtensionPolicyEmpty.key_path)));
 }
 
 TEST_F(SystemReportComponentTest, ReportExtensionPoliciesNonExistent) {
diff --git a/chrome/chrome_cleaner/crash/crashpad_crash_client.cc b/chrome/chrome_cleaner/crash/crashpad_crash_client.cc
index c7935b5b..4e324249 100644
--- a/chrome/chrome_cleaner/crash/crashpad_crash_client.cc
+++ b/chrome/chrome_cleaner/crash/crashpad_crash_client.cc
@@ -220,7 +220,7 @@
   bool chrome_system_install;
   RetrieveChromeVersionAndInstalledDomain(&chrome_version,
                                           &chrome_system_install);
-  SetCrashKey("ChromeVersion", base::UTF16ToUTF8(chrome_version));
+  SetCrashKey("ChromeVersion", base::WideToUTF8(chrome_version));
   SetCrashKey("ChromeSystemInstall", chrome_system_install ? "1" : "0");
 
   SetCrashKeysFromCommandLine();
diff --git a/chrome/chrome_cleaner/crash/crashpad_crash_reporter.cc b/chrome/chrome_cleaner/crash/crashpad_crash_reporter.cc
index 8c55ddc..5a0818b 100644
--- a/chrome/chrome_cleaner/crash/crashpad_crash_reporter.cc
+++ b/chrome/chrome_cleaner/crash/crashpad_crash_reporter.cc
@@ -133,7 +133,7 @@
   std::unique_ptr<char* []> argv_as_utf8(new char*[argv.size() + 1]);
   storage.reserve(argv.size());
   for (size_t i = 0; i < argv.size(); ++i) {
-    storage.push_back(base::UTF16ToUTF8(argv[i]));
+    storage.push_back(base::WideToUTF8(argv[i]));
     argv_as_utf8[i] = &storage[i][0];
   }
   argv_as_utf8[argv.size()] = nullptr;
diff --git a/chrome/chrome_cleaner/engines/broker/engine_file_requests_impl.cc b/chrome/chrome_cleaner/engines/broker/engine_file_requests_impl.cc
index be9382e..a3a7113 100644
--- a/chrome/chrome_cleaner/engines/broker/engine_file_requests_impl.cc
+++ b/chrome/chrome_cleaner/engines/broker/engine_file_requests_impl.cc
@@ -68,7 +68,7 @@
       file_name, &find_file_data, &handle);
   if (metadata_observer_) {
     std::map<std::string, std::string> arguments = {
-        {"file_name", base::UTF16ToUTF8(file_name.value())},
+        {"file_name", base::WideToUTF8(file_name.value())},
         {"result", base::NumberToString(result)},
         {"handle", base::NumberToString(reinterpret_cast<size_t>(handle))},
     };
diff --git a/chrome/chrome_cleaner/engines/broker/engine_requests_no_blocking_unittest.cc b/chrome/chrome_cleaner/engines/broker/engine_requests_no_blocking_unittest.cc
index 3bbdb087..e63bca0 100644
--- a/chrome/chrome_cleaner/engines/broker/engine_requests_no_blocking_unittest.cc
+++ b/chrome/chrome_cleaner/engines/broker/engine_requests_no_blocking_unittest.cc
@@ -556,8 +556,8 @@
       base::StrCat({temp_reg_key.FullyQualifiedPath(), L"\\dummy-subkey"}));
 
   base::Process test_process = LongRunningProcess(/*command_line=*/nullptr);
-  parent_process->AppendSwitchNative(
-      kTestProcessIdSwitch, base::NumberToString16(test_process.Pid()));
+  parent_process->AppendSwitchNative(kTestProcessIdSwitch,
+                                     base::NumberToWString(test_process.Pid()));
 
   // Install a test task scheduler so we don't accidentally delete a real task
   // when servicing the DeleteTask request.
diff --git a/chrome/chrome_cleaner/engines/broker/interface_log_service.cc b/chrome/chrome_cleaner/engines/broker/interface_log_service.cc
index e73439fa..0bcfde7 100644
--- a/chrome/chrome_cleaner/engines/broker/interface_log_service.cc
+++ b/chrome/chrome_cleaner/engines/broker/interface_log_service.cc
@@ -25,7 +25,7 @@
 
 namespace {
 
-base::FilePath GetPathForLogFile(const base::StringPiece16 log_file_name) {
+base::FilePath GetPathForLogFile(const base::WStringPiece log_file_name) {
   base::FilePath app_data_path;
   GetAppDataProductDirectory(&app_data_path);
   base::FilePath log_file_path = app_data_path.Append(log_file_name);
@@ -40,16 +40,16 @@
 
 // static
 std::unique_ptr<InterfaceLogService> InterfaceLogService::Create(
-    const base::StringPiece16 file_name,
-    const base::StringPiece16 build_version) {
+    const base::WStringPiece file_name,
+    const base::WStringPiece build_version) {
   if (file_name.empty())
     return nullptr;
 
   base::FilePath file_path = GetPathForLogFile(file_name);
 
   std::string file_path_utf8;
-  if (!base::UTF16ToUTF8(file_path.value().c_str(), file_path.value().size(),
-                         &file_path_utf8)) {
+  if (!base::WideToUTF8(file_path.value().c_str(), file_path.value().size(),
+                        &file_path_utf8)) {
     LOG(ERROR) << "Can't open interface log file " << file_path.value()
                << ": name is invalid" << std::endl;
     return nullptr;
@@ -115,14 +115,13 @@
   return GetPathForLogFile(log_file_name_);
 }
 
-InterfaceLogService::InterfaceLogService(
-    const base::StringPiece16 file_name,
-    const base::StringPiece16 build_version,
-    std::ofstream csv_stream)
+InterfaceLogService::InterfaceLogService(const base::WStringPiece file_name,
+                                         const base::WStringPiece build_version,
+                                         std::ofstream csv_stream)
     : InterfaceMetadataObserver(),
       log_file_name_(file_name),
       csv_stream_(std::move(csv_stream)) {
-  std::string build_version_utf8 = base::UTF16ToUTF8(build_version);
+  std::string build_version_utf8 = base::WideToUTF8(build_version);
 
   base::AutoLock lock(lock_);
   call_record_.set_build_version(build_version_utf8);
diff --git a/chrome/chrome_cleaner/engines/broker/interface_log_service.h b/chrome/chrome_cleaner/engines/broker/interface_log_service.h
index 058e1e65..171b6db 100644
--- a/chrome/chrome_cleaner/engines/broker/interface_log_service.h
+++ b/chrome/chrome_cleaner/engines/broker/interface_log_service.h
@@ -23,8 +23,8 @@
 class InterfaceLogService : public InterfaceMetadataObserver {
  public:
   static std::unique_ptr<InterfaceLogService> Create(
-      const base::StringPiece16 file_name,
-      const base::StringPiece16 build_version);
+      const base::WStringPiece file_name,
+      const base::WStringPiece build_version);
 
   ~InterfaceLogService() override;
 
@@ -44,8 +44,8 @@
   base::FilePath GetLogFilePath() const;
 
  private:
-  InterfaceLogService(const base::StringPiece16 file_name,
-                      const base::StringPiece16 build_version,
+  InterfaceLogService(const base::WStringPiece file_name,
+                      const base::WStringPiece build_version,
                       std::ofstream csv_stream);
 
   // TODO(joenotcharles): Currently the CallHistory is only used in the unit
diff --git a/chrome/chrome_cleaner/engines/broker/interface_log_service_unittest.cc b/chrome/chrome_cleaner/engines/broker/interface_log_service_unittest.cc
index a676707e..eccc351 100644
--- a/chrome/chrome_cleaner/engines/broker/interface_log_service_unittest.cc
+++ b/chrome/chrome_cleaner/engines/broker/interface_log_service_unittest.cc
@@ -31,7 +31,7 @@
  public:
   void SetUp() override {
     log_service_ = InterfaceLogService::Create(
-        kLogFileName, base::UTF8ToUTF16(kDummyBuildVersion));
+        kLogFileName, base::UTF8ToWide(kDummyBuildVersion));
     expected_file_size_ = 0LL;
   }
 
@@ -286,7 +286,7 @@
 
 TEST_F(InterfaceLogServiceTest, EmptyLogFileTest) {
   EXPECT_FALSE(
-      InterfaceLogService::Create(L"", base::UTF8ToUTF16(kDummyBuildVersion)));
+      InterfaceLogService::Create(L"", base::UTF8ToWide(kDummyBuildVersion)));
 }
 
 }  // namespace chrome_cleaner
diff --git a/chrome/chrome_cleaner/engines/broker/sandbox_setup.cc b/chrome/chrome_cleaner/engines/broker/sandbox_setup.cc
index 0682aae..8dec017d 100644
--- a/chrome/chrome_cleaner/engines/broker/sandbox_setup.cc
+++ b/chrome/chrome_cleaner/engines/broker/sandbox_setup.cc
@@ -100,7 +100,7 @@
 
   // Propagate engine selection switches to the sandbox target.
   command_line->AppendSwitchNative(
-      kEngineSwitch, base::NumberToString16(Settings::GetInstance()->engine()));
+      kEngineSwitch, base::NumberToWString(Settings::GetInstance()->engine()));
 
   return RESULT_CODE_SUCCESS;
 }
diff --git a/chrome/chrome_cleaner/engines/common/registry_util.cc b/chrome/chrome_cleaner/engines/common/registry_util.cc
index 1779c02..13d060d0 100644
--- a/chrome/chrome_cleaner/engines/common/registry_util.cc
+++ b/chrome/chrome_cleaner/engines/common/registry_util.cc
@@ -99,7 +99,7 @@
     default:
       // Replace null chars with 0s for printing.
       base::string16 str(key.CastAsWStringPiece());
-      base::ReplaceChars(str, base::StringPiece16(L"\0", 1), L"\\0", &str);
+      base::ReplaceChars(str, base::WStringPiece(L"\0", 1), L"\\0", &str);
       return str;
   }
 }
diff --git a/chrome/chrome_cleaner/engines/controllers/elevating_facade.cc b/chrome/chrome_cleaner/engines/controllers/elevating_facade.cc
index fc82bf0..9fe6ff3 100644
--- a/chrome/chrome_cleaner/engines/controllers/elevating_facade.cc
+++ b/chrome/chrome_cleaner/engines/controllers/elevating_facade.cc
@@ -52,9 +52,9 @@
     return false;
 
   return base::EqualsCaseInsensitiveASCII(
-      base::StringPiece16(window_class_prefix, class_name_length),
-      base::StringPiece16(kChromeWindowClassPrefix,
-                          base::size(kChromeWindowClassPrefix) - 1));
+      base::WStringPiece(window_class_prefix, class_name_length),
+      base::WStringPiece(kChromeWindowClassPrefix,
+                         base::size(kChromeWindowClassPrefix) - 1));
 }
 
 // Returns a handle to the foreground window if it is a Chrome window, otherwise
diff --git a/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc b/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc
index 9ee8d4d6..066576ae 100644
--- a/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc
+++ b/chrome/chrome_cleaner/engines/controllers/extension_removal_unittest.cc
@@ -333,19 +333,19 @@
 
 TEST_F(ExtensionCleanupTest, CleanupExtensions) {
   std::vector<ForceInstalledExtension> extensions_to_cleanup{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   std::unique_ptr<UwEMatchers> matchers =
@@ -395,36 +395,36 @@
 
 TEST_F(ExtensionCleanupTest, CleanupSomeExtensions) {
   std::vector<ForceInstalledExtension> expected_extensions{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   std::vector<ForceInstalledExtension> expected_final_extensions{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION}};
   std::vector<ForceInstalledExtension> extensions_to_cleanup{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   std::unique_ptr<UwEMatchers> matchers =
@@ -474,19 +474,19 @@
 
 TEST_F(ExtensionCleanupTest, CleanupNoExtensions) {
   std::vector<ForceInstalledExtension> expected_extensions{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   std::vector<ForceInstalledExtension> extensions_to_cleanup;
@@ -537,19 +537,19 @@
 
 TEST_F(ExtensionCleanupTest, DISABLED_CleanupNoExtensionsWhenNotAllowed) {
   std::vector<ForceInstalledExtension> expected_extensions{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   std::vector<ForceInstalledExtension> extensions_to_cleanup =
diff --git a/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc b/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
index 6639a6bf..60570e3 100644
--- a/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
+++ b/chrome/chrome_cleaner/engines/controllers/uwe_engine_cleaner_wrapper.cc
@@ -163,7 +163,7 @@
           return;
         }
         master_preferences_extensions.push_back(
-            base::UTF8ToUTF16(extension.id.AsString()));
+            base::UTF8ToWide(extension.id.AsString()));
         break;
       }
       case INSTALL_METHOD_UNSPECIFIED:
@@ -197,7 +197,7 @@
       LOG(ERROR) << "Could not serialize json";
       return;
     }
-    base::string16 serialized_json16 = base::UTF8ToUTF16(serialized_json);
+    base::string16 serialized_json16 = base::UTF8ToWide(serialized_json);
     if (!RemoveExtensionSettingsPoliciesExtensionForAccessMask(
             KEY_WOW64_32KEY | KEY_WRITE, content_type, serialized_json16)) {
       LOG(ERROR) << "Could not remove extension settings from registry";
diff --git a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy_unittest.cc b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy_unittest.cc
index b634b03a..3af0c3a 100644
--- a/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy_unittest.cc
+++ b/chrome/chrome_cleaner/engines/target/cleaner_engine_requests_proxy_unittest.cc
@@ -664,7 +664,7 @@
     test_process_ = LongRunningProcess(/*command_line=*/nullptr);
     ASSERT_TRUE(test_process_.IsValid());
 
-    base::string16 switch_str = base::NumberToString16(test_process_.Pid());
+    base::string16 switch_str = base::NumberToWString(test_process_.Pid());
     parent_process_->AppendSwitchNative(kLongRunningProcessIdSwitch,
                                         switch_str);
   }
diff --git a/chrome/chrome_cleaner/engines/target/libraries.cc b/chrome/chrome_cleaner/engines/target/libraries.cc
index d26d75a..44bce585 100644
--- a/chrome/chrome_cleaner/engines/target/libraries.cc
+++ b/chrome/chrome_cleaner/engines/target/libraries.cc
@@ -94,7 +94,7 @@
 extern "C" FARPROC WINAPI DllLoadHook(unsigned dliNotify, PDelayLoadInfo pdli) {
   switch (dliNotify) {
     case dliNotePreLoadLibrary: {
-      const base::string16 requested_library = base::ASCIIToUTF16(pdli->szDll);
+      const base::string16 requested_library = base::ASCIIToWide(pdli->szDll);
       const Engine::Name engine = Settings::GetInstance()->engine();
 
       VerifyEngineLibraryAllowed(engine, requested_library);
diff --git a/chrome/chrome_cleaner/engines/target/libraries_unittest.cc b/chrome/chrome_cleaner/engines/target/libraries_unittest.cc
index 61bbc28f..01765f6 100644
--- a/chrome/chrome_cleaner/engines/target/libraries_unittest.cc
+++ b/chrome/chrome_cleaner/engines/target/libraries_unittest.cc
@@ -107,7 +107,7 @@
 
   ASSERT_TRUE(Engine::Name_IsValid(engine));
   parent_process_->AppendSwitchNative(chrome_cleaner::kEngineSwitch,
-                                      base::NumberToString16(engine));
+                                      base::NumberToWString(engine));
 
   int32_t exit_code = -1;
   ASSERT_TRUE(
diff --git a/chrome/chrome_cleaner/http/http_agent_impl.cc b/chrome/chrome_cleaner/http/http_agent_impl.cc
index 9154c0c..f6291bb 100644
--- a/chrome/chrome_cleaner/http/http_agent_impl.cc
+++ b/chrome/chrome_cleaner/http/http_agent_impl.cc
@@ -118,14 +118,14 @@
   // Returns the proxy auto-configuration URL, or an empty string if automatic
   // proxy configuration is disabled. Only valid after a successful call to
   // Load().
-  const base::char16* auto_config_url() const {
+  const wchar_t* auto_config_url() const {
     return proxy_config_.lpszAutoConfigUrl ? proxy_config_.lpszAutoConfigUrl
                                            : L"";
   }
 
   // Returns the proxy configuration string that should be passed to
   // WinHttpOpen.
-  const base::char16* proxy() const {
+  const wchar_t* proxy() const {
     return (proxy_config_.lpszProxy && proxy_config_.lpszProxy[0] != 0)
                ? proxy_config_.lpszProxy
                : WINHTTP_NO_PROXY_NAME;
@@ -133,7 +133,7 @@
 
   // Returns the proxy bypass configuration string that should be passed to
   // WinHttpOpen. Only valid after a successful call to Load().
-  const base::char16* proxy_bypass() const {
+  const wchar_t* proxy_bypass() const {
     return access_type() == WINHTTP_ACCESS_TYPE_NO_PROXY
                ? WINHTTP_NO_PROXY_BYPASS
                : proxy_config_.lpszProxyBypass;
@@ -430,7 +430,7 @@
   DCHECK(has_content_type);
   DCHECK(content_type);
 
-  base::char16 content_type_buffer[256] = {0};
+  wchar_t content_type_buffer[256] = {0};
 
   if (QueryHeader(WINHTTP_QUERY_CONTENT_TYPE, has_content_type,
                   &content_type_buffer, sizeof(content_type_buffer))) {
diff --git a/chrome/chrome_cleaner/http/internet_helpers.cc b/chrome/chrome_cleaner/http/internet_helpers.cc
index 84ceea6..9141ad1 100644
--- a/chrome/chrome_cleaner/http/internet_helpers.cc
+++ b/chrome/chrome_cleaner/http/internet_helpers.cc
@@ -24,14 +24,12 @@
 
 // Returns the index of the closing quote of the string, if any. |start| points
 // at the opening quote.
-size_t FindStringEnd(const base::string16& line,
-                     size_t start,
-                     base::char16 delim) {
+size_t FindStringEnd(const base::string16& line, size_t start, wchar_t delim) {
   DCHECK_LT(start, line.length());
   DCHECK_EQ(line[start], delim);
   DCHECK((delim == L'"') || (delim == L'\''));
 
-  const base::char16 set[] = {delim, L'\\', L'\0'};
+  const wchar_t set[] = {delim, L'\\', L'\0'};
   for (size_t end = line.find_first_of(set, start + 1);
        end != base::string16::npos; end = line.find_first_of(set, end + 2)) {
     if (line[end] != L'\\')
@@ -40,9 +38,9 @@
   return line.length();
 }
 
-const base::char16 kHttpLws[] = L" \t";
+const wchar_t kHttpLws[] = L" \t";
 
-bool IsLWS(base::char16 c) {
+bool IsLWS(wchar_t c) {
   return ::wcschr(kHttpLws, c) != NULL;
 }
 
@@ -102,13 +100,13 @@
       TrimLWS(&param_value_begin, &param_value_end);
 
       if (base::LowerCaseEqualsASCII(
-              base::StringPiece16(param_name_begin, param_name_end),
+              base::WStringPiece(param_name_begin, param_name_end),
               "charset")) {
         charset_val = param_value_begin - begin;
         charset_end = param_value_end - begin;
         type_has_charset = true;
       } else if (base::LowerCaseEqualsASCII(
-                     base::StringPiece16(param_name_begin, param_name_end),
+                     base::WStringPiece(param_name_begin, param_name_end),
                      "boundary")) {
         if (boundary)
           boundary->assign(param_value_begin, param_value_end);
@@ -122,7 +120,7 @@
     // standard, but may occur in rare cases.
     charset_val = content_type_str.find_first_not_of(kHttpLws, charset_val);
     charset_val = std::min(charset_val, charset_end);
-    base::char16 first_char = content_type_str[charset_val];
+    wchar_t first_char = content_type_str[charset_val];
     if (first_char == L'"' || first_char == L'\'') {
       charset_end = FindStringEnd(content_type_str, charset_val, first_char);
       ++charset_val;
@@ -145,16 +143,16 @@
     // The common case here is that mime_type is empty.
     bool eq = !mime_type->empty() &&
               base::LowerCaseEqualsASCII(
-                  base::StringPiece16(begin + type_val, begin + type_end),
+                  base::WStringPiece(begin + type_val, begin + type_end),
                   base::WideToUTF8(*mime_type).data());
     if (!eq) {
       mime_type->assign(base::ToLowerASCII(
-          base::StringPiece16(begin + type_val, begin + type_end)));
+          base::WStringPiece(begin + type_val, begin + type_end)));
     }
     if ((!eq && *had_charset) || type_has_charset) {
       *had_charset = true;
       charset->assign(base::ToLowerASCII(
-          base::StringPiece16(begin + charset_val, begin + charset_end)));
+          base::WStringPiece(begin + charset_val, begin + charset_end)));
     }
   }
 }
@@ -194,16 +192,16 @@
   if (secure) {
     if (port == 443)
       return L"https://" + host + path;
-    return L"https://" + host + L':' + base::NumberToString16(port) + path;
+    return L"https://" + host + L':' + base::NumberToWString(port) + path;
   }
   if (port == 80)
     return L"http://" + host + path;
-  return L"http://" + host + L':' + base::NumberToString16(port) + path;
+  return L"http://" + host + L':' + base::NumberToWString(port) + path;
 }
 
 base::string16 GenerateMultipartHttpRequestBoundary() {
   // The boundary has 27 '-' characters followed by 16 hex digits.
-  static const base::char16 kBoundaryPrefix[] = L"---------------------------";
+  static const wchar_t kBoundaryPrefix[] = L"---------------------------";
   static const size_t kBoundaryLength = 27 + 16;
 
   // Generate some random numbers to fill out the boundary.
@@ -211,7 +209,7 @@
   int r1 = rand();
 
   // Add one character for the NULL termination.
-  base::char16 temp[kBoundaryLength + 1];
+  wchar_t temp[kBoundaryLength + 1];
   ::swprintf(temp, sizeof(temp) / sizeof(*temp), L"%s%08X%08X", kBoundaryPrefix,
              r0, r1);
 
diff --git a/chrome/chrome_cleaner/http/internet_helpers_unittest.cc b/chrome/chrome_cleaner/http/internet_helpers_unittest.cc
index c0676ee0..5d9432c 100644
--- a/chrome/chrome_cleaner/http/internet_helpers_unittest.cc
+++ b/chrome/chrome_cleaner/http/internet_helpers_unittest.cc
@@ -16,11 +16,11 @@
 
 TEST(InternetHelpersTest, ParseContentType) {
   const struct {
-    const base::char16* content_type;
-    const base::char16* expected_mime_type;
-    const base::char16* expected_charset;
+    const wchar_t* content_type;
+    const wchar_t* expected_mime_type;
+    const wchar_t* expected_charset;
     const bool expected_had_charset;
-    const base::char16* expected_boundary;
+    const wchar_t* expected_boundary;
   } tests[] = {
       {L"text/html; charset=utf-8", L"text/html", L"utf-8", true, L""},
       {L"text/html; charset=", L"text/html", L"", true, L""},
@@ -60,11 +60,11 @@
 
 TEST(InternetHelpersTest, ComposeAndDecomposeUrl) {
   const struct {
-    const base::char16* url;
-    const base::char16* scheme;
-    const base::char16* host;
+    const wchar_t* url;
+    const wchar_t* scheme;
+    const wchar_t* host;
     uint16_t port;
-    const base::char16* path;
+    const wchar_t* path;
   } tests[] = {
       {L"http://example.com/", L"http", L"example.com", 80, L"/"},
       {L"https://example.com/", L"https", L"example.com", 443, L"/"},
@@ -86,7 +86,7 @@
                          tests[i].scheme == base::string16(L"https")));
   }
 
-  const base::char16* invalid_urls[] = {
+  const wchar_t* invalid_urls[] = {
       L"",         L"example.com",       L"example.com/foo",
       L"/foo/bar", L"example.com:80",    L"http://",
       L"http:",    L"http:/example.com", L"http:example.com"};
diff --git a/chrome/chrome_cleaner/http/user_agent.cc b/chrome/chrome_cleaner/http/user_agent.cc
index 75de74e..d306728 100644
--- a/chrome/chrome_cleaner/http/user_agent.cc
+++ b/chrome/chrome_cleaner/http/user_agent.cc
@@ -11,7 +11,7 @@
 
 namespace {
 
-const base::char16* ArchitectureToString(UserAgent::Architecture architecture) {
+const wchar_t* ArchitectureToString(UserAgent::Architecture architecture) {
   switch (architecture) {
     case UserAgent::WOW64:
       return L"; WOW64";
@@ -41,8 +41,8 @@
 
 base::string16 UserAgent::AsString() {
   return product_name_ + L"/" + product_version_ + L" (Windows NT " +
-         base::NumberToString16(os_major_version_) + L"." +
-         base::NumberToString16(os_minor_version_) +
+         base::NumberToWString(os_major_version_) + L"." +
+         base::NumberToWString(os_minor_version_) +
          ArchitectureToString(architecture_) + L") WinHTTP/" + winhttp_version_;
 }
 
diff --git a/chrome/chrome_cleaner/ipc/ipc_test_util.cc b/chrome/chrome_cleaner/ipc/ipc_test_util.cc
index c6cf865..5cef565 100644
--- a/chrome/chrome_cleaner/ipc/ipc_test_util.cc
+++ b/chrome/chrome_cleaner/ipc/ipc_test_util.cc
@@ -103,7 +103,7 @@
                                               HANDLE handle) {
   extra_handles_to_inherit_.push_back(handle);
   command_line_.AppendSwitchNative(
-      switch_string, base::NumberToString16(base::win::HandleToUint32(handle)));
+      switch_string, base::NumberToWString(base::win::HandleToUint32(handle)));
 }
 
 bool ParentProcess::LaunchConnectedChildProcess(
diff --git a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc.cc b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc.cc
index 11dd15f..50a110e 100644
--- a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc.cc
+++ b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc.cc
@@ -105,8 +105,8 @@
   chrome_cleaner::PromptUserRequest prompt_user_message;
   for (const base::FilePath& file_to_delete : files_to_delete) {
     std::string file_path_utf8;
-    if (!base::UTF16ToUTF8(file_to_delete.value().c_str(),
-                           file_to_delete.value().size(), &file_path_utf8)) {
+    if (!base::WideToUTF8(file_to_delete.value().c_str(),
+                          file_to_delete.value().size(), &file_path_utf8)) {
       std::move(callback).Run(PromptUserResponse::DENIED);
       return;
     } else {
@@ -116,8 +116,8 @@
 
   for (const base::string16& registry_key : registry_keys) {
     std::string registry_key_utf8;
-    if (!base::UTF16ToUTF8(registry_key.c_str(), registry_key.size(),
-                           &registry_key_utf8)) {
+    if (!base::WideToUTF8(registry_key.c_str(), registry_key.size(),
+                          &registry_key_utf8)) {
       std::move(callback).Run(PromptUserResponse::DENIED);
       return;
     } else {
@@ -127,8 +127,8 @@
 
   for (const base::string16& extension_id : extension_ids) {
     std::string extension_id_utf8;
-    if (!base::UTF16ToUTF8(extension_id.c_str(), extension_id.size(),
-                           &extension_id_utf8)) {
+    if (!base::WideToUTF8(extension_id.c_str(), extension_id.size(),
+                          &extension_id_utf8)) {
       std::move(callback).Run(PromptUserResponse::DENIED);
       return;
     } else {
diff --git a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
index a456469a..a8f78d4 100644
--- a/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
+++ b/chrome/chrome_cleaner/ipc/proto_chrome_prompt_ipc_unittest.cc
@@ -40,8 +40,8 @@
 constexpr char kExpectedChromeDisconnectPointSwitch[] =
     "expected-parent-disconnected";
 
-constexpr base::char16 kInvalidUTF16String[] = {0xDC00, 0xD800, 0xD800, 0xDFFF,
-                                                0xDFFF, 0xDBFF, 0};
+constexpr wchar_t kInvalidUTF16String[] = {0xDC00, 0xD800, 0xD800, 0xDFFF,
+                                           0xDFFF, 0xDBFF, 0};
 const base::FilePath kInvalidFilePath(kInvalidUTF16String);
 const base::FilePath kNonASCIIFilePath(L"ééààçç");
 const base::string16 kInvalidRegistryKey(kInvalidUTF16String);
@@ -145,7 +145,7 @@
   // Handles to inherit will be added to the LaunchOptions explicitly.
   security_attributes.bInheritHandle = false;
 
-  base::string16 pipe_name = base::UTF8ToUTF16(
+  base::string16 pipe_name = base::UTF8ToWide(
       base::StrCat({"\\\\.\\pipe\\chrome-cleaner-",
                     base::UnguessableToken::Create().ToString()}));
 
@@ -483,8 +483,8 @@
         return false;
       }
       std::string file_path_utf8;
-      base::UTF16ToUTF8(kBadFilePath.value().c_str(),
-                        kBadFilePath.value().size(), &file_path_utf8);
+      base::WideToUTF8(kBadFilePath.value().c_str(),
+                       kBadFilePath.value().size(), &file_path_utf8);
       if (request.prompt_user().files_to_delete(0) != file_path_utf8) {
         LOG(ERROR) << "Wrong value for file to delete";
         return false;
@@ -495,7 +495,7 @@
         return false;
       }
       if (request.prompt_user().registry_keys(0) !=
-          base::UTF16ToUTF8(kBadRegistryKey)) {
+          base::WideToUTF8(kBadRegistryKey)) {
         LOG(ERROR) << "Wrong value for registry key";
         return false;
       }
diff --git a/chrome/chrome_cleaner/ipc/sandbox.cc b/chrome/chrome_cleaner/ipc/sandbox.cc
index 653994b4..8b49217 100644
--- a/chrome/chrome_cleaner/ipc/sandbox.cc
+++ b/chrome/chrome_cleaner/ipc/sandbox.cc
@@ -258,7 +258,7 @@
           base::WaitableEvent::InitialState::NOT_SIGNALED);
   command_line.AppendSwitchNative(
       chrome_cleaner::kInitDoneNotifierSwitch,
-      base::NumberToString16(
+      base::NumberToWString(
           base::win::HandleToUint32(init_done_event->handle())));
   policy->AddHandleToShare(init_done_event->handle());
 
diff --git a/chrome/chrome_cleaner/logging/cleaner_logging_service.cc b/chrome/chrome_cleaner/logging/cleaner_logging_service.cc
index 5638664..b764b741 100644
--- a/chrome/chrome_cleaner/logging/cleaner_logging_service.cc
+++ b/chrome/chrome_cleaner/logging/cleaner_logging_service.cc
@@ -115,28 +115,28 @@
 void ProtoObjectToFileInformation(const FileInformation& proto_file_information,
                                   internal::FileInformation* file_information) {
   DCHECK(file_information);
-  file_information->path = base::UTF8ToUTF16(proto_file_information.path());
+  file_information->path = base::UTF8ToWide(proto_file_information.path());
   file_information->creation_date = proto_file_information.creation_date();
   file_information->last_modified_date =
       proto_file_information.last_modified_date();
   file_information->sha256 = proto_file_information.sha256();
   file_information->size = proto_file_information.size();
   file_information->company_name =
-      base::UTF8ToUTF16(proto_file_information.company_name());
+      base::UTF8ToWide(proto_file_information.company_name());
   file_information->company_short_name =
-      base::UTF8ToUTF16(proto_file_information.company_short_name());
+      base::UTF8ToWide(proto_file_information.company_short_name());
   file_information->product_name =
-      base::UTF8ToUTF16(proto_file_information.product_name());
+      base::UTF8ToWide(proto_file_information.product_name());
   file_information->product_short_name =
-      base::UTF8ToUTF16(proto_file_information.product_short_name());
+      base::UTF8ToWide(proto_file_information.product_short_name());
   file_information->internal_name =
-      base::UTF8ToUTF16(proto_file_information.internal_name());
+      base::UTF8ToWide(proto_file_information.internal_name());
   file_information->original_filename =
-      base::UTF8ToUTF16(proto_file_information.original_filename());
+      base::UTF8ToWide(proto_file_information.original_filename());
   file_information->file_description =
-      base::UTF8ToUTF16(proto_file_information.file_description());
+      base::UTF8ToWide(proto_file_information.file_description());
   file_information->file_version =
-      base::UTF8ToUTF16(proto_file_information.file_version());
+      base::UTF8ToWide(proto_file_information.file_version());
   file_information->active_file = proto_file_information.active_file();
 }
 
@@ -477,7 +477,7 @@
   base::AutoLock lock(lock_);
   ChromeCleanerReport::SystemReport::LoadedModule* loaded_module =
       chrome_cleaner_report_.mutable_system_report()->add_loaded_modules();
-  loaded_module->set_name(base::UTF16ToUTF8(name));
+  loaded_module->set_name(base::WideToUTF8(name));
   loaded_module->set_host(module_host);
   *loaded_module->mutable_file_information() = reported_file_information;
 }
@@ -492,8 +492,8 @@
   base::AutoLock lock(lock_);
   ChromeCleanerReport::SystemReport::Service* service =
       chrome_cleaner_report_.mutable_system_report()->add_services();
-  service->set_display_name(base::UTF16ToUTF8(display_name));
-  service->set_service_name(base::UTF16ToUTF8(service_name));
+  service->set_display_name(base::WideToUTF8(display_name));
+  service->set_service_name(base::WideToUTF8(service_name));
   *service->mutable_file_information() = reported_file_information;
 }
 
@@ -518,7 +518,7 @@
   base::AutoLock lock(lock_);
   ChromeCleanerReport::SystemReport::Process* process =
       chrome_cleaner_report_.mutable_system_report()->add_processes();
-  process->set_name(base::UTF16ToUTF8(name));
+  process->set_name(base::WideToUTF8(name));
   *process->mutable_file_information() = reported_file_information;
 }
 
@@ -526,10 +526,10 @@
     const internal::RegistryValue& registry_value,
     const std::vector<internal::FileInformation>& file_informations) {
   RegistryValue new_registry_value;
-  new_registry_value.set_key_path(base::UTF16ToUTF8(registry_value.key_path));
+  new_registry_value.set_key_path(base::WideToUTF8(registry_value.key_path));
   new_registry_value.set_value_name(
-      base::UTF16ToUTF8(registry_value.value_name));
-  new_registry_value.set_data(base::UTF16ToUTF8(registry_value.data));
+      base::WideToUTF8(registry_value.value_name));
+  new_registry_value.set_data(base::WideToUTF8(registry_value.data));
 
   for (const auto& file_information : file_informations) {
     FileInformation* reported_file_information =
@@ -552,7 +552,7 @@
   FileInformationToProtoObject(file_information, reported_file_information);
 
   for (const auto& guid : guids)
-    layered_service_provider.add_guids(base::UTF16ToUTF8(guid));
+    layered_service_provider.add_guids(base::WideToUTF8(guid));
 
   base::AutoLock lock(lock_);
   *chrome_cleaner_report_.mutable_system_report()
@@ -568,10 +568,10 @@
   ChromeCleanerReport_SystemReport_SystemProxySettings*
       win_inet_proxy_settings = chrome_cleaner_report_.mutable_system_report()
                                     ->mutable_win_inet_proxy_settings();
-  win_inet_proxy_settings->set_config(base::UTF16ToUTF8(config));
-  win_inet_proxy_settings->set_bypass(base::UTF16ToUTF8(bypass));
+  win_inet_proxy_settings->set_config(base::WideToUTF8(config));
+  win_inet_proxy_settings->set_bypass(base::WideToUTF8(bypass));
   win_inet_proxy_settings->set_auto_config_url(
-      base::UTF16ToUTF8(auto_config_url));
+      base::WideToUTF8(auto_config_url));
   win_inet_proxy_settings->set_autodetect(autodetect);
 }
 
@@ -582,8 +582,8 @@
   ChromeCleanerReport_SystemReport_SystemProxySettings*
       win_http_proxy_settings = chrome_cleaner_report_.mutable_system_report()
                                     ->mutable_win_http_proxy_settings();
-  win_http_proxy_settings->set_config(base::UTF16ToUTF8(config));
-  win_http_proxy_settings->set_bypass(base::UTF16ToUTF8(bypass));
+  win_http_proxy_settings->set_config(base::WideToUTF8(config));
+  win_http_proxy_settings->set_bypass(base::WideToUTF8(bypass));
 }
 
 void CleanerLoggingService::AddInstalledExtension(
@@ -594,7 +594,7 @@
   ChromeCleanerReport_SystemReport_InstalledExtension* installed_extension =
       chrome_cleaner_report_.mutable_system_report()
           ->add_installed_extensions();
-  installed_extension->set_extension_id(base::UTF16ToUTF8(extension_id));
+  installed_extension->set_extension_id(base::WideToUTF8(extension_id));
   installed_extension->set_install_method(install_method);
   for (const auto& file : extension_files) {
     FileInformation proto_file_information;
@@ -608,8 +608,8 @@
     const base::string16& description,
     const std::vector<internal::FileInformation>& actions) {
   ScheduledTask scheduled_task;
-  scheduled_task.set_name(base::UTF16ToUTF8(name));
-  scheduled_task.set_description(base::UTF16ToUTF8(description));
+  scheduled_task.set_name(base::WideToUTF8(name));
+  scheduled_task.set_description(base::WideToUTF8(description));
 
   for (const auto& action : actions) {
     FileInformation* reported_action =
@@ -630,11 +630,11 @@
   base::AutoLock lock(lock_);
   ChromeCleanerReport_SystemReport_ShortcutData* shortcut_data =
       chrome_cleaner_report_.mutable_system_report()->add_shortcut_data();
-  shortcut_data->set_lnk_path(base::UTF16ToUTF8(lnk_path));
-  shortcut_data->set_executable_path(base::UTF16ToUTF8(executable_path));
+  shortcut_data->set_lnk_path(base::WideToUTF8(lnk_path));
+  shortcut_data->set_executable_path(base::WideToUTF8(executable_path));
   shortcut_data->set_executable_hash(executable_hash);
   for (const auto& argument : command_line_arguments) {
-    shortcut_data->add_command_line_arguments(base::UTF16ToUTF8(argument));
+    shortcut_data->add_command_line_arguments(base::WideToUTF8(argument));
   }
 }
 
@@ -663,7 +663,7 @@
       continue;
     for (const MatchedFile& file : uws.files()) {
       base::string16 sanitized_path =
-          base::UTF8ToUTF16(file.file_information().path());
+          base::UTF8ToWide(file.file_information().path());
       RemovalStatus removal_status =
           status_updater->GetRemovalStatusOfSanitizedPath(sanitized_path);
 
@@ -853,7 +853,7 @@
 void CleanerLoggingService::UpdateFileRemovalStatuses() {
   for (const auto& path_and_status :
        FileRemovalStatusUpdater::GetInstance()->GetAllRemovalStatuses()) {
-    std::string sanitized_path = base::UTF16ToUTF8(path_and_status.first);
+    std::string sanitized_path = base::WideToUTF8(path_and_status.first);
     FileRemovalStatusUpdater::FileRemovalStatus status = path_and_status.second;
     DCHECK(status.removal_status != REMOVAL_STATUS_UNSPECIFIED);
 
diff --git a/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc b/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
index 53d179a7..5ba24022 100644
--- a/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
+++ b/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
@@ -143,7 +143,7 @@
   int folders_index = 0;
   for (const auto& file_path : uws.expanded_disk_footprints.file_paths()) {
     // The path will be sanitized in the logs.
-    std::string sanitized_path = base::UTF16ToUTF8(SanitizePath(file_path));
+    std::string sanitized_path = base::WideToUTF8(SanitizePath(file_path));
     if (base::DirectoryExists(file_path)) {
       ASSERT_TRUE(folders_index < log_uws.folders_size());
       EXPECT_EQ(sanitized_path,
@@ -175,7 +175,7 @@
     const internal::FileInformation& file_information,
     const FileInformation& proto_file_information) {
   EXPECT_EQ(proto_file_information.path(),
-            base::UTF16ToUTF8(file_information.path));
+            base::WideToUTF8(file_information.path));
   EXPECT_EQ(proto_file_information.creation_date(),
             file_information.creation_date);
   EXPECT_EQ(proto_file_information.last_modified_date(),
@@ -183,21 +183,21 @@
   EXPECT_EQ(proto_file_information.sha256(), file_information.sha256);
   EXPECT_EQ(proto_file_information.size(), file_information.size);
   EXPECT_EQ(proto_file_information.company_name(),
-            base::UTF16ToUTF8(file_information.company_name));
+            base::WideToUTF8(file_information.company_name));
   EXPECT_EQ(proto_file_information.company_short_name(),
-            base::UTF16ToUTF8(file_information.company_short_name));
+            base::WideToUTF8(file_information.company_short_name));
   EXPECT_EQ(proto_file_information.product_name(),
-            base::UTF16ToUTF8(file_information.product_name));
+            base::WideToUTF8(file_information.product_name));
   EXPECT_EQ(proto_file_information.product_short_name(),
-            base::UTF16ToUTF8(file_information.product_short_name));
+            base::WideToUTF8(file_information.product_short_name));
   EXPECT_EQ(proto_file_information.internal_name(),
-            base::UTF16ToUTF8(file_information.internal_name));
+            base::WideToUTF8(file_information.internal_name));
   EXPECT_EQ(proto_file_information.original_filename(),
-            base::UTF16ToUTF8(file_information.original_filename));
+            base::WideToUTF8(file_information.original_filename));
   EXPECT_EQ(proto_file_information.file_description(),
-            base::UTF16ToUTF8(file_information.file_description));
+            base::WideToUTF8(file_information.file_description));
   EXPECT_EQ(proto_file_information.file_version(),
-            base::UTF16ToUTF8(file_information.file_version));
+            base::WideToUTF8(file_information.file_version));
   EXPECT_EQ(proto_file_information.active_file(), file_information.active_file);
 }
 
@@ -205,11 +205,10 @@
     const internal::RegistryValue& registry_value,
     const RegistryValue& proto_registry_value) {
   EXPECT_EQ(proto_registry_value.key_path(),
-            base::UTF16ToUTF8(registry_value.key_path));
+            base::WideToUTF8(registry_value.key_path));
   EXPECT_EQ(proto_registry_value.value_name(),
-            base::UTF16ToUTF8(registry_value.value_name));
-  EXPECT_EQ(proto_registry_value.data(),
-            base::UTF16ToUTF8(registry_value.data));
+            base::WideToUTF8(registry_value.value_name));
+  EXPECT_EQ(proto_registry_value.data(), base::WideToUTF8(registry_value.data));
 }
 
 void NoSleep(base::TimeDelta) {}
@@ -779,28 +778,28 @@
   MatchedFile matched_file;
   FileInformation* proto_file_information =
       matched_file.mutable_file_information();
-  proto_file_information->set_path(base::UTF16ToUTF8(kFileInformation1.path));
+  proto_file_information->set_path(base::WideToUTF8(kFileInformation1.path));
   proto_file_information->set_creation_date(kFileInformation1.creation_date);
   proto_file_information->set_last_modified_date(
       kFileInformation1.last_modified_date);
   proto_file_information->set_sha256(kFileInformation1.sha256);
   proto_file_information->set_size(kFileInformation1.size);
   proto_file_information->set_company_name(
-      base::UTF16ToUTF8(kFileInformation1.company_name));
+      base::WideToUTF8(kFileInformation1.company_name));
   proto_file_information->set_company_short_name(
-      base::UTF16ToUTF8(kFileInformation1.company_short_name));
+      base::WideToUTF8(kFileInformation1.company_short_name));
   proto_file_information->set_product_name(
-      base::UTF16ToUTF8(kFileInformation1.product_name));
+      base::WideToUTF8(kFileInformation1.product_name));
   proto_file_information->set_product_short_name(
-      base::UTF16ToUTF8(kFileInformation1.product_short_name));
+      base::WideToUTF8(kFileInformation1.product_short_name));
   proto_file_information->set_internal_name(
-      base::UTF16ToUTF8(kFileInformation1.internal_name));
+      base::WideToUTF8(kFileInformation1.internal_name));
   proto_file_information->set_original_filename(
-      base::UTF16ToUTF8(kFileInformation1.original_filename));
+      base::WideToUTF8(kFileInformation1.original_filename));
   proto_file_information->set_file_description(
-      base::UTF16ToUTF8(kFileInformation1.file_description));
+      base::WideToUTF8(kFileInformation1.file_description));
   proto_file_information->set_file_version(
-      base::UTF16ToUTF8(kFileInformation1.file_version));
+      base::WideToUTF8(kFileInformation1.file_version));
   proto_file_information->set_active_file(kFileInformation1.active_file);
   MessageBuilder builder;
   AppendMatchedFile(matched_file, &builder);
@@ -832,11 +831,11 @@
 TEST_P(CleanerLoggingServiceTest, AppendMatchedRegistryEntry) {
   MatchedRegistryEntry matched_registry_entry;
   matched_registry_entry.set_key_path(
-      base::UTF16ToUTF8(kMatchedRegistryEntryKey));
+      base::WideToUTF8(kMatchedRegistryEntryKey));
   matched_registry_entry.set_value_name(
-      base::UTF16ToUTF8(kMatchedRegistryEntryValueName));
+      base::WideToUTF8(kMatchedRegistryEntryValueName));
   matched_registry_entry.set_value_substring(
-      base::UTF16ToUTF8(kMatchedRegistryEntryValueSubstring));
+      base::WideToUTF8(kMatchedRegistryEntryValueSubstring));
   MessageBuilder builder;
   AppendMatchedRegistryEntry(matched_registry_entry, &builder);
   EXPECT_EQ(kMatchedRegistryEntryToStringExpectedString, builder.content());
@@ -925,7 +924,7 @@
       report.system_report().installed_programs(0).folder_information();
 
   const base::string16 sanitized_path = SanitizePath(installed_program_path);
-  EXPECT_EQ(base::UTF16ToUTF8(sanitized_path), folder_information.path());
+  EXPECT_EQ(base::WideToUTF8(sanitized_path), folder_information.path());
   EXPECT_FALSE(folder_information.creation_date().empty());
   EXPECT_FALSE(folder_information.last_modified_date().empty());
 }
@@ -1009,8 +1008,8 @@
 
   ASSERT_EQ(2, layered_service_provider.guids_size());
 
-  EXPECT_EQ(base::UTF16ToUTF8(guids.at(0)), layered_service_provider.guids(0));
-  EXPECT_EQ(base::UTF16ToUTF8(guids.at(1)), layered_service_provider.guids(1));
+  EXPECT_EQ(base::WideToUTF8(guids.at(0)), layered_service_provider.guids(0));
+  EXPECT_EQ(base::WideToUTF8(guids.at(1)), layered_service_provider.guids(1));
 
   ExpectFileInformationEqualToProtoObj(
       kFileInformation1, layered_service_provider.file_information());
@@ -1098,7 +1097,7 @@
             installed_extension.install_method());
   ASSERT_EQ(installed_extension.extension_files().size(), 1);
   EXPECT_EQ(installed_extension.extension_files(0).path(),
-            base::UTF16ToUTF8(kFilePath1));
+            base::WideToUTF8(kFilePath1));
 
   installed_extension = report.system_report().installed_extensions(1);
   EXPECT_EQ(base::WideToUTF8(kExtensionId2),
@@ -1111,8 +1110,8 @@
       installed_extension.extension_files(0).path(),
       installed_extension.extension_files(1).path()};
   EXPECT_THAT(reported_files, testing::UnorderedElementsAreArray(
-                                  {base::UTF16ToUTF8(kFilePath1),
-                                   base::UTF16ToUTF8(kFilePath2)}));
+                                  {base::WideToUTF8(kFilePath1),
+                                   base::WideToUTF8(kFilePath2)}));
 }
 
 TEST_P(CleanerLoggingServiceTest, AddScheduledTask) {
@@ -1181,7 +1180,7 @@
 void AddFileToUwS(const base::FilePath& path, UwS* uws) {
   MatchedFile* file = uws->add_files();
   file->mutable_file_information()->set_path(
-      base::UTF16ToUTF8(SanitizePath(path)));
+      base::WideToUTF8(SanitizePath(path)));
   file->mutable_file_information()->set_active_file(
       PathHasActiveExtension(path));
   file->set_removal_status(REMOVAL_STATUS_MATCHED_ONLY);
@@ -1193,7 +1192,7 @@
 void AddFolderToUwS(const base::FilePath& path, UwS* uws) {
   MatchedFolder* folder = uws->add_folders();
   folder->mutable_folder_information()->set_path(
-      base::UTF16ToUTF8(SanitizePath(path)));
+      base::WideToUTF8(SanitizePath(path)));
   folder->set_removal_status(REMOVAL_STATUS_MATCHED_ONLY);
 }
 
@@ -1228,7 +1227,7 @@
                                 const base::FilePath& path,
                                 RemovalStatus expected_status) {
   bool found = false;
-  std::string normalized_path = base::UTF16ToUTF8(SanitizePath(path));
+  std::string normalized_path = base::WideToUTF8(SanitizePath(path));
   for (const auto& file : report.unknown_uws().files()) {
     if (file.file_information().path() == normalized_path) {
       EXPECT_EQ(file.removal_status(), expected_status);
@@ -1529,10 +1528,10 @@
   shortcut1 = report.system_report().shortcut_data(0);
   shortcut2 = report.system_report().shortcut_data(1);
 
-  EXPECT_EQ(shortcut1.lnk_path(), base::UTF16ToUTF8(kLnkPath));
-  EXPECT_EQ(shortcut2.lnk_path(), base::UTF16ToUTF8(kLnkPath));
-  EXPECT_EQ(shortcut1.executable_path(), base::UTF16ToUTF8(kExecutablePath1));
-  EXPECT_EQ(shortcut2.executable_path(), base::UTF16ToUTF8(kExecutablePath2));
+  EXPECT_EQ(shortcut1.lnk_path(), base::WideToUTF8(kLnkPath));
+  EXPECT_EQ(shortcut2.lnk_path(), base::WideToUTF8(kLnkPath));
+  EXPECT_EQ(shortcut1.executable_path(), base::WideToUTF8(kExecutablePath1));
+  EXPECT_EQ(shortcut2.executable_path(), base::WideToUTF8(kExecutablePath2));
   EXPECT_EQ(shortcut1.executable_hash(), kHash);
   EXPECT_EQ(shortcut2.executable_hash(), kHash);
   EXPECT_EQ(shortcut1.command_line_arguments().size(), 0);
diff --git a/chrome/chrome_cleaner/logging/message_builder.cc b/chrome/chrome_cleaner/logging/message_builder.cc
index 398641e4..49439e06 100644
--- a/chrome/chrome_cleaner/logging/message_builder.cc
+++ b/chrome/chrome_cleaner/logging/message_builder.cc
@@ -11,14 +11,14 @@
 
 namespace chrome_cleaner {
 
-MessageBuilder::MessageItem::MessageItem(base::StringPiece16 value)
+MessageBuilder::MessageItem::MessageItem(base::WStringPiece value)
     : value_(value.as_string()) {}
 
 MessageBuilder::MessageItem::MessageItem(base::StringPiece value)
-    : value_(base::UTF8ToUTF16(value.as_string())) {}
+    : value_(base::UTF8ToWide(value.as_string())) {}
 
 MessageBuilder::MessageItem::MessageItem(int value)
-    : value_(base::NumberToString16(value)) {}
+    : value_(base::NumberToWString(value)) {}
 
 MessageBuilder::ScopedIndent::ScopedIndent(MessageBuilder* builder)
     : builder_(builder) {
@@ -70,7 +70,7 @@
     content_ += L"\t";
 }
 
-MessageBuilder& MessageBuilder::AddHeaderLine(base::StringPiece16 title) {
+MessageBuilder& MessageBuilder::AddHeaderLine(base::WStringPiece title) {
   Add(title, L":").NewLine();
   return *this;
 }
diff --git a/chrome/chrome_cleaner/logging/message_builder.h b/chrome/chrome_cleaner/logging/message_builder.h
index baaecfd5..ed39b27 100644
--- a/chrome/chrome_cleaner/logging/message_builder.h
+++ b/chrome/chrome_cleaner/logging/message_builder.h
@@ -98,14 +98,14 @@
   // Adds a new line with |title| indented with |indentation_level| tabs.
   // Equivalent to:
   //   Add(title, ":").NewLine()
-  MessageBuilder& AddHeaderLine(base::StringPiece16 title);
+  MessageBuilder& AddHeaderLine(base::WStringPiece title);
 
   // AddFieldValueLine adds a new line for a pair (|field_name|, |value|)
   // indented with |indentation_level| tabs.
   // Equivalent to:
   //   Add(field_name, ": ", value).NewLine()
   template <typename Value>
-  MessageBuilder& AddFieldValueLine(base::StringPiece16 field_name,
+  MessageBuilder& AddFieldValueLine(base::WStringPiece field_name,
                                     const Value& value) {
     Add(field_name, L": ", value).NewLine();
     return *this;
@@ -127,7 +127,7 @@
   // list in AddInternal().
   class MessageItem {
    public:
-    explicit MessageItem(base::StringPiece16 value);
+    explicit MessageItem(base::WStringPiece value);
     explicit MessageItem(base::StringPiece value);
     explicit MessageItem(int value);
 
diff --git a/chrome/chrome_cleaner/logging/registry_logger.cc b/chrome/chrome_cleaner/logging/registry_logger.cc
index bb377b6..e1dc3ee1 100644
--- a/chrome/chrome_cleaner/logging/registry_logger.cc
+++ b/chrome/chrome_cleaner/logging/registry_logger.cc
@@ -98,7 +98,7 @@
     return;
   }
 
-  suffix_ = base::UTF8ToUTF16(suffix);
+  suffix_ = base::UTF8ToWide(suffix);
   CreateRegKey(&logging_key_, GetLoggingKeyPath(mode));
   CreateRegKey(&scan_times_key_, GetScanTimesKeyPath(mode));
 }
@@ -207,7 +207,7 @@
   if (ReadPendingLogFiles(&log_files, nullptr)) {
     log_files.push_back(log_file.value());
     registry_value =
-        base::JoinString(log_files, base::StringPiece16(&kMultiSzSeparator, 1));
+        base::JoinString(log_files, base::WStringPiece(&kMultiSzSeparator, 1));
   } else {
     registry_value = log_file.value();
   }
@@ -283,7 +283,7 @@
   }
 
   base::string16 registry_value(
-      base::JoinString(log_files, base::StringPiece16(&kMultiSzSeparator, 1)));
+      base::JoinString(log_files, base::WStringPiece(&kMultiSzSeparator, 1)));
   // REG_MULTI_SZ requires an extra \0 at the end of the string.
   registry_value.append(1, L'\0');
   LONG result = logging_key_.WriteValue(
@@ -306,7 +306,7 @@
 bool RegistryLogger::RecordFoundPUPs(const std::vector<UwSId>& pups_to_store) {
   base::string16 multi_sz_value;
   for (UwSId pup_to_store : pups_to_store) {
-    multi_sz_value += base::NumberToString16(pup_to_store);
+    multi_sz_value += base::NumberToWString(pup_to_store);
     multi_sz_value += kMultiSzSeparator;
   }
   multi_sz_value += kMultiSzSeparator;
diff --git a/chrome/chrome_cleaner/logging/registry_logger_unittest.cc b/chrome/chrome_cleaner/logging/registry_logger_unittest.cc
index 96d841e..1662147 100644
--- a/chrome/chrome_cleaner/logging/registry_logger_unittest.cc
+++ b/chrome/chrome_cleaner/logging/registry_logger_unittest.cc
@@ -348,7 +348,7 @@
 
   base::string16 key_name = no_suffix_logger.GetLoggingKeyPath(mode);
   EXPECT_EQ(base::string16::npos,
-            key_name.find(base::UTF8ToUTF16(kTestSuffix).c_str()));
+            key_name.find(base::UTF8ToWide(kTestSuffix).c_str()));
 
   // This checks directly for the company name Google, instead of using
   // COMPANY_SHORTNAME_STRING, because it's used for communication with Chrome
@@ -356,7 +356,7 @@
   key_name = logger.GetLoggingKeyPath(mode);
   const base::string16 expected_name =
       base::StrCat({L"Software\\Google\\Software Removal Tool\\",
-                    base::UTF8ToUTF16(kTestSuffix)});
+                    base::UTF8ToWide(kTestSuffix)});
   EXPECT_EQ(expected_name, key_name);
 
   base::win::RegKey no_suffix_key;
diff --git a/chrome/chrome_cleaner/logging/utils.cc b/chrome/chrome_cleaner/logging/utils.cc
index 94d9a52..077893c 100644
--- a/chrome/chrome_cleaner/logging/utils.cc
+++ b/chrome/chrome_cleaner/logging/utils.cc
@@ -44,7 +44,7 @@
   internal::FileInformation file_information;
   RetrievePathInformation(expanded_path, &file_information);
 
-  folder_information->set_path(base::UTF16ToUTF8(file_information.path));
+  folder_information->set_path(base::WideToUTF8(file_information.path));
   folder_information->set_creation_date(file_information.creation_date);
   folder_information->set_last_modified_date(
       file_information.last_modified_date);
@@ -149,7 +149,7 @@
        found_uws->expanded_scheduled_tasks) {
     ScheduledTask* reported_task =
         detected_uws.add_scheduled_tasks()->mutable_scheduled_task();
-    reported_task->set_name(base::UTF16ToUTF8(expanded_scheduled_task));
+    reported_task->set_name(base::WideToUTF8(expanded_scheduled_task));
   }
 
   // Collect trace locations.
@@ -170,7 +170,7 @@
   DCHECK(proto_file_information);
   if (file_information.path.empty())
     return;
-  proto_file_information->set_path(base::UTF16ToUTF8(file_information.path));
+  proto_file_information->set_path(base::WideToUTF8(file_information.path));
   if (!file_information.creation_date.empty())
     proto_file_information->set_creation_date(file_information.creation_date);
   if (!file_information.last_modified_date.empty()) {
@@ -182,35 +182,35 @@
   proto_file_information->set_size(file_information.size);
   if (!file_information.company_name.empty()) {
     proto_file_information->set_company_name(
-        base::UTF16ToUTF8(file_information.company_name));
+        base::WideToUTF8(file_information.company_name));
   }
   if (!file_information.company_short_name.empty()) {
     proto_file_information->set_company_short_name(
-        base::UTF16ToUTF8(file_information.company_short_name));
+        base::WideToUTF8(file_information.company_short_name));
   }
   if (!file_information.product_name.empty()) {
     proto_file_information->set_product_name(
-        base::UTF16ToUTF8(file_information.product_name));
+        base::WideToUTF8(file_information.product_name));
   }
   if (!file_information.product_short_name.empty()) {
     proto_file_information->set_product_short_name(
-        base::UTF16ToUTF8(file_information.product_short_name));
+        base::WideToUTF8(file_information.product_short_name));
   }
   if (!file_information.internal_name.empty()) {
     proto_file_information->set_internal_name(
-        base::UTF16ToUTF8(file_information.internal_name));
+        base::WideToUTF8(file_information.internal_name));
   }
   if (!file_information.original_filename.empty()) {
     proto_file_information->set_original_filename(
-        base::UTF16ToUTF8(file_information.original_filename));
+        base::WideToUTF8(file_information.original_filename));
   }
   if (!file_information.file_description.empty()) {
     proto_file_information->set_file_description(
-        base::UTF16ToUTF8(file_information.file_description));
+        base::WideToUTF8(file_information.file_description));
   }
   if (!file_information.file_version.empty()) {
     proto_file_information->set_file_version(
-        base::UTF16ToUTF8(file_information.file_version));
+        base::WideToUTF8(file_information.file_version));
   }
   proto_file_information->set_active_file(file_information.active_file);
 }
diff --git a/chrome/chrome_cleaner/logging/utils_unittest.cc b/chrome/chrome_cleaner/logging/utils_unittest.cc
index 40d9508..301cb53 100644
--- a/chrome/chrome_cleaner/logging/utils_unittest.cc
+++ b/chrome/chrome_cleaner/logging/utils_unittest.cc
@@ -40,7 +40,7 @@
   EXPECT_TRUE(RetrieveFolderInformation(temp_folder, &folder_information));
 
   // The expected file path value should be sanitized.
-  EXPECT_EQ(base::UTF16ToUTF8(SanitizePath(temp_folder)),
+  EXPECT_EQ(base::WideToUTF8(SanitizePath(temp_folder)),
             folder_information.path());
   EXPECT_FALSE(folder_information.creation_date().empty());
   EXPECT_FALSE(folder_information.last_modified_date().empty());
@@ -163,7 +163,7 @@
     ASSERT_TRUE(uws.files(i).has_file_information());
     const FileInformation& file_info = uws.files(i).file_information();
     ASSERT_TRUE(file_info.has_path());
-    base::FilePath file_path(base::UTF8ToUTF16(file_info.path()));
+    base::FilePath file_path(base::UTF8ToWide(file_info.path()));
     base::string16 uws_filename =
         base::ToLowerASCII(file_path.BaseName().value());
     converted_files.push_back(uws_filename);
diff --git a/chrome/chrome_cleaner/os/digest_verifier.cc b/chrome/chrome_cleaner/os/digest_verifier.cc
index d8620b4..fecf7ad5 100644
--- a/chrome/chrome_cleaner/os/digest_verifier.cc
+++ b/chrome/chrome_cleaner/os/digest_verifier.cc
@@ -82,7 +82,7 @@
   }
 
   for (const chrome_cleaner::FileDigest& digest : digests_pb.file_digests()) {
-    const base::string16 filename = base::UTF8ToUTF16(digest.filename());
+    const base::string16 filename = base::UTF8ToWide(digest.filename());
     digests_[base::ToLowerASCII(filename)] =
         base::ToLowerASCII(digest.digest());
   }
diff --git a/chrome/chrome_cleaner/os/disk_util.cc b/chrome/chrome_cleaner/os/disk_util.cc
index e29c8bb..37e615ac 100644
--- a/chrome/chrome_cleaner/os/disk_util.cc
+++ b/chrome/chrome_cleaner/os/disk_util.cc
@@ -63,12 +63,12 @@
 // "C:\Program Files\Common Files\".
 const wchar_t kCommonProgramW6432[] = L"%CommonProgramW6432%";
 
-constexpr const base::char16* kCompanyIgnoredReportingList[] = {
-    STRING16_LITERAL("Google LLC"),
-    STRING16_LITERAL("Google Inc"),
-    STRING16_LITERAL("Google Inc."),
-    STRING16_LITERAL("Intel Corporation"),
-    STRING16_LITERAL("Microsoft Corporation"),
+constexpr const wchar_t* kCompanyIgnoredReportingList[] = {
+    L"Google LLC",
+    L"Google Inc",
+    L"Google Inc.",
+    L"Intel Corporation",
+    L"Microsoft Corporation",
 };
 
 // Built from various sources to try and include all the extensions that are
@@ -407,15 +407,15 @@
   base::string16 content = L"path = '" + file_information.path + L"'";
 
   AppendFileInformationField(L"file_creation_date",
-                             base::UTF8ToUTF16(file_information.creation_date),
+                             base::UTF8ToWide(file_information.creation_date),
                              &content);
   AppendFileInformationField(
       L"file_last_modified_date",
-      base::UTF8ToUTF16(file_information.last_modified_date), &content);
+      base::UTF8ToWide(file_information.last_modified_date), &content);
   AppendFileInformationField(
-      L"digest", base::UTF8ToUTF16(file_information.sha256), &content);
+      L"digest", base::UTF8ToWide(file_information.sha256), &content);
   AppendFileInformationField(
-      L"size", base::NumberToString16(file_information.size), &content);
+      L"size", base::NumberToWString(file_information.size), &content);
   AppendFileInformationField(L"company_name", file_information.company_name,
                              &content);
   AppendFileInformationField(L"company_short_name",
@@ -433,7 +433,7 @@
   AppendFileInformationField(L"file_version", file_information.file_version,
                              &content);
   AppendFileInformationField(
-      L"active_file", base::NumberToString16(file_information.active_file),
+      L"active_file", base::NumberToWString(file_information.active_file),
       &content);
 
   return content;
diff --git a/chrome/chrome_cleaner/os/disk_util_unittest.cc b/chrome/chrome_cleaner/os/disk_util_unittest.cc
index 168e0b1..f930261 100644
--- a/chrome/chrome_cleaner/os/disk_util_unittest.cc
+++ b/chrome/chrome_cleaner/os/disk_util_unittest.cc
@@ -833,8 +833,7 @@
   base::FilePath source_exe_path(
       executable_path.Append(kTestProcessExecutableName));
   base::string16 target_exe_name = base::StrCat(
-      {base::UTF8ToUTF16(base::UnguessableToken::Create().ToString()),
-       L".exe"});
+      {base::UTF8ToWide(base::UnguessableToken::Create().ToString()), L".exe"});
   base::FilePath target_exe_path(executable_path.Append(target_exe_name));
 
   ASSERT_TRUE(base::CopyFile(source_exe_path, target_exe_path));
diff --git a/chrome/chrome_cleaner/os/file_remover_unittest.cc b/chrome/chrome_cleaner/os/file_remover_unittest.cc
index 1efa656..ddda5fc0 100644
--- a/chrome/chrome_cleaner/os/file_remover_unittest.cc
+++ b/chrome/chrome_cleaner/os/file_remover_unittest.cc
@@ -576,8 +576,8 @@
       CreateFileWithContent(path, kTestContent, strlen(kTestContent)));
 
   const base::FilePath sym_path = temp_dir_.GetPath().Append(kTestFileName);
-  ASSERT_NE(0, ::CreateSymbolicLink(sym_path.AsUTF16Unsafe().c_str(),
-                                    path.AsUTF16Unsafe().c_str(), 0));
+  ASSERT_NE(0, ::CreateSymbolicLink(sym_path.value().c_str(),
+                                    path.value().c_str(), 0));
 
   DoAndExpectCorrespondingRemoval(sym_path);
   EXPECT_EQ(
@@ -596,7 +596,7 @@
   ASSERT_NO_FATAL_FAILURE(
       CreateFileWithContent(path, kTestContent, strlen(kTestContent)));
 
-  base::FilePath stream_path(base::StrCat({path.AsUTF16Unsafe(), L"::$data"}));
+  base::FilePath stream_path(base::StrCat({path.value(), L"::$data"}));
   ASSERT_NO_FATAL_FAILURE(
       CreateFileWithContent(stream_path, kTestContent, strlen(kTestContent)));
 
@@ -615,8 +615,7 @@
   ASSERT_NO_FATAL_FAILURE(
       CreateFileWithContent(path, kTestContent, strlen(kTestContent)));
 
-  base::FilePath stream_path(
-      base::StrCat({path.AsUTF16Unsafe(), L":stream:$data"}));
+  base::FilePath stream_path(base::StrCat({path.value(), L":stream:$data"}));
   ASSERT_NO_FATAL_FAILURE(
       CreateFileWithContent(stream_path, kTestContent, strlen(kTestContent)));
 
diff --git a/chrome/chrome_cleaner/os/post_reboot_registration.cc b/chrome/chrome_cleaner/os/post_reboot_registration.cc
index 10cec13..5499cbb 100644
--- a/chrome/chrome_cleaner/os/post_reboot_registration.cc
+++ b/chrome/chrome_cleaner/os/post_reboot_registration.cc
@@ -56,7 +56,7 @@
                                  GetPostRebootSwitchKeyPath().c_str(),
                                  KEY_SET_VALUE | KEY_WOW64_32KEY);
   base::string16 switches_value(switches.GetCommandLineString());
-  if (switches_key.WriteValue(base::UTF8ToUTF16(cleanup_id).c_str(),
+  if (switches_key.WriteValue(base::UTF8ToWide(cleanup_id).c_str(),
                               switches_value.c_str()) != ERROR_SUCCESS) {
     PLOG(ERROR) << "Failed to Write RunOnce value with: "
                 << SanitizeCommandLine(switches)
@@ -113,7 +113,7 @@
                                  KEY_QUERY_VALUE | KEY_WOW64_32KEY);
 
   base::string16 string_value;
-  if (switches_key.ReadValue(base::UTF8ToUTF16(cleanup_id).c_str(),
+  if (switches_key.ReadValue(base::UTF8ToWide(cleanup_id).c_str(),
                              &string_value) != ERROR_SUCCESS) {
     PLOG(ERROR) << "Failed to Read RunOnce reboot switches.";
     return false;
diff --git a/chrome/chrome_cleaner/os/post_reboot_registration_unittest.cc b/chrome/chrome_cleaner/os/post_reboot_registration_unittest.cc
index c9509c73..386590a9 100644
--- a/chrome/chrome_cleaner/os/post_reboot_registration_unittest.cc
+++ b/chrome/chrome_cleaner/os/post_reboot_registration_unittest.cc
@@ -45,29 +45,29 @@
   command_line.SetProgram(exe_path);
 
   std::string switch_str(kPostRebootSwitchesInOtherRegistryKeySwitch);
-  EXPECT_TRUE(RunOnceCommandLineContains(
-      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToUTF16(switch_str).c_str()));
-  EXPECT_TRUE(RunOnceCommandLineContains(
-      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToUTF16(cleanup_id).c_str()));
+  EXPECT_TRUE(RunOnceCommandLineContains(TEST_PRODUCT_SHORTNAME_STRING,
+                                         base::UTF8ToWide(switch_str).c_str()));
+  EXPECT_TRUE(RunOnceCommandLineContains(TEST_PRODUCT_SHORTNAME_STRING,
+                                         base::UTF8ToWide(cleanup_id).c_str()));
   EXPECT_FALSE(RunOnceCommandLineContains(TEST_PRODUCT_SHORTNAME_STRING,
-                                          base::UTF8ToUTF16(kSwitch1).c_str()));
+                                          base::UTF8ToWide(kSwitch1).c_str()));
   EXPECT_FALSE(RunOnceCommandLineContains(TEST_PRODUCT_SHORTNAME_STRING,
-                                          base::UTF8ToUTF16(kSwitch2).c_str()));
+                                          base::UTF8ToWide(kSwitch2).c_str()));
   EXPECT_TRUE(RunOnceOverrideCommandLineContains(
-      cleanup_id, base::UTF8ToUTF16(kSwitch1).c_str()));
+      cleanup_id, base::UTF8ToWide(kSwitch1).c_str()));
   EXPECT_TRUE(RunOnceOverrideCommandLineContains(
-      cleanup_id, base::UTF8ToUTF16(kSwitch2).c_str()));
+      cleanup_id, base::UTF8ToWide(kSwitch2).c_str()));
 
   // And then test that the function to delete the RunOnce entry also works.
   post_reboot.UnregisterRunOnceOnRestart();
   EXPECT_FALSE(RunOnceCommandLineContains(
-      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToUTF16(cleanup_id).c_str()));
+      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToWide(cleanup_id).c_str()));
 
   // Attempt to unregister RunOnce again to make sure that nothing weird happens
   // if the key doesn't exist.
   post_reboot.UnregisterRunOnceOnRestart();
   EXPECT_FALSE(RunOnceCommandLineContains(
-      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToUTF16(cleanup_id).c_str()));
+      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToWide(cleanup_id).c_str()));
 }
 
 TEST(PostRebootRegistrationTests, ReadRunOncePostRebootCommandLine) {
@@ -99,7 +99,7 @@
   EXPECT_FALSE(
       post_reboot.ReadRunOncePostRebootCommandLine(cleanup_id, &tmp_cmd));
   EXPECT_FALSE(RunOnceOverrideCommandLineContains(
-      cleanup_id, base::UTF8ToUTF16(kSwitch1).c_str()));
+      cleanup_id, base::UTF8ToWide(kSwitch1).c_str()));
 
   // Check that command lines that are too long will not be registered.
   constexpr int max_command_line_length = 260;
diff --git a/chrome/chrome_cleaner/os/rebooter_unittest.cc b/chrome/chrome_cleaner/os/rebooter_unittest.cc
index 3048bff..e46f9787 100644
--- a/chrome/chrome_cleaner/os/rebooter_unittest.cc
+++ b/chrome/chrome_cleaner/os/rebooter_unittest.cc
@@ -69,8 +69,8 @@
                                              /*logs_uploads_allowed=*/false));
 
   std::string switch_str(kPostRebootSwitchesInOtherRegistryKeySwitch);
-  EXPECT_TRUE(RunOnceCommandLineContains(
-      TEST_PRODUCT_SHORTNAME_STRING, base::UTF8ToUTF16(switch_str).c_str()));
+  EXPECT_TRUE(RunOnceCommandLineContains(TEST_PRODUCT_SHORTNAME_STRING,
+                                         base::UTF8ToWide(switch_str).c_str()));
 
   EXPECT_TRUE(
       RunOnceOverrideCommandLineContains(kTestCleanupId, kExpectedTestSwitch));
diff --git a/chrome/chrome_cleaner/os/registry_util.cc b/chrome/chrome_cleaner/os/registry_util.cc
index 28436fc..e9670be4 100644
--- a/chrome/chrome_cleaner/os/registry_util.cc
+++ b/chrome/chrome_cleaner/os/registry_util.cc
@@ -163,7 +163,7 @@
       return L"REG_SZ";
     default:
       LOG(WARNING) << "Unknown registry value type (" << value_type << ").";
-      return base::NumberToString16(value_type);
+      return base::NumberToWString(value_type);
   }
 }
 
@@ -181,7 +181,7 @@
 
   // Enumerates value names under the registry key |key|.
   DWORD index = 0;
-  std::vector<base::char16> value_name(kValueNameBufferSize);
+  std::vector<wchar_t> value_name(kValueNameBufferSize);
   while (true) {
     for (unsigned int iteration = 0; iteration < kMaxRegistryReadIterations;
          ++iteration) {
@@ -396,7 +396,7 @@
     // The content displayed by this fallback is a sequence of bytes in
     // little-endian, which give strange display for numeric values (i.e
     // 01000000 instead of 00000001)
-    *content = base::ASCIIToUTF16(base::HexEncode(
+    *content = base::ASCIIToWide(base::HexEncode(
         reinterpret_cast<const char*>(raw_content), raw_content_bytes));
   }
 }
diff --git a/chrome/chrome_cleaner/os/registry_util_unittest.cc b/chrome/chrome_cleaner/os/registry_util_unittest.cc
index 0070543..8a67ca9 100644
--- a/chrome/chrome_cleaner/os/registry_util_unittest.cc
+++ b/chrome/chrome_cleaner/os/registry_util_unittest.cc
@@ -640,7 +640,7 @@
   base::string16 output_value;
 
   GetRegistryValueAsString(input_value.c_str(),
-                           input_value.size() * sizeof(base::char16), REG_SZ,
+                           input_value.size() * sizeof(wchar_t), REG_SZ,
                            &output_value);
 
   EXPECT_EQ(kUnicodeValue, output_value);
@@ -651,7 +651,7 @@
   base::string16 output_value;
 
   GetRegistryValueAsString(input_value.c_str(),
-                           input_value.size() * sizeof(base::char16), REG_DWORD,
+                           input_value.size() * sizeof(wchar_t), REG_DWORD,
                            &output_value);
 
   EXPECT_EQ(kDWORDStringValue, output_value);
diff --git a/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc b/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
index 770dc1a..a49242f3 100644
--- a/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
+++ b/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
@@ -144,7 +144,7 @@
   // Get the ownership and ACL of the quarantine folder and check the values.
   ASSERT_EQ(static_cast<DWORD>(ERROR_SUCCESS),
             ::GetNamedSecurityInfo(
-                quarantine_path.AsUTF16Unsafe().c_str(), SE_FILE_OBJECT,
+                quarantine_path.value().c_str(), SE_FILE_OBJECT,
                 OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
                 &owner_sid, /*psidGroup=*/nullptr, &dacl,
                 /*pSacl=*/nullptr, &security_descriptor));
diff --git a/chrome/chrome_cleaner/os/task_scheduler_unittest.cc b/chrome/chrome_cleaner/os/task_scheduler_unittest.cc
index b289cf01..a5d240e 100644
--- a/chrome/chrome_cleaner/os/task_scheduler_unittest.cc
+++ b/chrome/chrome_cleaner/os/task_scheduler_unittest.cc
@@ -103,7 +103,7 @@
   // and signaled in the test process to confirm it was scheduled and ran.
   const base::string16 event_name =
       base::StrCat({kTestProcessExecutableName, L"-",
-                    base::NumberToString16(::GetCurrentProcessId())});
+                    base::NumberToWString(::GetCurrentProcessId())});
   base::WaitableEvent event(base::win::ScopedHandle(
       ::CreateEvent(nullptr, FALSE, FALSE, event_name.c_str())));
   ASSERT_NE(event.handle(), nullptr);
diff --git a/chrome/chrome_cleaner/parsers/parser_utils/command_line_arguments_sanitizer.cc b/chrome/chrome_cleaner/parsers/parser_utils/command_line_arguments_sanitizer.cc
index 5ead457..0ead861 100644
--- a/chrome/chrome_cleaner/parsers/parser_utils/command_line_arguments_sanitizer.cc
+++ b/chrome/chrome_cleaner/parsers/parser_utils/command_line_arguments_sanitizer.cc
@@ -22,7 +22,7 @@
 base::string16 GetUnescapedHost(GURL url) {
   std::string url_host = url.host();
 
-  url::RawCanonOutputT<base::char16> unescaped_url_host;
+  url::RawCanonOutputT<wchar_t> unescaped_url_host;
   url::DecodeURLEscapeSequences(url_host.c_str(), url_host.length(),
                                 url::DecodeURLMode::kUTF8OrIsomorphic,
                                 &unescaped_url_host);
@@ -45,7 +45,7 @@
   if (!has_scheme && url.host().find(".") == std::string::npos)
     return possible_url;
 
-  return base::UTF8ToUTF16(url.scheme()) + L"://" + GetUnescapedHost(url);
+  return base::UTF8ToWide(url.scheme()) + L"://" + GetUnescapedHost(url);
 }
 }  // namespace
 
@@ -60,7 +60,7 @@
   std::vector<base::string16> sanitized_arguments;
   for (auto it = switches.begin(); it != switches.end(); it++) {
     sanitized_arguments.push_back(
-        L"--" + base::UTF8ToUTF16(it->first) +
+        L"--" + base::UTF8ToWide(it->first) +
         ((it->second.empty())
              ? L""
              : L"=" + SanitizePath(base::FilePath(SanitizeUrl(it->second)))));
diff --git a/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser.cc b/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser.cc
index f1a88a6..dfad246 100644
--- a/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser.cc
+++ b/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser.cc
@@ -92,7 +92,7 @@
   *current_byte += (string_size + 1) * sizeof(wchar_t);
   const wchar_t* string_ptr =
       reinterpret_cast<const wchar_t*>(buffer.data() + string_start);
-  base::WideToUTF16(string_ptr, string_size, parsed_string);
+  parsed_string->assign(string_ptr, string_size);
   return true;
 }
 
@@ -159,7 +159,7 @@
 
   const wchar_t* string_ptr =
       reinterpret_cast<const wchar_t*>(buffer.data() + *current_byte);
-  base::WideToUTF16(string_ptr, string_size, parsed_string);
+  parsed_string->assign(string_ptr, string_size);
   *current_byte += string_size * sizeof(wchar_t);
   return true;
 }
diff --git a/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser_unittest.cc b/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser_unittest.cc
index 4cfd7ef..0c6f411 100644
--- a/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser_unittest.cc
+++ b/chrome/chrome_cleaner/parsers/shortcut_parser/target/lnk_parser_unittest.cc
@@ -254,8 +254,7 @@
       if (buffer[i] == size_lower && buffer[i + 1] == size_upper) {
         const wchar_t* string_ptr =
             reinterpret_cast<const wchar_t*>(buffer.data() + i + 2);
-        base::string16 found_string;
-        base::WideToUTF16(string_ptr, length, &found_string);
+        base::string16 found_string(string_ptr, length);
         if (found_string == expected_string) {
           found = true;
           *found_location = i;
diff --git a/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.cc b/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.cc
index 93b57bf..accaaf6c 100644
--- a/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.cc
+++ b/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_impl.cc
@@ -84,7 +84,7 @@
         std::move(policy_registry_entries_force_list.back());
     policy_registry_entries_force_list.pop_back();
     base::Optional<ExtensionID> extension_id =
-        ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
+        ExtensionID::Create(base::WideToUTF8(entry.extension_id));
     if (!extension_id.has_value()) {
       continue;
     }
@@ -100,7 +100,7 @@
         std::move(policy_files_default_extensions.back());
     policy_files_default_extensions.pop_back();
     base::Optional<ExtensionID> extension_id =
-        ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
+        ExtensionID::Create(base::WideToUTF8(file.extension_id));
     if (!extension_id.has_value()) {
       continue;
     }
@@ -117,7 +117,7 @@
         std::move(policy_registry_entries_force_installed.back());
     policy_registry_entries_force_installed.pop_back();
     base::Optional<ExtensionID> extension_id =
-        ExtensionID::Create(base::UTF16ToUTF8(entry.extension_id));
+        ExtensionID::Create(base::WideToUTF8(entry.extension_id));
     if (!extension_id.has_value()) {
       continue;
     }
@@ -134,7 +134,7 @@
         std::move(policy_files_master_preferences.back());
     policy_files_master_preferences.pop_back();
     base::Optional<ExtensionID> extension_id =
-        ExtensionID::Create(base::UTF16ToUTF8(file.extension_id));
+        ExtensionID::Create(base::WideToUTF8(file.extension_id));
     if (!extension_id.has_value()) {
       continue;
     }
diff --git a/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_unittest.cc b/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_unittest.cc
index 9bb8a41..012bfb5 100644
--- a/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_unittest.cc
+++ b/chrome/chrome_cleaner/scanner/force_installed_extension_scanner_unittest.cc
@@ -29,19 +29,19 @@
 TEST(UwEMatcherTest, GetForceInstalledExtensions) {
   ForceInstalledExtensionScannerImpl extension_scanner;
   std::vector<ForceInstalledExtension> expected_extensions{
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId1)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId1)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId2)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId2)).value(),
        DEFAULT_APPS_EXTENSION},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId5)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId5)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId4)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId4)).value(),
        POLICY_EXTENSION_SETTINGS},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId3)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId3)).value(),
        POLICY_EXTENSION_FORCELIST},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId6)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId6)).value(),
        POLICY_MASTER_PREFERENCES},
-      {ExtensionID::Create(base::UTF16ToUTF8(kTestExtensionId7)).value(),
+      {ExtensionID::Create(base::WideToUTF8(kTestExtensionId7)).value(),
        POLICY_MASTER_PREFERENCES},
   };
   TestJsonParser json_parser;
diff --git a/chrome/chrome_cleaner/scanner/matcher_util.cc b/chrome/chrome_cleaner/scanner/matcher_util.cc
index fc4da29..d125c46a 100644
--- a/chrome/chrome_cleaner/scanner/matcher_util.cc
+++ b/chrome/chrome_cleaner/scanner/matcher_util.cc
@@ -79,7 +79,7 @@
 
 bool IsKnownFileByOriginalFilename(const base::FilePath& path,
                                    const SignatureMatcherAPI* signature_matcher,
-                                   const base::char16* const names[],
+                                   const wchar_t* const names[],
                                    size_t names_length) {
   DCHECK(signature_matcher);
   DCHECK(names);
@@ -101,7 +101,7 @@
 
 bool IsKnownFileByCompanyName(const base::FilePath& path,
                               const SignatureMatcherAPI* signature_matcher,
-                              const base::char16* const names[],
+                              const wchar_t* const names[],
                               size_t names_length) {
   DCHECK(signature_matcher);
   DCHECK(names);
diff --git a/chrome/chrome_cleaner/scanner/matcher_util.h b/chrome/chrome_cleaner/scanner/matcher_util.h
index a02a7fd..6a3b4474 100644
--- a/chrome/chrome_cleaner/scanner/matcher_util.h
+++ b/chrome/chrome_cleaner/scanner/matcher_util.h
@@ -40,12 +40,12 @@
 
 bool IsKnownFileByOriginalFilename(const base::FilePath& path,
                                    const SignatureMatcherAPI* signature_matcher,
-                                   const base::char16* const names[],
+                                   const wchar_t* const names[],
                                    size_t names_length);
 
 bool IsKnownFileByCompanyName(const base::FilePath& path,
                               const SignatureMatcherAPI* signature_matcher,
-                              const base::char16* const names[],
+                              const wchar_t* const names[],
                               size_t names_length);
 
 }  // namespace chrome_cleaner
diff --git a/chrome/chrome_cleaner/scanner/matcher_util_unittest.cc b/chrome/chrome_cleaner/scanner/matcher_util_unittest.cc
index 0802a5a..d363963c 100644
--- a/chrome/chrome_cleaner/scanner/matcher_util_unittest.cc
+++ b/chrome/chrome_cleaner/scanner/matcher_util_unittest.cc
@@ -31,10 +31,10 @@
 
 namespace {
 
-constexpr base::char16 kFileName1[] = L"File1";
-constexpr base::char16 kFileName2[] = L"File2";
-constexpr base::char16 kFileName3[] = L"File3";
-constexpr base::char16 kFileName4[] = L"File4";
+constexpr wchar_t kFileName1[] = L"File1";
+constexpr wchar_t kFileName2[] = L"File2";
+constexpr wchar_t kFileName3[] = L"File3";
+constexpr wchar_t kFileName4[] = L"File4";
 
 constexpr char kFileContent1[] = "This is the file content.";
 constexpr char kFileContent2[] = "Hi!";
@@ -49,16 +49,20 @@
     "BD283E41A3672B6BDAA574F8BD7176F8BCA95BD81383CDE32AA6D78B1DB0E371",
 };
 
-constexpr base::char16 kKnownOriginalFilename[] = L"uws.exe";
-constexpr base::char16 kUnknownOriginalFilename[] = L"knowngood.exe";
-const base::char16* const kKnownOriginalFilenames[] = {
-    L"dummy entry", L"uws.exe", L"zombie uws.exe",
+constexpr wchar_t kKnownOriginalFilename[] = L"uws.exe";
+constexpr wchar_t kUnknownOriginalFilename[] = L"knowngood.exe";
+const wchar_t* const kKnownOriginalFilenames[] = {
+    L"dummy entry",
+    L"uws.exe",
+    L"zombie uws.exe",
 };
 
-constexpr base::char16 kKnownCompanyName[] = L"uws vendor inc";
-constexpr base::char16 kUnknownCompanyName[] = L"paradise";
-const base::char16* const kKnownCompanyNames[] = {
-    L"dummy entry", L"uws vendor inc", L"ACME",
+constexpr wchar_t kKnownCompanyName[] = L"uws vendor inc";
+constexpr wchar_t kUnknownCompanyName[] = L"paradise";
+const wchar_t* const kKnownCompanyNames[] = {
+    L"dummy entry",
+    L"uws vendor inc",
+    L"ACME",
 };
 
 constexpr FileDigestInfo kFileContentDigestInfos[] = {
diff --git a/chrome/chrome_cleaner/test/generate_test_uws_test.cc b/chrome/chrome_cleaner/test/generate_test_uws_test.cc
index 24c8840c2..89d80b7 100644
--- a/chrome/chrome_cleaner/test/generate_test_uws_test.cc
+++ b/chrome/chrome_cleaner/test/generate_test_uws_test.cc
@@ -21,8 +21,7 @@
   // Ensure the expected output files don't exist.
   base::FilePath start_menu_path;
   ASSERT_TRUE(base::PathService::Get(base::DIR_START_MENU, &start_menu_path));
-  base::FilePath startup_dir =
-      start_menu_path.Append(STRING16_LITERAL("Startup"));
+  base::FilePath startup_dir = start_menu_path.Append(L"Startup");
 
   base::FilePath uws_file_a =
       startup_dir.Append(chrome_cleaner::kTestUwsAFilename);
@@ -39,8 +38,8 @@
       base::BindOnce(base::GetDeleteFileCallback(), uws_file_b));
 
   // Expect generate_test_uws to finish quickly with exit code 0 (success).
-  base::Process process(base::LaunchProcess(
-      STRING16_LITERAL("generate_test_uws.exe"), base::LaunchOptions()));
+  base::Process process(
+      base::LaunchProcess(L"generate_test_uws.exe", base::LaunchOptions()));
   ASSERT_TRUE(process.IsValid());
 
   int exit_code = -1;
diff --git a/chrome/chrome_cleaner/test/reboot_deletion_helper.cc b/chrome/chrome_cleaner/test/reboot_deletion_helper.cc
index 200d0b0..5285768 100644
--- a/chrome/chrome_cleaner/test/reboot_deletion_helper.cc
+++ b/chrome/chrome_cleaner/test/reboot_deletion_helper.cc
@@ -36,8 +36,8 @@
   DCHECK(value);
   DCHECK(value->empty());
 
-  const base::char16* data = buffer.c_str();
-  const base::char16* data_end = data + buffer.size();
+  const wchar_t* data = buffer.c_str();
+  const wchar_t* data_end = data + buffer.size();
 
   // Put null-terminated strings into the sequence.
   while (data < data_end) {
@@ -86,10 +86,9 @@
   ++total_wchars;  // Space for the extra terminating null char.
 
   buffer->resize(total_wchars);
-  base::char16* write_pointer =
-      reinterpret_cast<base::char16*>(&((*buffer)[0]));
+  wchar_t* write_pointer = reinterpret_cast<wchar_t*>(&((*buffer)[0]));
   // Keep an end pointer around for sanity checking.
-  base::char16* end_pointer = write_pointer + total_wchars;
+  wchar_t* end_pointer = write_pointer + total_wchars;
 
   std::vector<PendingMove>::const_iterator copy_iter(pending_moves.begin());
   for (; copy_iter != pending_moves.end() && write_pointer < end_pointer;
@@ -97,12 +96,12 @@
     // First copy the source string.
     size_t string_length = copy_iter->first.length() + 1;
     ::memcpy(write_pointer, copy_iter->first.c_str(),
-             string_length * sizeof(base::char16));
+             string_length * sizeof(wchar_t));
     write_pointer += string_length;
     // Now copy the destination string.
     string_length = copy_iter->second.length() + 1;
     ::memcpy(write_pointer, copy_iter->second.c_str(),
-             string_length * sizeof(base::char16));
+             string_length * sizeof(wchar_t));
     write_pointer += string_length;
 
     // We should never run off the end while in this loop.
@@ -247,7 +246,7 @@
   }
 
   // We now have a buffer of bytes that is actually a sequence of
-  // null-terminated char16 strings terminated by an additional null character.
+  // null-terminated wide strings terminated by an additional null character.
   // Stick this into a vector of strings for clarity.
   if (!MultiSZToStringArray(pending_moves_value, pending_moves)) {
     DLOG(ERROR) << "Cannot decode PendingRename registry value.";
@@ -293,7 +292,7 @@
   buffer = buffer + last_entry;
 
   // Write back the serialized values into the registry key.
-  uint32_t size_in_bytes = buffer.size() * sizeof(base::char16);
+  uint32_t size_in_bytes = buffer.size() * sizeof(wchar_t);
   if (session_manager_key.WriteValue(kPendingFileRenameOps, buffer.c_str(),
                                      size_in_bytes,
                                      REG_MULTI_SZ) != ERROR_SUCCESS) {
diff --git a/chrome/chrome_cleaner/test/scoped_process_protector.cc b/chrome/chrome_cleaner/test/scoped_process_protector.cc
index 9bd29b49..b2dda83 100644
--- a/chrome/chrome_cleaner/test/scoped_process_protector.cc
+++ b/chrome/chrome_cleaner/test/scoped_process_protector.cc
@@ -87,7 +87,7 @@
 
 void ScopedProcessProtector::DenyAccess(ACCESS_MASK access_to_deny) {
   // The name of the predefined EVERYONE group.
-  static constexpr base::char16 kEveryoneGroup[] = STRING16_LITERAL("EVERYONE");
+  static constexpr wchar_t kEveryoneGroup[] = L"EVERYONE";
 
   // The Trustee parameter requires a non-const string.
   base::string16 trustee_name(kEveryoneGroup);
diff --git a/chrome/chrome_cleaner/test/secure_dll_loading_test.cc b/chrome/chrome_cleaner/test/secure_dll_loading_test.cc
index c772f66..d8c0fd0 100644
--- a/chrome/chrome_cleaner/test/secure_dll_loading_test.cc
+++ b/chrome/chrome_cleaner/test/secure_dll_loading_test.cc
@@ -55,7 +55,7 @@
     base::CommandLine command_line(exe_path_);
     command_line.AppendSwitchNative(
         chrome_cleaner::kInitDoneNotifierSwitch,
-        base::NumberToString16(
+        base::NumberToWString(
             base::win::HandleToUint32(init_done_notifier->handle())));
     command_line.AppendSwitch(chrome_cleaner::kLoadEmptyDLLSwitch);
 
diff --git a/chrome/chrome_cleaner/test/test_executables.cc b/chrome/chrome_cleaner/test/test_executables.cc
index 1c56c1d7..ebb934a 100644
--- a/chrome/chrome_cleaner/test/test_executables.cc
+++ b/chrome/chrome_cleaner/test/test_executables.cc
@@ -21,8 +21,8 @@
 // If you add another test executable here, also add it to the data_deps in
 // the "test_executables" target of chrome_cleaner/test/BUILD.gn.
 
-const base::char16 kTestServiceExecutableName[] = L"test_service.exe";
-const base::char16 kTestProcessExecutableName[] = L"test_process.exe";
+const wchar_t kTestServiceExecutableName[] = L"test_service.exe";
+const wchar_t kTestProcessExecutableName[] = L"test_process.exe";
 
 base::Process LongRunningProcess(base::CommandLine* cmd) {
   base::FilePath exe_dir;
@@ -44,7 +44,7 @@
           base::WaitableEvent::InitialState::NOT_SIGNALED);
   command_line.AppendSwitchNative(
       chrome_cleaner::kInitDoneNotifierSwitch,
-      base::NumberToString16(
+      base::NumberToWString(
           base::win::HandleToUint32(init_done_event->handle())));
 
   if (cmd)
diff --git a/chrome/chrome_cleaner/test/test_executables.h b/chrome/chrome_cleaner/test/test_executables.h
index ca6a2af1..45fbc3e 100644
--- a/chrome/chrome_cleaner/test/test_executables.h
+++ b/chrome/chrome_cleaner/test/test_executables.h
@@ -12,10 +12,10 @@
 namespace chrome_cleaner {
 
 // The name of the service executable used for tests.
-extern const base::char16 kTestServiceExecutableName[];
+extern const wchar_t kTestServiceExecutableName[];
 
 // The name of the executable used for tests.
-extern const base::char16 kTestProcessExecutableName[];
+extern const wchar_t kTestProcessExecutableName[];
 
 // Creates a process that will run for a minute, which is long enough to be
 // killed by a reasonably fast unit or integration test.
diff --git a/chrome/chrome_cleaner/test/test_file_util.cc b/chrome/chrome_cleaner/test/test_file_util.cc
index dd4c93c2..e784aa1 100644
--- a/chrome/chrome_cleaner/test/test_file_util.cc
+++ b/chrome/chrome_cleaner/test/test_file_util.cc
@@ -64,7 +64,7 @@
     const base::ScopedTempDir& temp_dir) {
   base::FilePath path(temp_dir.GetPath().Append(file_name));
   EXPECT_NE(base::WriteFile(path, content.c_str(), content.size()), -1);
-  base::string16 utf16_file_path = path.AsUTF16Unsafe();
+  base::string16 utf16_file_path = path.value();
   base::win::ScopedHandle file_handle(
       ::CreateFile(utf16_file_path.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,
                    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL));
diff --git a/chrome/chrome_cleaner/test/test_native_reg_util.cc b/chrome/chrome_cleaner/test/test_native_reg_util.cc
index 6eddf75..7ec27c8 100644
--- a/chrome/chrome_cleaner/test/test_native_reg_util.cc
+++ b/chrome/chrome_cleaner/test/test_native_reg_util.cc
@@ -18,9 +18,9 @@
 
 namespace {
 
-const base::char16 kTimestampDelimiter[] = STRING16_LITERAL("$");
-const base::char16 kTempTestKeyPath[] =
-    STRING16_LITERAL("Software\\ChromeCleaner\\NativeTempTestKeys");
+const wchar_t kTimestampDelimiter[] = L"$";
+const wchar_t kTempTestKeyPath[] =
+    L"Software\\ChromeCleaner\\NativeTempTestKeys";
 
 }  // namespace
 
@@ -28,8 +28,8 @@
   const base::TimeDelta timestamp =
       base::Time::Now().ToDeltaSinceWindowsEpoch();
   key_path_ = base::StrCat(
-      {kTempTestKeyPath, base::NumberToString16(timestamp.InMicroseconds()),
-       kTimestampDelimiter, base::ASCIIToUTF16(base::GenerateGUID())});
+      {kTempTestKeyPath, base::NumberToWString(timestamp.InMicroseconds()),
+       kTimestampDelimiter, base::ASCIIToWide(base::GenerateGUID())});
 
   CHECK(ERROR_SUCCESS ==
         reg_key_.Create(HKEY_LOCAL_MACHINE, key_path_.c_str(), KEY_ALL_ACCESS));
diff --git a/chrome/chrome_cleaner/test/test_process_main.cc b/chrome/chrome_cleaner/test/test_process_main.cc
index eca0f61..8e01a0e 100644
--- a/chrome/chrome_cleaner/test/test_process_main.cc
+++ b/chrome/chrome_cleaner/test/test_process_main.cc
@@ -23,7 +23,7 @@
 
 namespace {
 
-constexpr base::char16 kLogFileExtension[] = L"log";
+constexpr wchar_t kLogFileExtension[] = L"log";
 
 }  // namespace
 
diff --git a/chrome/chrome_cleaner/test/test_registry_util.cc b/chrome/chrome_cleaner/test/test_registry_util.cc
index 60862016..4a0a33ff 100644
--- a/chrome/chrome_cleaner/test/test_registry_util.cc
+++ b/chrome/chrome_cleaner/test/test_registry_util.cc
@@ -15,8 +15,8 @@
 
 void ExpectRegistryFootprint(const PUPData::PUP& pup,
                              const RegKeyPath& key_path,
-                             const base::char16* value_name,
-                             const base::char16* value_substring,
+                             const wchar_t* value_name,
+                             const wchar_t* value_substring,
                              RegistryMatchRule rule) {
   DCHECK(value_name);
   DCHECK(value_substring);
@@ -36,8 +36,8 @@
 
 void ExpectRegistryFootprintAbsent(const PUPData::PUP& pup,
                                    const RegKeyPath& key_path,
-                                   const base::char16* value_name,
-                                   const base::char16* value_substring,
+                                   const wchar_t* value_name,
+                                   const wchar_t* value_substring,
                                    RegistryMatchRule rule) {
   DCHECK(value_name);
   DCHECK(value_substring);
@@ -54,10 +54,10 @@
 }
 
 ScopedRegistryValue::ScopedRegistryValue(HKEY rootkey,
-                                         const base::char16* subkey,
+                                         const wchar_t* subkey,
                                          REGSAM access,
-                                         const base::char16* value_name,
-                                         const base::char16* content,
+                                         const wchar_t* value_name,
+                                         const wchar_t* content,
                                          uint32_t value_type)
     : value_name_(value_name) {
   DCHECK(subkey);
@@ -86,9 +86,8 @@
   }
 
   // Store the new registry value content.
-  result =
-      key_.WriteValue(value_name, content,
-                      ::wcslen(content) * sizeof(base::char16), value_type);
+  result = key_.WriteValue(value_name, content,
+                           ::wcslen(content) * sizeof(wchar_t), value_type);
   DCHECK_EQ(result, ERROR_SUCCESS);
 }
 
@@ -107,7 +106,7 @@
 }
 
 ScopedTempRegistryKey::ScopedTempRegistryKey(HKEY key,
-                                             const base::char16* key_path,
+                                             const wchar_t* key_path,
                                              REGSAM access) {
   DCHECK(key_path);
   key_.Create(key, key_path, access);
diff --git a/chrome/chrome_cleaner/test/test_registry_util.h b/chrome/chrome_cleaner/test/test_registry_util.h
index 0286e40..b83a52e 100644
--- a/chrome/chrome_cleaner/test/test_registry_util.h
+++ b/chrome/chrome_cleaner/test/test_registry_util.h
@@ -21,19 +21,19 @@
 class ScopedRegistryValue {
  public:
   ScopedRegistryValue(HKEY rootkey,
-                      const base::char16* subkey,
+                      const wchar_t* subkey,
                       REGSAM access,
-                      const base::char16* value_name,
-                      const base::char16* content,
+                      const wchar_t* value_name,
+                      const wchar_t* content,
                       uint32_t value_type);
 
   ~ScopedRegistryValue();
 
  private:
-  const base::char16* value_name_;
+  const wchar_t* value_name_;
   base::win::RegKey key_;
   DWORD old_value_type_ = REG_NONE;
-  std::vector<base::char16> old_value_;
+  std::vector<wchar_t> old_value_;
   DWORD old_value_size_ = 0;
   bool has_value_ = false;
 
@@ -42,7 +42,7 @@
 
 class ScopedTempRegistryKey {
  public:
-  ScopedTempRegistryKey(HKEY key, const base::char16* key_path, REGSAM access);
+  ScopedTempRegistryKey(HKEY key, const wchar_t* key_path, REGSAM access);
   ~ScopedTempRegistryKey();
 
   bool Valid() const { return key_.Valid(); }
@@ -56,15 +56,15 @@
 // Expect the registry footprint to be found in |pup|.
 void ExpectRegistryFootprint(const PUPData::PUP& pup,
                              const RegKeyPath& key_path,
-                             const base::char16* value_name,
-                             const base::char16* value_substring,
+                             const wchar_t* value_name,
+                             const wchar_t* value_substring,
                              RegistryMatchRule rule);
 
 // Expect the registry footprint not to be found in |pup|.
 void ExpectRegistryFootprintAbsent(const PUPData::PUP& pup,
                                    const RegKeyPath& key_path,
-                                   const base::char16* value_name,
-                                   const base::char16* value_substring,
+                                   const wchar_t* value_name,
+                                   const wchar_t* value_substring,
                                    RegistryMatchRule rule);
 
 }  // namespace chrome_cleaner
diff --git a/chrome/chrome_cleaner/test/test_scoped_service_handle.cc b/chrome/chrome_cleaner/test/test_scoped_service_handle.cc
index 0316e18..f5d96b5 100644
--- a/chrome/chrome_cleaner/test/test_scoped_service_handle.cc
+++ b/chrome/chrome_cleaner/test/test_scoped_service_handle.cc
@@ -138,7 +138,7 @@
   base::string16 service_name;
   do {
     service_name =
-        base::UTF8ToUTF16(base::UnguessableToken::Create().ToString());
+        base::UTF8ToWide(base::UnguessableToken::Create().ToString());
   } while (DoesServiceExist(service_name.c_str()));
   return service_name;
 }
diff --git a/chrome/chrome_cleaner/test/test_scoped_service_handle.h b/chrome/chrome_cleaner/test/test_scoped_service_handle.h
index 785dbb4..a56ff956 100644
--- a/chrome/chrome_cleaner/test/test_scoped_service_handle.h
+++ b/chrome/chrome_cleaner/test/test_scoped_service_handle.h
@@ -26,7 +26,7 @@
   ::testing::AssertionResult StopAndDelete();
   void Close();
 
-  const base::char16* service_name() const { return service_name_.c_str(); }
+  const wchar_t* service_name() const { return service_name_.c_str(); }
 
  private:
   base::string16 service_name_;
diff --git a/chrome/chrome_cleaner/test/test_util.cc b/chrome/chrome_cleaner/test/test_util.cc
index f269914..6b741245 100644
--- a/chrome/chrome_cleaner/test/test_util.cc
+++ b/chrome/chrome_cleaner/test/test_util.cc
@@ -199,7 +199,7 @@
   if (run_once_key.Valid()) {
     // There is no need to check the return value, since ReadValue will leave
     // |reg_value| empty on error.
-    run_once_key.ReadValue(base::UTF8ToUTF16(cleanup_id).c_str(), &reg_value);
+    run_once_key.ReadValue(base::UTF8ToWide(cleanup_id).c_str(), &reg_value);
   }
 
   return String16ContainsCaseInsensitive(reg_value, sub_string);
@@ -438,11 +438,11 @@
   int exit_code = 0;
   if (!process.WaitForExitWithTimeout(TestTimeouts::action_timeout(),
                                       &exit_code)) {
-    LOG(ERROR) << "Failed to reset acl for file " << ucrt_path.AsUTF16Unsafe();
+    LOG(ERROR) << "Failed to reset acl for file " << ucrt_path.value();
     return false;
   }
   if (exit_code) {
-    LOG(ERROR) << "Failed to reset acl for file " << ucrt_path.AsUTF16Unsafe()
+    LOG(ERROR) << "Failed to reset acl for file " << ucrt_path.value()
                << " with exit code " << exit_code;
   }
   return !exit_code;
diff --git a/chrome/chrome_cleaner/ui/chrome_proxy_main_dialog.cc b/chrome/chrome_cleaner/ui/chrome_proxy_main_dialog.cc
index 2cad2ff..c98e064a 100644
--- a/chrome/chrome_cleaner/ui/chrome_proxy_main_dialog.cc
+++ b/chrome/chrome_cleaner/ui/chrome_proxy_main_dialog.cc
@@ -53,7 +53,7 @@
     for (const ForceInstalledExtension& matched_extension :
          pup->matched_extensions) {
       extension_ids.push_back(
-          base::UTF8ToUTF16(matched_extension.id.AsString()));
+          base::UTF8ToWide(matched_extension.id.AsString()));
     }
   }
   chrome_prompt_ipc_->PostPromptUserTask(
diff --git a/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver.cc b/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver.cc
index 8163b02..8d8c834 100644
--- a/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver.cc
+++ b/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver.cc
@@ -44,7 +44,7 @@
                           base::string16* output_sanitized_filename) {
   DCHECK(output_sanitized_filename);
 
-  base::string16 sanitized_filename = path.BaseName().AsUTF16Unsafe();
+  base::string16 sanitized_filename = path.BaseName().value();
   if (base::EndsWith(sanitized_filename, kDefaultFileStreamSuffix,
                      base::CompareCase::INSENSITIVE_ASCII)) {
     // Remove the default file stream suffix.
@@ -96,7 +96,7 @@
                                            const std::string& file_hash,
                                            size_t max_filename_length) {
   const base::string16 normalized_hash =
-      base::UTF8ToUTF16(base::ToUpperASCII(file_hash));
+      base::UTF8ToWide(base::ToUpperASCII(file_hash));
 
   // Length of the ".zip" suffix and the "_" infix.
   constexpr size_t kAffixSize = 5;
@@ -157,7 +157,7 @@
   // eliminate TOCTTOU, use |FILE_FLAG_BACKUP_SEMANTICS| to open a directory
   // then check.
   base::File src_file(::CreateFile(
-      src_file_path.AsUTF16Unsafe().c_str(), kMinimizedReadAccess,
+      src_file_path.value().c_str(), kMinimizedReadAccess,
       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
       OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
       nullptr));
@@ -228,7 +228,7 @@
   }
 
   // Create and open the zip file with minimized rights for writing.
-  base::File zip_file(::CreateFile(zip_file_path.AsUTF16Unsafe().c_str(),
+  base::File zip_file(::CreateFile(zip_file_path.value().c_str(),
                                    kMinimizedWriteAccess, 0, nullptr,
                                    CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr));
   if (!zip_file.IsValid()) {
@@ -239,7 +239,7 @@
     return;
   }
 
-  const std::string filename_in_zip = base::UTF16ToUTF8(sanitized_src_filename);
+  const std::string filename_in_zip = base::WideToUTF8(sanitized_src_filename);
   // Do archive.
   // Unretained pointer of |zip_archiver_| is safe because its deleter is run on
   // the same task runner. If |zip_archiver_| is destructed later, the deleter
diff --git a/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver_unittest.cc b/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver_unittest.cc
index 6868f88..dd82ddf6a 100644
--- a/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver_unittest.cc
+++ b/chrome/chrome_cleaner/zip_archiver/sandboxed_zip_archiver_unittest.cc
@@ -219,9 +219,9 @@
 TEST_F(ZipArchiverSandboxedArchiverTest, SourceIsSymbolicLink) {
   base::FilePath symlink_path =
       test_file_.GetTempDirPath().AppendASCII(kTestSymlink);
-  ASSERT_TRUE(::CreateSymbolicLink(
-      symlink_path.AsUTF16Unsafe().c_str(),
-      test_file_.GetSourceFilePath().AsUTF16Unsafe().c_str(), 0));
+  ASSERT_TRUE(
+      ::CreateSymbolicLink(symlink_path.value().c_str(),
+                           test_file_.GetSourceFilePath().value().c_str(), 0));
 
   EXPECT_EQ(ZipArchiverResultCode::kIgnoredSourceFile, Archive(symlink_path));
 }
@@ -232,8 +232,8 @@
 }
 
 TEST_F(ZipArchiverSandboxedArchiverTest, SourceIsDefaultFileStream) {
-  base::FilePath stream_path(base::StrCat(
-      {test_file_.GetSourceFilePath().AsUTF16Unsafe(), L"::$data"}));
+  base::FilePath stream_path(
+      base::StrCat({test_file_.GetSourceFilePath().value(), L"::$data"}));
 
   EXPECT_EQ(ZipArchiverResultCode::kSuccess, Archive(stream_path));
 
@@ -243,8 +243,8 @@
 }
 
 TEST_F(ZipArchiverSandboxedArchiverTest, SourceIsNonDefaultFileStream) {
-  base::FilePath stream_path(base::StrCat(
-      {test_file_.GetSourceFilePath().AsUTF16Unsafe(), L":stream:$data"}));
+  base::FilePath stream_path(
+      base::StrCat({test_file_.GetSourceFilePath().value(), L":stream:$data"}));
   base::File stream_file(stream_path, base::File::FLAG_CREATE);
   ASSERT_TRUE(stream_file.IsValid());
 
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 3b2100a..a7fc300 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -90,16 +90,6 @@
     "ThirdPartyModulesBlocking", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
-// Enables the additional TLS 1.3 server-random-based downgrade protection
-// described in https://tools.ietf.org/html/rfc8446#section-4.1.3 for
-// connections which chain to a local trust anchor. The protection is
-// unconditionally enabled for known trust anchors.
-//
-// This is a MUST-level requirement of TLS 1.3, but may have compatibility
-// issues with some outdated buggy TLS-terminating proxies.
-const base::Feature kTLS13HardeningForLocalAnchors{
-    "TLS13HardeningForLocalAnchors", base::FEATURE_ENABLED_BY_DEFAULT};
-
 #if BUILDFLAG(TRIAL_COMPARISON_CERT_VERIFIER_SUPPORTED)
 // Enables the dual certificate verification trial feature.
 // https://crbug.com/649026
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 168297ef..a982924 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -431,9 +431,6 @@
 #endif
 
 COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kTLS13HardeningForLocalAnchors;
-
-COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kTreatUnsafeDownloadsAsActive;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index b3e77b01..ce695497 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -76,6 +76,9 @@
 
   // Display orientation type.
   enum RotationType {
+    // RotateAny is the auto-rotation status (not locked to a rotation) for
+    // tablet mode. Not working in clamshell mode.
+    RotateAny,
     Rotate0,
     Rotate90,
     Rotate180,
diff --git a/chrome/common/extensions/api/identity.idl b/chrome/common/extensions/api/identity.idl
index f90faaf..17c0179 100644
--- a/chrome/common/extensions/api/identity.idl
+++ b/chrome/common/extensions/api/identity.idl
@@ -84,7 +84,8 @@
     boolean? interactive;
   };
 
-  callback GetAuthTokenCallback = void (optional DOMString token);
+  callback GetAuthTokenCallback = void (optional DOMString token,
+                                        optional DOMString[] scopes);
   callback GetAccountsCallback = void (AccountInfo[] accounts);
   callback GetProfileUserInfoCallback = void (ProfileUserInfo userInfo);
   callback InvalidateAuthTokenCallback = void ();
@@ -113,6 +114,9 @@
     // context. In particular, do not use <code>getAuthToken</code>
     // interactively when your app is first launched.
     //
+    // The <code>scopes</code> parameter in the callback function is not yet
+    // available. It will be populated in future versions of Chrome.
+    //
     // |details| : Token options.
     // |callback| : Called with an OAuth2 access token as specified by the
     // manifest, or undefined if there was an error.
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 4e3cb12..b9e4ec73 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -609,7 +609,9 @@
 // List of note taking aps that can be enabled to run on the lock screen.
 // The intended usage is to whitelist the set of apps that the user can enable
 // to run on lock screen, not to actually enable the apps to run on lock screen.
-const char kNoteTakingAppsLockScreenWhitelist[] =
+// Note that this used to be `kNoteTakingAppsLockScreenWhitelist`, hence the
+// difference between the variable name and the string value.
+const char kNoteTakingAppsLockScreenAllowlist[] =
     "settings.note_taking_apps_lock_screen_whitelist";
 
 // Dictionary pref that maps lock screen app ID to a boolean indicating whether
@@ -2051,11 +2053,6 @@
 // from http to https.
 const char kHSTSPolicyBypassList[] = "hsts.policy.upgrade_bypass_list";
 
-// If true, enables stronger TLS 1.3 downgrade protection for connections using
-// local trust anchors.
-const char kTLS13HardeningForLocalAnchorsEnabled[] =
-    "ssl.tls13_hardening_for_local_anchors";
-
 // Boolean that specifies whether the built-in asynchronous DNS client is used.
 const char kBuiltInDnsClientEnabled[] = "async_dns.enabled";
 
@@ -3057,4 +3054,16 @@
     "adb_sideloading_powerwash_on_next_reboot_notification_shown";
 #endif
 
+#if !defined(OS_ANDROID)
+// Boolean pref that indicates whether caret browsing is currently enabled.
+const char kCaretBrowsingEnabled[] = "settings.a11y.caretbrowsing.enabled";
+
+// Boolean pref for whether the user is shown a dialog to confirm that caret
+// browsing should be enabled/disabled when the keyboard shortcut is pressed.
+// If set to false, no intervening dialog is displayed and caret browsing mode
+// is toggled silently by the keyboard shortcut.
+const char kShowCaretBrowsingDialog[] =
+    "settings.a11y.caretbrowsing.show_dialog";
+#endif
+
 }  // namespace prefs
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index bd2d960..77d0aa3 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -245,7 +245,7 @@
 extern const char kChromeOSReleaseNotesVersion[];
 extern const char kNoteTakingAppId[];
 extern const char kNoteTakingAppEnabledOnLockScreen[];
-extern const char kNoteTakingAppsLockScreenWhitelist[];
+extern const char kNoteTakingAppsLockScreenAllowlist[];
 extern const char kNoteTakingAppsLockScreenToastShown[];
 extern const char kRestoreLastLockScreenNote[];
 extern const char kSessionUserActivitySeen[];
@@ -794,7 +794,6 @@
 extern const char kCipherSuiteBlacklist[];
 extern const char kH2ClientCertCoalescingHosts[];
 extern const char kHSTSPolicyBypassList[];
-extern const char kTLS13HardeningForLocalAnchorsEnabled[];
 
 extern const char kBuiltInDnsClientEnabled[];
 extern const char kDnsOverHttpsMode[];
@@ -1078,6 +1077,11 @@
 extern const char kAdbSideloadingPowerwashOnNextRebootNotificationShown[];
 #endif
 
+#if !defined(OS_ANDROID)
+extern const char kCaretBrowsingEnabled[];
+extern const char kShowCaretBrowsingDialog[];
+#endif
+
 }  // namespace prefs
 
 #endif  // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chrome/credential_provider/gaiacp/reauth_credential.cc b/chrome/credential_provider/gaiacp/reauth_credential.cc
index 8d21bca..156a948 100644
--- a/chrome/credential_provider/gaiacp/reauth_credential.cc
+++ b/chrome/credential_provider/gaiacp/reauth_credential.cc
@@ -16,7 +16,9 @@
 
 namespace credential_provider {
 
-constexpr char kGaiaReauthPath[] = "embedded/reauth/windows";
+// TODO(crbug.com/1111561): Change it back to emdedded/reauth/windows
+// once reauth flow latency issue is resolved.
+constexpr char kGaiaReauthPath[] = "embedded/setup/windows";
 
 CReauthCredential::CReauthCredential() = default;
 
diff --git a/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc b/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc
index 43370442..4bb7ceb9 100644
--- a/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc
+++ b/chrome/credential_provider/gaiacp/reauth_credential_unittests.cc
@@ -389,7 +389,7 @@
     if (set_email_for_reauth) {
       ASSERT_EQ(
           gcpw_path,
-          base::StringPrintf("embedded/reauth/windows?device_id=%s&show_tos=%d",
+          base::StringPrintf("embedded/setup/windows?device_id=%s&show_tos=%d",
                              device_id.c_str(), is_tos_accepted ? 0 : 1));
     } else {
       ASSERT_EQ(
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent.h b/chrome/renderer/lite_video/lite_video_hint_agent.h
index 4fcc6a0..023150bb 100644
--- a/chrome/renderer/lite_video/lite_video_hint_agent.h
+++ b/chrome/renderer/lite_video/lite_video_hint_agent.h
@@ -54,16 +54,16 @@
     return active_throttles_;
   }
 
+  // Stop throttling and resume the current throttled media requests
+  // immediately. Throttling could start again for new requests
+  void StopThrottling();
+
  private:
   friend class LiteVideoHintAgentTest;
 
   // content::RenderFrameObserver overrides
   void OnDestruct() override;
 
-  // Stop throttling and resume the current throttled media requests
-  // immediately. Throttling could start again for new requests
-  void StopThrottling();
-
   // The network downlink bandwidth target in kilobytes per second used to
   // calculate the throttling delay on media requests
   base::Optional<int> target_downlink_bandwidth_kbps_;
diff --git a/chrome/renderer/previews/resource_loading_hints_agent.cc b/chrome/renderer/previews/resource_loading_hints_agent.cc
index dbb4498..016a94c 100644
--- a/chrome/renderer/previews/resource_loading_hints_agent.cc
+++ b/chrome/renderer/previews/resource_loading_hints_agent.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/metrics/histogram_macros.h"
+#include "base/metrics/histogram_macros_local.h"
 #include "content/public/renderer/render_frame.h"
 #include "third_party/blink/public/platform/web_loading_hints_provider.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -132,4 +133,13 @@
     lite_video_hint_agent->SetLiteVideoHint(std::move(lite_video_hint));
 }
 
+void ResourceLoadingHintsAgent::StopThrottlingMediaRequests() {
+  auto* lite_video_hint_agent =
+      lite_video::LiteVideoHintAgent::Get(render_frame());
+  if (lite_video_hint_agent) {
+    LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.HintsAgent.StopThrottling", true);
+    lite_video_hint_agent->StopThrottling();
+  }
+}
+
 }  // namespace previews
diff --git a/chrome/renderer/previews/resource_loading_hints_agent.h b/chrome/renderer/previews/resource_loading_hints_agent.h
index f2785b7..9a4f9c5 100644
--- a/chrome/renderer/previews/resource_loading_hints_agent.h
+++ b/chrome/renderer/previews/resource_loading_hints_agent.h
@@ -63,6 +63,7 @@
       blink::mojom::CompressPublicImagesHintsPtr images_hints) override;
   void SetLiteVideoHint(
       blink::mojom::LiteVideoHintPtr lite_video_hint) override;
+  void StopThrottlingMediaRequests() override;
 
   void SetReceiver(
       mojo::PendingAssociatedReceiver<
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 25ed99c..13f9995 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4316,6 +4316,7 @@
       "../browser/ui/webui/managed_ui_handler_unittest.cc",
       "../browser/ui/webui/management_ui_handler_unittest.cc",
       "../browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc",
+      "../browser/ui/webui/new_tab_page/promo_browser_command/promo_browser_command_handler_unittest.cc",
       "../browser/ui/webui/settings/downloads_handler_unittest.cc",
       "../browser/ui/webui/settings/hats_handler_unittest.cc",
       "../browser/ui/webui/settings/metrics_reporting_handler_unittest.cc",
@@ -4388,6 +4389,7 @@
       "//chrome/browser/nearby_sharing/logging:unit_tests",
       "//chrome/browser/nearby_sharing/proto",
       "//chrome/browser/nearby_sharing/scheduling:unit_tests",
+      "//chrome/browser/promo_browser_command:mojo_bindings",
       "//chrome/browser/resource_coordinator:tab_metrics_event_proto",
       "//chrome/browser/resource_coordinator/tab_ranker:tab_features_test_helper",
       "//chrome/services/sharing:unit_tests",
@@ -5523,6 +5525,7 @@
       "../browser/ui/views/extensions/extensions_menu_view_unittest.cc",
       "../browser/ui/views/extensions/media_galleries_dialog_views_unittest.cc",
       "../browser/ui/views/extensions/settings_overridden_dialog_view_unittest.cc",
+      "../browser/ui/views/feature_promos/feature_promo_controller_unittest.cc",
       "../browser/ui/views/frame/browser_non_client_frame_view_unittest.cc",
       "../browser/ui/views/frame/browser_view_layout_unittest.cc",
       "../browser/ui/views/frame/browser_view_unittest.cc",
@@ -5896,6 +5899,7 @@
       "../browser/extensions/extension_keybinding_apitest.cc",
       "../browser/extensions/omnibox_focus_interactive_test.cc",
       "../browser/extensions/window_open_interactive_apitest.cc",
+      "../browser/focus_ring_browsertest.cc",
       "../browser/global_keyboard_shortcuts_mac_browsertest.mm",
       "../browser/mouse_events_interactive_uitest.cc",
       "../browser/notifications/platform_notification_service_interactive_uitest.cc",
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index 76514058..bac832fa 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -188,6 +188,7 @@
   std::string GetWorkspace() const override;
   bool IsVisibleOnAllWorkspaces() const override;
   void ShowEmojiPanel() override {}
+  void ShowCaretBrowsingDialog() override {}
   std::unique_ptr<content::EyeDropper> OpenEyeDropper(
       content::RenderFrameHost* frame,
       content::EyeDropperListener* listener) override;
diff --git a/chrome/test/data/extensions/api_test/executescript/permissions/manifest.json b/chrome/test/data/extensions/api_test/executescript/permissions/manifest.json
index f881622a..76fe860 100644
--- a/chrome/test/data/extensions/api_test/executescript/permissions/manifest.json
+++ b/chrome/test/data/extensions/api_test/executescript/permissions/manifest.json
@@ -3,7 +3,8 @@
   "manifest_version": 2,
   "name": "Tests edge cases in chrome.tabs.executeScript() with permissions",
   "background": {
-    "page": "test.html"
+    "scripts": ["test.js"],
+    "persistent": true
   },
   "permissions": ["tabs", "http://a.com/", "http://b.com/"]
 }
diff --git a/chrome/test/data/extensions/api_test/executescript/permissions/script.js b/chrome/test/data/extensions/api_test/executescript/permissions/script.js
index b73bce3..5e7a0ebd 100644
--- a/chrome/test/data/extensions/api_test/executescript/permissions/script.js
+++ b/chrome/test/data/extensions/api_test/executescript/permissions/script.js
@@ -1 +1,6 @@
-chrome.extension.sendRequest(location.href);
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Return the location so the test can verify the expected results.
+window.location.href;
diff --git a/chrome/test/data/extensions/api_test/executescript/permissions/test.html b/chrome/test/data/extensions/api_test/executescript/permissions/test.html
deleted file mode 100644
index 3efb342..0000000
--- a/chrome/test/data/extensions/api_test/executescript/permissions/test.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!--
- * Copyright (c) 2011 The Chromium Authors. All rights reserved.  Use of this
- * source code is governed by a BSD-style license that can be found in the
- * LICENSE file.
--->
-<script src="test.js"></script>
diff --git a/chrome/test/data/extensions/api_test/executescript/permissions/test.js b/chrome/test/data/extensions/api_test/executescript/permissions/test.js
index 71ff6490..8b83b80 100644
--- a/chrome/test/data/extensions/api_test/executescript/permissions/test.js
+++ b/chrome/test/data/extensions/api_test/executescript/permissions/test.js
@@ -2,68 +2,108 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-var assertEq = chrome.test.assertEq;
-var assertTrue = chrome.test.assertTrue;
-var numReceivedRequests = 0;
 var relativePath = 'extensions/api_test/executescript/permissions/';
-var testFile = relativePath + 'empty.html';
-var testFileFrames = relativePath + 'frames.html';
-var onTabLoaded;
+var port;
 
-chrome.extension.onRequest.addListener(function(req) {
-  numReceivedRequests++;
-});
+function fixPort(url) {
+  return url.replace(/PORT/, port);
+}
 
-chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
-  if (tab.status == 'complete' && onTabLoaded)
-    onTabLoaded(tab);
-});
+chrome.test.runTests([
+  function setup() {
+    chrome.test.getConfig(function(config) {
+      port = config.testServer.port;
+      chrome.test.succeed();
+    });
+  },
 
-chrome.test.getConfig(function(config) {
+  // Test a race that used to occur here (see bug 30937).
+  // Open a tab that we're not allowed to execute in (c.com), then
+  // navigate it to a tab we *are* allowed to execute in (a.com),
+  // then quickly run script in the tab before it navigates. It
+  // should appear to work (no error -- it could have been a developer
+  // mistake), but not actually do anything.
+  function testRace() {
+    var testFile = relativePath + 'empty.html';
+    var openUrl = fixPort('http://c.com:PORT/') + testFile;
+    var executeUrl = fixPort('http://a.com:PORT/') + testFile;
+    var expectedError =
+        'Cannot access contents of url "' + openUrl + '". ' +
+        'Extension manifest must request permission to access this host.';
 
-  function fixPort(url) {
-    return url.replace(/PORT/, config.testServer.port);
-  }
+    // This promise waits for the second URL to finish loading.
+    let tabLoadedPromise = new Promise((resolve) => {
+      chrome.tabs.onUpdated.addListener(function listener(
+          tabId, changeInfo, tab) {
+        if (tab.status == 'complete' && tab.url == executeUrl) {
+          chrome.tabs.onUpdated.removeListener(listener);
+          resolve();
+        }
+      });
+    });
 
-  chrome.test.runTests([
-    // Test a race that used to occur here (see bug 30937).
-    // Open a tab that we're not allowed to execute in (c.com), then
-    // navigate it to a tab we *are* allowed to execute in (a.com),
-    // then quickly run script in the tab before it navigates. It
-    // should appear to work (no error -- it could have been a developer
-    // mistake), but not actually do anything.
-    function() {
-      chrome.tabs.create({url: fixPort('http://c.com:PORT/') + testFile});
-      onTabLoaded = function(tab) {
-        onTabLoaded = null;
-        numReceivedRequests = 0;
-        chrome.tabs.update(
-            tab.id, {url: fixPort('http://a.com:PORT/') + testFile});
-        chrome.tabs.executeScript(tab.id, {file: 'script.js'});
-        window.setTimeout(function() {
-          assertEq(0, numReceivedRequests);
-          chrome.test.succeed();
-        }, 4000);
-      };
-    },
+    // This promise waits for both the first URL to finish loading and
+    // the subsequent script execution to finish.
+    let executePromise = new Promise((resolve, reject) => {
+      chrome.tabs.onUpdated.addListener(function listener(
+          tabId, changeInfo, tab) {
+        if (tab.status == 'complete') {
+          chrome.tabs.onUpdated.removeListener(listener);
+          chrome.tabs.update(tab.id, {url: executeUrl});
+          chrome.tabs.executeScript(
+              tab.id, {file: 'script.js'},
+              function(results) {
+                if (results != undefined || !chrome.runtime.lastError) {
+                  reject('Unexpected success in execute callback');
+                } else if (chrome.runtime.lastError.message != expectedError) {
+                  reject('Unexpected error: ' +
+                         chrome.runtime.lastError.message);
+                } else {
+                  resolve();
+                }
+              });
+        }
+      })
+    });
 
-    // Inject into all frames. This should only affect frames we have
-    // access to. This page has three subframes, one each from a.com,
-    // b.com, and c.com. We have access to two of those, plus the root
-    // frame, so we should get three responses.
-    function() {
-      chrome.tabs.create(
-          {url: fixPort('http://a.com:PORT/') + testFileFrames});
-      onTabLoaded = function(tab) {
-        numReceivedRequests = 0;
-        chrome.tabs.executeScript(tab.id,
-                                  {file: 'script.js', allFrames: true});
-        window.setTimeout(function() {
-          chrome.test.assertEq(3, numReceivedRequests);
-          chrome.test.succeed();
-        }, 4000);
-      };
+    chrome.tabs.create({url: openUrl});
+
+    Promise.all([tabLoadedPromise, executePromise]).then(() => {
+      chrome.test.succeed();
+    }).catch((message) => {
+      console.log(message);
+      chrome.test.fail();
+    });
+  },
+
+  // Inject into all frames. This should only affect frames we have
+  // access to. This page has three subframes, one each from a.com,
+  // b.com, and c.com. We have access to two of those, plus the root
+  // frame, so we should get three responses.
+  function testAllFrames() {
+    var testFileFrames = relativePath + 'frames.html';
+    var tabUrl = fixPort('http://a.com:PORT/') + testFileFrames;
+    // A sorted list of the expected scripts results. The script returns
+    // window.location.href.
+    var expectedResults = [
+      tabUrl,
+      fixPort('http://a.com:PORT/') + relativePath + 'empty.html',
+      fixPort('http://b.com:PORT/') + relativePath + 'empty.html'].sort();
+
+    function executeScriptCallback(results) {
+      chrome.test.assertEq(expectedResults, results.sort());
+      chrome.test.succeed();
     }
-  ]);
 
-});
+    function updatedListener(tabId, changeInfo, tab) {
+      if (tab.status == 'complete') {
+        chrome.tabs.onUpdated.removeListener(updatedListener);
+        chrome.tabs.executeScript(tab.id, {file: 'script.js', allFrames: true},
+                                  executeScriptCallback);
+      }
+    }
+    chrome.tabs.onUpdated.addListener(updatedListener);
+
+    chrome.tabs.create({url: tabUrl});
+  },
+]);
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_anchor.png b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor.png
new file mode 100644
index 0000000..ae5c729
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_mac.png
new file mode 100644
index 0000000..cf156fa
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_mac.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png
new file mode 100644
index 0000000..cd5f3108
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_anchor_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_button.png b/chrome/test/data/focus_rings/focus_ring_browsertest_button.png
new file mode 100644
index 0000000..c326a9f
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_button.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_button_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_button_mac.png
new file mode 100644
index 0000000..c3d9c58
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_button_mac.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png
new file mode 100644
index 0000000..b6bba18
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_button_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox.png b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox.png
new file mode 100644
index 0000000..73ec818
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_mac.png
new file mode 100644
index 0000000..d32225e
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_mac.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png
new file mode 100644
index 0000000..73ec818
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_checkbox_win.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_radio.png b/chrome/test/data/focus_rings/focus_ring_browsertest_radio.png
new file mode 100644
index 0000000..0f7250a
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_radio.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_radio_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_mac.png
new file mode 100644
index 0000000..14c86d7
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_mac.png
Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png
new file mode 100644
index 0000000..0f7250a
--- /dev/null
+++ b/chrome/test/data/focus_rings/focus_ring_browsertest_radio_win.png
Binary files differ
diff --git a/chrome/test/data/pdf/viewer_pdf_toolbar_new_test.js b/chrome/test/data/pdf/viewer_pdf_toolbar_new_test.js
index 6dae194..67cfb571 100644
--- a/chrome/test/data/pdf/viewer_pdf_toolbar_new_test.js
+++ b/chrome/test/data/pdf/viewer_pdf_toolbar_new_test.js
@@ -183,6 +183,23 @@
     twoPageViewButton.click();
   },
 
+  function testShowAnnotationsToggle() {
+    const toolbar = createToolbar();
+
+    const showAnnotationsButton =
+        toolbar.shadowRoot.querySelector('#show-annotations-button');
+    chrome.test.assertFalse(
+        showAnnotationsButton.querySelector('iron-icon').hidden);
+
+    toolbar.addEventListener('display-annotations-changed', (e) => {
+      chrome.test.assertEq(false, e.detail);
+      chrome.test.assertTrue(
+          showAnnotationsButton.querySelector('iron-icon').hidden);
+      chrome.test.succeed();
+    });
+    showAnnotationsButton.click();
+  },
+
   function testSidenavToggleButton() {
     const toolbar = createToolbar();
     toolbar.addEventListener(
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index e98360f..feb3fe6 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5691,6 +5691,7 @@
   },
 
   "NoteTakingAppsLockScreenWhitelist": {
+    "note": "This policy is deprecated, see http://crbug.com/1095910.",
     "os": ["chromeos"],
     "policy_pref_mapping_test": [
       {
@@ -5702,6 +5703,18 @@
     ]
   },
 
+  "NoteTakingAppsLockScreenAllowlist": {
+    "os": ["chromeos"],
+    "policy_pref_mapping_test": [
+      {
+        "policies": {
+          "NoteTakingAppsLockScreenAllowlist": []
+        },
+        "prefs": { "settings.note_taking_apps_lock_screen_whitelist": {} }
+      }
+    ]
+  },
+
   "CastReceiverEnabled": {
     "os": ["chromeos"],
     "policy_pref_mapping_test": [
@@ -7700,13 +7713,7 @@
   },
 
   "TLS13HardeningForLocalAnchorsEnabled": {
-    "os": ["win", "linux", "mac", "chromeos", "android"],
-    "policy_pref_mapping_test": [
-      {
-        "policies": { "TLS13HardeningForLocalAnchorsEnabled": true },
-        "prefs": { "ssl.tls13_hardening_for_local_anchors": { "local_state": true } }
-      }
-    ]
+    "note": "This policy is retired, see https://crbug.com/1012400."
   },
 
   "CorsMitigationList": {
@@ -7899,5 +7906,19 @@
         "prefs": { "cros.system.channelDowngradeBehavior": {} }
       }
     ]
+  },
+  "BackForwardCacheEnabled": {
+    "os": ["android"],
+    "policy_pref_mapping_test": [
+      {
+        "policies": { "BackForwardCacheEnabled": true },
+        "prefs": {
+          "policy.back_forward_cache_enabled": {
+            "local_state":  true,
+            "value": true
+          }
+        }
+      }
+    ]
   }
 }
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
index 3e3c703..dc4f886 100644
--- a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
+++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
@@ -133,6 +133,7 @@
   pending_buffer_complete_ = false;
   pending_output_frames_ = kNoPendingOutput;
   paused_ = false;
+  playback_rate_ = 1.0f;
   reported_ready_for_playback_ = false;
   mixer_delay_ = RenderingDelay();
 
@@ -196,9 +197,10 @@
 
   mixer_input_ =
       std::make_unique<mixer_service::OutputStreamConnection>(this, params);
-  mixer_input_->Connect();
   mixer_input_->SetVolumeMultiplier(volume_multiplier_);
   mixer_input_->SetAudioClockRate(av_sync_clock_rate_);
+  mixer_input_->SetPlaybackRate(playback_rate_);
+  mixer_input_->Connect();
 }
 
 void AudioDecoderForMixer::StartPlaybackAt(int64_t playback_start_timestamp) {
@@ -259,6 +261,7 @@
     rate = 1.0f;
   }
 
+  playback_rate_ = rate;
   mixer_input_->SetPlaybackRate(rate);
   backend_->NewAudioPlaybackRateInEffect(rate);
 
@@ -378,9 +381,20 @@
 
   pending_output_frames_ = kNoPendingOutput;
   next_buffer_delay_ = AudioDecoderForMixer::RenderingDelay();
+  int64_t last_timestamp = last_push_playout_timestamp_;
   last_push_playout_timestamp_ = kInvalidTimestamp;
 
   CreateMixerInput(config, start_playback_asap_);
+  if (!start_playback_asap_) {
+    if (last_timestamp != kInvalidTimestamp &&
+        last_push_pts_ != kInvalidTimestamp) {
+      mixer_input_->SetStartTimestamp(last_timestamp, last_push_pts_);
+    } else {
+      // Pause + resume starts playback immediately.
+      mixer_input_->Pause();
+      mixer_input_->Resume();
+    }
+  }
 }
 
 void AudioDecoderForMixer::CreateDecoder() {
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.h b/chromecast/media/cma/backend/audio_decoder_for_mixer.h
index 74b7c6f..e19acce 100644
--- a/chromecast/media/cma/backend/audio_decoder_for_mixer.h
+++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.h
@@ -101,6 +101,7 @@
   bool pending_buffer_complete_ = false;
   bool mixer_error_ = false;
   bool paused_ = false;
+  float playback_rate_ = 1.0f;
   bool reported_ready_for_playback_ = false;
   RenderingDelay mixer_delay_;
 
diff --git a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.cc b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.cc
index b439e62..0f31455e 100644
--- a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.cc
@@ -29,28 +29,11 @@
 
 namespace {
 
-// Timeout values for the asynchronous operations of fetching client app
-// metadata and making the network request.
 // TODO(https://crbug.com/933656): Use async execution time metrics to tune
 // these timeout values.
-constexpr base::TimeDelta kWaitingForClientAppMetadataTimeout =
-    base::TimeDelta::FromSeconds(60);
 constexpr base::TimeDelta kWaitingForGetDevicesActivityStatusResponseTimeout =
     kMaxAsyncExecutionTime;
 
-void RecordClientAppMetadataFetchMetrics(const base::TimeDelta& execution_time,
-                                         CryptAuthAsyncTaskResult result) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.DeviceSyncV2.DeviceActivityGetter.ExecutionTime."
-      "ClientAppMetadataFetch",
-      execution_time, base::TimeDelta::FromSeconds(1) /* min */,
-      kWaitingForClientAppMetadataTimeout /* max */, 100 /* buckets */);
-  LogCryptAuthAsyncTaskSuccessMetric(
-      "CryptAuth.DeviceSyncV2.DeviceActivityGetter.AsyncTaskResult."
-      "ClientAppMetadataFetch",
-      result);
-}
-
 void RecordGetDevicesActivityStatusMetrics(
     const base::TimeDelta& execution_time,
     CryptAuthApiCallResult result) {
@@ -80,8 +63,6 @@
 base::Optional<base::TimeDelta>
 CryptAuthDeviceActivityGetterImpl::GetTimeoutForState(State state) {
   switch (state) {
-    case State::kWaitingForClientAppMetadata:
-      return kWaitingForClientAppMetadataTimeout;
     case State::kWaitingForGetDevicesActivityStatusResponse:
       return kWaitingForGetDevicesActivityStatusResponseTimeout;
     default:
@@ -94,28 +75,26 @@
 
 std::unique_ptr<CryptAuthDeviceActivityGetter>
 CryptAuthDeviceActivityGetterImpl::Factory::Create(
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    ClientAppMetadataProvider* client_app_metadata_provider,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer) {
   if (test_factory_)
-    return test_factory_->CreateInstance(client_factory,
-                                         client_app_metadata_provider,
-                                         gcm_manager, std::move(timer));
+    return test_factory_->CreateInstance(instance_id, instance_id_token,
+                                         client_factory, std::move(timer));
 
   return base::WrapUnique(new CryptAuthDeviceActivityGetterImpl(
-      client_factory, client_app_metadata_provider, gcm_manager,
-      std::move(timer)));
+      instance_id, instance_id_token, client_factory, std::move(timer)));
 }
 
 CryptAuthDeviceActivityGetterImpl::CryptAuthDeviceActivityGetterImpl(
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    ClientAppMetadataProvider* client_app_metadata_provider,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer)
-    : client_factory_(client_factory),
-      client_app_metadata_provider_(client_app_metadata_provider),
-      gcm_manager_(gcm_manager),
+    : instance_id_(instance_id),
+      instance_id_token_(instance_id_token),
+      client_factory_(client_factory),
       timer_(std::move(timer)) {
   DCHECK(client_factory);
 }
@@ -140,45 +119,15 @@
 }
 
 void CryptAuthDeviceActivityGetterImpl::OnAttemptStarted() {
-  // GCM registration is expected to be completed before the first enrollment.
-  DCHECK(!gcm_manager_->GetRegistrationId().empty())
-      << "Device activity status requested before GCM registration complete.";
-  SetState(State::kWaitingForClientAppMetadata);
-
-  client_app_metadata_provider_->GetClientAppMetadata(
-      gcm_manager_->GetRegistrationId(),
-      base::BindOnce(
-          &CryptAuthDeviceActivityGetterImpl::OnClientAppMetadataFetched,
-          callback_weak_ptr_factory_.GetWeakPtr()));
-}
-
-void CryptAuthDeviceActivityGetterImpl::OnClientAppMetadataFetched(
-    const base::Optional<cryptauthv2::ClientAppMetadata>& client_app_metadata) {
-  DCHECK(state_ == State::kWaitingForClientAppMetadata);
-
-  bool success = client_app_metadata.has_value();
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_,
-      success ? CryptAuthAsyncTaskResult::kSuccess
-              : CryptAuthAsyncTaskResult::kError);
-  if (!success) {
-    OnAttemptError(NetworkRequestError::kUnknown);
-    return;
-  }
-
   cryptauthv2::GetDevicesActivityStatusRequest request;
-
   request.mutable_context()->mutable_client_metadata()->set_retry_count(0);
   request.mutable_context()->mutable_client_metadata()->set_invocation_reason(
       cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED);
-
   request.mutable_context()->set_group(
       CryptAuthKeyBundle::KeyBundleNameEnumToString(
           CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether));
-  request.mutable_context()->set_device_id(
-      client_app_metadata.value().instance_id());
-  request.mutable_context()->set_device_id_token(
-      client_app_metadata.value().instance_id_token());
+  request.mutable_context()->set_device_id(instance_id_);
+  request.mutable_context()->set_device_id_token(instance_id_token_);
 
   SetState(State::kWaitingForGetDevicesActivityStatusResponse);
 
@@ -230,22 +179,13 @@
 }
 
 void CryptAuthDeviceActivityGetterImpl::OnTimeout() {
+  DCHECK_EQ(state_, State::kWaitingForGetDevicesActivityStatusResponse);
+  PA_LOG(ERROR) << "Timed out in state " << state_ << ".";
+
   base::TimeDelta execution_time =
       base::TimeTicks::Now() - last_state_change_timestamp_;
-  switch (state_) {
-    case State::kWaitingForClientAppMetadata:
-      RecordClientAppMetadataFetchMetrics(execution_time,
-                                          CryptAuthAsyncTaskResult::kTimeout);
-      break;
-    case State::kWaitingForGetDevicesActivityStatusResponse:
-      RecordGetDevicesActivityStatusMetrics(execution_time,
-                                            CryptAuthApiCallResult::kTimeout);
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  PA_LOG(ERROR) << "Timed out in state " << state_ << ".";
+  RecordGetDevicesActivityStatusMetrics(execution_time,
+                                        CryptAuthApiCallResult::kTimeout);
 
   OnAttemptError(NetworkRequestError::kUnknown);
 }
@@ -264,9 +204,6 @@
     case CryptAuthDeviceActivityGetterImpl::State::kNotStarted:
       stream << "[DeviceActivityGetter state: Not started]";
       break;
-    case CryptAuthDeviceActivityGetterImpl::State::kWaitingForClientAppMetadata:
-      stream << "[DeviceActivityGetter state: Waiting for client app metadata]";
-      break;
     case CryptAuthDeviceActivityGetterImpl::State::
         kWaitingForGetDevicesActivityStatusResponse:
       stream << "[DeviceActivityGetter state: Waiting for "
diff --git a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.h b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.h
index 6b6879e..82677b6 100644
--- a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.h
+++ b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl.h
@@ -9,14 +9,11 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "chromeos/services/device_sync/cryptauth_device_activity_getter.h"
-#include "chromeos/services/device_sync/cryptauth_gcm_manager.h"
 #include "chromeos/services/device_sync/network_request_error.h"
-#include "chromeos/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 #include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 
@@ -37,9 +34,9 @@
   class Factory {
    public:
     static std::unique_ptr<CryptAuthDeviceActivityGetter> Create(
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        ClientAppMetadataProvider* client_app_metadata_provider,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer =
             std::make_unique<base::OneShotTimer>());
     static void SetFactoryForTesting(Factory* test_factory);
@@ -47,9 +44,9 @@
    protected:
     virtual ~Factory();
     virtual std::unique_ptr<CryptAuthDeviceActivityGetter> CreateInstance(
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        ClientAppMetadataProvider* client_app_metadata_provider,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer) = 0;
 
    private:
@@ -61,24 +58,19 @@
  private:
   enum class State {
     kNotStarted,
-    kWaitingForClientAppMetadata,
     kWaitingForGetDevicesActivityStatusResponse,
     kFinished
   };
 
   friend std::ostream& operator<<(std::ostream& stream, const State& state);
 
-  CryptAuthDeviceActivityGetterImpl(
-      CryptAuthClientFactory* client_factory,
-      ClientAppMetadataProvider* client_app_metadata_provider,
-      CryptAuthGCMManager* gcm_manager,
-      std::unique_ptr<base::OneShotTimer> timer);
+  CryptAuthDeviceActivityGetterImpl(const std::string& instance_id,
+                                    const std::string& instance_id_token,
+                                    CryptAuthClientFactory* client_factory,
+                                    std::unique_ptr<base::OneShotTimer> timer);
 
   // CryptAuthDeviceActivityGetter:
   void OnAttemptStarted() override;
-  void OnClientAppMetadataFetched(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata);
 
   static base::Optional<base::TimeDelta> GetTimeoutForState(State state);
   void SetState(State state);
@@ -100,12 +92,10 @@
   // The time of the last state change. Used for execution time metrics.
   base::TimeTicks last_state_change_timestamp_;
 
+  std::string instance_id_;
+  std::string instance_id_token_;
   CryptAuthClientFactory* client_factory_ = nullptr;
-  ClientAppMetadataProvider* client_app_metadata_provider_ = nullptr;
-  CryptAuthGCMManager* gcm_manager_ = nullptr;
   std::unique_ptr<base::OneShotTimer> timer_;
-  base::WeakPtrFactory<CryptAuthDeviceActivityGetterImpl>
-      callback_weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(CryptAuthDeviceActivityGetterImpl);
 };
diff --git a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl_unittest.cc
index 7fa75ee..ccf59448 100644
--- a/chromeos/services/device_sync/cryptauth_device_activity_getter_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_device_activity_getter_impl_unittest.cc
@@ -17,18 +17,15 @@
 #include "chromeos/services/device_sync/cryptauth_client.h"
 #include "chromeos/services/device_sync/cryptauth_device.h"
 #include "chromeos/services/device_sync/cryptauth_device_sync_result.h"
-#include "chromeos/services/device_sync/cryptauth_gcm_manager_impl.h"
 #include "chromeos/services/device_sync/cryptauth_key.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
 #include "chromeos/services/device_sync/cryptauth_v2_device_sync_test_devices.h"
 #include "chromeos/services/device_sync/device_sync_type_converters.h"
-#include "chromeos/services/device_sync/fake_cryptauth_gcm_manager.h"
 #include "chromeos/services/device_sync/mock_cryptauth_client.h"
 #include "chromeos/services/device_sync/network_request_error.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
-#include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h"
 #include "components/gcm_driver/fake_gcm_driver.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
@@ -41,7 +38,6 @@
 namespace {
 
 const char kAccessTokenUsed[] = "access token used by CryptAuthClient";
-const char kTestCryptAuthGCMRegistrationId[] = "cryptAuthRegistrationId";
 const char kDeviceId[] = "device_id1";
 const int kLastActivityTimeSecs = 111;
 const cryptauthv2::ConnectivityStatus kConnectivityStatus =
@@ -61,9 +57,8 @@
         return cryptauthv2::BuildRequestContext(
             CryptAuthKeyBundle::KeyBundleNameEnumToString(
                 CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether),
-            GetClientMetadata(),
-            cryptauthv2::GetClientAppMetadataForTest().instance_id(),
-            cryptauthv2::GetClientAppMetadataForTest().instance_id_token());
+            GetClientMetadata(), cryptauthv2::kTestInstanceId,
+            cryptauthv2::kTestInstanceIdToken);
       }());
   return *request_context;
 }
@@ -101,17 +96,10 @@
   void SetUp() override {
     auto mock_timer = std::make_unique<base::MockOneShotTimer>();
     timer_ = mock_timer.get();
-
-    fake_cryptauth_gcm_manager_ = std::make_unique<FakeCryptAuthGCMManager>(
-        kTestCryptAuthGCMRegistrationId);
-
-    fake_client_app_metadata_provider_ =
-        std::make_unique<FakeClientAppMetadataProvider>();
-
     device_activity_getter_ =
         CryptAuthDeviceActivityGetterImpl::Factory::Create(
-            client_factory_.get(), fake_client_app_metadata_provider_.get(),
-            fake_cryptauth_gcm_manager_.get(), std::move(mock_timer));
+            cryptauthv2::kTestInstanceId, cryptauthv2::kTestInstanceIdToken,
+            client_factory_.get(), std::move(mock_timer));
   }
 
   // MockCryptAuthClientFactory::Observer:
@@ -136,14 +124,6 @@
                        base::Unretained(this)));
   }
 
-  void RetrieveClientAppMetadata(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata) {
-    std::move(
-        fake_client_app_metadata_provider_->metadata_requests().back().callback)
-        .Run(client_app_metadata);
-  }
-
   void VerifyGetDevicesActivityStatusRequest() {
     ASSERT_TRUE(get_device_activity_status_request_);
     EXPECT_TRUE(get_device_activity_status_success_callback_);
@@ -218,10 +198,6 @@
   std::unique_ptr<MockCryptAuthClientFactory> client_factory_;
   base::MockOneShotTimer* timer_;
 
-  std::unique_ptr<FakeCryptAuthGCMManager> fake_cryptauth_gcm_manager_;
-  std::unique_ptr<FakeClientAppMetadataProvider>
-      fake_client_app_metadata_provider_;
-
   std::unique_ptr<CryptAuthDeviceActivityGetter> device_activity_getter_;
 
   DISALLOW_COPY_AND_ASSIGN(DeviceSyncCryptAuthDeviceActivityGetterImplTest);
@@ -229,7 +205,6 @@
 
 TEST_F(DeviceSyncCryptAuthDeviceActivityGetterImplTest, Success) {
   GetDeviceActivityStatus();
-  RetrieveClientAppMetadata(cryptauthv2::GetClientAppMetadataForTest());
   VerifyGetDevicesActivityStatusRequest();
   SendGetDevicesActivityStatusResponse();
   VerifyNetworkRequestResult(mojom::NetworkRequestResult::kSuccess);
@@ -245,23 +220,8 @@
 }
 
 TEST_F(DeviceSyncCryptAuthDeviceActivityGetterImplTest,
-       NullMetadata_GetClientAppMetadata) {
-  GetDeviceActivityStatus();
-  RetrieveClientAppMetadata(base::nullopt);
-  VerifyNetworkRequestResult(mojom::NetworkRequestResult::kUnknown);
-}
-
-TEST_F(DeviceSyncCryptAuthDeviceActivityGetterImplTest,
-       Failure_Timeout_GetClientAppMetadata) {
-  GetDeviceActivityStatus();
-  timer()->Fire();
-  VerifyNetworkRequestResult(mojom::NetworkRequestResult::kUnknown);
-}
-
-TEST_F(DeviceSyncCryptAuthDeviceActivityGetterImplTest,
        Failure_Timeout_GetDevicesActivityStatusResponse) {
   GetDeviceActivityStatus();
-  RetrieveClientAppMetadata(cryptauthv2::GetClientAppMetadataForTest());
   VerifyGetDevicesActivityStatusRequest();
   timer()->Fire();
   VerifyNetworkRequestResult(mojom::NetworkRequestResult::kUnknown);
@@ -270,7 +230,6 @@
 TEST_F(DeviceSyncCryptAuthDeviceActivityGetterImplTest,
        Failure_ApiCall_GetDevicesActivityStatus) {
   GetDeviceActivityStatus();
-  RetrieveClientAppMetadata(cryptauthv2::GetClientAppMetadataForTest());
   VerifyGetDevicesActivityStatusRequest();
   FailGetDevicesActivityStatusRequest(NetworkRequestError::kBadRequest);
   VerifyNetworkRequestResult(mojom::NetworkRequestResult::kBadRequest);
diff --git a/chromeos/services/device_sync/cryptauth_device_notifier_impl.cc b/chromeos/services/device_sync/cryptauth_device_notifier_impl.cc
index 249f02c..420e830b 100644
--- a/chromeos/services/device_sync/cryptauth_device_notifier_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_device_notifier_impl.cc
@@ -12,11 +12,8 @@
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/services/device_sync/async_execution_time_metrics_logger.h"
 #include "chromeos/services/device_sync/cryptauth_client.h"
-#include "chromeos/services/device_sync/cryptauth_gcm_manager.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
 #include "chromeos/services/device_sync/cryptauth_task_metrics_logger.h"
-#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
-#include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 
 namespace chromeos {
 
@@ -24,27 +21,10 @@
 
 namespace {
 
-// Timeout values for asynchronous operation.
-// TODO(https://crbug.com/933656): Use async execution time metric to tune these
-// timeout values.
-constexpr base::TimeDelta kWaitingForClientAppMetadataTimeout =
-    base::TimeDelta::FromSeconds(60);
+// TODO(https://crbug.com/933656): Use async execution time metric to tune this.
 constexpr base::TimeDelta kWaitingForBatchNotifyGroupDevicesResponseTimeout =
     kMaxAsyncExecutionTime;
 
-void RecordClientAppMetadataFetchMetrics(const base::TimeDelta& execution_time,
-                                         CryptAuthAsyncTaskResult result) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.DeviceSyncV2.DeviceNotifier.ExecutionTime."
-      "ClientAppMetadataFetch",
-      execution_time, base::TimeDelta::FromSeconds(1) /* min */,
-      kWaitingForClientAppMetadataTimeout /* max */, 100 /* buckets */);
-  LogCryptAuthAsyncTaskSuccessMetric(
-      "CryptAuth.DeviceSyncV2.DeviceNotifier.AsyncTaskResult."
-      "ClientAppMetadataFetch",
-      result);
-}
-
 void RecordBatchNotifyGroupDevicesMetrics(const base::TimeDelta& execution_time,
                                           CryptAuthApiCallResult result) {
   LogAsyncExecutionTimeMetric(
@@ -64,19 +44,17 @@
 // static
 std::unique_ptr<CryptAuthDeviceNotifier>
 CryptAuthDeviceNotifierImpl::Factory::Create(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer) {
   if (test_factory_) {
-    return test_factory_->CreateInstance(client_app_metadata_provider,
-                                         client_factory, gcm_manager,
-                                         std::move(timer));
+    return test_factory_->CreateInstance(instance_id, instance_id_token,
+                                         client_factory, std::move(timer));
   }
 
   return base::WrapUnique(new CryptAuthDeviceNotifierImpl(
-      client_app_metadata_provider, client_factory, gcm_manager,
-      std::move(timer)));
+      instance_id, instance_id_token, client_factory, std::move(timer)));
 }
 
 // static
@@ -88,13 +66,13 @@
 CryptAuthDeviceNotifierImpl::Factory::~Factory() = default;
 
 CryptAuthDeviceNotifierImpl::CryptAuthDeviceNotifierImpl(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer)
-    : client_app_metadata_provider_(client_app_metadata_provider),
+    : instance_id_(instance_id),
+      instance_id_token_(instance_id_token),
       client_factory_(client_factory),
-      gcm_manager_(gcm_manager),
       timer_(std::move(timer)) {}
 
 CryptAuthDeviceNotifierImpl::~CryptAuthDeviceNotifierImpl() = default;
@@ -103,8 +81,6 @@
 base::Optional<base::TimeDelta> CryptAuthDeviceNotifierImpl::GetTimeoutForState(
     State state) {
   switch (state) {
-    case State::kWaitingForClientAppMetadata:
-      return kWaitingForClientAppMetadataTimeout;
     case State::kWaitingForBatchNotifyGroupDevicesResponse:
       return kWaitingForBatchNotifyGroupDevicesResponseTimeout;
     default:
@@ -169,21 +145,11 @@
 }
 
 void CryptAuthDeviceNotifierImpl::OnTimeout() {
+  DCHECK_EQ(state_, State::kWaitingForBatchNotifyGroupDevicesResponse);
   base::TimeDelta execution_time =
       base::TimeTicks::Now() - last_state_change_timestamp_;
-  switch (state_) {
-    case State::kWaitingForClientAppMetadata:
-      RecordClientAppMetadataFetchMetrics(execution_time,
-                                          CryptAuthAsyncTaskResult::kTimeout);
-      break;
-    case State::kWaitingForBatchNotifyGroupDevicesResponse:
-      RecordBatchNotifyGroupDevicesMetrics(execution_time,
-                                           CryptAuthApiCallResult::kTimeout);
-      break;
-    default:
-      NOTREACHED();
-  }
-
+  RecordBatchNotifyGroupDevicesMetrics(execution_time,
+                                       CryptAuthApiCallResult::kTimeout);
   PA_LOG(ERROR) << "Timed out in state " << state_ << ".";
 
   // TODO(https://crbug.com/1011358): Use more specific error codes.
@@ -194,28 +160,14 @@
   if (pending_requests_.empty())
     return;
 
-  if (!client_app_metadata_) {
-    // GCM registration is expected to be completed before the first enrollment.
-    DCHECK(!gcm_manager_->GetRegistrationId().empty())
-        << "DeviceSync requested before GCM registration complete.";
-
-    SetState(State::kWaitingForClientAppMetadata);
-    client_app_metadata_provider_->GetClientAppMetadata(
-        gcm_manager_->GetRegistrationId(),
-        base::BindOnce(&CryptAuthDeviceNotifierImpl::OnClientAppMetadataFetched,
-                       weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
   cryptauthv2::BatchNotifyGroupDevicesRequest request;
   request.mutable_context()->set_group(
       CryptAuthKeyBundle::KeyBundleNameEnumToString(
           CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether));
   request.mutable_context()->mutable_client_metadata()->set_invocation_reason(
       cryptauthv2::ClientMetadata::INVOCATION_REASON_UNSPECIFIED);
-  request.mutable_context()->set_device_id(client_app_metadata_->instance_id());
-  request.mutable_context()->set_device_id_token(
-      client_app_metadata_->instance_id_token());
+  request.mutable_context()->set_device_id(instance_id_);
+  request.mutable_context()->set_device_id_token(instance_id_token_);
   *request.mutable_notify_device_ids() = {
       pending_requests_.front().device_ids.begin(),
       pending_requests_.front().device_ids.end()};
@@ -233,30 +185,6 @@
                  base::Unretained(this)));
 }
 
-void CryptAuthDeviceNotifierImpl::OnClientAppMetadataFetched(
-    const base::Optional<cryptauthv2::ClientAppMetadata>& client_app_metadata) {
-  DCHECK_EQ(State::kWaitingForClientAppMetadata, state_);
-
-  bool success = client_app_metadata.has_value();
-
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_,
-      success ? CryptAuthAsyncTaskResult::kSuccess
-              : CryptAuthAsyncTaskResult::kError);
-
-  if (!success) {
-    PA_LOG(ERROR) << "ClientAppMetadata fetch failed.";
-
-    // TODO(https://crbug.com/1011358): Use more specific error codes.
-    FinishAttempt(NetworkRequestError::kUnknown);
-
-    return;
-  }
-
-  client_app_metadata_ = client_app_metadata;
-  ProcessRequestQueue();
-}
-
 void CryptAuthDeviceNotifierImpl::OnBatchNotifyGroupDevicesSuccess(
     const cryptauthv2::BatchNotifyGroupDevicesResponse& response) {
   DCHECK_EQ(State::kWaitingForBatchNotifyGroupDevicesResponse, state_);
@@ -305,10 +233,6 @@
     case CryptAuthDeviceNotifierImpl::State::kIdle:
       stream << "[CryptAuthDeviceNotifier state: Idle]";
       break;
-    case CryptAuthDeviceNotifierImpl::State::kWaitingForClientAppMetadata:
-      stream << "[CryptAuthDeviceNotifier state: Waiting for "
-             << "ClientAppMetadata]";
-      break;
     case CryptAuthDeviceNotifierImpl::State::
         kWaitingForBatchNotifyGroupDevicesResponse:
       stream << "[CryptAuthDeviceNotifier state: Waiting for "
diff --git a/chromeos/services/device_sync/cryptauth_device_notifier_impl.h b/chromeos/services/device_sync/cryptauth_device_notifier_impl.h
index 95d68551..b7c471c 100644
--- a/chromeos/services/device_sync/cryptauth_device_notifier_impl.h
+++ b/chromeos/services/device_sync/cryptauth_device_notifier_impl.h
@@ -17,7 +17,6 @@
 #include "chromeos/services/device_sync/cryptauth_device_notifier.h"
 #include "chromeos/services/device_sync/cryptauth_feature_type.h"
 #include "chromeos/services/device_sync/network_request_error.h"
-#include "chromeos/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 
@@ -25,10 +24,8 @@
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClient;
 class CryptAuthClientFactory;
-class CryptAuthGCMManager;
 
 // An implementation of CryptAuthDeviceNotifier, using instances of
 // CryptAuthClient to make the BatchNotifyGroupDevices API calls to CryptAuth.
@@ -40,9 +37,9 @@
   class Factory {
    public:
     static std::unique_ptr<CryptAuthDeviceNotifier> Create(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer =
             std::make_unique<base::OneShotTimer>());
     static void SetFactoryForTesting(Factory* test_factory);
@@ -50,9 +47,9 @@
    protected:
     virtual ~Factory();
     virtual std::unique_ptr<CryptAuthDeviceNotifier> CreateInstance(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer) = 0;
 
    private:
@@ -62,11 +59,7 @@
   ~CryptAuthDeviceNotifierImpl() override;
 
  private:
-  enum class State {
-    kIdle,
-    kWaitingForClientAppMetadata,
-    kWaitingForBatchNotifyGroupDevicesResponse
-  };
+  enum class State { kIdle, kWaitingForBatchNotifyGroupDevicesResponse };
 
   friend std::ostream& operator<<(std::ostream& stream, const State& state);
 
@@ -90,11 +83,10 @@
     base::OnceCallback<void(NetworkRequestError)> error_callback;
   };
 
-  CryptAuthDeviceNotifierImpl(
-      ClientAppMetadataProvider* client_app_metadata_provider,
-      CryptAuthClientFactory* client_factory,
-      CryptAuthGCMManager* gcm_manager,
-      std::unique_ptr<base::OneShotTimer> timer);
+  CryptAuthDeviceNotifierImpl(const std::string& instance_id,
+                              const std::string& instance_id_token,
+                              CryptAuthClientFactory* client_factory,
+                              std::unique_ptr<base::OneShotTimer> timer);
 
   // CryptAuthDeviceNotifier:
   void NotifyDevices(
@@ -108,9 +100,6 @@
   void OnTimeout();
 
   void ProcessRequestQueue();
-  void OnClientAppMetadataFetched(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata);
   void OnBatchNotifyGroupDevicesSuccess(
       const cryptauthv2::BatchNotifyGroupDevicesResponse& response);
   void OnBatchNotifyGroupDevicesFailure(NetworkRequestError error);
@@ -118,12 +107,11 @@
 
   State state_ = State::kIdle;
   base::TimeTicks last_state_change_timestamp_;
-  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
   base::queue<Request> pending_requests_;
 
-  ClientAppMetadataProvider* client_app_metadata_provider_ = nullptr;
+  std::string instance_id_;
+  std::string instance_id_token_;
   CryptAuthClientFactory* client_factory_ = nullptr;
-  CryptAuthGCMManager* gcm_manager_ = nullptr;
   std::unique_ptr<CryptAuthClient> cryptauth_client_;
   std::unique_ptr<base::OneShotTimer> timer_;
   base::WeakPtrFactory<CryptAuthDeviceNotifierImpl> weak_ptr_factory_{this};
diff --git a/chromeos/services/device_sync/cryptauth_device_notifier_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_device_notifier_impl_unittest.cc
index d3647e9..c3d247c 100644
--- a/chromeos/services/device_sync/cryptauth_device_notifier_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_device_notifier_impl_unittest.cc
@@ -19,14 +19,11 @@
 #include "chromeos/services/device_sync/cryptauth_device_notifier.h"
 #include "chromeos/services/device_sync/cryptauth_feature_type.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
-#include "chromeos/services/device_sync/fake_cryptauth_gcm_manager.h"
 #include "chromeos/services/device_sync/mock_cryptauth_client.h"
 #include "chromeos/services/device_sync/network_request_error.h"
-#include "chromeos/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
-#include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -53,9 +50,8 @@
       cryptauthv2::BuildRequestContext(
           CryptAuthKeyBundle::KeyBundleNameEnumToString(
               CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether),
-          GetClientMetadata(),
-          cryptauthv2::GetClientAppMetadataForTest().instance_id(),
-          cryptauthv2::GetClientAppMetadataForTest().instance_id_token()));
+          GetClientMetadata(), cryptauthv2::kTestInstanceId,
+          cryptauthv2::kTestInstanceIdToken));
   return *request_context;
 }
 
@@ -99,8 +95,7 @@
 
   DeviceSyncCryptAuthDeviceNotifierImplTest()
       : mock_client_factory_(
-            MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS),
-        fake_gcm_manager_(cryptauthv2::kTestGcmRegistrationId) {
+            MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS) {
     mock_client_factory_.AddObserver(this);
   }
 
@@ -114,8 +109,8 @@
     mock_timer_ = mock_timer.get();
 
     device_notifier_ = CryptAuthDeviceNotifierImpl::Factory::Create(
-        &fake_client_app_metadata_provider_, &mock_client_factory_,
-        &fake_gcm_manager_, std::move(mock_timer));
+        cryptauthv2::kTestInstanceId, cryptauthv2::kTestInstanceIdToken,
+        &mock_client_factory_, std::move(mock_timer));
   }
 
   // MockCryptAuthClientFactory::Observer:
@@ -142,32 +137,6 @@
             base::Unretained(this)));
   }
 
-  void HandleClientAppMetadataRequest(RequestAction request_action) {
-    ASSERT_FALSE(
-        fake_client_app_metadata_provider_.metadata_requests().empty());
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_client_app_metadata_provider_.metadata_requests()
-                  .back()
-                  .gcm_registration_id);
-    switch (request_action) {
-      case RequestAction::kSucceed:
-        std::move(fake_client_app_metadata_provider_.metadata_requests()
-                      .back()
-                      .callback)
-            .Run(cryptauthv2::GetClientAppMetadataForTest());
-        return;
-      case RequestAction::kFail:
-        std::move(fake_client_app_metadata_provider_.metadata_requests()
-                      .back()
-                      .callback)
-            .Run(base::nullopt /* client_app_metadata */);
-        return;
-      case RequestAction::kTimeout:
-        mock_timer_->Fire();
-        return;
-    }
-  }
-
   void HandleNextBatchNotifyGroupDevicesRequest(
       const cryptauthv2::BatchNotifyGroupDevicesRequest& expected_request,
       RequestAction request_action,
@@ -204,11 +173,6 @@
     }
   }
 
-  void VerifyNumberOfClientAppMetadataFetchAttempts(size_t num_attempts) {
-    EXPECT_EQ(num_attempts,
-              fake_client_app_metadata_provider_.metadata_requests().size());
-  }
-
   void VerifyResults(
       const std::vector<base::Optional<NetworkRequestError>> expected_results) {
     // Verify that all requests were processed.
@@ -246,9 +210,7 @@
   // base::nullopt indicates a success.
   std::vector<base::Optional<NetworkRequestError>> results_;
 
-  FakeClientAppMetadataProvider fake_client_app_metadata_provider_;
   MockCryptAuthClientFactory mock_client_factory_;
-  FakeCryptAuthGCMManager fake_gcm_manager_;
   base::MockOneShotTimer* mock_timer_ = nullptr;
 
   std::unique_ptr<CryptAuthDeviceNotifier> device_notifier_;
@@ -257,65 +219,48 @@
 };
 
 TEST_F(DeviceSyncCryptAuthDeviceNotifierImplTest, Test) {
-  // Queue up 6 requests before any finish. They should be processed
+  // Queue up 4 requests before any finish. They should be processed
   // sequentially.
   NotifyDevices({"device_id_1"}, cryptauthv2::TargetService::ENROLLMENT,
-                CryptAuthFeatureType::kEasyUnlockClientEnabled);
-  NotifyDevices({"device_id_2"}, cryptauthv2::TargetService::DEVICE_SYNC,
-                CryptAuthFeatureType::kSmsConnectHostSupported);
-  NotifyDevices({"device_id_3"}, cryptauthv2::TargetService::ENROLLMENT,
                 CryptAuthFeatureType::kBetterTogetherHostEnabled);
-  NotifyDevices({"device_id_4", "device_id_5"},
+  NotifyDevices({"device_id_2", "device_id_3"},
                 cryptauthv2::TargetService::DEVICE_SYNC,
                 CryptAuthFeatureType::kMagicTetherClientSupported);
-  NotifyDevices({"device_id_6", "device_id_7"},
+  NotifyDevices({"device_id_4", "device_id_5"},
                 cryptauthv2::TargetService::ENROLLMENT,
                 CryptAuthFeatureType::kBetterTogetherHostEnabled);
-  NotifyDevices({"device_id_8"}, cryptauthv2::TargetService::DEVICE_SYNC,
+  NotifyDevices({"device_id_6"}, cryptauthv2::TargetService::DEVICE_SYNC,
                 CryptAuthFeatureType::kMagicTetherClientSupported);
 
   // base::nullopt indicates a success.
   std::vector<base::Optional<NetworkRequestError>> expected_results;
 
-  // Timeout waiting for ClientAppMetadata.
-  HandleClientAppMetadataRequest(RequestAction::kTimeout);
-  expected_results.push_back(NetworkRequestError::kUnknown);
-
-  // Fail ClientAppMetadata fetch.
-  HandleClientAppMetadataRequest(RequestAction::kFail);
-  expected_results.push_back(NetworkRequestError::kUnknown);
-
   // Timeout waiting for BatchNotifyGroupDevices.
-  HandleClientAppMetadataRequest(RequestAction::kSucceed);
   HandleNextBatchNotifyGroupDevicesRequest(
-      NotifyEnrollmentBetterTogetherHostEnabledRequest({"device_id_3"}),
+      NotifyEnrollmentBetterTogetherHostEnabledRequest({"device_id_1"}),
       RequestAction::kTimeout);
   expected_results.push_back(NetworkRequestError::kUnknown);
 
   // Fail BatchNotifyGroupDevices call with "Bad Request".
   HandleNextBatchNotifyGroupDevicesRequest(
       NotifyDeviceSyncMagicTetherSupportedRequest(
-          {"device_id_4", "device_id_5"}),
+          {"device_id_2", "device_id_3"}),
       RequestAction::kFail, NetworkRequestError::kBadRequest);
   expected_results.push_back(NetworkRequestError::kBadRequest);
 
   // Succeed notifying devices.
   HandleNextBatchNotifyGroupDevicesRequest(
       NotifyEnrollmentBetterTogetherHostEnabledRequest(
-          {"device_id_6", "device_id_7"}),
+          {"device_id_4", "device_id_5"}),
       RequestAction::kSucceed);
   expected_results.push_back(base::nullopt);
 
   // Succeed notifying devices.
   HandleNextBatchNotifyGroupDevicesRequest(
-      NotifyDeviceSyncMagicTetherSupportedRequest({"device_id_8"}),
+      NotifyDeviceSyncMagicTetherSupportedRequest({"device_id_6"}),
       RequestAction::kSucceed);
   expected_results.push_back(base::nullopt);
 
-  // There was 1 timeout, 1 failed attempt, and 1 successful attempt to retrieve
-  // ClientAppMetadata.
-  VerifyNumberOfClientAppMetadataFetchAttempts(3u);
-
   VerifyResults(expected_results);
 }
 
diff --git a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.cc b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.cc
index 4054c4fb..d85270c 100644
--- a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.cc
@@ -12,11 +12,10 @@
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/services/device_sync/async_execution_time_metrics_logger.h"
 #include "chromeos/services/device_sync/cryptauth_client.h"
-#include "chromeos/services/device_sync/cryptauth_gcm_manager.h"
+#include "chromeos/services/device_sync/cryptauth_feature_type.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
 #include "chromeos/services/device_sync/cryptauth_task_metrics_logger.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
-#include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 
 namespace chromeos {
 
@@ -24,27 +23,10 @@
 
 namespace {
 
-// Timeout values for asynchronous operations.
-// TODO(https://crbug.com/933656): Use async execution time metric to tune these
-// timeout values.
-constexpr base::TimeDelta kWaitingForClientAppMetadataTimeout =
-    base::TimeDelta::FromSeconds(60);
+// TODO(https://crbug.com/933656): Use async execution time metric to tune this.
 constexpr base::TimeDelta kWaitingForBatchSetFeatureStatusesResponseTimeout =
     kMaxAsyncExecutionTime;
 
-void RecordClientAppMetadataFetchMetrics(const base::TimeDelta& execution_time,
-                                         CryptAuthAsyncTaskResult result) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.DeviceSyncV2.FeatureStatusSetter.ExecutionTime."
-      "ClientAppMetadataFetch",
-      execution_time, base::TimeDelta::FromSeconds(1) /* min */,
-      kWaitingForClientAppMetadataTimeout /* max */, 100 /* buckets */);
-  LogCryptAuthAsyncTaskSuccessMetric(
-      "CryptAuth.DeviceSyncV2.FeatureStatusSetter.AsyncTaskResult."
-      "ClientAppMetadataFetch",
-      result);
-}
-
 void RecordBatchSetFeatureStatusesMetrics(const base::TimeDelta& execution_time,
                                           CryptAuthApiCallResult result) {
   LogAsyncExecutionTimeMetric(
@@ -66,18 +48,16 @@
 // static
 std::unique_ptr<CryptAuthFeatureStatusSetter>
 CryptAuthFeatureStatusSetterImpl::Factory::Create(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer) {
   if (test_factory_)
-    return test_factory_->CreateInstance(client_app_metadata_provider,
-                                         client_factory, gcm_manager,
-                                         std::move(timer));
+    return test_factory_->CreateInstance(instance_id, instance_id_token,
+                                         client_factory, std::move(timer));
 
   return base::WrapUnique(new CryptAuthFeatureStatusSetterImpl(
-      client_app_metadata_provider, client_factory, gcm_manager,
-      std::move(timer)));
+      instance_id, instance_id_token, client_factory, std::move(timer)));
 }
 
 // static
@@ -89,13 +69,13 @@
 CryptAuthFeatureStatusSetterImpl::Factory::~Factory() = default;
 
 CryptAuthFeatureStatusSetterImpl::CryptAuthFeatureStatusSetterImpl(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer)
-    : client_app_metadata_provider_(client_app_metadata_provider),
+    : instance_id_(instance_id),
+      instance_id_token_(instance_id_token),
       client_factory_(client_factory),
-      gcm_manager_(gcm_manager),
       timer_(std::move(timer)) {}
 
 CryptAuthFeatureStatusSetterImpl::~CryptAuthFeatureStatusSetterImpl() = default;
@@ -104,8 +84,6 @@
 base::Optional<base::TimeDelta>
 CryptAuthFeatureStatusSetterImpl::GetTimeoutForState(State state) {
   switch (state) {
-    case State::kWaitingForClientAppMetadata:
-      return kWaitingForClientAppMetadataTimeout;
     case State::kWaitingForBatchSetFeatureStatusesResponse:
       return kWaitingForBatchSetFeatureStatusesResponseTimeout;
     default:
@@ -166,21 +144,11 @@
 }
 
 void CryptAuthFeatureStatusSetterImpl::OnTimeout() {
+  DCHECK_EQ(state_, State::kWaitingForBatchSetFeatureStatusesResponse);
   base::TimeDelta execution_time =
       base::TimeTicks::Now() - last_state_change_timestamp_;
-  switch (state_) {
-    case State::kWaitingForClientAppMetadata:
-      RecordClientAppMetadataFetchMetrics(execution_time,
-                                          CryptAuthAsyncTaskResult::kTimeout);
-      break;
-    case State::kWaitingForBatchSetFeatureStatusesResponse:
-      RecordBatchSetFeatureStatusesMetrics(execution_time,
-                                           CryptAuthApiCallResult::kTimeout);
-      break;
-    default:
-      NOTREACHED();
-  }
-
+  RecordBatchSetFeatureStatusesMetrics(execution_time,
+                                       CryptAuthApiCallResult::kTimeout);
   PA_LOG(ERROR) << "Timed out in state " << state_ << ".";
 
   // TODO(https://crbug.com/1011358): Use more specific error codes.
@@ -191,29 +159,14 @@
   if (pending_requests_.empty())
     return;
 
-  if (!client_app_metadata_) {
-    // GCM registration is expected to be completed before the first enrollment.
-    DCHECK(!gcm_manager_->GetRegistrationId().empty())
-        << "DeviceSync requested before GCM registration complete.";
-
-    SetState(State::kWaitingForClientAppMetadata);
-    client_app_metadata_provider_->GetClientAppMetadata(
-        gcm_manager_->GetRegistrationId(),
-        base::BindOnce(
-            &CryptAuthFeatureStatusSetterImpl::OnClientAppMetadataFetched,
-            weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
   cryptauthv2::BatchSetFeatureStatusesRequest request;
   request.mutable_context()->set_group(
       CryptAuthKeyBundle::KeyBundleNameEnumToString(
           CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether));
   request.mutable_context()->mutable_client_metadata()->set_invocation_reason(
       cryptauthv2::ClientMetadata::FEATURE_TOGGLED);
-  request.mutable_context()->set_device_id(client_app_metadata_->instance_id());
-  request.mutable_context()->set_device_id_token(
-      client_app_metadata_->instance_id_token());
+  request.mutable_context()->set_device_id(instance_id_);
+  request.mutable_context()->set_device_id_token(instance_id_token_);
 
   cryptauthv2::DeviceFeatureStatus* device_feature_status =
       request.add_device_feature_statuses();
@@ -252,30 +205,6 @@
           base::Unretained(this)));
 }
 
-void CryptAuthFeatureStatusSetterImpl::OnClientAppMetadataFetched(
-    const base::Optional<cryptauthv2::ClientAppMetadata>& client_app_metadata) {
-  DCHECK_EQ(State::kWaitingForClientAppMetadata, state_);
-
-  bool success = client_app_metadata.has_value();
-
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_,
-      success ? CryptAuthAsyncTaskResult::kSuccess
-              : CryptAuthAsyncTaskResult::kError);
-
-  if (!success) {
-    PA_LOG(ERROR) << "ClientAppMetadata fetch failed.";
-
-    // TODO(https://crbug.com/1011358): Use more specific error codes.
-    FinishAttempt(NetworkRequestError::kUnknown);
-
-    return;
-  }
-
-  client_app_metadata_ = client_app_metadata;
-  ProcessRequestQueue();
-}
-
 void CryptAuthFeatureStatusSetterImpl::OnBatchSetFeatureStatusesSuccess(
     const cryptauthv2::BatchSetFeatureStatusesResponse& response) {
   DCHECK_EQ(State::kWaitingForBatchSetFeatureStatusesResponse, state_);
@@ -314,10 +243,6 @@
     case CryptAuthFeatureStatusSetterImpl::State::kIdle:
       stream << "[CryptAuthFeatureStatusSetter state: Idle]";
       break;
-    case CryptAuthFeatureStatusSetterImpl::State::kWaitingForClientAppMetadata:
-      stream << "[CryptAuthFeatureStatusSetter state: Waiting for "
-             << "ClientAppMetadata]";
-      break;
     case CryptAuthFeatureStatusSetterImpl::State::
         kWaitingForBatchSetFeatureStatusesResponse:
       stream << "[CryptAuthFeatureStatusSetter state: Waiting for "
diff --git a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.h b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.h
index 01ea9a6..7c4e8d5 100644
--- a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.h
+++ b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl.h
@@ -19,17 +19,14 @@
 #include "chromeos/services/device_sync/cryptauth_feature_status_setter.h"
 #include "chromeos/services/device_sync/feature_status_change.h"
 #include "chromeos/services/device_sync/network_request_error.h"
-#include "chromeos/services/device_sync/proto/cryptauth_client_app_metadata.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 
 namespace chromeos {
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClient;
 class CryptAuthClientFactory;
-class CryptAuthGCMManager;
 
 // An implementation of CryptAuthFeatureStatusSetter, using instances of
 // CryptAuthClient to make the BatchSetFeatureStatuses API calls to CryptAuth.
@@ -41,9 +38,9 @@
   class Factory {
    public:
     static std::unique_ptr<CryptAuthFeatureStatusSetter> Create(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer =
             std::make_unique<base::OneShotTimer>());
 
@@ -52,9 +49,9 @@
    protected:
     virtual ~Factory();
     virtual std::unique_ptr<CryptAuthFeatureStatusSetter> CreateInstance(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const std::string& instance_id,
+        const std::string& instance_id_token,
         CryptAuthClientFactory* client_factory,
-        CryptAuthGCMManager* gcm_manager,
         std::unique_ptr<base::OneShotTimer> timer) = 0;
 
    private:
@@ -64,11 +61,7 @@
   ~CryptAuthFeatureStatusSetterImpl() override;
 
  private:
-  enum class State {
-    kIdle,
-    kWaitingForClientAppMetadata,
-    kWaitingForBatchSetFeatureStatusesResponse
-  };
+  enum class State { kIdle, kWaitingForBatchSetFeatureStatusesResponse };
 
   friend std::ostream& operator<<(std::ostream& stream, const State& state);
 
@@ -92,11 +85,10 @@
     base::OnceCallback<void(NetworkRequestError)> error_callback;
   };
 
-  CryptAuthFeatureStatusSetterImpl(
-      ClientAppMetadataProvider* client_app_metadata_provider,
-      CryptAuthClientFactory* client_factory,
-      CryptAuthGCMManager* gcm_manager,
-      std::unique_ptr<base::OneShotTimer> timer);
+  CryptAuthFeatureStatusSetterImpl(const std::string& instance_id,
+                                   const std::string& instance_id_token,
+                                   CryptAuthClientFactory* client_factory,
+                                   std::unique_ptr<base::OneShotTimer> timer);
 
   // CryptAuthFeatureStatusSetter:
   void SetFeatureStatus(
@@ -110,9 +102,6 @@
   void OnTimeout();
 
   void ProcessRequestQueue();
-  void OnClientAppMetadataFetched(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata);
   void OnBatchSetFeatureStatusesSuccess(
       const cryptauthv2::BatchSetFeatureStatusesResponse& response);
   void OnBatchSetFeatureStatusesFailure(NetworkRequestError error);
@@ -120,12 +109,11 @@
 
   State state_ = State::kIdle;
   base::TimeTicks last_state_change_timestamp_;
-  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
   base::queue<Request> pending_requests_;
 
-  ClientAppMetadataProvider* client_app_metadata_provider_ = nullptr;
+  std::string instance_id_;
+  std::string instance_id_token_;
   CryptAuthClientFactory* client_factory_ = nullptr;
-  CryptAuthGCMManager* gcm_manager_ = nullptr;
   std::unique_ptr<CryptAuthClient> cryptauth_client_;
   std::unique_ptr<base::OneShotTimer> timer_;
   base::WeakPtrFactory<CryptAuthFeatureStatusSetterImpl> weak_ptr_factory_{
diff --git a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl_unittest.cc
index 8ec991e..10fd2e8c 100644
--- a/chromeos/services/device_sync/cryptauth_feature_status_setter_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_feature_status_setter_impl_unittest.cc
@@ -14,8 +14,8 @@
 #include "base/optional.h"
 #include "base/timer/mock_timer.h"
 #include "chromeos/services/device_sync/cryptauth_client.h"
+#include "chromeos/services/device_sync/cryptauth_feature_type.h"
 #include "chromeos/services/device_sync/cryptauth_key_bundle.h"
-#include "chromeos/services/device_sync/fake_cryptauth_gcm_manager.h"
 #include "chromeos/services/device_sync/feature_status_change.h"
 #include "chromeos/services/device_sync/mock_cryptauth_client.h"
 #include "chromeos/services/device_sync/network_request_error.h"
@@ -23,7 +23,6 @@
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_devicesync.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
-#include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -50,9 +49,8 @@
       cryptauthv2::BuildRequestContext(
           CryptAuthKeyBundle::KeyBundleNameEnumToString(
               CryptAuthKeyBundle::Name::kDeviceSyncBetterTogether),
-          GetClientMetadata(),
-          cryptauthv2::GetClientAppMetadataForTest().instance_id(),
-          cryptauthv2::GetClientAppMetadataForTest().instance_id_token()));
+          GetClientMetadata(), cryptauthv2::kTestInstanceId,
+          cryptauthv2::kTestInstanceIdToken));
   return *request_context;
 }
 
@@ -122,8 +120,7 @@
 
   DeviceSyncCryptAuthFeatureStatusSetterImplTest()
       : mock_client_factory_(
-            MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS),
-        fake_gcm_manager_(cryptauthv2::kTestGcmRegistrationId) {
+            MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS) {
     mock_client_factory_.AddObserver(this);
   }
 
@@ -137,8 +134,8 @@
     mock_timer_ = mock_timer.get();
 
     feature_status_setter_ = CryptAuthFeatureStatusSetterImpl::Factory::Create(
-        &fake_client_app_metadata_provider_, &mock_client_factory_,
-        &fake_gcm_manager_, std::move(mock_timer));
+        cryptauthv2::kTestInstanceId, cryptauthv2::kTestInstanceIdToken,
+        &mock_client_factory_, std::move(mock_timer));
   }
 
   // MockCryptAuthClientFactory::Observer:
@@ -166,32 +163,6 @@
                        base::Unretained(this)));
   }
 
-  void HandleClientAppMetadataRequest(RequestAction request_action) {
-    ASSERT_FALSE(
-        fake_client_app_metadata_provider_.metadata_requests().empty());
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_client_app_metadata_provider_.metadata_requests()
-                  .back()
-                  .gcm_registration_id);
-    switch (request_action) {
-      case RequestAction::kSucceed:
-        std::move(fake_client_app_metadata_provider_.metadata_requests()
-                      .back()
-                      .callback)
-            .Run(cryptauthv2::GetClientAppMetadataForTest());
-        return;
-      case RequestAction::kFail:
-        std::move(fake_client_app_metadata_provider_.metadata_requests()
-                      .back()
-                      .callback)
-            .Run(base::nullopt /* client_app_metadata */);
-        return;
-      case RequestAction::kTimeout:
-        mock_timer_->Fire();
-        return;
-    }
-  }
-
   void HandleNextBatchSetFeatureStatusesRequest(
       const cryptauthv2::BatchSetFeatureStatusesRequest& expected_request,
       RequestAction request_action,
@@ -228,11 +199,6 @@
     }
   }
 
-  void VerifyNumberOfClientAppMetadataFetchAttempts(size_t num_attempts) {
-    EXPECT_EQ(num_attempts,
-              fake_client_app_metadata_provider_.metadata_requests().size());
-  }
-
   void VerifyResults(
       const std::vector<base::Optional<NetworkRequestError>> expected_results) {
     // Verify that all requests were processed.
@@ -270,9 +236,7 @@
   // base::nullopt indicates a success.
   std::vector<base::Optional<NetworkRequestError>> results_;
 
-  FakeClientAppMetadataProvider fake_client_app_metadata_provider_;
   MockCryptAuthClientFactory mock_client_factory_;
-  FakeCryptAuthGCMManager fake_gcm_manager_;
   base::MockOneShotTimer* mock_timer_ = nullptr;
 
   std::unique_ptr<CryptAuthFeatureStatusSetter> feature_status_setter_;
@@ -281,64 +245,46 @@
 };
 
 TEST_F(DeviceSyncCryptAuthFeatureStatusSetterImplTest, Test) {
-  // Queue up 6 requests before any finish. They should be processed
+  // Queue up 4 requests before any finish. They should be processed
   // sequentially.
-  SetFeatureStatus("device_id_1",
-                   multidevice::SoftwareFeature::kSmartLockClient,
-                   FeatureStatusChange::kDisable);
-  SetFeatureStatus("device_id_2",
-                   multidevice::SoftwareFeature::kInstantTetheringHost,
-                   FeatureStatusChange::kEnableNonExclusively);
-  SetFeatureStatus("device_id_3", multidevice::SoftwareFeature::kSmartLockHost,
+  SetFeatureStatus("device_id_1", multidevice::SoftwareFeature::kSmartLockHost,
                    FeatureStatusChange::kEnableExclusively);
+  SetFeatureStatus("device_id_2",
+                   multidevice::SoftwareFeature::kInstantTetheringClient,
+                   FeatureStatusChange::kDisable);
+  SetFeatureStatus("device_id_3",
+                   multidevice::SoftwareFeature::kInstantTetheringClient,
+                   FeatureStatusChange::kDisable);
   SetFeatureStatus("device_id_4",
-                   multidevice::SoftwareFeature::kInstantTetheringClient,
-                   FeatureStatusChange::kDisable);
-  SetFeatureStatus("device_id_5",
-                   multidevice::SoftwareFeature::kInstantTetheringClient,
-                   FeatureStatusChange::kDisable);
-  SetFeatureStatus("device_id_6",
                    multidevice::SoftwareFeature::kBetterTogetherHost,
                    FeatureStatusChange::kEnableNonExclusively);
 
   // base::nullopt indicates a success.
   std::vector<base::Optional<NetworkRequestError>> expected_results;
 
-  // Timeout waiting for ClientAppMetadata.
-  HandleClientAppMetadataRequest(RequestAction::kTimeout);
-  expected_results.push_back(NetworkRequestError::kUnknown);
-
-  // Fail ClientAppMetadata fetch.
-  HandleClientAppMetadataRequest(RequestAction::kFail);
-  expected_results.push_back(NetworkRequestError::kUnknown);
-
   // Timeout waiting for BatchSetFeatureStatuses.
-  HandleClientAppMetadataRequest(RequestAction::kSucceed);
   HandleNextBatchSetFeatureStatusesRequest(
-      SmartLockHostExclusivelyEnabledRequest("device_id_3"),
+      SmartLockHostExclusivelyEnabledRequest("device_id_1"),
       RequestAction::kTimeout);
   expected_results.push_back(NetworkRequestError::kUnknown);
 
   // Fail BatchSetFeatureStatuses call with "Bad Request".
   HandleNextBatchSetFeatureStatusesRequest(
-      InstantTetherClientDisabledRequest("device_id_4"), RequestAction::kFail,
+      InstantTetherClientDisabledRequest("device_id_2"), RequestAction::kFail,
       NetworkRequestError::kBadRequest);
   expected_results.push_back(NetworkRequestError::kBadRequest);
 
   // Succeed disabling InstantTethering client.
   HandleNextBatchSetFeatureStatusesRequest(
-      InstantTetherClientDisabledRequest("device_id_5"),
+      InstantTetherClientDisabledRequest("device_id_3"),
       RequestAction::kSucceed);
   expected_results.push_back(base::nullopt);
 
   // Succeed enabling BetterTogether host.
   HandleNextBatchSetFeatureStatusesRequest(
-      BetterTogetherHostEnabledRequest("device_id_6"), RequestAction::kSucceed);
+      BetterTogetherHostEnabledRequest("device_id_4"), RequestAction::kSucceed);
   expected_results.push_back(base::nullopt);
 
-  // There was 1 timeout, 1 failed attempt, and 1 successful attempt.
-  VerifyNumberOfClientAppMetadataFetchAttempts(3u);
-
   VerifyResults(expected_results);
 }
 
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc
index 3bf70fd..0582121 100644
--- a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.cc
@@ -4,7 +4,6 @@
 
 #include "chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h"
 
-#include <sstream>
 #include <utility>
 
 #include "base/memory/ptr_util.h"
@@ -13,9 +12,7 @@
 #include "chromeos/services/device_sync/cryptauth_client.h"
 #include "chromeos/services/device_sync/cryptauth_device_syncer_impl.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry.h"
-#include "chromeos/services/device_sync/cryptauth_task_metrics_logger.h"
 #include "chromeos/services/device_sync/proto/cryptauth_logging.h"
-#include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 
 namespace chromeos {
 
@@ -23,26 +20,6 @@
 
 namespace {
 
-// Timeout value for asynchronous operation.
-// TODO(https://crbug.com/933656): Use async execution time metrics to tune this
-// timeout value. For now, set this timeout to the max execution time recorded
-// by the metrics.
-constexpr base::TimeDelta kWaitingForClientAppMetadataTimeout =
-    base::TimeDelta::FromSeconds(60);
-
-void RecordClientAppMetadataFetchMetrics(const base::TimeDelta& execution_time,
-                                         CryptAuthAsyncTaskResult result) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.DeviceSyncV2.DeviceManager.ExecutionTime."
-      "ClientAppMetadataFetch",
-      execution_time, base::TimeDelta::FromSeconds(1) /* min */,
-      kWaitingForClientAppMetadataTimeout /* max */, 100 /* buckets */);
-  LogCryptAuthAsyncTaskSuccessMetric(
-      "CryptAuth.DeviceSyncV2.DeviceManager.AsyncTaskResult."
-      "ClientAppMetadataFetch",
-      result);
-}
-
 void RecordDeviceSyncResult(CryptAuthDeviceSyncResult result) {
   base::UmaHistogramEnumeration("CryptAuth.DeviceSyncV2.Result.ResultType",
                                 result.GetResultType());
@@ -62,23 +39,22 @@
 // static
 std::unique_ptr<CryptAuthV2DeviceManager>
 CryptAuthV2DeviceManagerImpl::Factory::Create(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const cryptauthv2::ClientAppMetadata& client_app_metadata,
     CryptAuthDeviceRegistry* device_registry,
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
     CryptAuthScheduler* scheduler,
-    PrefService* pref_service,
-    std::unique_ptr<base::OneShotTimer> timer) {
+    PrefService* pref_service) {
   if (test_factory_) {
-    return test_factory_->CreateInstance(
-        client_app_metadata_provider, device_registry, key_registry,
-        client_factory, gcm_manager, scheduler, pref_service, std::move(timer));
+    return test_factory_->CreateInstance(client_app_metadata, device_registry,
+                                         key_registry, client_factory,
+                                         gcm_manager, scheduler, pref_service);
   }
 
   return base::WrapUnique(new CryptAuthV2DeviceManagerImpl(
-      client_app_metadata_provider, device_registry, key_registry,
-      client_factory, gcm_manager, scheduler, pref_service, std::move(timer)));
+      client_app_metadata, device_registry, key_registry, client_factory,
+      gcm_manager, scheduler, pref_service));
 }
 
 // static
@@ -90,22 +66,20 @@
 CryptAuthV2DeviceManagerImpl::Factory::~Factory() = default;
 
 CryptAuthV2DeviceManagerImpl::CryptAuthV2DeviceManagerImpl(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const cryptauthv2::ClientAppMetadata& client_app_metadata,
     CryptAuthDeviceRegistry* device_registry,
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
     CryptAuthScheduler* scheduler,
-    PrefService* pref_service,
-    std::unique_ptr<base::OneShotTimer> timer)
-    : client_app_metadata_provider_(client_app_metadata_provider),
+    PrefService* pref_service)
+    : client_app_metadata_(client_app_metadata),
       device_registry_(device_registry),
       key_registry_(key_registry),
       client_factory_(client_factory),
       gcm_manager_(gcm_manager),
       scheduler_(scheduler),
-      pref_service_(pref_service),
-      timer_(std::move(timer)) {
+      pref_service_(pref_service) {
   gcm_manager_->AddObserver(this);
 }
 
@@ -162,21 +136,13 @@
       current_client_metadata_->invocation_reason(),
       cryptauthv2::ClientMetadata::InvocationReason_ARRAYSIZE);
 
-  if (!client_app_metadata_) {
-    // GCM registration is expected to be completed before the first enrollment.
-    DCHECK(!gcm_manager_->GetRegistrationId().empty())
-        << "DeviceSync requested before GCM registration complete.";
-
-    SetState(State::kWaitingForClientAppMetadata);
-    client_app_metadata_provider_->GetClientAppMetadata(
-        gcm_manager_->GetRegistrationId(),
-        base::BindOnce(
-            &CryptAuthV2DeviceManagerImpl::OnClientAppMetadataFetched,
-            callback_weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
-  AttemptDeviceSync();
+  PA_LOG(VERBOSE) << "Starting CryptAuth v2 DeviceSync.";
+  device_syncer_ = CryptAuthDeviceSyncerImpl::Factory::Create(
+      device_registry_, key_registry_, client_factory_, pref_service_);
+  device_syncer_->Sync(
+      *current_client_metadata_, client_app_metadata_,
+      base::BindOnce(&CryptAuthV2DeviceManagerImpl::OnDeviceSyncFinished,
+                     base::Unretained(this)));
 }
 
 void CryptAuthV2DeviceManagerImpl::OnResyncMessage(
@@ -188,82 +154,8 @@
   ForceDeviceSyncNow(cryptauthv2::ClientMetadata::SERVER_INITIATED, session_id);
 }
 
-void CryptAuthV2DeviceManagerImpl::SetState(State state) {
-  timer_->Stop();
-
-  PA_LOG(INFO) << "Transitioning from " << state_ << " to " << state << ".";
-  state_ = state;
-  last_state_change_timestamp_ = base::TimeTicks::Now();
-
-  // Note: CryptAuthDeviceSyncerImpl guarantees that the callback passed to its
-  // public method is always invoked; in other words, the class handles is
-  // relevant timeouts internally.
-  if (state_ != State::kWaitingForClientAppMetadata)
-    return;
-
-  timer_->Start(FROM_HERE, kWaitingForClientAppMetadataTimeout,
-                base::BindOnce(&CryptAuthV2DeviceManagerImpl::OnTimeout,
-                               callback_weak_ptr_factory_.GetWeakPtr()));
-}
-
-void CryptAuthV2DeviceManagerImpl::OnTimeout() {
-  DCHECK_EQ(State::kWaitingForClientAppMetadata, state_);
-
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_,
-      CryptAuthAsyncTaskResult::kTimeout);
-
-  OnDeviceSyncFinished(
-      CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::
-                                    kErrorTimeoutWaitingForClientAppMetadata,
-                                false /* did_device_registry_change */,
-                                base::nullopt /* client_directive */));
-}
-
-void CryptAuthV2DeviceManagerImpl::OnClientAppMetadataFetched(
-    const base::Optional<cryptauthv2::ClientAppMetadata>& client_app_metadata) {
-  DCHECK(state_ == State::kWaitingForClientAppMetadata);
-
-  bool success = client_app_metadata.has_value();
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_,
-      success ? CryptAuthAsyncTaskResult::kSuccess
-              : CryptAuthAsyncTaskResult::kError);
-  if (!success) {
-    OnDeviceSyncFinished(
-        CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::
-                                      kErrorClientAppMetadataFetchFailed,
-                                  false /* did_device_registry_change */,
-                                  base::nullopt /* client_directive */));
-    return;
-  }
-
-  client_app_metadata_ = client_app_metadata;
-
-  AttemptDeviceSync();
-}
-
-void CryptAuthV2DeviceManagerImpl::AttemptDeviceSync() {
-  DCHECK(current_client_metadata_);
-  DCHECK(client_app_metadata_);
-
-  device_syncer_ = CryptAuthDeviceSyncerImpl::Factory::Create(
-      device_registry_, key_registry_, client_factory_, pref_service_);
-
-  SetState(State::kWaitingForDeviceSync);
-
-  device_syncer_->Sync(
-      *current_client_metadata_, *client_app_metadata_,
-      base::BindOnce(&CryptAuthV2DeviceManagerImpl::OnDeviceSyncFinished,
-                     callback_weak_ptr_factory_.GetWeakPtr()));
-}
-
 void CryptAuthV2DeviceManagerImpl::OnDeviceSyncFinished(
     CryptAuthDeviceSyncResult device_sync_result) {
-  // Once a DeviceSync attempt finishes, no other callbacks should be invoked.
-  // This is particularly relevant for timeout failures.
-  callback_weak_ptr_factory_.InvalidateWeakPtrs();
-
   device_syncer_.reset();
 
   std::stringstream prefix;
@@ -309,28 +201,9 @@
                  << scheduler_->GetNumConsecutiveDeviceSyncFailures() << ".";
   }
 
-  SetState(State::kIdle);
-
   NotifyDeviceSyncFinished(device_sync_result);
 }
 
-std::ostream& operator<<(std::ostream& stream,
-                         const CryptAuthV2DeviceManagerImpl::State& state) {
-  switch (state) {
-    case CryptAuthV2DeviceManagerImpl::State::kIdle:
-      stream << "[DeviceManager state: Idle]";
-      break;
-    case CryptAuthV2DeviceManagerImpl::State::kWaitingForClientAppMetadata:
-      stream << "[DeviceManager state: Waiting for ClientAppMetadata]";
-      break;
-    case CryptAuthV2DeviceManagerImpl::State::kWaitingForDeviceSync:
-      stream << "[DeviceManager state: Waiting for DeviceSync to finish]";
-      break;
-  }
-
-  return stream;
-}
-
 }  // namespace device_sync
 
 }  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h
index 542f873..12019c8a4 100644
--- a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h
+++ b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl.h
@@ -13,7 +13,6 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/time/time.h"
-#include "base/timer/timer.h"
 #include "chromeos/services/device_sync/cryptauth_device_registry.h"
 #include "chromeos/services/device_sync/cryptauth_device_sync_result.h"
 #include "chromeos/services/device_sync/cryptauth_gcm_manager.h"
@@ -28,7 +27,6 @@
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClientFactory;
 class CryptAuthDeviceSyncer;
 class CryptAuthKeyRegistry;
@@ -48,28 +46,25 @@
   class Factory {
    public:
     static std::unique_ptr<CryptAuthV2DeviceManager> Create(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const cryptauthv2::ClientAppMetadata& client_app_metadata,
         CryptAuthDeviceRegistry* device_registry,
         CryptAuthKeyRegistry* key_registry,
         CryptAuthClientFactory* client_factory,
         CryptAuthGCMManager* gcm_manager,
         CryptAuthScheduler* scheduler,
-        PrefService* pref_service,
-        std::unique_ptr<base::OneShotTimer> timer =
-            std::make_unique<base::OneShotTimer>());
+        PrefService* pref_service);
     static void SetFactoryForTesting(Factory* test_factory);
 
    protected:
     virtual ~Factory();
     virtual std::unique_ptr<CryptAuthV2DeviceManager> CreateInstance(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const cryptauthv2::ClientAppMetadata& client_app_metadata,
         CryptAuthDeviceRegistry* device_registry,
         CryptAuthKeyRegistry* key_registry,
         CryptAuthClientFactory* client_factory,
         CryptAuthGCMManager* gcm_manager,
         CryptAuthScheduler* scheduler,
-        PrefService* pref_service,
-        std::unique_ptr<base::OneShotTimer> timer) = 0;
+        PrefService* pref_service) = 0;
 
    private:
     static Factory* test_factory_;
@@ -79,24 +74,15 @@
 
  protected:
   CryptAuthV2DeviceManagerImpl(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       CryptAuthDeviceRegistry* device_registry,
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
       CryptAuthScheduler* scheduler,
-      PrefService* pref_service,
-      std::unique_ptr<base::OneShotTimer> timer);
+      PrefService* pref_service);
 
  private:
-  enum class State {
-    kIdle,
-    kWaitingForClientAppMetadata,
-    kWaitingForDeviceSync
-  };
-
-  friend std::ostream& operator<<(std::ostream& stream, const State& state);
-
   // CryptAuthV2DeviceManager:
   void Start() override;
   const CryptAuthDeviceRegistry::InstanceIdToDeviceMap& GetSyncedDevices()
@@ -118,38 +104,18 @@
       const base::Optional<std::string>& session_id,
       const base::Optional<CryptAuthFeatureType>& feature_type) override;
 
-  void SetState(State state);
-  void OnTimeout();
-
-  void OnClientAppMetadataFetched(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata);
-  void AttemptDeviceSync();
   void OnDeviceSyncFinished(CryptAuthDeviceSyncResult device_sync_result);
 
-  State state_ = State::kIdle;
-
-  // The time of the last state change. Used for execution time metrics.
-  base::TimeTicks last_state_change_timestamp_;
-
   base::Optional<cryptauthv2::ClientMetadata> current_client_metadata_;
-  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
   std::unique_ptr<CryptAuthDeviceSyncer> device_syncer_;
 
-  ClientAppMetadataProvider* client_app_metadata_provider_ = nullptr;
+  cryptauthv2::ClientAppMetadata client_app_metadata_;
   CryptAuthDeviceRegistry* device_registry_ = nullptr;
   CryptAuthKeyRegistry* key_registry_ = nullptr;
   CryptAuthClientFactory* client_factory_ = nullptr;
   CryptAuthGCMManager* gcm_manager_ = nullptr;
   CryptAuthScheduler* scheduler_ = nullptr;
   PrefService* pref_service_ = nullptr;
-  std::unique_ptr<base::OneShotTimer> timer_;
-
-  // For weak pointers used in callbacks. These weak pointers are invalidated
-  // when the current DeviceSync attempt finishes in order to cancel outstanding
-  // callbacks.
-  base::WeakPtrFactory<CryptAuthV2DeviceManagerImpl> callback_weak_ptr_factory_{
-      this};
 
   // For sending a weak pointer to the scheduler, whose lifetime exceeds that of
   // CryptAuthV2DeviceManagerImpl.
diff --git a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl_unittest.cc
index b54203e..ebf57f4f 100644
--- a/chromeos/services/device_sync/cryptauth_v2_device_manager_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_device_manager_impl_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/optional.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/timer/mock_timer.h"
 #include "chromeos/services/device_sync/cryptauth_device_registry_impl.h"
 #include "chromeos/services/device_sync/cryptauth_device_syncer_impl.h"
 #include "chromeos/services/device_sync/cryptauth_key_registry_impl.h"
@@ -16,7 +15,6 @@
 #include "chromeos/services/device_sync/mock_cryptauth_client.h"
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
-#include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h"
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -98,13 +96,10 @@
   }
 
   void CreateAndStartDeviceManager() {
-    auto mock_timer = std::make_unique<base::MockOneShotTimer>();
-    mock_timer_ = mock_timer.get();
-
     device_manager_ = CryptAuthV2DeviceManagerImpl::Factory::Create(
-        &fake_client_app_metadata_provider_, device_registry_.get(),
+        cryptauthv2::GetClientAppMetadataForTest(), device_registry_.get(),
         key_registry_.get(), &mock_client_factory_, &fake_gcm_manager_,
-        &fake_scheduler_, &test_pref_service_, std::move(mock_timer));
+        &fake_scheduler_, &test_pref_service_);
 
     device_manager_->AddObserver(this);
 
@@ -143,43 +138,6 @@
         cryptauthv2::ClientMetadata::SERVER_INITIATED, session_id));
   }
 
-  void SucceedGetClientAppMetadataRequest() {
-    ASSERT_FALSE(
-        fake_client_app_metadata_provider_.metadata_requests().empty());
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_client_app_metadata_provider_.metadata_requests()
-                  .back()
-                  .gcm_registration_id);
-    std::move(
-        fake_client_app_metadata_provider_.metadata_requests().back().callback)
-        .Run(cryptauthv2::GetClientAppMetadataForTest());
-  }
-
-  void FailHandleGetClientAppMetadataRequestAndVerifyResult() {
-    ASSERT_FALSE(
-        fake_client_app_metadata_provider_.metadata_requests().empty());
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_client_app_metadata_provider_.metadata_requests()
-                  .back()
-                  .gcm_registration_id);
-    std::move(
-        fake_client_app_metadata_provider_.metadata_requests().back().callback)
-        .Run(base::nullopt /* client_app_metadata */);
-    ProcessAndVerifyNewDeviceSyncResult(
-        CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::
-                                      kErrorClientAppMetadataFetchFailed,
-                                  false /* did_device_registry_change */,
-                                  base::nullopt /* client_directive */));
-  }
-  void TimeoutWaitingForClientAppMetadataAndVerifyResult() {
-    mock_timer_->Fire();
-    ProcessAndVerifyNewDeviceSyncResult(
-        CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::
-                                      kErrorTimeoutWaitingForClientAppMetadata,
-                                  false /* did_device_registry_change */,
-                                  base::nullopt /* client_directive */));
-  }
-
   void FinishDeviceSyncAttemptAndVerifyResult(
       size_t expected_device_syncer_instance_index,
       const CryptAuthDeviceSyncResult& device_sync_result) {
@@ -189,8 +147,6 @@
     // the device syncer can be invoked.
     EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
               fake_gcm_manager_.GetRegistrationId());
-    ASSERT_FALSE(
-        fake_client_app_metadata_provider_.metadata_requests().empty());
 
     // Only the most recently created device syncer is valid.
     EXPECT_EQ(fake_device_syncer_factory_->instances().size() - 1,
@@ -330,10 +286,8 @@
   std::vector<CryptAuthDeviceSyncResult> device_sync_results_sent_to_observer_;
 
   TestingPrefServiceSimple test_pref_service_;
-  FakeClientAppMetadataProvider fake_client_app_metadata_provider_;
   FakeCryptAuthGCMManager fake_gcm_manager_;
   FakeCryptAuthSchedulerUpdatedByDeviceSyncResults fake_scheduler_;
-  base::MockOneShotTimer* mock_timer_ = nullptr;
   MockCryptAuthClientFactory mock_client_factory_;
   base::HistogramTester histogram_tester_;
   std::unique_ptr<CryptAuthDeviceRegistry> device_registry_;
@@ -349,7 +303,6 @@
   RequestDeviceSyncThroughSchedulerAndVerify(
       cryptauthv2::ClientMetadata::INITIALIZATION,
       base::nullopt /* session_id */);
-  SucceedGetClientAppMetadataRequest();
   FinishDeviceSyncAttemptAndVerifyResult(
       0u /* expected_device_sync_instance_index */,
       CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::kSuccess,
@@ -361,7 +314,6 @@
   CreateAndStartDeviceManager();
   ForceDeviceSyncRequestAndVerify(cryptauthv2::ClientMetadata::MANUAL,
                                   kFakeSessionId);
-  SucceedGetClientAppMetadataRequest();
   FinishDeviceSyncAttemptAndVerifyResult(
       0u /* expected_device_sync_instance_index */,
       CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::kSuccess,
@@ -373,7 +325,6 @@
        RequestDeviceSyncThroughGcm) {
   CreateAndStartDeviceManager();
   RequestDeviceSyncThroughGcmAndVerify(kFakeSessionId);
-  SucceedGetClientAppMetadataRequest();
   FinishDeviceSyncAttemptAndVerifyResult(
       0u /* expected_device_sync_instance_index */,
       CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::kSuccess,
@@ -385,7 +336,6 @@
   CreateAndStartDeviceManager();
   RequestDeviceSyncThroughSchedulerAndVerify(
       cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
-  SucceedGetClientAppMetadataRequest();
 
   // Fail first attempt with fatal error.
   FinishDeviceSyncAttemptAndVerifyResult(
@@ -427,34 +377,6 @@
   EXPECT_FALSE(device_manager()->IsRecoveringFromFailure());
 }
 
-TEST_F(DeviceSyncCryptAuthV2DeviceManagerImplTest,
-       ClientAppMetadataFetch_Failure) {
-  CreateAndStartDeviceManager();
-
-  // Fail to fetch ClientAppMetadata first attempt.
-  RequestDeviceSyncThroughSchedulerAndVerify(
-      cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
-  FailHandleGetClientAppMetadataRequestAndVerifyResult();
-
-  // Succeed ClientAppMetadata fetch second attempt.
-  RequestDeviceSyncThroughSchedulerAndVerify(
-      cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
-  SucceedGetClientAppMetadataRequest();
-  FinishDeviceSyncAttemptAndVerifyResult(
-      0u /* expected_device_sync_instance_index */,
-      CryptAuthDeviceSyncResult(CryptAuthDeviceSyncResult::ResultCode::kSuccess,
-                                true /* did_device_registry_change */,
-                                cryptauthv2::GetClientDirectiveForTest()));
-}
-
-TEST_F(DeviceSyncCryptAuthV2DeviceManagerImplTest,
-       ClientAppMetadataFetch_Timeout) {
-  CreateAndStartDeviceManager();
-  RequestDeviceSyncThroughSchedulerAndVerify(
-      cryptauthv2::ClientMetadata::PERIODIC, base::nullopt /* session_id */);
-  TimeoutWaitingForClientAppMetadataAndVerifyResult();
-}
-
 }  // namespace device_sync
 
 }  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
index ad1a803c..baae6953 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.cc
@@ -4,13 +4,12 @@
 
 #include "chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h"
 
-#include <utility>
-
 #include "base/bind.h"
+#include "base/hash/hash.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/time/clock.h"
-#include "base/timer/timer.h"
 #include "base/values.h"
 #include "chromeos/components/multidevice/logging/logging.h"
 #include "chromeos/services/device_sync/cryptauth_enrollment_constants.h"
@@ -19,7 +18,6 @@
 #include "chromeos/services/device_sync/cryptauth_v2_enroller_impl.h"
 #include "chromeos/services/device_sync/pref_names.h"
 #include "chromeos/services/device_sync/proto/cryptauth_logging.h"
-#include "chromeos/services/device_sync/public/cpp/client_app_metadata_provider.h"
 #include "chromeos/services/device_sync/value_string_encoding.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -30,12 +28,6 @@
 
 namespace {
 
-// Timeout value for asynchronous operation.
-// TODO(https://crbug.com/933656): Use async execution time metrics to tune
-// this timeout value.
-constexpr base::TimeDelta kWaitingForClientAppMetadataTimeout =
-    base::TimeDelta::FromSeconds(60);
-
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum class UserKeyPairState {
@@ -119,28 +111,6 @@
                                 result.result_code());
 }
 
-void RecordGcmRegistrationMetrics(const base::TimeDelta& execution_time,
-                                  bool success) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.EnrollmentV2.GcmRegistration.AttemptTime", execution_time,
-      base::TimeDelta::FromSeconds(1) /* min */,
-      base::TimeDelta::FromMinutes(10) /* max */, 100 /* buckets */);
-
-  base::UmaHistogramBoolean("CryptAuth.EnrollmentV2.GcmRegistration.Success",
-                            success);
-}
-
-void RecordClientAppMetadataFetchMetrics(const base::TimeDelta& execution_time,
-                                         CryptAuthAsyncTaskResult result) {
-  base::UmaHistogramCustomTimes(
-      "CryptAuth.EnrollmentV2.ExecutionTime.ClientAppMetadataFetch2",
-      execution_time, base::TimeDelta::FromSeconds(1) /* min */,
-      kWaitingForClientAppMetadataTimeout /* max */, 100 /* buckets */);
-
-  LogCryptAuthAsyncTaskSuccessMetric(
-      "CryptAuth.EnrollmentV2.AsyncTaskResult.ClientAppMetadataFetch", result);
-}
-
 }  // namespace
 
 // static
@@ -150,23 +120,22 @@
 // static
 std::unique_ptr<CryptAuthEnrollmentManager>
 CryptAuthV2EnrollmentManagerImpl::Factory::Create(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const cryptauthv2::ClientAppMetadata& client_app_metadata,
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
     CryptAuthScheduler* scheduler,
     PrefService* pref_service,
-    base::Clock* clock,
-    std::unique_ptr<base::OneShotTimer> timer) {
+    base::Clock* clock) {
   if (test_factory_) {
-    return test_factory_->CreateInstance(
-        client_app_metadata_provider, key_registry, client_factory, gcm_manager,
-        scheduler, pref_service, clock, std::move(timer));
+    return test_factory_->CreateInstance(client_app_metadata, key_registry,
+                                         client_factory, gcm_manager, scheduler,
+                                         pref_service, clock);
   }
 
   return base::WrapUnique(new CryptAuthV2EnrollmentManagerImpl(
-      client_app_metadata_provider, key_registry, client_factory, gcm_manager,
-      scheduler, pref_service, clock, std::move(timer)));
+      client_app_metadata, key_registry, client_factory, gcm_manager, scheduler,
+      pref_service, clock));
 }
 
 // static
@@ -180,6 +149,9 @@
 // static
 void CryptAuthV2EnrollmentManagerImpl::RegisterPrefs(
     PrefRegistrySimple* registry) {
+  registry->RegisterStringPref(
+      prefs::kCryptAuthLastEnrolledClientAppMetadataHash, std::string());
+
   // TODO(nohle): Remove when v1 Enrollment is deprecated.
   registry->RegisterStringPref(prefs::kCryptAuthEnrollmentUserPublicKey,
                                std::string());
@@ -188,22 +160,20 @@
 }
 
 CryptAuthV2EnrollmentManagerImpl::CryptAuthV2EnrollmentManagerImpl(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const cryptauthv2::ClientAppMetadata& client_app_metadata,
     CryptAuthKeyRegistry* key_registry,
     CryptAuthClientFactory* client_factory,
     CryptAuthGCMManager* gcm_manager,
     CryptAuthScheduler* scheduler,
     PrefService* pref_service,
-    base::Clock* clock,
-    std::unique_ptr<base::OneShotTimer> timer)
-    : client_app_metadata_provider_(client_app_metadata_provider),
+    base::Clock* clock)
+    : client_app_metadata_(client_app_metadata),
       key_registry_(key_registry),
       client_factory_(client_factory),
       gcm_manager_(gcm_manager),
       scheduler_(scheduler),
       pref_service_(pref_service),
-      clock_(clock),
-      timer_(std::move(timer)) {
+      clock_(clock) {
   // TODO(nohle): Remove when v1 Enrollment is deprecated.
   AddV1UserKeyPairToRegistryIfNecessary();
 
@@ -218,21 +188,30 @@
   scheduler_->StartEnrollmentScheduling(
       scheduler_weak_ptr_factory_.GetWeakPtr());
 
-  // If the v1 and v2 user key pairs initially disagreed, force a re-enrollment
-  // with the v1 user key pair that replaced the v2 user key pair.
-  if (initial_v1_and_v2_user_key_pairs_disagree_) {
+  std::string last_enrolled_client_app_metadata_hash = pref_service_->GetString(
+      prefs::kCryptAuthLastEnrolledClientAppMetadataHash);
+  if (!last_enrolled_client_app_metadata_hash.empty() &&
+      GetClientAppMetadataHash() != last_enrolled_client_app_metadata_hash) {
+    // Re-enroll if the ClientAppMetadata has changed since the last successful
+    // enrollment. NOTE: Do not force an enrollment if the ClientAppMetadata
+    // hash has never been set.
+    ForceEnrollmentNow(
+        cryptauth::InvocationReason::INVOCATION_REASON_SOFTWARE_UPDATE,
+        base::nullopt /* session_id */);
+  } else if (initial_v1_and_v2_user_key_pairs_disagree_) {
+    // If the v1 and v2 user key pairs initially disagreed, force a
+    // re-enrollment with the v1 user key pair that replaced the v2 user key
+    // pair.
     ForceEnrollmentNow(
         cryptauth::InvocationReason::INVOCATION_REASON_INITIALIZATION,
         base::nullopt /* session_id */);
-  }
-
-  // It is possible, though unlikely, that |scheduler_| has previously enrolled
-  // successfully but |key_registry_| no longer holds the enrolled keys, for
-  // example, if keys are deleted from the key registry or if the persisted key
-  // registry pref cannot be parsed due to an encoding change. In this case,
-  // force a re-enrollment.
-  if (scheduler_->GetLastSuccessfulEnrollmentTime() &&
-      (GetUserPublicKey().empty() || GetUserPrivateKey().empty())) {
+  } else if (scheduler_->GetLastSuccessfulEnrollmentTime() &&
+             (GetUserPublicKey().empty() || GetUserPrivateKey().empty())) {
+    // It is possible, though unlikely, that |scheduler_| has previously
+    // enrolled successfully but |key_registry_| no longer holds the enrolled
+    // keys, for example, if keys are deleted from the key registry or if the
+    // persisted key registry pref cannot be parsed due to an encoding change.
+    // In this case, force a re-enrollment.
     ForceEnrollmentNow(
         cryptauth::InvocationReason::INVOCATION_REASON_FAILURE_RECOVERY,
         base::nullopt /* session_id */);
@@ -276,7 +255,7 @@
 }
 
 bool CryptAuthV2EnrollmentManagerImpl::IsEnrollmentInProgress() const {
-  return state_ != State::kIdle;
+  return scheduler_->IsWaitingForEnrollmentResult();
 }
 
 bool CryptAuthV2EnrollmentManagerImpl::IsRecoveringFromFailure() const {
@@ -320,8 +299,6 @@
     const cryptauthv2::ClientMetadata& client_metadata,
     const base::Optional<cryptauthv2::PolicyReference>&
         client_directive_policy_reference) {
-  DCHECK(state_ == State::kIdle);
-
   NotifyEnrollmentStarted();
 
   current_client_metadata_ = client_metadata;
@@ -332,26 +309,7 @@
       current_client_metadata_->invocation_reason(),
       cryptauthv2::ClientMetadata::InvocationReason_ARRAYSIZE);
 
-  AttemptEnrollment();
-}
-
-void CryptAuthV2EnrollmentManagerImpl::OnGCMRegistrationResult(bool success) {
-  if (state_ != State::kWaitingForGcmRegistration)
-    return;
-
-  bool was_successful = success && !gcm_manager_->GetRegistrationId().empty();
-
-  RecordGcmRegistrationMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_, was_successful);
-
-  if (!was_successful) {
-    OnEnrollmentFinished(CryptAuthEnrollmentResult(
-        CryptAuthEnrollmentResult::ResultCode::kErrorGcmRegistrationFailed,
-        base::nullopt /* client_directive */));
-    return;
-  }
-
-  AttemptEnrollment();
+  Enroll();
 }
 
 void CryptAuthV2EnrollmentManagerImpl::OnReenrollMessage(
@@ -360,61 +318,14 @@
   ForceEnrollmentNow(cryptauth::INVOCATION_REASON_SERVER_INITIATED, session_id);
 }
 
-void CryptAuthV2EnrollmentManagerImpl::OnClientAppMetadataFetched(
-    const base::Optional<cryptauthv2::ClientAppMetadata>& client_app_metadata) {
-  DCHECK(state_ == State::kWaitingForClientAppMetadata);
-
-  bool success = client_app_metadata.has_value();
-
-  CryptAuthAsyncTaskResult result = success ? CryptAuthAsyncTaskResult::kSuccess
-                                            : CryptAuthAsyncTaskResult::kError;
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_, result);
-
-  if (!success) {
-    OnEnrollmentFinished(
-        CryptAuthEnrollmentResult(CryptAuthEnrollmentResult::ResultCode::
-                                      kErrorClientAppMetadataFetchFailed,
-                                  base::nullopt /* client_directive */));
-    return;
-  }
-
-  client_app_metadata_ = client_app_metadata;
-
-  AttemptEnrollment();
-}
-
-void CryptAuthV2EnrollmentManagerImpl::AttemptEnrollment() {
-  if (gcm_manager_->GetRegistrationId().empty()) {
-    SetState(State::kWaitingForGcmRegistration);
-    gcm_manager_->RegisterWithGCM();
-    return;
-  }
-
-  if (!client_app_metadata_) {
-    SetState(State::kWaitingForClientAppMetadata);
-    client_app_metadata_provider_->GetClientAppMetadata(
-        gcm_manager_->GetRegistrationId(),
-        base::BindOnce(
-            &CryptAuthV2EnrollmentManagerImpl::OnClientAppMetadataFetched,
-            callback_weak_ptr_factory_.GetWeakPtr()));
-    return;
-  }
-
-  Enroll();
-}
-
 void CryptAuthV2EnrollmentManagerImpl::Enroll() {
   DCHECK(current_client_metadata_);
-  DCHECK(client_app_metadata_);
 
+  PA_LOG(VERBOSE) << "Starting CryptAuth v2 Enrollment attempt.";
   enroller_ =
       CryptAuthV2EnrollerImpl::Factory::Create(key_registry_, client_factory_);
-
-  SetState(State::kWaitingForEnrollment);
-
   enroller_->Enroll(
-      *current_client_metadata_, *client_app_metadata_,
+      *current_client_metadata_, client_app_metadata_,
       client_directive_policy_reference_,
       base::BindOnce(&CryptAuthV2EnrollmentManagerImpl::OnEnrollmentFinished,
                      callback_weak_ptr_factory_.GetWeakPtr()));
@@ -436,6 +347,8 @@
                  << current_client_metadata_->invocation_reason()
                  << " succeeded with result code "
                  << enrollment_result_copy.result_code();
+    pref_service_->SetString(prefs::kCryptAuthLastEnrolledClientAppMetadataHash,
+                             GetClientAppMetadataHash());
   } else {
     PA_LOG(WARNING) << "Enrollment attempt with invocation reason "
                     << current_client_metadata_->invocation_reason()
@@ -457,37 +370,21 @@
                  << scheduler_->GetNumConsecutiveEnrollmentFailures();
   }
 
-  SetState(State::kIdle);
-
   NotifyEnrollmentFinished(enrollment_result_copy.IsSuccess());
 }
 
-void CryptAuthV2EnrollmentManagerImpl::SetState(State state) {
-  timer_->Stop();
-
-  PA_LOG(INFO) << "Transitioning from " << state_ << " to " << state;
-  state_ = state;
-  last_state_change_timestamp_ = base::TimeTicks::Now();
-
-  if (state_ != State::kWaitingForClientAppMetadata)
-    return;
-
-  timer_->Start(FROM_HERE, kWaitingForClientAppMetadataTimeout,
-                base::BindOnce(&CryptAuthV2EnrollmentManagerImpl::OnTimeout,
-                               callback_weak_ptr_factory_.GetWeakPtr()));
-}
-
-void CryptAuthV2EnrollmentManagerImpl::OnTimeout() {
-  DCHECK(state_ == State::kWaitingForClientAppMetadata);
-  RecordClientAppMetadataFetchMetrics(
-      base::TimeTicks::Now() - last_state_change_timestamp_
-      /* execution_time */,
-      CryptAuthAsyncTaskResult::kTimeout);
-
-  OnEnrollmentFinished(
-      CryptAuthEnrollmentResult(CryptAuthEnrollmentResult::ResultCode::
-                                    kErrorTimeoutWaitingForClientAppMetadata,
-                                base::nullopt /*client_directive */));
+std::string CryptAuthV2EnrollmentManagerImpl::GetClientAppMetadataHash() const {
+  // NOTE: SerializeAsString() is not guaranteed to be stable; it could change
+  // if the protobuf serialization algorithm changes or if the field
+  // serialization is inherently nondeterministic. However, because we only have
+  // MessageLite protocol buffers in Chrome, MessageDifferencer is not
+  // available. So, we either need to compare field-by-field (maintenance heavy)
+  // or compare the serializations. We choose the latter and risk a spurious
+  // re-enrollment if the serialization algorithm changes. We assume the
+  // ClientAppMetadata fields are serialized deterministically; unit tests will
+  // fail if they are not.
+  return base::NumberToString(
+      base::PersistentHash(client_app_metadata_.SerializeAsString()));
 }
 
 std::string CryptAuthV2EnrollmentManagerImpl::GetV1UserPublicKey() const {
@@ -544,26 +441,6 @@
   };
 }
 
-std::ostream& operator<<(std::ostream& stream,
-                         const CryptAuthV2EnrollmentManagerImpl::State& state) {
-  switch (state) {
-    case CryptAuthV2EnrollmentManagerImpl::State::kIdle:
-      stream << "[EnrollmentManager state: Idle]";
-      break;
-    case CryptAuthV2EnrollmentManagerImpl::State::kWaitingForGcmRegistration:
-      stream << "[EnrollmentManager state: Waiting for GCM registration]";
-      break;
-    case CryptAuthV2EnrollmentManagerImpl::State::kWaitingForClientAppMetadata:
-      stream << "[EnrollmentManager state: Waiting for ClientAppMetadata]";
-      break;
-    case CryptAuthV2EnrollmentManagerImpl::State::kWaitingForEnrollment:
-      stream << "[EnrollmentManager state: Waiting for enrollment to finish]";
-      break;
-  }
-
-  return stream;
-}
-
 }  // namespace device_sync
 
 }  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
index 8e4fb18..590b094 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl.h
@@ -6,7 +6,6 @@
 #define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_V2_ENROLLMENT_MANAGER_IMPL_H_
 
 #include <memory>
-#include <ostream>
 #include <string>
 
 #include "base/macros.h"
@@ -24,15 +23,10 @@
 class PrefService;
 class PrefRegistrySimple;
 
-namespace base {
-class OneShotTimer;
-}  // namespace base
-
 namespace chromeos {
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClientFactory;
 class CryptAuthKeyRegistry;
 class CryptAuthV2Enroller;
@@ -45,6 +39,8 @@
 //  2) The enrollment manager listens to the GCM manager for re-enrollment
 //     requests.
 //  3) The ForceEnrollmentNow() method allows for immediate requests.
+//  4) On start-up, if the client app metadata has changed since the last
+//     enrollment, a re-enrollment is scheduled.
 //
 // All flavors of enrollment attempts are guarded by timeouts. For example, an
 // enrollment attempt triggered by ForceEnrollmentNow() will always
@@ -65,28 +61,25 @@
   class Factory {
    public:
     static std::unique_ptr<CryptAuthEnrollmentManager> Create(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const cryptauthv2::ClientAppMetadata& client_app_metadata,
         CryptAuthKeyRegistry* key_registry,
         CryptAuthClientFactory* client_factory,
         CryptAuthGCMManager* gcm_manager,
         CryptAuthScheduler* scheduler,
         PrefService* pref_service,
-        base::Clock* clock = base::DefaultClock::GetInstance(),
-        std::unique_ptr<base::OneShotTimer> timer =
-            std::make_unique<base::OneShotTimer>());
+        base::Clock* clock = base::DefaultClock::GetInstance());
     static void SetFactoryForTesting(Factory* test_factory);
 
    protected:
     virtual ~Factory();
     virtual std::unique_ptr<CryptAuthEnrollmentManager> CreateInstance(
-        ClientAppMetadataProvider* client_app_metadata_provider,
+        const cryptauthv2::ClientAppMetadata& client_app_metadata,
         CryptAuthKeyRegistry* key_registry,
         CryptAuthClientFactory* client_factory,
         CryptAuthGCMManager* gcm_manager,
         CryptAuthScheduler* scheduler,
         PrefService* pref_service,
-        base::Clock* clock,
-        std::unique_ptr<base::OneShotTimer> timer) = 0;
+        base::Clock* clock) = 0;
 
    private:
     static Factory* test_factory_;
@@ -100,25 +93,15 @@
 
  protected:
   CryptAuthV2EnrollmentManagerImpl(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
       CryptAuthScheduler* scheduler,
       PrefService* pref_service,
-      base::Clock* clock,
-      std::unique_ptr<base::OneShotTimer> timer);
+      base::Clock* clock);
 
  private:
-  enum class State {
-    kIdle,
-    kWaitingForGcmRegistration,
-    kWaitingForClientAppMetadata,
-    kWaitingForEnrollment
-  };
-
-  friend std::ostream& operator<<(std::ostream& stream, const State& state);
-
   // CryptAuthEnrollmentManager:
   void Start() override;
   void ForceEnrollmentNow(
@@ -138,26 +121,14 @@
                                  client_directive_policy_reference) override;
 
   // CryptAuthGCMManager::Observer:
-  void OnGCMRegistrationResult(bool success) override;
   void OnReenrollMessage(
       const base::Optional<std::string>& session_id,
       const base::Optional<CryptAuthFeatureType>& feature_type) override;
 
-  void OnClientAppMetadataFetched(
-      const base::Optional<cryptauthv2::ClientAppMetadata>&
-          client_app_metadata);
-
-  // Starts the enrollment flow if a valid GCM registration ID exists and the
-  // ClientAppMetadata has already been fetched; otherwise, the enrollment is
-  // postposed while they are retrieved.
-  void AttemptEnrollment();
-
   void Enroll();
   void OnEnrollmentFinished(const CryptAuthEnrollmentResult& enrollment_result);
 
-  void SetState(State state);
-  void OnTimeout();
-
+  std::string GetClientAppMetadataHash() const;
   std::string GetV1UserPublicKey() const;
   std::string GetV1UserPrivateKey() const;
 
@@ -165,26 +136,19 @@
   // the kUserKeyPair key bundle.
   void AddV1UserKeyPairToRegistryIfNecessary();
 
-  ClientAppMetadataProvider* client_app_metadata_provider_;
+  cryptauthv2::ClientAppMetadata client_app_metadata_;
   CryptAuthKeyRegistry* key_registry_;
   CryptAuthClientFactory* client_factory_;
   CryptAuthGCMManager* gcm_manager_;
   CryptAuthScheduler* scheduler_;
   PrefService* pref_service_;
   base::Clock* clock_;
-  std::unique_ptr<base::OneShotTimer> timer_;
 
   bool initial_v1_and_v2_user_key_pairs_disagree_ = false;
 
-  State state_ = State::kIdle;
-
-  // The time of the last state change. Used for execution time metrics.
-  base::TimeTicks last_state_change_timestamp_;
-
   base::Optional<cryptauthv2::ClientMetadata> current_client_metadata_;
   base::Optional<cryptauthv2::PolicyReference>
       client_directive_policy_reference_;
-  base::Optional<cryptauthv2::ClientAppMetadata> client_app_metadata_;
   std::unique_ptr<CryptAuthV2Enroller> enroller_;
 
   // For weak pointers used in callbacks. These weak pointers are invalidated
diff --git a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
index aa77dfc..1505c56 100644
--- a/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_v2_enrollment_manager_impl_unittest.cc
@@ -32,7 +32,6 @@
 #include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_directive.pb.h"
 #include "chromeos/services/device_sync/proto/cryptauth_v2_test_util.h"
-#include "chromeos/services/device_sync/public/cpp/fake_client_app_metadata_provider.h"
 #include "chromeos/services/device_sync/public/cpp/gcm_constants.h"
 #include "chromeos/services/device_sync/value_string_encoding.h"
 #include "components/prefs/pref_service.h"
@@ -111,7 +110,7 @@
       CryptAuthEnrollmentManager::Observer {
  protected:
   DeviceSyncCryptAuthV2EnrollmentManagerImplTest()
-      : fake_gcm_manager_(std::string() /* registration_id */),
+      : fake_gcm_manager_(cryptauthv2::kTestGcmRegistrationId),
         mock_client_factory_(
             MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS) {}
 
@@ -161,22 +160,23 @@
                            util::EncodeAsValueString(private_key));
   }
 
-  void CreateEnrollmentManager() {
-    auto mock_timer = std::make_unique<base::MockOneShotTimer>();
-    mock_timer_ = mock_timer.get();
-
-    VerifyUserKeyPairStateHistogram(0u /* total_count */);
+  void CreateEnrollmentManager(
+      const cryptauthv2::ClientAppMetadata& client_app_metadata) {
+    VerifyUserKeyPairStateHistogram(num_manager_creations_ /* total_count */);
 
     enrollment_manager_ = CryptAuthV2EnrollmentManagerImpl::Factory::Create(
-        &fake_client_app_metadata_provider_, key_registry_.get(),
-        &mock_client_factory_, &fake_gcm_manager_, &fake_enrollment_scheduler_,
-        &test_pref_service_, &test_clock_, std::move(mock_timer));
+        client_app_metadata, key_registry_.get(), &mock_client_factory_,
+        &fake_gcm_manager_, &fake_enrollment_scheduler_, &test_pref_service_,
+        &test_clock_);
+    ++num_manager_creations_;
 
-    VerifyUserKeyPairStateHistogram(1u /* total_count */);
+    VerifyUserKeyPairStateHistogram(num_manager_creations_ /* total_count */);
 
     enrollment_manager_->AddObserver(this);
   }
 
+  void DestroyEnrollmentManager() { enrollment_manager_.reset(); }
+
   void RequestEnrollmentThroughGcm(
       const base::Optional<std::string>& session_id) {
     fake_gcm_manager_.PushReenrollMessage(session_id,
@@ -189,53 +189,13 @@
               num_enrollment_started_notifications_);
   }
 
-  void CompleteGcmRegistration(bool success) {
-    EXPECT_TRUE(fake_gcm_manager_.GetRegistrationId().empty());
-
-    if (success) {
-      fake_gcm_manager_.CompleteRegistration(
-          cryptauthv2::kTestGcmRegistrationId);
-    } else {
-      // An empty registration ID is interpreted as an error by
-      // FakeCryptAuthGCMManager.
-      fake_gcm_manager_.CompleteRegistration(std::string());
-    }
-  }
-
-  void HandleGetClientAppMetadataRequest(bool success) {
-    EXPECT_GT(fake_client_app_metadata_provider_.metadata_requests().size(),
-              0u);
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_client_app_metadata_provider_.metadata_requests()
-                  .back()
-                  .gcm_registration_id);
-
-    if (success) {
-      std::move(fake_client_app_metadata_provider_.metadata_requests()
-                    .back()
-                    .callback)
-          .Run(cryptauthv2::GetClientAppMetadataForTest());
-      return;
-    }
-
-    std::move(
-        fake_client_app_metadata_provider_.metadata_requests().back().callback)
-        .Run(base::nullopt /* client_app_metadata */);
-  }
-
   void FinishEnrollmentAttempt(
       size_t expected_enroller_instance_index,
       const cryptauthv2::ClientMetadata& expected_client_metadata,
+      const cryptauthv2::ClientAppMetadata& expected_client_app_metadata,
       const CryptAuthEnrollmentResult& enrollment_result) {
     EXPECT_TRUE(enrollment_manager_->IsEnrollmentInProgress());
 
-    // A valid GCM registration ID and valid ClientAppMetadata must exist before
-    // the enroller can be invoked.
-    EXPECT_EQ(cryptauthv2::kTestGcmRegistrationId,
-              fake_gcm_manager_.GetRegistrationId());
-    EXPECT_GT(fake_client_app_metadata_provider_.metadata_requests().size(),
-              0u);
-
     // Only the most recently created enroller is valid.
     EXPECT_EQ(fake_enroller_factory_->created_instances().size() - 1,
               expected_enroller_instance_index);
@@ -243,7 +203,8 @@
         fake_enroller_factory_
             ->created_instances()[expected_enroller_instance_index];
 
-    VerifyEnrollerData(enroller, expected_client_metadata);
+    VerifyEnrollerData(enroller, expected_client_metadata,
+                       expected_client_app_metadata);
 
     enroller->FinishAttempt(enrollment_result);
 
@@ -290,8 +251,6 @@
 
   base::SimpleTestClock* test_clock() { return &test_clock_; }
 
-  base::MockOneShotTimer* mock_timer() { return mock_timer_; }
-
   const base::HistogramTester* histogram_tester() { return &histogram_tester_; }
 
   CryptAuthEnrollmentManager* enrollment_manager() {
@@ -301,11 +260,12 @@
  private:
   void VerifyEnrollerData(
       FakeCryptAuthV2Enroller* enroller,
-      const cryptauthv2::ClientMetadata& expected_client_metadata) {
+      const cryptauthv2::ClientMetadata& expected_client_metadata,
+      const cryptauthv2::ClientAppMetadata& expected_client_app_metadata) {
     EXPECT_TRUE(enroller->was_enroll_called());
     EXPECT_EQ(expected_client_metadata.SerializeAsString(),
               enroller->client_metadata()->SerializeAsString());
-    EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().SerializeAsString(),
+    EXPECT_EQ(expected_client_app_metadata.SerializeAsString(),
               enroller->client_app_metadata()->SerializeAsString());
     EXPECT_EQ(
         GetClientDirectivePolicyReferenceForTest().SerializeAsString(),
@@ -362,15 +322,14 @@
                                         false, failure_count);
   }
 
+  size_t num_manager_creations_ = 0;
   size_t num_enrollment_started_notifications_ = 0;
   std::vector<bool> observer_enrollment_finished_success_list_;
 
   TestingPrefServiceSimple test_pref_service_;
-  FakeClientAppMetadataProvider fake_client_app_metadata_provider_;
   FakeCryptAuthGCMManager fake_gcm_manager_;
   FakeCryptAuthScheduler fake_enrollment_scheduler_;
   base::SimpleTestClock test_clock_;
-  base::MockOneShotTimer* mock_timer_;
   MockCryptAuthClientFactory mock_client_factory_;
   base::HistogramTester histogram_tester_;
   std::unique_ptr<CryptAuthKeyRegistry> key_registry_;
@@ -381,13 +340,13 @@
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        EnrollmentRequestedFromScheduler_NeverPreviouslyEnrolled) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   EXPECT_FALSE(fake_enrollment_scheduler()->HasEnrollmentSchedulingStarted());
 
   enrollment_manager()->Start();
   EXPECT_TRUE(fake_enrollment_scheduler()->HasEnrollmentSchedulingStarted());
 
-  // The user has never enrolled with v1 or v2 and has not registered with GCM.
+  // The user has never enrolled with v1 or v2.
   fake_enrollment_scheduler()->set_last_successful_enrollment_time(
       base::Time());
   EXPECT_TRUE(key_registry()->key_bundles().empty());
@@ -404,9 +363,6 @@
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
 
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
-
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
       cryptauthv2::GetClientDirectiveForTest());
@@ -417,66 +373,13 @@
           0 /* retry_count */,
           cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
           base::nullopt /* session_id */) /* expected_client_metadata */,
-      expected_enrollment_result);
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
 
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
-TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest, GcmRegistrationFailed) {
-  CreateEnrollmentManager();
-  enrollment_manager()->Start();
-
-  fake_enrollment_scheduler()->RequestEnrollment(
-      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
-      base::nullopt /* session_id */);
-
-  CompleteGcmRegistration(false /* success */);
-
-  VerifyEnrollmentResults({CryptAuthEnrollmentResult(
-      CryptAuthEnrollmentResult::ResultCode::kErrorGcmRegistrationFailed,
-      base::nullopt /* client_directive */)});
-}
-
-TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
-       ClientAppMetadataFetchFailed) {
-  CreateEnrollmentManager();
-  enrollment_manager()->Start();
-
-  fake_enrollment_scheduler()->RequestEnrollment(
-      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
-      base::nullopt /* session_id */);
-
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(false /* success */);
-
-  VerifyEnrollmentResults({CryptAuthEnrollmentResult(
-      CryptAuthEnrollmentResult::ResultCode::kErrorClientAppMetadataFetchFailed,
-      base::nullopt /* client_directive */)});
-}
-
-TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
-       ClientAppMetadataTimeout) {
-  CreateEnrollmentManager();
-  enrollment_manager()->Start();
-
-  fake_enrollment_scheduler()->RequestEnrollment(
-      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
-      base::nullopt /* session_id */);
-
-  CompleteGcmRegistration(true /* success */);
-
-  // Timeout waiting for ClientAppMetadata.
-  EXPECT_TRUE(mock_timer()->IsRunning());
-  mock_timer()->Fire();
-
-  VerifyEnrollmentResults(
-      {CryptAuthEnrollmentResult(CryptAuthEnrollmentResult::ResultCode::
-                                     kErrorTimeoutWaitingForClientAppMetadata,
-                                 base::nullopt /* client_directive */)});
-}
-
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest, ForcedEnrollment) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   enrollment_manager()->Start();
 
   enrollment_manager()->ForceEnrollmentNow(
@@ -487,9 +390,6 @@
       1 /* expected_num_enrollment_started_notifications */);
 
   // Simulate a failed enrollment attempt due to CryptAuth server overload.
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
-
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
@@ -500,14 +400,14 @@
           0 /* retry_count */,
           cryptauthv2::ClientMetadata::FEATURE_TOGGLED /* invocation_reason */,
           kFakeSessionId) /* expected_client_metadata */,
-      expected_enrollment_result);
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
 
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        RetryAfterFailedPeriodicEnrollment_PreviouslyEnrolled) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
 
   // The user has already enrolled.
   CryptAuthKey user_key_pair_v2(
@@ -553,15 +453,13 @@
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
 
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
-
   CryptAuthEnrollmentResult first_expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
 
   FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
                           expected_client_metadata,
+                          cryptauthv2::GetClientAppMetadataForTest(),
                           first_expected_enrollment_result);
 
   EXPECT_FALSE(enrollment_manager()->IsRecoveringFromFailure());
@@ -589,6 +487,7 @@
   expected_client_metadata.set_retry_count(1);
   FinishEnrollmentAttempt(1u /* expected_enroller_instance_index */,
                           expected_client_metadata,
+                          cryptauthv2::GetClientAppMetadataForTest(),
                           second_expected_enrollment_result);
 
   VerifyEnrollmentResults(
@@ -607,7 +506,7 @@
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        EnrollmentTriggeredByGcmMessage_Success) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   enrollment_manager()->Start();
 
   RequestEnrollmentThroughGcm(kFakeSessionId);
@@ -615,8 +514,6 @@
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNoNewKeysNeeded,
       cryptauthv2::GetClientDirectiveForTest());
@@ -625,13 +522,13 @@
       cryptauthv2::BuildClientMetadata(
           0 /* retry_count */, cryptauthv2::ClientMetadata::SERVER_INITIATED,
           kFakeSessionId) /* expected_client_metadata */,
-      expected_enrollment_result);
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        EnrollmentTriggeredByGcmMessage_Failure) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   enrollment_manager()->Start();
 
   RequestEnrollmentThroughGcm(kFakeSessionId);
@@ -639,8 +536,6 @@
   EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
       base::nullopt /* client_directive */);
@@ -649,7 +544,7 @@
       cryptauthv2::BuildClientMetadata(
           0 /* retry_count */, cryptauthv2::ClientMetadata::SERVER_INITIATED,
           kFakeSessionId) /* expected_client_metadata */,
-      expected_enrollment_result);
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
@@ -663,7 +558,7 @@
   EXPECT_FALSE(
       key_registry()->GetActiveKey(CryptAuthKeyBundle::Name::kUserKeyPair));
 
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   histogram_tester()->ExpectBucketCount(
       "CryptAuth.EnrollmentV2.UserKeyPairState",
       1 /* UserKeyPairState::kYesV1KeyNoV2Key */, 1 /* count */);
@@ -695,7 +590,7 @@
 
   // A legacy v1 user key pair should overwrite any existing v2 user key pair
   // when the enrollment manager is constructed.
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   histogram_tester()->ExpectBucketCount(
       "CryptAuth.EnrollmentV2.UserKeyPairState",
       4 /* UserKeyPairState::kYesV1KeyYesV2KeyDisagree */, 1 /* count */);
@@ -717,10 +612,9 @@
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
       base::nullopt /* client_directive */);
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          expected_client_metadata, expected_enrollment_result);
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */, expected_client_metadata,
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
 
   VerifyInvocationReasonHistogram(
       {expected_client_metadata.invocation_reason()});
@@ -737,7 +631,7 @@
   key_registry()->AddKey(CryptAuthKeyBundle::Name::kUserKeyPair,
                          user_key_pair_v1);
 
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   histogram_tester()->ExpectBucketCount(
       "CryptAuth.EnrollmentV2.UserKeyPairState",
       3 /* UserKeyPairState::kYesV1KeyYesV2KeyAgree */, 1 /* count */);
@@ -758,7 +652,7 @@
   key_registry()->AddKey(CryptAuthKeyBundle::Name::kUserKeyPair,
                          user_key_pair_v2);
 
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   histogram_tester()->ExpectBucketCount(
       "CryptAuth.EnrollmentV2.UserKeyPairState",
       2 /* UserKeyPairState::kNoV1KeyYesV2Key */, 1 /* count */);
@@ -770,7 +664,7 @@
 }
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest, GetUserKeyPair) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   histogram_tester()->ExpectBucketCount(
       "CryptAuth.EnrollmentV2.UserKeyPairState",
       0 /* UserKeyPairState::kNoV1KeyNoV2Key */, 1 /* count */);
@@ -789,7 +683,7 @@
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        MultipleEnrollmentAttempts) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
   enrollment_manager()->Start();
 
   std::vector<cryptauthv2::ClientMetadata::InvocationReason>
@@ -806,13 +700,12 @@
       expected_invocation_reasons.back(), kFakeSessionId);
   VerifyEnrollmentManagerObserversNotifiedOfStart(
       1 /* expected_num_enrollment_started_notifications */);
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
   FinishEnrollmentAttempt(
       0u /* expected_enroller_instance_index */,
       cryptauthv2::BuildClientMetadata(
           0 /* retry_count */, expected_invocation_reasons.back(),
           kFakeSessionId) /* expected_client_metadata */,
+      cryptauthv2::GetClientAppMetadataForTest(),
       expected_enrollment_results.back());
 
   // Fail periodic refresh twice due to overloaded CryptAuth server.
@@ -829,6 +722,7 @@
       cryptauthv2::BuildClientMetadata(
           0 /* retry_count */, expected_invocation_reasons.back(),
           kFakeSessionId) /* expected_client_metadata */,
+      cryptauthv2::GetClientAppMetadataForTest(),
       expected_enrollment_results.back());
   fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(1);
   fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
@@ -847,6 +741,7 @@
       cryptauthv2::BuildClientMetadata(
           1 /* retry_count */, expected_invocation_reasons.back(),
           kFakeSessionId) /* expected_client_metadata */,
+      cryptauthv2::GetClientAppMetadataForTest(),
       expected_enrollment_results.back());
   fake_enrollment_scheduler()->set_num_consecutive_enrollment_failures(2);
   fake_enrollment_scheduler()->set_time_to_next_enrollment_request(
@@ -866,6 +761,7 @@
       cryptauthv2::BuildClientMetadata(
           2 /* retry_count */, expected_invocation_reasons.back(),
           base::nullopt /* session_id */) /* expected_client_metadata */,
+      cryptauthv2::GetClientAppMetadataForTest(),
       expected_enrollment_results.back());
 
   VerifyInvocationReasonHistogram(expected_invocation_reasons);
@@ -874,7 +770,7 @@
 
 TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
        MissingUserKeyPairRecovery) {
-  CreateEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
 
   // The user has already enrolled according to the scheduler, but there is no
   // user key pair because the key registry was corrupted, for instance.
@@ -891,16 +787,98 @@
   CryptAuthEnrollmentResult expected_enrollment_result(
       CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
       base::nullopt /* client_directive */);
-  CompleteGcmRegistration(true /* success */);
-  HandleGetClientAppMetadataRequest(true /* success */);
-  FinishEnrollmentAttempt(0u /* expected_enroller_instance_index */,
-                          expected_client_metadata, expected_enrollment_result);
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */, expected_client_metadata,
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result);
 
   VerifyInvocationReasonHistogram(
       {expected_client_metadata.invocation_reason()});
   VerifyEnrollmentResults({expected_enrollment_result});
 }
 
+TEST_F(DeviceSyncCryptAuthV2EnrollmentManagerImplTest,
+       ClientAppMetadataChange) {
+  // If the user has never enrolled, no forced enrollment should be made due to
+  // a ClientAppMetadata change.
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
+  enrollment_manager()->Start();
+  EXPECT_FALSE(enrollment_manager()->IsEnrollmentInProgress());
+
+  // Succeed initialization and persist the client app metadata
+  fake_enrollment_scheduler()->RequestEnrollment(
+      cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+      base::nullopt /* session_id */);
+  CryptAuthEnrollmentResult expected_enrollment_result1(
+      CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
+      cryptauthv2::GetClientDirectiveForTest());
+  FinishEnrollmentAttempt(
+      0u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */,
+          cryptauthv2::ClientMetadata::INITIALIZATION /* invocation_reason */,
+          base::nullopt /* session_id */) /* expected_client_metadata */,
+      cryptauthv2::GetClientAppMetadataForTest(), expected_enrollment_result1);
+  VerifyEnrollmentResults({expected_enrollment_result1});
+
+  // The client app metadata doesn't change, so don't force an enrollment.
+  DestroyEnrollmentManager();
+  CreateEnrollmentManager(cryptauthv2::GetClientAppMetadataForTest());
+  enrollment_manager()->Start();
+  EXPECT_FALSE(enrollment_manager()->IsEnrollmentInProgress());
+
+  // The client app metadata changes, force an enrollment.
+  DestroyEnrollmentManager();
+  cryptauthv2::ClientAppMetadata new_client_app_metadata =
+      cryptauthv2::GetClientAppMetadataForTest();
+  new_client_app_metadata.set_instance_id("new_instance_id");
+  CreateEnrollmentManager(new_client_app_metadata);
+  enrollment_manager()->Start();
+  EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
+
+  // Enrollment fails; new client app metadata not persisted.
+  CryptAuthEnrollmentResult expected_enrollment_result2(
+      CryptAuthEnrollmentResult::ResultCode::kErrorCryptAuthServerOverloaded,
+      base::nullopt /* client_directive */);
+  FinishEnrollmentAttempt(
+      1u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */,
+          cryptauthv2::ClientMetadata::SOFTWARE_UPDATE /* invocation_reason */,
+          base::nullopt /* session_id */) /* expected_client_metadata */,
+      new_client_app_metadata, expected_enrollment_result2);
+  VerifyEnrollmentResults(
+      {expected_enrollment_result1, expected_enrollment_result2});
+
+  // We still haven't successfully enrolled the new client app metadata; on
+  // start-up we still see a metadata change and force the enrollment.
+  DestroyEnrollmentManager();
+  CreateEnrollmentManager(new_client_app_metadata);
+  enrollment_manager()->Start();
+  EXPECT_TRUE(enrollment_manager()->IsEnrollmentInProgress());
+
+  // Enrollment succeeds; new client app metadata is persisted.
+  CryptAuthEnrollmentResult expected_enrollment_result3(
+      CryptAuthEnrollmentResult::ResultCode::kSuccessNewKeysEnrolled,
+      base::nullopt /* client_directive */);
+  FinishEnrollmentAttempt(
+      2u /* expected_enroller_instance_index */,
+      cryptauthv2::BuildClientMetadata(
+          0 /* retry_count */,
+          cryptauthv2::ClientMetadata::SOFTWARE_UPDATE /* invocation_reason */,
+          base::nullopt /* session_id */) /* expected_client_metadata */,
+      new_client_app_metadata, expected_enrollment_result3);
+  VerifyEnrollmentResults({expected_enrollment_result1,
+                           expected_enrollment_result2,
+                           expected_enrollment_result3});
+
+  // We have successfully enrolled the new client app metadata; no change
+  // detected on start-up.
+  DestroyEnrollmentManager();
+  CreateEnrollmentManager(new_client_app_metadata);
+  enrollment_manager()->Start();
+  EXPECT_FALSE(enrollment_manager()->IsEnrollmentInProgress());
+}
+
 }  // namespace device_sync
 
 }  // namespace chromeos
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc
index 21bb1e5..f3c7aad 100644
--- a/chromeos/services/device_sync/device_sync_impl.cc
+++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -677,8 +677,9 @@
 
   cryptauth_device_activity_getter_ =
       CryptAuthDeviceActivityGetterImpl::Factory::Create(
-          cryptauth_client_factory_.get(), client_app_metadata_provider_,
-          cryptauth_gcm_manager_.get());
+          client_app_metadata_->instance_id(),
+          client_app_metadata_->instance_id_token(),
+          cryptauth_client_factory_.get());
 
   cryptauth_device_activity_getter_->GetDevicesActivityStatus(
       base::BindOnce(&DeviceSyncImpl::OnGetDevicesActivityStatusFinished,
@@ -1022,7 +1023,7 @@
 
     cryptauth_enrollment_manager_ =
         CryptAuthV2EnrollmentManagerImpl::Factory::Create(
-            client_app_metadata_provider_, cryptauth_key_registry_.get(),
+            *client_app_metadata_, cryptauth_key_registry_.get(),
             cryptauth_client_factory_.get(), cryptauth_gcm_manager_.get(),
             cryptauth_scheduler_.get(), profile_prefs_, clock_);
   } else {
@@ -1050,7 +1051,7 @@
 
     cryptauth_v2_device_manager_ =
         CryptAuthV2DeviceManagerImpl::Factory::Create(
-            client_app_metadata_provider_, cryptauth_device_registry_.get(),
+            *client_app_metadata_, cryptauth_device_registry_.get(),
             cryptauth_key_registry_.get(), cryptauth_client_factory_.get(),
             cryptauth_gcm_manager_.get(), cryptauth_scheduler_.get(),
             profile_prefs_);
@@ -1081,12 +1082,14 @@
 
   if (features::ShouldUseV2DeviceSync()) {
     feature_status_setter_ = CryptAuthFeatureStatusSetterImpl::Factory::Create(
-        client_app_metadata_provider_, cryptauth_client_factory_.get(),
-        cryptauth_gcm_manager_.get());
+        client_app_metadata_->instance_id(),
+        client_app_metadata_->instance_id_token(),
+        cryptauth_client_factory_.get());
 
     device_notifier_ = CryptAuthDeviceNotifierImpl::Factory::Create(
-        client_app_metadata_provider_, cryptauth_client_factory_.get(),
-        cryptauth_gcm_manager_.get());
+        client_app_metadata_->instance_id(),
+        client_app_metadata_->instance_id_token(),
+        cryptauth_client_factory_.get());
   }
 
   if (features::ShouldUseV1DeviceSync()) {
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc
index 5c437e6..dfa9c8f 100644
--- a/chromeos/services/device_sync/device_sync_service_unittest.cc
+++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -377,13 +377,13 @@
     : public CryptAuthV2DeviceManagerImpl::Factory {
  public:
   FakeCryptAuthV2DeviceManagerFactory(
-      FakeClientAppMetadataProvider* fake_client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       FakeCryptAuthDeviceRegistryFactory* fake_device_registry_factory,
       FakeCryptAuthKeyRegistryFactory* fake_key_registry_factory,
       FakeCryptAuthGCMManagerFactory* fake_gcm_manager_factory,
       FakeCryptAuthSchedulerFactory* fake_scheduler_factory,
       TestingPrefServiceSimple* test_pref_service)
-      : fake_client_app_metadata_provider_(fake_client_app_metadata_provider),
+      : client_app_metadata_(client_app_metadata),
         fake_device_registry_factory_(fake_device_registry_factory),
         fake_key_registry_factory_(fake_key_registry_factory),
         fake_gcm_manager_factory_(fake_gcm_manager_factory),
@@ -397,16 +397,16 @@
  private:
   // CryptAuthV2DeviceManagerImpl::Factory:
   std::unique_ptr<CryptAuthV2DeviceManager> CreateInstance(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       CryptAuthDeviceRegistry* device_registry,
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
       CryptAuthScheduler* scheduler,
-      PrefService* pref_service,
-      std::unique_ptr<base::OneShotTimer> timer) override {
+      PrefService* pref_service) override {
     EXPECT_TRUE(features::ShouldUseV2DeviceSync());
-    EXPECT_EQ(fake_client_app_metadata_provider_, client_app_metadata_provider);
+    EXPECT_EQ(client_app_metadata_.SerializeAsString(),
+              client_app_metadata.SerializeAsString());
     EXPECT_EQ(fake_device_registry_factory_->instance(), device_registry);
     EXPECT_EQ(fake_key_registry_factory_->instance(), key_registry);
     EXPECT_EQ(fake_gcm_manager_factory_->instance(), gcm_manager);
@@ -422,7 +422,7 @@
     return std::move(instance);
   }
 
-  FakeClientAppMetadataProvider* fake_client_app_metadata_provider_ = nullptr;
+  cryptauthv2::ClientAppMetadata client_app_metadata_;
   FakeCryptAuthDeviceRegistryFactory* fake_device_registry_factory_ = nullptr;
   FakeCryptAuthKeyRegistryFactory* fake_key_registry_factory_ = nullptr;
   FakeCryptAuthGCMManagerFactory* fake_gcm_manager_factory_ = nullptr;
@@ -491,13 +491,13 @@
     : public CryptAuthV2EnrollmentManagerImpl::Factory {
  public:
   FakeCryptAuthV2EnrollmentManagerFactory(
-      FakeClientAppMetadataProvider* fake_client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       FakeCryptAuthKeyRegistryFactory* fake_cryptauth_key_registry_factory,
       FakeCryptAuthGCMManagerFactory* fake_cryptauth_gcm_manager_factory,
       FakeCryptAuthSchedulerFactory* fake_cryptauth_scheduler_factory,
       TestingPrefServiceSimple* test_pref_service,
       base::SimpleTestClock* simple_test_clock)
-      : fake_client_app_metadata_provider_(fake_client_app_metadata_provider),
+      : client_app_metadata_(client_app_metadata),
         fake_cryptauth_key_registry_factory_(
             fake_cryptauth_key_registry_factory),
         fake_cryptauth_gcm_manager_factory_(fake_cryptauth_gcm_manager_factory),
@@ -517,16 +517,16 @@
 
   // CryptAuthV2EnrollmentManagerImpl::Factory:
   std::unique_ptr<CryptAuthEnrollmentManager> CreateInstance(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const cryptauthv2::ClientAppMetadata& client_app_metadata,
       CryptAuthKeyRegistry* key_registry,
       CryptAuthClientFactory* client_factory,
       CryptAuthGCMManager* gcm_manager,
       CryptAuthScheduler* scheduler,
       PrefService* pref_service,
-      base::Clock* clock,
-      std::unique_ptr<base::OneShotTimer> timer) override {
+      base::Clock* clock) override {
     EXPECT_TRUE(base::FeatureList::IsEnabled(features::kCryptAuthV2Enrollment));
-    EXPECT_EQ(fake_client_app_metadata_provider_, client_app_metadata_provider);
+    EXPECT_EQ(client_app_metadata_.SerializeAsString(),
+              client_app_metadata.SerializeAsString());
     EXPECT_EQ(fake_cryptauth_key_registry_factory_->instance(), key_registry);
     EXPECT_EQ(fake_cryptauth_gcm_manager_factory_->instance(), gcm_manager);
     EXPECT_EQ(fake_cryptauth_scheduler_factory_->instance(), scheduler);
@@ -545,7 +545,7 @@
   }
 
  private:
-  FakeClientAppMetadataProvider* fake_client_app_metadata_provider_;
+  cryptauthv2::ClientAppMetadata client_app_metadata_;
   FakeCryptAuthKeyRegistryFactory* fake_cryptauth_key_registry_factory_;
   FakeCryptAuthGCMManagerFactory* fake_cryptauth_gcm_manager_factory_;
   FakeCryptAuthSchedulerFactory* fake_cryptauth_scheduler_factory_;
@@ -778,7 +778,7 @@
 
     fake_cryptauth_v2_enrollment_manager_factory_ =
         std::make_unique<FakeCryptAuthV2EnrollmentManagerFactory>(
-            fake_client_app_metadata_provider_.get(),
+            cryptauthv2::GetClientAppMetadataForTest(),
             fake_cryptauth_key_registry_factory_.get(),
             fake_cryptauth_gcm_manager_factory_.get(),
             fake_cryptauth_scheduler_factory_.get(), test_pref_service_.get(),
@@ -819,7 +819,7 @@
 
     fake_cryptauth_v2_device_manager_factory_ =
         std::make_unique<FakeCryptAuthV2DeviceManagerFactory>(
-            fake_client_app_metadata_provider_.get(),
+            cryptauthv2::GetClientAppMetadataForTest(),
             fake_cryptauth_device_registry_factory_.get(),
             fake_cryptauth_key_registry_factory_.get(),
             fake_cryptauth_gcm_manager_factory_.get(),
@@ -1114,6 +1114,10 @@
       return nullptr;
 
     EXPECT_EQ(1u, fake_feature_status_setter_factory_->instances().size());
+    EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().instance_id(),
+              fake_device_notifier_factory_->last_instance_id());
+    EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().instance_id_token(),
+              fake_device_notifier_factory_->last_instance_id_token());
     return fake_feature_status_setter_factory_->instances()[0];
   }
 
@@ -1126,6 +1130,10 @@
       return nullptr;
 
     EXPECT_EQ(1u, fake_device_notifier_factory_->instances().size());
+    EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().instance_id(),
+              fake_device_notifier_factory_->last_instance_id());
+    EXPECT_EQ(cryptauthv2::GetClientAppMetadataForTest().instance_id_token(),
+              fake_device_notifier_factory_->last_instance_id_token());
     return fake_device_notifier_factory_->instances()[0];
   }
 
diff --git a/chromeos/services/device_sync/fake_cryptauth_device_notifier.cc b/chromeos/services/device_sync/fake_cryptauth_device_notifier.cc
index b91a7e4..06c2da6 100644
--- a/chromeos/services/device_sync/fake_cryptauth_device_notifier.cc
+++ b/chromeos/services/device_sync/fake_cryptauth_device_notifier.cc
@@ -57,13 +57,13 @@
 
 std::unique_ptr<CryptAuthDeviceNotifier>
 FakeCryptAuthDeviceNotifierFactory::CreateInstance(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer) {
-  last_client_app_metadata_provider_ = client_app_metadata_provider;
+  last_instance_id_ = instance_id;
+  last_instance_id_token_ = instance_id_token;
   last_client_factory_ = client_factory;
-  last_gcm_manager_ = gcm_manager;
 
   auto instance = std::make_unique<FakeCryptAuthDeviceNotifier>();
   instances_.push_back(instance.get());
diff --git a/chromeos/services/device_sync/fake_cryptauth_device_notifier.h b/chromeos/services/device_sync/fake_cryptauth_device_notifier.h
index 6bc3447..874b20f7 100644
--- a/chromeos/services/device_sync/fake_cryptauth_device_notifier.h
+++ b/chromeos/services/device_sync/fake_cryptauth_device_notifier.h
@@ -22,9 +22,7 @@
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClientFactory;
-class CryptAuthGCMManager;
 
 class FakeCryptAuthDeviceNotifier : public CryptAuthDeviceNotifier {
  public:
@@ -84,30 +82,28 @@
     return instances_;
   }
 
-  const ClientAppMetadataProvider* last_client_app_metadata_provider() const {
-    return last_client_app_metadata_provider_;
+  const std::string& last_instance_id() const { return last_instance_id_; }
+
+  const std::string& last_instance_id_token() const {
+    return last_instance_id_token_;
   }
 
   const CryptAuthClientFactory* last_client_factory() const {
     return last_client_factory_;
   }
 
-  const CryptAuthGCMManager* last_gcm_manager() const {
-    return last_gcm_manager_;
-  }
-
  private:
   // CryptAuthDeviceNotifierImpl::Factory:
   std::unique_ptr<CryptAuthDeviceNotifier> CreateInstance(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const std::string& instance_id,
+      const std::string& instance_id_token,
       CryptAuthClientFactory* client_factory,
-      CryptAuthGCMManager* gcm_manager,
       std::unique_ptr<base::OneShotTimer> timer) override;
 
   std::vector<FakeCryptAuthDeviceNotifier*> instances_;
-  ClientAppMetadataProvider* last_client_app_metadata_provider_ = nullptr;
+  std::string last_instance_id_;
+  std::string last_instance_id_token_;
   CryptAuthClientFactory* last_client_factory_ = nullptr;
-  CryptAuthGCMManager* last_gcm_manager_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthDeviceNotifierFactory);
 };
diff --git a/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.cc b/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.cc
index d52d471d..8550fa9 100644
--- a/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.cc
+++ b/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.cc
@@ -55,13 +55,13 @@
 
 std::unique_ptr<CryptAuthFeatureStatusSetter>
 FakeCryptAuthFeatureStatusSetterFactory::CreateInstance(
-    ClientAppMetadataProvider* client_app_metadata_provider,
+    const std::string& instance_id,
+    const std::string& instance_id_token,
     CryptAuthClientFactory* client_factory,
-    CryptAuthGCMManager* gcm_manager,
     std::unique_ptr<base::OneShotTimer> timer) {
-  last_client_app_metadata_provider_ = client_app_metadata_provider;
+  last_instance_id_ = instance_id;
+  last_instance_id_token_ = instance_id_token;
   last_client_factory_ = client_factory;
-  last_gcm_manager_ = gcm_manager;
 
   auto instance = std::make_unique<FakeCryptAuthFeatureStatusSetter>();
   instances_.push_back(instance.get());
diff --git a/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.h b/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.h
index 67edd25..9d233f89 100644
--- a/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.h
+++ b/chromeos/services/device_sync/fake_cryptauth_feature_status_setter.h
@@ -21,9 +21,7 @@
 
 namespace device_sync {
 
-class ClientAppMetadataProvider;
 class CryptAuthClientFactory;
-class CryptAuthGCMManager;
 
 class FakeCryptAuthFeatureStatusSetter : public CryptAuthFeatureStatusSetter {
  public:
@@ -83,30 +81,28 @@
     return instances_;
   }
 
-  const ClientAppMetadataProvider* last_client_app_metadata_provider() const {
-    return last_client_app_metadata_provider_;
+  const std::string& last_instance_id() const { return last_instance_id_; }
+
+  const std::string& last_instance_id_token() const {
+    return last_instance_id_token_;
   }
 
   const CryptAuthClientFactory* last_client_factory() const {
     return last_client_factory_;
   }
 
-  const CryptAuthGCMManager* last_gcm_manager() const {
-    return last_gcm_manager_;
-  }
-
  private:
   // CryptAuthFeatureStatusSetterImpl::Factory:
   std::unique_ptr<CryptAuthFeatureStatusSetter> CreateInstance(
-      ClientAppMetadataProvider* client_app_metadata_provider,
+      const std::string& instance_id,
+      const std::string& instance_id_token,
       CryptAuthClientFactory* client_factory,
-      CryptAuthGCMManager* gcm_manager,
       std::unique_ptr<base::OneShotTimer> timer) override;
 
   std::vector<FakeCryptAuthFeatureStatusSetter*> instances_;
-  ClientAppMetadataProvider* last_client_app_metadata_provider_ = nullptr;
+  std::string last_instance_id_;
+  std::string last_instance_id_token_;
   CryptAuthClientFactory* last_client_factory_ = nullptr;
-  CryptAuthGCMManager* last_gcm_manager_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCryptAuthFeatureStatusSetterFactory);
 };
diff --git a/chromeos/services/device_sync/pref_names.cc b/chromeos/services/device_sync/pref_names.cc
index 08c406b..b106fbd 100644
--- a/chromeos/services/device_sync/pref_names.cc
+++ b/chromeos/services/device_sync/pref_names.cc
@@ -68,6 +68,11 @@
 // populate and persist the CryptAuthKeyRegistry.
 const char kCryptAuthKeyRegistry[] = "cryptauth.key_registry";
 
+// (CryptAuth v2) The hash of the last enrolled ClientAppMetadata. If this hash
+// changes, a re-enrollment should occur.
+const char kCryptAuthLastEnrolledClientAppMetadataHash[] =
+    "cryptauth.enrollment.last_enrolled_client_app_metadata_hash";
+
 // (CryptAuth v2) The encrypted and unencrypted local device
 // CryptAuthBetterTogetherMetadata, along with the encrypting group public key,
 // sent during the most recent successful SyncMetadata call. We don't want to
diff --git a/chromeos/services/device_sync/pref_names.h b/chromeos/services/device_sync/pref_names.h
index f798f3a7..c5b52cf 100644
--- a/chromeos/services/device_sync/pref_names.h
+++ b/chromeos/services/device_sync/pref_names.h
@@ -30,6 +30,7 @@
 // Prefs for CryptAuth v2:
 extern const char kCryptAuthDeviceRegistry[];
 extern const char kCryptAuthKeyRegistry[];
+extern const char kCryptAuthLastEnrolledClientAppMetadataHash[];
 extern const char kCryptAuthLastSyncedEncryptedLocalDeviceMetadata[];
 extern const char kCryptAuthLastSyncedGroupPublicKey[];
 extern const char kCryptAuthLastSyncedUnencryptedLocalDeviceMetadata[];
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index bc93560..5adce75 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -466,6 +466,14 @@
                       enable_download_manager) {}
 
 AutofillManager::~AutofillManager() {
+  if (frame_has_parsed_forms_) {
+    base::UmaHistogramBoolean(
+        "Autofill.WebOTP.PhoneNumberCollection.ParseResult",
+        has_observed_phone_number_field_);
+    base::UmaHistogramBoolean("Autofill.WebOTP.OneTimeCode.FromAutocomplete",
+                              has_observed_one_time_code_field_);
+  }
+
   if (autocomplete_history_manager_) {
     autocomplete_history_manager_->CancelPendingQueries(this);
   }
@@ -2029,6 +2037,7 @@
 void AutofillManager::OnFormsParsed(const std::vector<const FormData*>& forms,
                                     const base::TimeTicks timestamp) {
   DCHECK(!forms.empty());
+  frame_has_parsed_forms_ = true;
 
   // Record the current sync state to be used for metrics on this page.
   sync_state_ = personal_data_->GetSyncSigninState();
@@ -2049,6 +2058,11 @@
       continue;
     }
 
+    if (data_util::ContainsPhone(data_util::DetermineGroups(
+            form_structure->GetServerFieldTypes()))) {
+      has_observed_phone_number_field_ = true;
+    }
+
     // TODO(crbug.com/869482): avoid logging developer engagement multiple
     // times for a given form if it or other forms on the page are dynamic.
     LogDeveloperEngagementUkm(client_->GetUkmRecorder(),
@@ -2078,6 +2092,8 @@
         card_form = true;
       } else if (IsAddressForm(field->Type().group())) {
         address_form = true;
+      } else if (field->Type().html_type() == HTML_TYPE_ONE_TIME_CODE) {
+        has_observed_one_time_code_field_ = true;
       }
     }
     if (card_form) {
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index 92f08cf..70a9ea3 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -652,6 +652,13 @@
   // Has the user edited a field that was previously autofilled?
   bool user_did_edit_autofilled_field_ = false;
 
+  // Does the frame has any parsed forms?
+  bool frame_has_parsed_forms_ = false;
+  // Is there a field with autocomplete="one-time-code" observed?
+  bool has_observed_one_time_code_field_ = false;
+  // Is there a field with phone number collection observed?
+  bool has_observed_phone_number_field_ = false;
+
   // When the user first interacted with a potentially fillable form on this
   // page.
   base::TimeTicks initial_interaction_timestamp_;
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc
index 1c4adb2f..f75f6d0c 100644
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc
@@ -10403,6 +10403,193 @@
   }
 }
 
+// Verify that we don't log Autofill.WebOTP.OneTimeCode.FromAutocomplete if the
+// frame has no form.
+TEST_F(AutofillMetricsTest, FrameHasNoForm) {
+  autofill_manager_.reset();
+  EXPECT_FALSE(base::StatisticsRecorder::FindHistogram(
+      "Autofill.WebOTP.OneTimeCode.FromAutocomplete"));
+}
+
+// Verify that we correctly log metrics if a frame has
+// autocomplete="one-time-code".
+TEST_F(AutofillMetricsTest, FrameHasAutocompleteOneTimeCode) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+
+  std::vector<FormData> forms_with_one_time_code(1, form);
+
+  test::CreateTestFormField("", "", "", "password", &field);
+  field.autocomplete_attribute = "one-time-code";
+  forms_with_one_time_code.back().fields.push_back(field);
+  test::CreateTestFormField("", "", "", "password", &field);
+  forms_with_one_time_code.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_with_one_time_code, TimeTicks());
+  autofill_manager_.reset();
+  // Verifies that autocomplete="one-time-code" in a form is correctly recorded.
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.OneTimeCode.FromAutocomplete",
+      /* has_one_time_code */ 1,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.OneTimeCode.FromAutocomplete", 1);
+}
+
+// Verify that we correctly log metrics if a frame does not have
+// autocomplete="one-time-code".
+TEST_F(AutofillMetricsTest, FrameDoesNotHaveAutocompleteOneTimeCode) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+  std::vector<FormData> forms_without_one_time_code(1, form);
+
+  test::CreateTestFormField("", "", "", "password", &field);
+  forms_without_one_time_code.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_without_one_time_code, TimeTicks());
+  autofill_manager_.reset();
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.OneTimeCode.FromAutocomplete",
+      /* has_one_time_code */ 0,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.OneTimeCode.FromAutocomplete", 1);
+}
+
+// Verify that we correctly log metrics when a phone number field does not have
+// autocomplete attribute but there are at least 3 fields in the form.
+TEST_F(AutofillMetricsTest, FrameHasPhoneNumberFieldWithoutAutocomplete) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+
+  std::vector<FormData> forms_with_phone_number(1, form);
+
+  // At least 3 fields are necessary for FormStructure to compute proper field
+  // types if autocomplete attribute value is not available.
+  test::CreateTestFormField("Phone", "phone", "", "tel", &field);
+  forms_with_phone_number.back().fields.push_back(field);
+  test::CreateTestFormField("Last Name", "lastname", "", "text", &field);
+  forms_with_phone_number.back().fields.push_back(field);
+  test::CreateTestFormField("First Name", "firstname", "", "text", &field);
+  forms_with_phone_number.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_with_phone_number, TimeTicks());
+  autofill_manager_.reset();
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult",
+      /* has_phone_number_field */ 1,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult", 1);
+}
+
+// Verify that we correctly log metrics when a phone number field does not have
+// autocomplete attribute and there are less than 3 fields in the form.
+TEST_F(AutofillMetricsTest, FrameHasSinglePhoneNumberFieldWithoutAutocomplete) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+  std::vector<FormData> forms_with_single_phone_number_field(1, form);
+
+  // At least 3 fields are necessary for FormStructure to compute proper field
+  // types if autocomplete attribute value is not available.
+  test::CreateTestFormField("Phone", "phone", "", "tel", &field);
+  forms_with_single_phone_number_field.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_with_single_phone_number_field,
+                                 TimeTicks());
+  autofill_manager_.reset();
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult",
+      /* has_phone_number_field */ 0,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult", 1);
+}
+
+// Verify that we correctly log metrics when a phone number field has
+// autocomplete attribute.
+TEST_F(AutofillMetricsTest, FrameHasPhoneNumberFieldWithAutocomplete) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+
+  std::vector<FormData> forms_with_phone_number(1, form);
+
+  test::CreateTestFormField("Phone", "phone", "", "tel", &field);
+  field.autocomplete_attribute = "phone";
+  forms_with_phone_number.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_with_phone_number, TimeTicks());
+  autofill_manager_.reset();
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult",
+      /* has_phone_number_field */ 1,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult", 1);
+}
+
+// Verify that we correctly log metrics when a form does not have phone number
+// field.
+TEST_F(AutofillMetricsTest, FrameDoesNotHavePhoneNumberField) {
+  FormData form;
+  form.unique_renderer_id = MakeFormRendererId();
+  form.name = ASCIIToUTF16("TestForm");
+  form.url = GURL("http://example.com/form.html");
+  form.action = GURL("http://example.com/submit.html");
+  form.main_frame_origin = url::Origin::Create(autofill_client_.form_origin());
+
+  FormFieldData field;
+  std::vector<FormData> forms_without_phone_number(1, form);
+
+  test::CreateTestFormField("", "", "", "password", &field);
+  forms_without_phone_number.back().fields.push_back(field);
+
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormsSeen(forms_without_phone_number, TimeTicks());
+  autofill_manager_.reset();
+  histogram_tester.ExpectBucketCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult",
+      /* has_phone_number_field */ 0,
+      /* sample count */ 1);
+  histogram_tester.ExpectTotalCount(
+      "Autofill.WebOTP.PhoneNumberCollection.ParseResult", 1);
+}
+
 TEST_F(AutofillMetricsTest, LogAutocompleteSuggestionAcceptedIndex_WithIndex) {
   base::HistogramTester histogram_tester;
   const int test_index = 3;
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc
index d47758c3..6f8a9e2 100644
--- a/components/autofill/core/browser/autofill_type.cc
+++ b/components/autofill/core/browser/autofill_type.cc
@@ -203,6 +203,9 @@
       // TODO(crbug/702223): Add support for UPI-VPA.
       return NO_GROUP;
 
+    case HTML_TYPE_ONE_TIME_CODE:
+      return NO_GROUP;
+
     case HTML_TYPE_UNSPECIFIED:
     case HTML_TYPE_UNRECOGNIZED:
       return NO_GROUP;
@@ -442,6 +445,7 @@
     // These types aren't stored; they're transient.
     case HTML_TYPE_TRANSACTION_AMOUNT:
     case HTML_TYPE_TRANSACTION_CURRENCY:
+    case HTML_TYPE_ONE_TIME_CODE:
       return UNKNOWN_TYPE;
 
     case HTML_TYPE_UNRECOGNIZED:
diff --git a/components/autofill/core/browser/data_model/address.cc b/components/autofill/core/browser/data_model/address.cc
index bd147b8..d351882e 100644
--- a/components/autofill/core/browser/data_model/address.cc
+++ b/components/autofill/core/browser/data_model/address.cc
@@ -28,6 +28,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 Address::Address() {}
 
 Address::Address(const Address& address) {
@@ -102,7 +104,9 @@
   }
 }
 
-void Address::SetRawInfo(ServerFieldType type, const base::string16& value) {
+void Address::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                               const base::string16& value,
+                                               VerificationStatus status) {
   DCHECK_EQ(ADDRESS_HOME, AutofillType(type).group());
   switch (type) {
     case ADDRESS_HOME_LINE1:
@@ -221,9 +225,10 @@
   return GetRawInfo(storable_type);
 }
 
-bool Address::SetInfoImpl(const AutofillType& type,
-                          const base::string16& value,
-                          const std::string& locale) {
+bool Address::SetInfoWithVerificationStatusImpl(const AutofillType& type,
+                                                const base::string16& value,
+                                                const std::string& locale,
+                                                VerificationStatus status) {
   if (type.html_type() == HTML_TYPE_COUNTRY_CODE) {
     if (!data_util::IsValidCountryCode(base::i18n::ToUpper(value))) {
       // Some popular websites use the HTML_TYPE_COUNTRY_CODE attribute for
@@ -260,7 +265,7 @@
     return !country_code_.empty();
   }
 
-  SetRawInfo(storable_type, value);
+  SetRawInfoWithVerificationStatus(storable_type, value, status);
 
   // Give up when importing addresses with any entirely blank lines.
   // There's a good chance that this formatting is not intentional, but it's
diff --git a/components/autofill/core/browser/data_model/address.h b/components/autofill/core/browser/data_model/address.h
index e33d3fa..ccf3bb8 100644
--- a/components/autofill/core/browser/data_model/address.h
+++ b/components/autofill/core/browser/data_model/address.h
@@ -27,8 +27,10 @@
 
   // FormGroup:
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
-
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
   void GetMatchingTypes(const base::string16& text,
                         const std::string& locale,
                         ServerFieldTypeSet* matching_types) const override;
@@ -38,9 +40,11 @@
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
   base::string16 GetInfoImpl(const AutofillType& type,
                              const std::string& locale) const override;
-  bool SetInfoImpl(const AutofillType& type,
-                   const base::string16& value,
-                   const std::string& locale) override;
+  bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& locale,
+      structured_address::VerificationStatus status) override;
 
   // Trims any trailing newlines from |street_address_|.
   void TrimStreetAddress();
diff --git a/components/autofill/core/browser/data_model/autofill_data_model_unittest.cc b/components/autofill/core/browser/data_model/autofill_data_model_unittest.cc
index b24e914..75d311790 100644
--- a/components/autofill/core/browser/data_model/autofill_data_model_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_data_model_unittest.cc
@@ -17,6 +17,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 namespace {
 
 const base::Time kArbitraryTime = base::Time::FromDoubleT(25);
@@ -39,7 +41,10 @@
   base::string16 GetRawInfo(ServerFieldType type) const override {
     return base::string16();
   }
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override {}
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override {}
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override {}
 
   DISALLOW_COPY_AND_ASSIGN(TestAutofillDataModel);
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc
index 60aeae6..d785b0db 100644
--- a/components/autofill/core/browser/data_model/autofill_profile.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -56,6 +56,9 @@
 using ::i18n::addressinput::AddressField;
 
 namespace autofill {
+
+using structured_address::VerificationStatus;
+
 namespace {
 
 // Like |AutofillType::GetStorableType()|, but also returns |NAME_FULL| for
@@ -257,7 +260,7 @@
   operator=(profile);
 }
 
-AutofillProfile::~AutofillProfile() {}
+AutofillProfile::~AutofillProfile() = default;
 
 AutofillProfile& AutofillProfile::operator=(const AutofillProfile& profile) {
   if (this == &profile)
@@ -366,13 +369,15 @@
   return form_group->GetRawInfo(type);
 }
 
-void AutofillProfile::SetRawInfo(ServerFieldType type,
-                                 const base::string16& value) {
+void AutofillProfile::SetRawInfoWithVerificationStatus(
+    ServerFieldType type,
+    const base::string16& value,
+    VerificationStatus status) {
   FormGroup* form_group = MutableFormGroupForType(AutofillType(type));
   if (form_group) {
     is_client_validity_states_updated_ &=
         !IsClientValidationSupportedForType(type);
-    form_group->SetRawInfo(type, value);
+    form_group->SetRawInfoWithVerificationStatus(type, value, status);
   }
 }
 
@@ -1010,6 +1015,15 @@
   return false;
 }
 
+VerificationStatus AutofillProfile::GetVerificationStatusImpl(
+    const ServerFieldType type) const {
+  const FormGroup* form_group = FormGroupForType(AutofillType(type));
+  if (!form_group)
+    return VerificationStatus::kNoStatus;
+
+  return form_group->GetVerificationStatus(type);
+}
+
 base::string16 AutofillProfile::GetInfoImpl(
     const AutofillType& type,
     const std::string& app_locale) const {
@@ -1031,9 +1045,11 @@
   return form_group->GetInfoImpl(type, app_locale);
 }
 
-bool AutofillProfile::SetInfoImpl(const AutofillType& type,
-                                  const base::string16& value,
-                                  const std::string& app_locale) {
+bool AutofillProfile::SetInfoWithVerificationStatusImpl(
+    const AutofillType& type,
+    const base::string16& value,
+    const std::string& app_locale,
+    VerificationStatus status) {
   FormGroup* form_group = MutableFormGroupForType(type);
   if (!form_group)
     return false;
@@ -1043,7 +1059,9 @@
 
   base::string16 trimmed_value;
   base::TrimWhitespace(value, base::TRIM_ALL, &trimmed_value);
-  return form_group->SetInfoImpl(type, trimmed_value, app_locale);
+
+  return form_group->SetInfoWithVerificationStatusImpl(type, trimmed_value,
+                                                       app_locale, status);
 }
 
 // static
@@ -1203,4 +1221,11 @@
             << profile.use_date();
 }
 
+bool AutofillProfile::FinalizeAfterImport() {
+  bool success = true;
+  if (!name_.FinalizeAfterImport())
+    success = false;
+
+  return success;
+}
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_profile.h b/components/autofill/core/browser/data_model/autofill_profile.h
index a984548..2021e66 100644
--- a/components/autofill/core/browser/data_model/autofill_profile.h
+++ b/components/autofill/core/browser/data_model/autofill_profile.h
@@ -77,7 +77,10 @@
           matching_types_validities) const;
 
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
 
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
 
@@ -276,15 +279,29 @@
     return weak_ptr_factory_.GetWeakPtr();
   }
 
+  // Calls |FinalizeAfterImport()| on all |FormGroup| members that are
+  // implemented using the hybrid-structure |AddressComponent|.
+  // If possible, this will initiate the completion of the structure tree to
+  // derive all missing values either by parsing their parent node if assigned,
+  // or by formatting the value from their child nodes.
+  // Returns true if all calls yielded true.
+  bool FinalizeAfterImport();
+
  private:
   typedef std::vector<const FormGroup*> FormGroupList;
 
   // FormGroup:
   base::string16 GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
-  bool SetInfoImpl(const AutofillType& type,
-                   const base::string16& value,
-                   const std::string& app_locale) override;
+
+  structured_address::VerificationStatus GetVerificationStatusImpl(
+      const ServerFieldType type) const override;
+
+  bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      structured_address::VerificationStatus status) override;
 
   // Creates inferred labels for |profiles| at indices corresponding to
   // |indices|, and stores the results to the corresponding elements of
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 58f33697..1379c75 100644
--- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -33,6 +33,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 namespace {
 
 base::string16 GetLabel(AutofillProfile* profile) {
@@ -954,6 +956,120 @@
       comparator, profile2, "pt-BR", {NAME_FULL, PHONE_HOME_CITY_AND_NUMBER}));
 }
 
+TEST(AutofillProfileTest, TestFinalizeAfterImport) {
+  base::test::ScopedFeatureList structured_addresses_feature;
+  structured_addresses_feature.InitAndEnableFeature(
+      features::kAutofillEnableSupportForMoreStructureInNames);
+
+  // A profile with just a full name should be finalizeable.
+  {
+    AutofillProfile profile;
+    profile.SetRawInfoWithVerificationStatus(NAME_FULL,
+                                             base::ASCIIToUTF16("Peter Pan"),
+                                             VerificationStatus::kObserved);
+    EXPECT_TRUE(profile.FinalizeAfterImport());
+    EXPECT_EQ(profile.GetRawInfo(NAME_FIRST), base::ASCIIToUTF16("Peter"));
+    EXPECT_EQ(profile.GetVerificationStatus(NAME_FIRST),
+              VerificationStatus::kParsed);
+    EXPECT_EQ(profile.GetRawInfo(NAME_LAST), base::ASCIIToUTF16("Pan"));
+    EXPECT_EQ(profile.GetVerificationStatus(NAME_LAST),
+              VerificationStatus::kParsed);
+  }
+  // A profile with both a NAME_FULL and NAME_FIRST is currently not, because
+  // the full name is likely to already contain the information in the first
+  // name. The current completion logic does not support such a scenario because
+  // it is highly likely that this scenario is caused by a classification error
+  // and would not yield a correctly imported name.
+  {
+    AutofillProfile profile;
+    profile.SetRawInfoWithVerificationStatus(NAME_FULL,
+                                             base::ASCIIToUTF16("Peter Pan"),
+                                             VerificationStatus::kObserved);
+    profile.SetRawInfoWithVerificationStatus(NAME_FIRST,
+                                             base::ASCIIToUTF16("Michael"),
+                                             VerificationStatus::kObserved);
+    EXPECT_FALSE(profile.FinalizeAfterImport());
+  }
+}
+
+TEST(AutofillProfileTest, SetAndGetRawInfoWithValidationStatus) {
+  base::test::ScopedFeatureList structured_addresses_feature;
+  structured_addresses_feature.InitAndEnableFeature(
+      features::kAutofillEnableSupportForMoreStructureInNames);
+
+  AutofillProfile profile;
+  // An unsupported type should return |kNoStatus|.
+  EXPECT_EQ(profile.GetVerificationStatus(UNKNOWN_TYPE),
+            VerificationStatus::kNoStatus);
+  EXPECT_EQ(profile.GetVerificationStatus(PHONE_HOME_NUMBER),
+            VerificationStatus::kNoStatus);
+
+  // An unassigned supported type should return |kNoStatus|.
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_FULL),
+            VerificationStatus::kNoStatus);
+
+  // Set a value with verification status and verify the results.
+  profile.SetRawInfoWithVerificationStatus(NAME_FULL,
+                                           base::ASCIIToUTF16("full name"),
+                                           VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetVerificationStatusInt(NAME_FULL), 2);
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_FULL),
+            VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetRawInfo(NAME_FULL), base::ASCIIToUTF16("full name"));
+
+  // Test the working of the wrapper to pass the value by int.
+  profile.SetRawInfoWithVerificationStatusInt(
+      NAME_FULL, base::ASCIIToUTF16("full name"), 2);
+  EXPECT_EQ(profile.GetVerificationStatusInt(NAME_FULL), 2);
+}
+
+TEST(AutofillProfileTest, SetAndGetInfoWithValidationStatus) {
+  base::test::ScopedFeatureList structured_addresses_feature;
+  structured_addresses_feature.InitAndEnableFeature(
+      features::kAutofillEnableSupportForMoreStructureInNames);
+
+  AutofillProfile profile;
+  // An unsupported type should return |kNoStatus|.
+  EXPECT_EQ(profile.GetVerificationStatus(UNKNOWN_TYPE),
+            VerificationStatus::kNoStatus);
+  EXPECT_EQ(profile.GetVerificationStatus(PHONE_HOME_NUMBER),
+            VerificationStatus::kNoStatus);
+
+  // An unassigned supported type should return |kNoStatus|.
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_FULL),
+            VerificationStatus::kNoStatus);
+
+  // Set a value with verification status and verify the results.
+  profile.SetInfoWithVerificationStatus(
+      AutofillType(NAME_FULL), base::ASCIIToUTF16("full name"), "en-US",
+      VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_FULL),
+            VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetRawInfo(NAME_FULL), base::ASCIIToUTF16("full name"));
+
+  // Settings an unknown type should result in false.
+  EXPECT_FALSE(profile.SetInfoWithVerificationStatus(
+      UNKNOWN_TYPE, base::ASCIIToUTF16("DM"), "en-US",
+      VerificationStatus::kFormatted));
+
+  // Set a value with verification status using and AutofillType and verify the
+  // results.
+  EXPECT_TRUE(profile.SetInfoWithVerificationStatus(
+      AutofillType(NAME_MIDDLE_INITIAL), base::ASCIIToUTF16("MK"), "en-US",
+      VerificationStatus::kFormatted));
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_MIDDLE_INITIAL),
+            VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetRawInfo(NAME_MIDDLE_INITIAL), base::ASCIIToUTF16("MK"));
+
+  // Set a value with verification status and verify the results.
+  EXPECT_TRUE(profile.SetInfoWithVerificationStatus(
+      AutofillType(NAME_MIDDLE_INITIAL), base::ASCIIToUTF16("CS"), "en-US",
+      VerificationStatus::kFormatted));
+  EXPECT_EQ(profile.GetVerificationStatus(NAME_MIDDLE_INITIAL),
+            VerificationStatus::kFormatted);
+  EXPECT_EQ(profile.GetRawInfo(NAME_MIDDLE_INITIAL), base::ASCIIToUTF16("CS"));
+}
+
 TEST(AutofillProfileTest, SetRawInfo_UpdateValidityFlag) {
   AutofillProfile a;
   SetupValidatedTestProfile(a);
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 5953037..d228959 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
@@ -307,7 +307,7 @@
   return false;
 }
 
-std::vector<const RE2*>
+std::vector<const re2::RE2*>
 AddressComponent::GetParseRegularExpressionsByRelevance() const {
   return {};
 }
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 dbb085f..1fd3ce5 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
@@ -12,7 +12,10 @@
 #include "base/optional.h"
 #include "base/strings/string_piece.h"
 #include "components/autofill/core/browser/field_types.h"
-#include "third_party/re2/src/re2/re2.h"
+
+namespace re2 {
+class RE2;
+}  // namespace re2
 
 namespace autofill {
 namespace structured_address {
@@ -248,7 +251,8 @@
   }
 
   // Returns the parse expressions by relevance for testing.
-  std::vector<const RE2*> GetParseRegularExpressionsByRelevanceForTesting() {
+  std::vector<const re2::RE2*>
+  GetParseRegularExpressionsByRelevanceForTesting() {
     return GetParseRegularExpressionsByRelevance();
   }
 
@@ -280,7 +284,8 @@
 
   // Returns pointers to regular expressions sorted by their relevance.
   // This method is virtual and can be reimplemented for each type.
-  virtual std::vector<const RE2*> GetParseRegularExpressionsByRelevance() const;
+  virtual std::vector<const re2::RE2*> GetParseRegularExpressionsByRelevance()
+      const;
 
   // Method to parse |value_| into the values of |subcomponents_|. The
   // purpose of this method is to cover special cases. This method returns true
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 4ab53f0..6a1983e 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
@@ -135,7 +135,7 @@
 
 NameLastConjunction::~NameLastConjunction() = default;
 
-std::vector<const RE2*> NameLast::GetParseRegularExpressionsByRelevance()
+std::vector<const re2::RE2*> NameLast::GetParseRegularExpressionsByRelevance()
     const {
   auto* pattern_provider = StructuredAddressesRegExProvider::Instance();
   DCHECK(pattern_provider);
@@ -172,7 +172,7 @@
           parent,
           {&name_honorific_, &name_first_, &name_middle_, &name_last_}) {}
 
-std::vector<const RE2*> NameFull::GetParseRegularExpressionsByRelevance()
+std::vector<const re2::RE2*> NameFull::GetParseRegularExpressionsByRelevance()
     const {
   auto* pattern_provider = StructuredAddressesRegExProvider::Instance();
   DCHECK(pattern_provider);
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 6083e993..1fc1906f 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
@@ -10,6 +10,10 @@
 
 #include "components/autofill/core/browser/data_model/autofill_structured_address_component.h"
 
+namespace re2 {
+class RE2;
+}  // namespace re2
+
 using autofill::structured_address::AddressComponent;
 
 namespace autofill {
@@ -124,7 +128,7 @@
   explicit NameLast(AddressComponent* parent);
   ~NameLast() override;
 
-  std::vector<const RE2*> GetParseRegularExpressionsByRelevance()
+  std::vector<const re2::RE2*> GetParseRegularExpressionsByRelevance()
       const override;
 
  private:
@@ -163,7 +167,7 @@
   explicit NameFull(AddressComponent* parent);
   ~NameFull() override;
 
-  std::vector<const RE2*> GetParseRegularExpressionsByRelevance()
+  std::vector<const re2::RE2*> GetParseRegularExpressionsByRelevance()
       const override;
 
  private:
diff --git a/components/autofill/core/browser/data_model/contact_info.cc b/components/autofill/core/browser/data_model/contact_info.cc
index fc97e3e..843da4d4 100644
--- a/components/autofill/core/browser/data_model/contact_info.cc
+++ b/components/autofill/core/browser/data_model/contact_info.cc
@@ -22,99 +22,168 @@
 
 namespace autofill {
 
-NameInfo::NameInfo() {}
+using structured_address::VerificationStatus;
+
+namespace {
+
+// TODO(crbug.com/1103421): Clean legacy implementation once structured names
+// are fully launched.
+bool StructuredAddressesEnabled() {
+  return base::FeatureList::IsEnabled(
+      features::kAutofillEnableSupportForMoreStructureInNames);
+}
+}  // namespace
+
+NameInfo::NameInfo() = default;
 
 NameInfo::NameInfo(const NameInfo& info) {
   *this = info;
 }
 
-NameInfo::~NameInfo() {}
+NameInfo::~NameInfo() = default;
 
 NameInfo& NameInfo::operator=(const NameInfo& info) {
   if (this == &info)
     return *this;
 
-  given_ = info.given_;
-  middle_ = info.middle_;
-  family_ = info.family_;
-  full_ = info.full_;
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled()) {
+    name_ = info.name_;
+  } else {
+    given_ = info.given_;
+    middle_ = info.middle_;
+    family_ = info.family_;
+    full_ = info.full_;
+  }
   return *this;
 }
 
+bool NameInfo::FinalizeAfterImport() {
+  if (StructuredAddressesEnabled())
+    return name_.CompleteFullTree();
+  return true;
+}
+
 bool NameInfo::operator==(const NameInfo& other) const {
   if (this == &other)
     return true;
+
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled())
+    return name_ == other.name_;
+
   return given_ == other.given_ && middle_ == other.middle_ &&
          family_ == other.family_ && full_ == other.full_;
 }
 
 base::string16 NameInfo::GetRawInfo(ServerFieldType type) const {
   DCHECK_EQ(NAME, AutofillType(type).group());
-  switch (type) {
-    case NAME_FIRST:
-      return given_;
 
-    case NAME_MIDDLE:
-      return middle_;
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled()) {
+    return name_.GetValueForType(type);
+  } else {
+    switch (type) {
+      case NAME_FIRST:
+        return given_;
 
-    case NAME_LAST:
-      return family_;
+      case NAME_MIDDLE:
+        return middle_;
 
-    case NAME_MIDDLE_INITIAL:
-      return MiddleInitial();
+      case NAME_LAST:
+        return family_;
 
-    case NAME_FULL:
-      return full_;
+      case NAME_MIDDLE_INITIAL:
+        return MiddleInitial();
 
-    default:
-      return base::string16();
+      case NAME_FULL:
+        return full_;
+
+      default:
+        return base::string16();
+    }
   }
 }
 
-void NameInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
+void NameInfo::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                                const base::string16& value,
+                                                VerificationStatus status) {
   DCHECK_EQ(NAME, AutofillType(type).group());
-  switch (type) {
-    case NAME_FIRST:
-      given_ = value;
-      break;
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled()) {
+    bool success = name_.SetValueForTypeIfPossible(type, value, status);
+    DCHECK(success);
+  } else {
+    switch (type) {
+      case NAME_FIRST:
+        given_ = value;
+        break;
 
-    case NAME_MIDDLE:
-    case NAME_MIDDLE_INITIAL:
-      middle_ = value;
-      break;
+      case NAME_MIDDLE:
+      case NAME_MIDDLE_INITIAL:
+        middle_ = value;
+        break;
 
-    case NAME_LAST:
-      family_ = value;
-      break;
+      case NAME_LAST:
+        family_ = value;
+        break;
 
-    case NAME_FULL:
-      full_ = value;
-      break;
+      case NAME_FULL:
+        full_ = value;
+        break;
 
-    default:
-      NOTREACHED();
+      case NAME_LAST_FIRST:
+      case NAME_LAST_SECOND:
+      case NAME_LAST_CONJUNCTION:
+      case NAME_HONORIFIC_PREFIX:
+        break;
+
+      default:
+        NOTREACHED();
+    }
   }
 }
 
 void NameInfo::GetSupportedTypes(ServerFieldTypeSet* supported_types) const {
-  supported_types->insert(NAME_FIRST);
-  supported_types->insert(NAME_MIDDLE);
-  supported_types->insert(NAME_LAST);
-  supported_types->insert(NAME_MIDDLE_INITIAL);
-  supported_types->insert(NAME_FULL);
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled()) {
+    name_.GetSupportedTypes(supported_types);
+  } else {
+    supported_types->insert(NAME_FIRST);
+    supported_types->insert(NAME_MIDDLE);
+    supported_types->insert(NAME_LAST);
+    supported_types->insert(NAME_MIDDLE_INITIAL);
+    supported_types->insert(NAME_FULL);
+  }
 }
 
 base::string16 NameInfo::GetInfoImpl(const AutofillType& type,
                                      const std::string& app_locale) const {
-  if (type.GetStorableType() == NAME_FULL)
-    return FullName();
-
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (!StructuredAddressesEnabled()) {
+    if (type.GetStorableType() == NAME_FULL)
+      return FullName();
+  }
   return GetRawInfo(type.GetStorableType());
 }
 
-bool NameInfo::SetInfoImpl(const AutofillType& type,
-                           const base::string16& value,
-                           const std::string& app_locale) {
+bool NameInfo::SetInfoWithVerificationStatusImpl(const AutofillType& type,
+                                                 const base::string16& value,
+                                                 const std::string& app_locale,
+                                                 VerificationStatus status) {
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled()) {
+    return FormGroup::SetInfoWithVerificationStatusImpl(type, value, app_locale,
+                                                        status);
+  }
+
   // Always clear out the full name if we're making a change.
   if (value != GetInfo(type, app_locale))
     full_.clear();
@@ -124,10 +193,24 @@
     return true;
   }
 
-  return FormGroup::SetInfoImpl(type, value, app_locale);
+  return FormGroup::SetInfoWithVerificationStatusImpl(type, value, app_locale,
+                                                      status);
+}
+
+VerificationStatus NameInfo::GetVerificationStatusImpl(
+    ServerFieldType type) const {
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled())
+    return name_.GetVerificationStatusForType(type);
+  return VerificationStatus::kNoStatus;
 }
 
 base::string16 NameInfo::FullName() const {
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled())
+    NOTREACHED();
   if (!full_.empty())
     return full_;
 
@@ -135,10 +218,18 @@
 }
 
 base::string16 NameInfo::MiddleInitial() const {
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled())
+    NOTREACHED();
   return middle_.empty() ? base::string16() : middle_.substr(0U, 1U);
 }
 
 void NameInfo::SetFullName(const base::string16& full) {
+  // TODO(crbug.com/1103421): Clean legacy implementation once structured names
+  // are fully launched.
+  if (StructuredAddressesEnabled())
+    NOTREACHED();
   full_ = full;
   data_util::NameParts parts = data_util::SplitName(full);
   given_ = parts.given;
@@ -146,13 +237,13 @@
   family_ = parts.family;
 }
 
-EmailInfo::EmailInfo() {}
+EmailInfo::EmailInfo() = default;
 
 EmailInfo::EmailInfo(const EmailInfo& info) {
   *this = info;
 }
 
-EmailInfo::~EmailInfo() {}
+EmailInfo::~EmailInfo() = default;
 
 EmailInfo& EmailInfo::operator=(const EmailInfo& info) {
   if (this == &info)
@@ -177,12 +268,14 @@
   return base::string16();
 }
 
-void EmailInfo::SetRawInfo(ServerFieldType type, const base::string16& value) {
+void EmailInfo::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                                 const base::string16& value,
+                                                 VerificationStatus status) {
   DCHECK_EQ(EMAIL_ADDRESS, type);
   email_ = value;
 }
 
-CompanyInfo::CompanyInfo() {}
+CompanyInfo::CompanyInfo() = default;
 
 CompanyInfo::CompanyInfo(const AutofillProfile* profile) : profile_(profile) {}
 
@@ -190,7 +283,7 @@
   *this = info;
 }
 
-CompanyInfo::~CompanyInfo() {}
+CompanyInfo::~CompanyInfo() = default;
 
 CompanyInfo& CompanyInfo::operator=(const CompanyInfo& info) {
   if (this == &info)
@@ -213,8 +306,9 @@
   return IsValidOrVerified(company_name_) ? company_name_ : base::string16();
 }
 
-void CompanyInfo::SetRawInfo(ServerFieldType type,
-                             const base::string16& value) {
+void CompanyInfo::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                                   const base::string16& value,
+                                                   VerificationStatus status) {
   DCHECK_EQ(COMPANY_NAME, type);
   company_name_ = value;
 }
diff --git a/components/autofill/core/browser/data_model/contact_info.h b/components/autofill/core/browser/data_model/contact_info.h
index cedfe7b..c67974a 100644
--- a/components/autofill/core/browser/data_model/contact_info.h
+++ b/components/autofill/core/browser/data_model/contact_info.h
@@ -5,10 +5,12 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_CONTACT_INFO_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_CONTACT_INFO_H_
 
+#include <string>
 #include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/strings/string16.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_name.h"
 #include "components/autofill/core/browser/data_model/form_group.h"
 
 namespace autofill {
@@ -28,16 +30,37 @@
 
   // FormGroup:
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
+
+  // Derives all missing tokens in the structured representation of the name by
+  // either parsing missing tokens from their assigned parent or by formatting
+  // them from their assigned children.
+  // Return false if the completion is not possible either because no value is
+  // set or because there are two conflicting values set. Two values are
+  // conflicting iff they are on the same root-to-leaf path.
+  // For example, NAME_FIRST is child of NAME_LAST and if both are set, the tree
+  // cannot be completed.
+  bool FinalizeAfterImport();
 
  private:
   // FormGroup:
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
   base::string16 GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
-  bool SetInfoImpl(const AutofillType& type,
-                   const base::string16& value,
-                   const std::string& app_locale) override;
+
+  bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      structured_address::VerificationStatus status) override;
+
+  // Return the verification status of a structured name value.
+  structured_address::VerificationStatus GetVerificationStatusImpl(
+      ServerFieldType type) const override;
 
   // Returns the full name, which is either |full_|, or if |full_| is empty,
   // is composed of given, middle and family.
@@ -50,10 +73,16 @@
   // Sets |given_|, |middle_|, and |family_| to the tokenized |full|.
   void SetFullName(const base::string16& full);
 
+  // Legacy fields to store the unstructured representation of the name when
+  // |features::kAutofillEnableSupportForMoreStructureInNames| is not enabled.
   base::string16 given_;
   base::string16 middle_;
   base::string16 family_;
   base::string16 full_;
+
+  // This data structure stores the more-structured representation of the name
+  // when |features::kAutofillEnableSupportForMoreStructureInNames| is enabled.
+  structured_address::NameFull name_;
 };
 
 class EmailInfo : public FormGroup {
@@ -68,7 +97,10 @@
 
   // FormGroup:
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
 
  private:
   // FormGroup:
@@ -90,7 +122,10 @@
 
   // FormGroup:
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
   void set_profile(const AutofillProfile* profile) { profile_ = profile; }
 
  private:
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 e0bcfce..5f284a4d 100644
--- a/components/autofill/core/browser/data_model/contact_info_unittest.cc
+++ b/components/autofill/core/browser/data_model/contact_info_unittest.cc
@@ -23,6 +23,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 struct FullNameTestCase {
   std::string full_name_input;
   std::string given_name_output;
@@ -49,6 +51,48 @@
             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
 }
 
+TEST(NameInfoTest, GetMatchingTypesForStructuredName) {
+  base::test::ScopedFeatureList structured_name_feature;
+  structured_name_feature.InitAndEnableFeature(
+      features::kAutofillEnableSupportForMoreStructureInNames);
+
+  NameInfo name;
+  name.SetRawInfoWithVerificationStatus(
+      NAME_FULL, base::ASCIIToUTF16("Mr. Pablo Diego Ruiz y Picasso"),
+      VerificationStatus::kObserved);
+  name.FinalizeAfterImport();
+
+  EXPECT_EQ(name.GetRawInfo(NAME_HONORIFIC_PREFIX), base::ASCIIToUTF16("Mr."));
+  EXPECT_EQ(name.GetRawInfo(NAME_FIRST), base::ASCIIToUTF16("Pablo Diego"));
+  EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), base::ASCIIToUTF16(""));
+  EXPECT_EQ(name.GetRawInfo(NAME_LAST), base::ASCIIToUTF16("Ruiz y Picasso"));
+  EXPECT_EQ(name.GetRawInfo(NAME_LAST_FIRST), base::ASCIIToUTF16("Ruiz"));
+  EXPECT_EQ(name.GetRawInfo(NAME_LAST_SECOND), base::ASCIIToUTF16("Picasso"));
+  EXPECT_EQ(name.GetRawInfo(NAME_LAST_CONJUNCTION), base::ASCIIToUTF16("y"));
+
+  EXPECT_EQ(name.GetVerificationStatus(NAME_HONORIFIC_PREFIX),
+            VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_FIRST),
+            VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_MIDDLE),
+            VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_LAST), VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_LAST_FIRST),
+            VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_LAST_SECOND),
+            VerificationStatus::kParsed);
+  EXPECT_EQ(name.GetVerificationStatus(NAME_LAST_CONJUNCTION),
+            VerificationStatus::kParsed);
+
+  ServerFieldTypeSet matching_types;
+  name.GetMatchingTypes(base::ASCIIToUTF16("Ruiz"), "US", &matching_types);
+  EXPECT_EQ(matching_types, ServerFieldTypeSet({NAME_LAST_FIRST}));
+
+  name.GetMatchingTypes(base::ASCIIToUTF16("Mr."), "US", &matching_types);
+  EXPECT_EQ(matching_types,
+            ServerFieldTypeSet({NAME_LAST_FIRST, NAME_HONORIFIC_PREFIX}));
+}
+
 INSTANTIATE_TEST_SUITE_P(
     ContactInfoTest,
     SetFullNameTest,
@@ -165,7 +209,7 @@
             name.GetInfo(AutofillType(NAME_FULL), "en-US"));
 
   // Setting raw info: no change. (Even though this leads to a slightly
-  // inconsitent state.)
+  // inconsistent state.)
   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Second"));
   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("Second"));
   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index 92174b3..224e5bb 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -45,6 +45,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 // Unicode characters used in card number obfuscation:
 //  - 0x2022 - Bullet.
 //  - 0x2006 - SIX-PER-EM SPACE (small space between bullets).
@@ -405,7 +407,9 @@
   }
 }
 
-void CreditCard::SetRawInfo(ServerFieldType type, const base::string16& value) {
+void CreditCard::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                                  const base::string16& value,
+                                                  VerificationStatus status) {
   DCHECK_EQ(CREDIT_CARD, AutofillType(type).group());
   switch (type) {
     case CREDIT_CARD_NAME_FULL:
@@ -966,17 +970,21 @@
   return GetRawInfo(storable_type);
 }
 
-bool CreditCard::SetInfoImpl(const AutofillType& type,
-                             const base::string16& value,
-                             const std::string& app_locale) {
+bool CreditCard::SetInfoWithVerificationStatusImpl(
+    const AutofillType& type,
+    const base::string16& value,
+    const std::string& app_locale,
+    VerificationStatus status) {
   ServerFieldType storable_type = type.GetStorableType();
   if (storable_type == CREDIT_CARD_EXP_MONTH)
     return SetExpirationMonthFromString(value, app_locale);
 
-  if (storable_type == CREDIT_CARD_NUMBER)
-    SetRawInfo(storable_type, StripSeparators(value));
-  else
-    SetRawInfo(storable_type, value);
+  if (storable_type == CREDIT_CARD_NUMBER) {
+    SetRawInfoWithVerificationStatus(storable_type, StripSeparators(value),
+                                     status);
+  } else {
+    SetRawInfoWithVerificationStatus(storable_type, value, status);
+  }
   return true;
 }
 
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h
index e47bf9f..6f9d208 100644
--- a/components/autofill/core/browser/data_model/credit_card.h
+++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -120,7 +120,10 @@
                         const std::string& app_locale,
                         ServerFieldTypeSet* matching_types) const override;
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
 
   // Special method to set value for HTML5 month input type.
   void SetInfoForMonthInputType(const base::string16& value);
@@ -312,9 +315,11 @@
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
   base::string16 GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
-  bool SetInfoImpl(const AutofillType& type,
-                   const base::string16& value,
-                   const std::string& app_locale) override;
+  bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      structured_address::VerificationStatus status) override;
 
   // The issuer network of the card to fill in to the page, e.g. 'Mastercard'.
   base::string16 NetworkForFill() const;
diff --git a/components/autofill/core/browser/data_model/form_group.cc b/components/autofill/core/browser/data_model/form_group.cc
index 71d0293..bf2416f 100644
--- a/components/autofill/core/browser/data_model/form_group.cc
+++ b/components/autofill/core/browser/data_model/form_group.cc
@@ -4,13 +4,17 @@
 
 #include "components/autofill/core/browser/data_model/form_group.h"
 
+#include "base/strings/string_number_conversions.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/autofill_profile_comparator.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_component.h"
 #include "components/autofill/core/common/autofill_l10n_util.h"
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 void FormGroup::GetMatchingTypes(const base::string16& text,
                                  const std::string& app_locale,
                                  ServerFieldTypeSet* matching_types) const {
@@ -59,16 +63,51 @@
   return GetInfoImpl(type, app_locale);
 }
 
+VerificationStatus FormGroup::GetVerificationStatus(
+    ServerFieldType type) const {
+  return GetVerificationStatusImpl(type);
+}
+
+VerificationStatus FormGroup::GetVerificationStatus(
+    const AutofillType& type) const {
+  return GetVerificationStatus(type.GetStorableType());
+}
+
+int FormGroup::GetVerificationStatusInt(ServerFieldType type) const {
+  return static_cast<int>(GetVerificationStatus(type));
+}
+
+int FormGroup::GetVerificationStatusInt(const AutofillType& type) const {
+  return static_cast<int>(GetVerificationStatus(type));
+}
+
 bool FormGroup::SetInfo(ServerFieldType type,
                         const base::string16& value,
                         const std::string& app_locale) {
-  return SetInfoImpl(AutofillType(type), value, app_locale);
+  return SetInfoWithVerificationStatus(type, value, app_locale,
+                                       VerificationStatus::kNoStatus);
 }
 
 bool FormGroup::SetInfo(const AutofillType& type,
                         const base::string16& value,
                         const std::string& app_locale) {
-  return SetInfoImpl(type, value, app_locale);
+  return SetInfoWithVerificationStatus(type, value, app_locale,
+                                       VerificationStatus::kNoStatus);
+}
+
+bool FormGroup::SetInfoWithVerificationStatus(ServerFieldType type,
+                                              const base::string16& value,
+                                              const std::string& app_locale,
+                                              const VerificationStatus status) {
+  return SetInfoWithVerificationStatusImpl(AutofillType(type), value,
+                                           app_locale, status);
+}
+
+bool FormGroup::SetInfoWithVerificationStatus(const AutofillType& type,
+                                              const base::string16& value,
+                                              const std::string& app_locale,
+                                              VerificationStatus status) {
+  return SetInfoWithVerificationStatusImpl(type, value, app_locale, status);
 }
 
 bool FormGroup::HasInfo(ServerFieldType type) const {
@@ -86,11 +125,28 @@
   return GetRawInfo(type.GetStorableType());
 }
 
-bool FormGroup::SetInfoImpl(const AutofillType& type,
-                            const base::string16& value,
-                            const std::string& app_locale) {
-  SetRawInfo(type.GetStorableType(), value);
+bool FormGroup::SetInfoWithVerificationStatusImpl(const AutofillType& type,
+                                                  const base::string16& value,
+                                                  const std::string& app_locale,
+                                                  VerificationStatus status) {
+  SetRawInfoWithVerificationStatus(type.GetStorableType(), value, status);
   return true;
 }
 
+void FormGroup::SetRawInfo(ServerFieldType type, const base::string16& value) {
+  SetRawInfoWithVerificationStatus(type, value, VerificationStatus::kNoStatus);
+}
+
+void FormGroup::SetRawInfoWithVerificationStatusInt(ServerFieldType type,
+                                                    const base::string16& value,
+                                                    int status) {
+  SetRawInfoWithVerificationStatus(type, value,
+                                   static_cast<VerificationStatus>(status));
+}
+
+VerificationStatus FormGroup::GetVerificationStatusImpl(
+    ServerFieldType type) const {
+  return VerificationStatus::kNoStatus;
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/form_group.h b/components/autofill/core/browser/data_model/form_group.h
index d46c9bc..18760f3 100644
--- a/components/autofill/core/browser/data_model/form_group.h
+++ b/components/autofill/core/browser/data_model/form_group.h
@@ -12,12 +12,16 @@
 
 namespace autofill {
 
+namespace structured_address {
+enum class VerificationStatus;
+}
+
 class AutofillType;
 
 // This class is an interface for collections of form fields, grouped by type.
 class FormGroup {
  public:
-  virtual ~FormGroup() {}
+  virtual ~FormGroup() = default;
 
   // Used to determine the type of a field based on the |text| that a user
   // enters into the field, interpreted in the given |app_locale| if
@@ -36,11 +40,28 @@
   // returned value. For user-visible strings, use GetInfo() instead.
   virtual base::string16 GetRawInfo(ServerFieldType type) const = 0;
 
+  // Finalization routine that should be called after importing a FormGroup.
+  // Returns true if the finalization was successful.
+  bool FinalizeAfterImport();
+
   // Sets this FormGroup object's data for |type| to |value|, without
   // canonicalizing the |value|.  For data that has not already been
   // canonicalized, use SetInfo() instead.
-  virtual void SetRawInfo(ServerFieldType type,
-                          const base::string16& value) = 0;
+  // Accepts a verification status.
+  virtual void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) = 0;
+
+  // Convenience wrapper to allow passing the status as an integer.
+  void SetRawInfoWithVerificationStatusInt(ServerFieldType type,
+                                           const base::string16& value,
+                                           int status);
+
+  // Convenience wrapper to add
+  // |structured_address::VerificationStatus::kNoStatus| to
+  // |SetRawInfoWithVerificationStatus|.
+  void SetRawInfo(ServerFieldType type, const base::string16& value);
 
   // Returns true iff the string associated with |type| is nonempty (without
   // canonicalizing its value).
@@ -53,6 +74,18 @@
   base::string16 GetInfo(const AutofillType& type,
                          const std::string& app_locale) const;
 
+  // Returns the verification status associated with the type.
+  // Returns kNoStatus if the type does not support a verification status.
+  virtual structured_address::VerificationStatus GetVerificationStatus(
+      ServerFieldType type) const;
+  structured_address::VerificationStatus GetVerificationStatus(
+      const AutofillType& type) const;
+
+  // Convenience wrappers to retrieve the Verification status in integer
+  // representation.
+  int GetVerificationStatusInt(ServerFieldType type) const;
+  int GetVerificationStatusInt(const AutofillType& type) const;
+
   // Used to populate this FormGroup object with data. Canonicalizes the data
   // according to the specified |app_locale| prior to storing, if appropriate.
   bool SetInfo(ServerFieldType type,
@@ -62,6 +95,19 @@
                const base::string16& value,
                const std::string& app_locale);
 
+  // Same as |SetInfo| but supports a verification status.
+  bool SetInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      const std::string& app_locale,
+      const structured_address::VerificationStatus status);
+
+  bool SetInfoWithVerificationStatus(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      const structured_address::VerificationStatus status);
+
   // Returns true iff the string associated with |type| is nonempty.
   bool HasInfo(ServerFieldType type) const;
   bool HasInfo(const AutofillType& type) const;
@@ -82,9 +128,15 @@
 
   // Used to populate this FormGroup object with data. Canonicalizes the data
   // according to the specified |app_locale| prior to storing, if appropriate.
-  virtual bool SetInfoImpl(const AutofillType& type,
-                           const base::string16& value,
-                           const std::string& app_locale);
+  virtual bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      const structured_address::VerificationStatus status);
+
+  // Used to retrieve the verification status of a value associated with |type|.
+  virtual structured_address::VerificationStatus GetVerificationStatusImpl(
+      ServerFieldType type) const;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/phone_number.cc b/components/autofill/core/browser/data_model/phone_number.cc
index 96a2b0b..c992333 100644
--- a/components/autofill/core/browser/data_model/phone_number.cc
+++ b/components/autofill/core/browser/data_model/phone_number.cc
@@ -20,6 +20,9 @@
 #include "components/autofill/core/common/autofill_features.h"
 
 namespace autofill {
+
+using structured_address::VerificationStatus;
+
 namespace {
 
 // Returns the region code for this phone number, which is an ISO 3166 2-letter
@@ -81,8 +84,9 @@
   return base::string16();
 }
 
-void PhoneNumber::SetRawInfo(ServerFieldType type,
-                             const base::string16& value) {
+void PhoneNumber::SetRawInfoWithVerificationStatus(ServerFieldType type,
+                                                   const base::string16& value,
+                                                   VerificationStatus status) {
   DCHECK_EQ(PHONE_HOME, AutofillType(type).group());
   if (type != PHONE_HOME_CITY_AND_NUMBER && type != PHONE_HOME_WHOLE_NUMBER) {
     // Only full phone numbers should be set directly.  The remaining field
@@ -208,10 +212,12 @@
   }
 }
 
-bool PhoneNumber::SetInfoImpl(const AutofillType& type,
-                              const base::string16& value,
-                              const std::string& app_locale) {
-  SetRawInfo(type.GetStorableType(), value);
+bool PhoneNumber::SetInfoWithVerificationStatusImpl(
+    const AutofillType& type,
+    const base::string16& value,
+    const std::string& app_locale,
+    VerificationStatus status) {
+  SetRawInfoWithVerificationStatus(type.GetStorableType(), value, status);
 
   if (number_.empty())
     return true;
diff --git a/components/autofill/core/browser/data_model/phone_number.h b/components/autofill/core/browser/data_model/phone_number.h
index 2a11e1c..ef29aee 100644
--- a/components/autofill/core/browser/data_model/phone_number.h
+++ b/components/autofill/core/browser/data_model/phone_number.h
@@ -36,7 +36,10 @@
                         const std::string& app_locale,
                         ServerFieldTypeSet* matching_types) const override;
   base::string16 GetRawInfo(ServerFieldType type) const override;
-  void SetRawInfo(ServerFieldType type, const base::string16& value) override;
+  void SetRawInfoWithVerificationStatus(
+      ServerFieldType type,
+      const base::string16& value,
+      structured_address::VerificationStatus status) override;
 
   // Size and offset of the prefix and suffix portions of phone numbers.
   static const size_t kPrefixOffset = 0;
@@ -51,7 +54,7 @@
     ~PhoneCombineHelper();
 
     // If |type| is a phone field type, saves the |value| accordingly and
-    // returns true.  For all other field types returs false.
+    // returns true.  For all other field types returns false.
     bool SetInfo(const AutofillType& type, const base::string16& value);
 
     // Parses the number built up from pieces stored via SetInfo() according to
@@ -77,9 +80,11 @@
   void GetSupportedTypes(ServerFieldTypeSet* supported_types) const override;
   base::string16 GetInfoImpl(const AutofillType& type,
                              const std::string& app_locale) const override;
-  bool SetInfoImpl(const AutofillType& type,
-                   const base::string16& value,
-                   const std::string& app_locale) override;
+  bool SetInfoWithVerificationStatusImpl(
+      const AutofillType& type,
+      const base::string16& value,
+      const std::string& app_locale,
+      structured_address::VerificationStatus status) override;
 
   // Updates the cached parsed number if the profile's region has changed
   // since the last time the cache was updated.
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc
index 3836e41..ab676ec 100644
--- a/components/autofill/core/browser/field_types.cc
+++ b/components/autofill/core/browser/field_types.cc
@@ -422,6 +422,8 @@
       return "HTML_TYPE_CREDIT_CARD_EXP_4_DIGIT_YEAR";
     case HTML_TYPE_UPI_VPA:
       return "HTML_TYPE_UPI_VPA";
+    case HTML_TYPE_ONE_TIME_CODE:
+      return "HTML_TYPE_ONE_TIME_CODE";
     case HTML_TYPE_UNRECOGNIZED:
       return "HTML_TYPE_UNRECOGNIZED";
   }
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index 54eac2f..c41e81e 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -290,6 +290,9 @@
   // Universal Payment Interface - Virtual Payment Address.
   HTML_TYPE_UPI_VPA,
 
+  // Phone number verification one-time-codes.
+  HTML_TYPE_ONE_TIME_CODE,
+
   // Non-standard autocomplete types.
   HTML_TYPE_UNRECOGNIZED,
 };
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 1009591..b1e36cec 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -23,6 +23,7 @@
 #include "components/autofill/core/browser/autofill_metrics.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_name.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
 #include "components/autofill/core/browser/data_model/phone_number.h"
 #include "components/autofill/core/browser/form_structure.h"
@@ -41,6 +42,8 @@
 
 namespace autofill {
 
+using structured_address::VerificationStatus;
+
 namespace {
 
 using AddressImportRequirement =
@@ -579,8 +582,10 @@
     // We need to store phone data in the variables, before building the whole
     // number at the end. If |value| is not from a phone field, home.SetInfo()
     // returns false and data is stored directly in |candidate_profile|.
-    if (!combined_phone.SetInfo(field_type, value))
-      candidate_profile.SetInfo(field_type, value, app_locale_);
+    if (!combined_phone.SetInfo(field_type, value)) {
+      candidate_profile.SetInfoWithVerificationStatus(
+          field_type, value, app_locale_, VerificationStatus::kObserved);
+    }
 
     // Reject profiles with invalid country information.
     if (server_field_type == ADDRESS_HOME_COUNTRY &&
@@ -595,8 +600,10 @@
         // every language code.
         std::string page_language = client_->GetPageLanguage();
         // Retry to set the country of there is known page language.
-        if (!page_language.empty())
-          candidate_profile.SetInfo(field_type, value, page_language);
+        if (!page_language.empty()) {
+          candidate_profile.SetInfoWithVerificationStatus(
+              field_type, value, page_language, VerificationStatus::kObserved);
+        }
       }
       // Check if the country code was still not determined correctly.
       if (candidate_profile.GetRawInfo(ADDRESS_HOME_COUNTRY).empty()) {
@@ -615,8 +622,9 @@
     base::string16 constructed_number;
     if (!combined_phone.ParseNumber(candidate_profile, app_locale_,
                                     &constructed_number) ||
-        !candidate_profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
-                                   constructed_number, app_locale_)) {
+        !candidate_profile.SetInfoWithVerificationStatus(
+            AutofillType(PHONE_HOME_WHOLE_NUMBER), constructed_number,
+            app_locale_, VerificationStatus::kObserved)) {
       if (import_log_buffer) {
         *import_log_buffer << LogMessage::kImportAddressProfileFromFormFailed
                            << "Invalid phone number." << CTag{};
@@ -669,6 +677,10 @@
 
   if (!all_fullfilled)
     return false;
+
+  if (!candidate_profile.FinalizeAfterImport())
+    return false;
+
   std::string guid =
       personal_data_manager_->SaveImportedProfile(candidate_profile);
 
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 41e5a75..0f717f6 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -358,6 +358,9 @@
       autocomplete_attribute_value == "upi")
     return HTML_TYPE_UPI_VPA;
 
+  if (autocomplete_attribute_value == "one-time-code")
+    return HTML_TYPE_ONE_TIME_CODE;
+
   return HTML_TYPE_UNRECOGNIZED;
 }
 
diff --git a/components/browser_ui/widget/android/java/res/layout/expand_arrow_with_separator.xml b/components/browser_ui/widget/android/java/res/layout/expand_arrow_with_separator.xml
index cffc095..79b1f50 100644
--- a/components/browser_ui/widget/android/java/res/layout/expand_arrow_with_separator.xml
+++ b/components/browser_ui/widget/android/java/res/layout/expand_arrow_with_separator.xml
@@ -27,7 +27,7 @@
         android:layout_width="wrap_content"
         android:paddingStart="@dimen/radio_button_with_description_and_aux_button_spacing"
         android:paddingEnd="@dimen/radio_button_with_description_lateral_padding"
-        android:src="@drawable/ic_expand_more_right_black_24dp"
+        android:src="@drawable/ic_expand_more_horizontal_black_24dp"
         android:background="?android:attr/selectableItemBackground"
         app:tint="@color/default_icon_color_tint_list"/>
 </LinearLayout>
diff --git a/components/component_updater/component_updater_service.h b/components/component_updater/component_updater_service.h
index 2dd5768..c98bc5da 100644
--- a/components/component_updater/component_updater_service.h
+++ b/components/component_updater/component_updater_service.h
@@ -26,6 +26,10 @@
 class ComponentUpdaterPolicyTest;
 }
 
+namespace settings {
+class AccessibilityMainHandler;
+}
+
 namespace update_client {
 class ComponentInstaller;
 class Configurator;
@@ -143,6 +147,7 @@
   virtual bool GetComponentDetails(const std::string& id,
                                    CrxUpdateItem* item) const = 0;
 
+  friend class settings::AccessibilityMainHandler;
   friend class ::ComponentsHandler;
   FRIEND_TEST_ALL_PREFIXES(ComponentInstallerTest, RegisterComponent);
 };
diff --git a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
index 71d0c5e..49e37805 100644
--- a/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
+++ b/components/discardable_memory/client/client_discardable_shared_memory_manager.cc
@@ -295,6 +295,8 @@
 }
 
 void ClientDiscardableSharedMemoryManager::ReleaseFreeMemory() {
+  TRACE_EVENT0("blink",
+               "ClientDiscardableSharedMemoryManager::ReleaseFreeMemory()");
   base::AutoLock lock(lock_);
 
   size_t heap_size_prior_to_releasing_memory = heap_->GetSize();
diff --git a/components/enterprise/BUILD.gn b/components/enterprise/BUILD.gn
index fffeaf86..9f82abd 100644
--- a/components/enterprise/BUILD.gn
+++ b/components/enterprise/BUILD.gn
@@ -48,6 +48,13 @@
       "//net",
     ]
   }
+
+  if (!is_android && !is_chromeos) {
+    sources += [
+      "browser/controller/chrome_browser_cloud_management_controller.cc",
+      "browser/controller/chrome_browser_cloud_management_controller.h",
+    ]
+  }
 }
 
 static_library("test_support") {
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_controller.cc b/components/enterprise/browser/controller/chrome_browser_cloud_management_controller.cc
similarity index 98%
rename from chrome/browser/policy/chrome_browser_cloud_management_controller.cc
rename to components/enterprise/browser/controller/chrome_browser_cloud_management_controller.cc
index 9d4c4cdf..2a33b3f 100644
--- a/chrome/browser/policy/chrome_browser_cloud_management_controller.cc
+++ b/components/enterprise/browser/controller/chrome_browser_cloud_management_controller.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/policy/chrome_browser_cloud_management_controller.h"
+#include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h"
 
 #include <utility>
 
@@ -14,7 +14,6 @@
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
 #include "components/enterprise/browser/controller/chrome_browser_cloud_management_helper.h"
diff --git a/chrome/browser/policy/chrome_browser_cloud_management_controller.h b/components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h
similarity index 95%
rename from chrome/browser/policy/chrome_browser_cloud_management_controller.h
rename to components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h
index 537404f..ed3bbab 100644
--- a/chrome/browser/policy/chrome_browser_cloud_management_controller.h
+++ b/components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
-#define CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
+#ifndef COMPONENTS_ENTERPRISE_BROWSER_CONTROLLER_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
+#define COMPONENTS_ENTERPRISE_BROWSER_CONTROLLER_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
 
 #include <memory>
 #include <string>
@@ -13,7 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
-#include "chrome/browser/enterprise/reporting/reporting_delegate_factory_desktop.h"
+#include "components/enterprise/browser/reporting/reporting_delegate_factory.h"
 #include "components/policy/core/common/cloud/cloud_policy_client.h"
 
 class PrefService;
@@ -21,7 +21,7 @@
 namespace network {
 class NetworkConnectionTracker;
 class SharedURLLoaderFactory;
-}
+}  // namespace network
 
 namespace enterprise_reporting {
 class ReportScheduler;
@@ -235,4 +235,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_POLICY_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
+#endif  // COMPONENTS_ENTERPRISE_BROWSER_CONTROLLER_CHROME_BROWSER_CLOUD_MANAGEMENT_CONTROLLER_H_
diff --git a/components/exo/wayland/zcr_remote_shell.cc b/components/exo/wayland/zcr_remote_shell.cc
index 56fed7c6..3879d085 100644
--- a/components/exo/wayland/zcr_remote_shell.cc
+++ b/components/exo/wayland/zcr_remote_shell.cc
@@ -832,6 +832,11 @@
     layout_mode_ = helper->InTabletMode()
                        ? ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_TABLET
                        : ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_WINDOWED;
+    if (wl_resource_get_version(remote_shell_resource_) >=
+        ZCR_REMOTE_SHELL_V1_LAYOUT_MODE_SINCE_VERSION) {
+      zcr_remote_shell_v1_send_layout_mode(remote_shell_resource_,
+                                           layout_mode_);
+    }
 
     if (wl_resource_get_version(remote_shell_resource_) >= 8) {
       double scale_factor = GetDefaultDeviceScaleFactor();
diff --git a/components/feed/core/v2/feed_network_impl.cc b/components/feed/core/v2/feed_network_impl.cc
index 339f2ab8..433500e 100644
--- a/components/feed/core/v2/feed_network_impl.cc
+++ b/components/feed/core/v2/feed_network_impl.cc
@@ -43,6 +43,8 @@
 namespace {
 constexpr char kApplicationXProtobuf[] = "application/x-protobuf";
 constexpr base::TimeDelta kNetworkTimeout = base::TimeDelta::FromSeconds(30);
+constexpr char kUploadActionUrl[] =
+    "https://discover-pa.googleapis.com/v1/actions:upload";
 
 signin::ScopeSet GetAuthScopes() {
   return {"https://www.googleapis.com/auth/googlenow"};
@@ -69,21 +71,6 @@
   }
 }
 
-GURL GetUploadActionURL(version_info::Channel channel) {
-  switch (channel) {
-    case version_info::Channel::BETA:
-      return GURL(
-          "https://staging-discover-pa.sandbox.googleapis.com/v1/"
-          "actions:upload");
-    case version_info::Channel::STABLE:
-      return GURL("https://discover-pa.googleapis.com/v1/actions:upload");
-    default:
-      return GURL(
-          "https://autopush-discover-pa.sandbox.googleapis.com/v1/"
-          "actions:upload");
-  }
-}
-
 GURL GetUrlWithoutQuery(const GURL& url) {
   GURL::Replacements replacements;
   replacements.ClearQuery();
@@ -418,12 +405,10 @@
     const std::string& api_key,
     scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
     const base::TickClock* tick_clock,
-    PrefService* pref_service,
-    version_info::Channel chrome_channel)
+    PrefService* pref_service)
     : delegate_(delegate),
       identity_manager_(identity_manager),
       api_key_(api_key),
-      chrome_channel_(chrome_channel),
       loader_factory_(loader_factory),
       tick_clock_(tick_clock),
       pref_service_(pref_service) {}
@@ -459,8 +444,7 @@
   std::string binary_proto;
   request.SerializeToString(&binary_proto);
 
-  GURL url = GetUploadActionURL(chrome_channel_);
-  Send(url, "POST", std::move(binary_proto),
+  Send(GURL(kUploadActionUrl), "POST", std::move(binary_proto),
        base::BindOnce(
            &ParseAndForwardResponse<ActionRequestResult,
                                     NetworkRequestType::kUploadActions>,
diff --git a/components/feed/core/v2/feed_network_impl.h b/components/feed/core/v2/feed_network_impl.h
index 51811981..660780e 100644
--- a/components/feed/core/v2/feed_network_impl.h
+++ b/components/feed/core/v2/feed_network_impl.h
@@ -44,8 +44,7 @@
                   const std::string& api_key,
                   scoped_refptr<network::SharedURLLoaderFactory> loader_factory,
                   const base::TickClock* tick_clock,
-                  PrefService* pref_service,
-                  version_info::Channel chrome_channel);
+                  PrefService* pref_service);
   ~FeedNetworkImpl() override;
   FeedNetworkImpl(const FeedNetworkImpl&) = delete;
   FeedNetworkImpl& operator=(FeedNetworkImpl&) = delete;
@@ -81,7 +80,6 @@
   Delegate* delegate_;
   signin::IdentityManager* identity_manager_;
   const std::string api_key_;
-  const version_info::Channel chrome_channel_;
   scoped_refptr<network::SharedURLLoaderFactory> loader_factory_;
   const base::TickClock* tick_clock_;
   PrefService* pref_service_;
diff --git a/components/feed/core/v2/feed_network_impl_unittest.cc b/components/feed/core/v2/feed_network_impl_unittest.cc
index 98ac22f..c86564d 100644
--- a/components/feed/core/v2/feed_network_impl_unittest.cc
+++ b/components/feed/core/v2/feed_network_impl_unittest.cc
@@ -96,7 +96,7 @@
     feed_network_ = std::make_unique<FeedNetworkImpl>(
         &delegate_, identity_test_env_.identity_manager(), "dummy_api_key",
         shared_url_loader_factory_, task_environment_.GetMockTickClock(),
-        &profile_prefs_, version_info::Channel::STABLE);
+        &profile_prefs_);
   }
 
   FeedNetwork* feed_network() { return feed_network_.get(); }
diff --git a/components/feed/core/v2/public/feed_service.cc b/components/feed/core/v2/public/feed_service.cc
index c494315..04795aa 100644
--- a/components/feed/core/v2/public/feed_service.cc
+++ b/components/feed/core/v2/public/feed_service.cc
@@ -177,8 +177,7 @@
       base::DefaultTickClock::GetInstance(), profile_prefs);
   feed_network_ = std::make_unique<FeedNetworkImpl>(
       network_delegate_.get(), identity_manager, api_key, url_loader_factory,
-      base::DefaultTickClock::GetInstance(), profile_prefs,
-      chrome_info.channel);
+      base::DefaultTickClock::GetInstance(), profile_prefs);
   store_ = std::make_unique<FeedStore>(std::move(database));
 
   stream_ = std::make_unique<FeedStream>(
diff --git a/components/optimization_guide/hint_cache.cc b/components/optimization_guide/hint_cache.cc
index 48ba1b6..00559b0 100644
--- a/components/optimization_guide/hint_cache.cc
+++ b/components/optimization_guide/hint_cache.cc
@@ -284,6 +284,7 @@
 
     switch (hint.key_representation()) {
       case proto::HOST_SUFFIX:
+      case proto::HOST:
         update_data->MoveHintIntoUpdateData(std::move(hint));
         processed_hints_to_store = true;
         break;
@@ -294,7 +295,6 @@
               std::make_unique<MemoryHint>(expiry_time, std::move(hint)));
         }
         break;
-      case proto::HOST:
       case proto::REPRESENTATION_UNSPECIFIED:
         NOTREACHED();
         break;
diff --git a/components/optimization_guide/hint_cache_unittest.cc b/components/optimization_guide/hint_cache_unittest.cc
index 6acbda9..6409d8d 100644
--- a/components/optimization_guide/hint_cache_unittest.cc
+++ b/components/optimization_guide/hint_cache_unittest.cc
@@ -181,13 +181,13 @@
 
   proto::Hint hint1;
   hint1.set_key("subdomain.domain.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   proto::Hint hint2;
   hint2.set_key("host.domain.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   proto::Hint hint3;
   hint3.set_key("otherhost.subdomain.domain.org");
-  hint3.set_key_representation(proto::HOST_SUFFIX);
+  hint3.set_key_representation(proto::HOST);
 
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   update_data->MoveHintIntoUpdateData(std::move(hint2));
@@ -201,8 +201,8 @@
 
   // Matched
   EXPECT_TRUE(hint_cache()->HasHint("otherhost.subdomain.domain.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("host.subdomain.domain.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("subhost.host.subdomain.domain.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("host.domain.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("subdomain.domain.org"));
 }
 
 TEST_F(HintCacheTest, ComponentUpdateWithSameVersionIgnored) {
@@ -248,13 +248,13 @@
 
   proto::Hint hint1;
   hint1.set_key("subdomain.domain.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   proto::Hint hint2;
   hint2.set_key("host.domain.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   proto::Hint hint3;
   hint3.set_key("otherhost.subdomain.domain.org");
-  hint3.set_key_representation(proto::HOST_SUFFIX);
+  hint3.set_key_representation(proto::HOST);
 
   update_data_1->MoveHintIntoUpdateData(std::move(hint1));
   update_data_1->MoveHintIntoUpdateData(std::move(hint2));
@@ -268,8 +268,8 @@
 
   // Matched
   EXPECT_TRUE(hint_cache()->HasHint("otherhost.subdomain.domain.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("host.subdomain.domain.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("subhost.host.subdomain.domain.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("host.domain.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("subdomain.domain.org"));
 
   std::unique_ptr<StoreUpdateData> update_data_2 =
       hint_cache()->MaybeCreateUpdateDataForComponentHints(version_2);
@@ -277,13 +277,13 @@
 
   proto::Hint hint4;
   hint4.set_key("subdomain.domain2.org");
-  hint4.set_key_representation(proto::HOST_SUFFIX);
+  hint4.set_key_representation(proto::HOST);
   proto::Hint hint5;
   hint5.set_key("host.domain2.org");
-  hint5.set_key_representation(proto::HOST_SUFFIX);
+  hint5.set_key_representation(proto::HOST);
   proto::Hint hint6;
   hint6.set_key("otherhost.subdomain.domain2.org");
-  hint6.set_key_representation(proto::HOST_SUFFIX);
+  hint6.set_key_representation(proto::HOST);
 
   update_data_2->MoveHintIntoUpdateData(std::move(hint4));
   update_data_2->MoveHintIntoUpdateData(std::move(hint5));
@@ -300,8 +300,8 @@
 
   // Matched
   EXPECT_TRUE(hint_cache()->HasHint("otherhost.subdomain.domain2.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("host.subdomain.domain2.org"));
-  EXPECT_TRUE(hint_cache()->HasHint("subhost.host.subdomain.domain2.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("subdomain.domain2.org"));
+  EXPECT_TRUE(hint_cache()->HasHint("host.domain2.org"));
 }
 
 TEST_F(HintCacheTest, ComponentHintsAvailableAfterRestart) {
@@ -319,13 +319,13 @@
 
       proto::Hint hint1;
       hint1.set_key("subdomain.domain.org");
-      hint1.set_key_representation(proto::HOST_SUFFIX);
+      hint1.set_key_representation(proto::HOST);
       proto::Hint hint2;
       hint2.set_key("host.domain.org");
-      hint2.set_key_representation(proto::HOST_SUFFIX);
+      hint2.set_key_representation(proto::HOST);
       proto::Hint hint3;
       hint3.set_key("otherhost.subdomain.domain.org");
-      hint3.set_key_representation(proto::HOST_SUFFIX);
+      hint3.set_key_representation(proto::HOST);
 
       update_data->MoveHintIntoUpdateData(std::move(hint1));
       update_data->MoveHintIntoUpdateData(std::move(hint2));
@@ -342,8 +342,8 @@
 
     // Matched
     EXPECT_TRUE(hint_cache()->HasHint("otherhost.subdomain.domain.org"));
-    EXPECT_TRUE(hint_cache()->HasHint("host.subdomain.domain.org"));
-    EXPECT_TRUE(hint_cache()->HasHint("subhost.host.subdomain.domain.org"));
+    EXPECT_TRUE(hint_cache()->HasHint("host.domain.org"));
+    EXPECT_TRUE(hint_cache()->HasHint("subdomain.domain.org"));
 
     DestroyHintCache();
   }
@@ -363,13 +363,13 @@
 
     proto::Hint hint1;
     hint1.set_key("subdomain.domain.org");
-    hint1.set_key_representation(proto::HOST_SUFFIX);
+    hint1.set_key_representation(proto::HOST);
     proto::Hint hint2;
     hint2.set_key("host.domain.org");
-    hint2.set_key_representation(proto::HOST_SUFFIX);
+    hint2.set_key_representation(proto::HOST);
     proto::Hint hint3;
     hint3.set_key("otherhost.subdomain.domain.org");
-    hint3.set_key_representation(proto::HOST_SUFFIX);
+    hint3.set_key_representation(proto::HOST);
 
     update_data->MoveHintIntoUpdateData(std::move(hint1));
     update_data->MoveHintIntoUpdateData(std::move(hint2));
@@ -383,8 +383,8 @@
 
     // Matched
     EXPECT_TRUE(hint_cache()->HasHint("otherhost.subdomain.domain.org"));
-    EXPECT_TRUE(hint_cache()->HasHint("host.subdomain.domain.org"));
-    EXPECT_TRUE(hint_cache()->HasHint("subhost.host.subdomain.domain.org"));
+    EXPECT_TRUE(hint_cache()->HasHint("host.domain.org"));
+    EXPECT_TRUE(hint_cache()->HasHint("subdomain.domain.org"));
 
     DestroyHintCache();
   }
@@ -405,13 +405,13 @@
 
       proto::Hint hint1;
       hint1.set_key("subdomain.domain.org");
-      hint1.set_key_representation(proto::HOST_SUFFIX);
+      hint1.set_key_representation(proto::HOST);
       proto::Hint hint2;
       hint2.set_key("host.domain.org");
-      hint2.set_key_representation(proto::HOST_SUFFIX);
+      hint2.set_key_representation(proto::HOST);
       proto::Hint hint3;
       hint3.set_key("otherhost.subdomain.domain.org");
-      hint3.set_key_representation(proto::HOST_SUFFIX);
+      hint3.set_key_representation(proto::HOST);
 
       update_data->MoveHintIntoUpdateData(std::move(hint1));
       update_data->MoveHintIntoUpdateData(std::move(hint2));
@@ -430,9 +430,8 @@
     bool should_match = (i == 0);
     EXPECT_EQ(hint_cache()->HasHint("otherhost.subdomain.domain.org"),
               should_match);
-    EXPECT_EQ(hint_cache()->HasHint("host.subdomain.domain.org"), should_match);
-    EXPECT_EQ(hint_cache()->HasHint("subhost.host.subdomain.domain.org"),
-              should_match);
+    EXPECT_EQ(hint_cache()->HasHint("subdomain.domain.org"), should_match);
+    EXPECT_EQ(hint_cache()->HasHint("host.domain.org"), should_match);
 
     DestroyHintCache();
   }
@@ -451,7 +450,7 @@
   for (int i = 0; i < kTestHintCount; ++i) {
     proto::Hint hint;
     hint.set_key(GetHostDomainOrg(i));
-    hint.set_key_representation(proto::HOST_SUFFIX);
+    hint.set_key_representation(proto::HOST);
     update_data->MoveHintIntoUpdateData(std::move(hint));
   }
 
@@ -491,7 +490,7 @@
   for (int i = 0; i < kTestHintCount; ++i) {
     proto::Hint hint;
     hint.set_key(GetHostDomainOrg(i));
-    hint.set_key_representation(proto::HOST_SUFFIX);
+    hint.set_key_representation(proto::HOST);
     update_data->MoveHintIntoUpdateData(std::move(hint));
   }
 
@@ -512,16 +511,14 @@
   std::string hint_key = "subdomain.domain.org";
   proto::Hint hint;
   hint.set_key(hint_key);
-  hint.set_key_representation(proto::HOST_SUFFIX);
+  hint.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint));
 
   UpdateComponentHints(std::move(update_data));
 
-  EXPECT_FALSE(
-      hint_cache()->GetHostKeyedHintIfLoaded("host.subdomain.domain.org"));
-  LoadHint("host.subdomain.domain.org");
-  EXPECT_TRUE(
-      hint_cache()->GetHostKeyedHintIfLoaded("host.subdomain.domain.org"));
+  EXPECT_FALSE(hint_cache()->GetHostKeyedHintIfLoaded("subdomain.domain.org"));
+  LoadHint("subdomain.domain.org");
+  EXPECT_TRUE(hint_cache()->GetHostKeyedHintIfLoaded("subdomain.domain.org"));
 
   EXPECT_TRUE(GetLoadedHint());
   EXPECT_EQ(hint_key, GetLoadedHint()->key());
@@ -538,7 +535,7 @@
       std::make_unique<proto::GetHintsResponse>();
 
   proto::Hint* hint = get_hints_response->add_hints();
-  hint->set_key_representation(proto::HOST_SUFFIX);
+  hint->set_key_representation(proto::HOST);
   hint->set_key("host.domain.org");
   proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("page pattern");
@@ -579,7 +576,7 @@
 
   // Set server-provided expiration time.
   proto::Hint* hint = get_hints_response->add_hints();
-  hint->set_key_representation(proto::HOST_SUFFIX);
+  hint->set_key_representation(proto::HOST);
   hint->set_key("host.domain.org");
   hint->mutable_max_cache_duration()->set_seconds(kFetchedHintExpirationSecs);
   proto::PageHint* page_hint = hint->add_page_hints();
@@ -614,7 +611,7 @@
       std::make_unique<proto::GetHintsResponse>();
 
   proto::Hint* hint = get_hints_response->add_hints();
-  hint->set_key_representation(proto::HOST_SUFFIX);
+  hint->set_key_representation(proto::HOST);
   hint->set_key("host.domain.org");
   proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("page pattern");
@@ -691,14 +688,14 @@
 
   std::string host = "shouldpurge.com";
   proto::Hint* hint1 = get_hints_response->add_hints();
-  hint1->set_key_representation(proto::HOST_SUFFIX);
+  hint1->set_key_representation(proto::HOST);
   hint1->set_key(host);
   hint1->mutable_max_cache_duration()->set_seconds(cache_duration_in_secs);
   proto::PageHint* page_hint1 = hint1->add_page_hints();
   page_hint1->set_page_pattern("page pattern");
   std::string host2 = "notpurged.com";
   proto::Hint* hint2 = get_hints_response->add_hints();
-  hint2->set_key_representation(proto::HOST_SUFFIX);
+  hint2->set_key_representation(proto::HOST);
   hint2->set_key(host2);
   hint2->mutable_max_cache_duration()->set_seconds(cache_duration_in_secs * 2);
   proto::PageHint* page_hint2 = hint2->add_page_hints();
@@ -738,7 +735,7 @@
 
   std::string host = "host.com";
   proto::Hint* hint = get_hints_response->add_hints();
-  hint->set_key_representation(proto::HOST_SUFFIX);
+  hint->set_key_representation(proto::HOST);
   hint->set_key(host);
   proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("page pattern");
@@ -820,7 +817,7 @@
 
   std::string host = "host.com";
   proto::Hint* hint = get_hints_response->add_hints();
-  hint->set_key_representation(proto::HOST_SUFFIX);
+  hint->set_key_representation(proto::HOST);
   hint->set_key(host);
   proto::PageHint* page_hint = hint->add_page_hints();
   page_hint->set_page_pattern("page pattern");
@@ -843,7 +840,7 @@
 
   proto::Hint hint;
   hint.set_key("whatever.com");
-  hint.set_key_representation(proto::HOST_SUFFIX);
+  hint.set_key_representation(proto::HOST);
   proto::PageHint* page_hint = hint.add_page_hints();
   page_hint->set_page_pattern("foo.org/*/one/");
 
@@ -860,7 +857,7 @@
 
   proto::Hint hint;
   hint.set_key("whatever.com");
-  hint.set_key_representation(proto::HOST_SUFFIX);
+  hint.set_key_representation(proto::HOST);
 
   google::protobuf::RepeatedPtrField<proto::Hint> hints;
   *(hints.Add()) = hint;
@@ -902,14 +899,14 @@
 
   proto::Hint hint;
   hint.set_key("foo.org");
-  hint.set_key_representation(proto::HOST_SUFFIX);
+  hint.set_key_representation(proto::HOST);
   proto::PageHint* page_hint = hint.add_page_hints();
   page_hint->set_page_pattern("foo.org/*/one/");
   *(hints.Add()) = hint;
 
   proto::Hint no_page_hints_hint;
-  no_page_hints_hint.set_key("whatever.com");
-  no_page_hints_hint.set_key_representation(proto::HOST_SUFFIX);
+  no_page_hints_hint.set_key("nopagehints.com");
+  no_page_hints_hint.set_key_representation(proto::HOST);
   *(hints.Add()) = no_page_hints_hint;
 
   std::unique_ptr<StoreUpdateData> update_data =
diff --git a/components/optimization_guide/hints_fetcher.cc b/components/optimization_guide/hints_fetcher.cc
index bf23c01..ed199b2a 100644
--- a/components/optimization_guide/hints_fetcher.cc
+++ b/components/optimization_guide/hints_fetcher.cc
@@ -189,6 +189,8 @@
   request_context_ = request_context;
 
   proto::GetHintsRequest get_hints_request;
+  // TODO(crbug/1110487): Add supported key representations once server supports
+  // sending HOST-keyed hints.
 
   for (const auto& optimization_type : optimization_types)
     get_hints_request.add_supported_optimizations(optimization_type);
diff --git a/components/optimization_guide/optimization_guide_store.cc b/components/optimization_guide/optimization_guide_store.cc
index 8a01f68..f68269d 100644
--- a/components/optimization_guide/optimization_guide_store.cc
+++ b/components/optimization_guide/optimization_guide_store.cc
@@ -40,9 +40,6 @@
 //    "[StoreEntryType::kComponentHint]_[component_version]_[host]"
 constexpr char kKeySectionDelimiter = '_';
 
-// Realistic minimum length of a host suffix.
-const int kMinHostSuffix = 6;  // eg., abc.tv
-
 // Enumerates the possible outcomes of loading metadata. Used in UMA histograms,
 // so the order of enumerators should not be changed.
 //
@@ -342,25 +339,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(out_entry_key);
 
-  // Look for longest host name suffix that has a hint. No need to continue
-  // lookups and substring work once get to a root domain like ".com" or
-  // ".co.in" (MinHostSuffix length check is a heuristic for that).
-  std::string host_suffix(host);
-  while (host_suffix.length() >= kMinHostSuffix) {
-    // Attempt to find an entry key associated with the current host suffix.
-    *out_entry_key = entry_key_prefix + host_suffix;
-    if (entry_keys_ &&
-        entry_keys_->find(*out_entry_key) != entry_keys_->end()) {
-      return true;
-    }
-
-    size_t pos = host_suffix.find_first_of('.');
-    if (pos == std::string::npos) {
-      break;
-    }
-    host_suffix = host_suffix.substr(pos + 1);
-  }
-  return false;
+  // Look for entry key for host.
+  *out_entry_key = entry_key_prefix + host;
+  return entry_keys_ && entry_keys_->find(*out_entry_key) != entry_keys_->end();
 }
 
 void OptimizationGuideStore::LoadHint(const EntryKey& hint_entry_key,
diff --git a/components/optimization_guide/optimization_guide_store_unittest.cc b/components/optimization_guide/optimization_guide_store_unittest.cc
index 947be9f0..41c29ecd 100644
--- a/components/optimization_guide/optimization_guide_store_unittest.cc
+++ b/components/optimization_guide/optimization_guide_store_unittest.cc
@@ -31,8 +31,8 @@
 constexpr char kDefaultComponentVersion[] = "1.0.0";
 constexpr char kUpdateComponentVersion[] = "2.0.0";
 
-std::string GetHostSuffix(size_t id) {
-  // Host suffix alternates between two different domain types depending on
+std::string GetHost(size_t id) {
+  // Host alternates between two different domain types depending on
   // whether the id is odd or even.
   if (id % 2 == 0) {
     return "domain" + base::NumberToString(id) + ".org";
@@ -110,13 +110,13 @@
           OptimizationGuideStore::GetComponentHintEntryKeyPrefix(
               base::Version(kDefaultComponentVersion));
       for (size_t i = 0; i < component_hint_count.value(); ++i) {
-        std::string host_suffix = GetHostSuffix(i);
-        StoreEntry& entry = db_store_[component_hint_key_prefix + host_suffix];
+        std::string host = GetHost(i);
+        StoreEntry& entry = db_store_[component_hint_key_prefix + host];
         entry.set_entry_type(static_cast<proto::StoreEntryType>(
             OptimizationGuideStore::StoreEntryType::kComponentHint));
         proto::Hint* hint = entry.mutable_hint();
-        hint->set_key(host_suffix);
-        hint->set_key_representation(proto::HOST_SUFFIX);
+        hint->set_key(host);
+        hint->set_key_representation(proto::HOST);
         proto::PageHint* page_hint = hint->add_page_hints();
         page_hint->set_page_pattern("page pattern " + base::NumberToString(i));
       }
@@ -140,10 +140,10 @@
   void SeedComponentUpdateData(StoreUpdateData* update_data,
                                size_t component_hint_count) {
     for (size_t i = 0; i < component_hint_count; ++i) {
-      std::string host_suffix = GetHostSuffix(i);
+      std::string host = GetHost(i);
       proto::Hint hint;
-      hint.set_key(host_suffix);
-      hint.set_key_representation(proto::HOST_SUFFIX);
+      hint.set_key(host);
+      hint.set_key_representation(proto::HOST);
       proto::PageHint* page_hint = hint.add_page_hints();
       page_hint->set_page_pattern("page pattern " + base::NumberToString(i));
       update_data->MoveHintIntoUpdateData(std::move(hint));
@@ -153,10 +153,10 @@
   void SeedFetchedUpdateData(StoreUpdateData* update_data,
                              size_t fetched_hint_count) {
     for (size_t i = 0; i < fetched_hint_count; ++i) {
-      std::string host_suffix = GetHostSuffix(i);
+      std::string host = GetHost(i);
       proto::Hint hint;
-      hint.set_key(host_suffix);
-      hint.set_key_representation(proto::HOST_SUFFIX);
+      hint.set_key(host);
+      hint.set_key_representation(proto::HOST);
       proto::PageHint* page_hint = hint.add_page_hints();
       page_hint->set_page_pattern("page pattern " + base::NumberToString(i));
       update_data->MoveHintIntoUpdateData(std::move(hint));
@@ -178,13 +178,13 @@
   void SeedHostModelFeaturesUpdateData(StoreUpdateData* update_data,
                                        size_t host_model_features_count) {
     for (size_t i = 0; i < host_model_features_count; i++) {
-      std::string host_suffix = GetHostSuffix(i);
+      std::string host = GetHost(i);
       proto::HostModelFeatures host_model_features;
       proto::ModelFeature* model_feature =
           host_model_features.add_model_features();
       model_feature->set_feature_name("host_feat1");
       model_feature->set_double_value(2.0);
-      host_model_features.set_host(host_suffix);
+      host_model_features.set_host(host);
       update_data->CopyHostModelFeaturesIntoUpdateData(host_model_features);
     }
   }
@@ -391,9 +391,9 @@
         OptimizationGuideStore::GetComponentHintEntryKeyPrefix(
             base::Version(version));
     for (int i = 0; i < count; ++i) {
-      std::string host_suffix = GetHostSuffix(i);
+      std::string host = GetHost(i);
       OptimizationGuideStore::EntryKey hint_entry_key =
-          component_hint_entry_key_prefix + host_suffix;
+          component_hint_entry_key_prefix + host;
       const auto& hint_entry = db_store_.find(hint_entry_key);
       if (hint_entry == db_store_.end()) {
         FAIL() << "No entry found for component hint: " << hint_entry_key;
@@ -403,7 +403,7 @@
         FAIL() << "Component hint entry does not have hint: " << hint_entry_key;
       }
 
-      EXPECT_EQ(hint_entry->second.hint().key(), host_suffix);
+      EXPECT_EQ(hint_entry->second.hint().key(), host);
     }
   }
 
@@ -1271,10 +1271,10 @@
   // Verify that all component hints in the initial data can successfully be
   // loaded from the store.
   for (size_t i = 0; i < hint_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey hint_entry_key;
-    if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-      FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+    if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+      FAIL() << "Hint entry not found for host: " << host;
     }
 
     guide_store()->LoadHint(
@@ -1290,7 +1290,7 @@
       FAIL() << "Loaded hint was null for entry key: " << hint_entry_key;
     }
 
-    EXPECT_EQ(last_loaded_hint()->hint()->key(), host_suffix);
+    EXPECT_EQ(last_loaded_hint()->hint()->key(), host);
     EXPECT_FALSE(last_loaded_hint()->expiry_time().has_value());
   }
 }
@@ -1313,10 +1313,10 @@
   // Verify that all component hints within a successful component update can
   // be loaded from the store.
   for (size_t i = 0; i < update_hint_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey hint_entry_key;
-    if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-      FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+    if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+      FAIL() << "Hint entry not found for host: " << host;
     }
 
     guide_store()->LoadHint(
@@ -1332,7 +1332,7 @@
       FAIL() << "Loaded hint was null for entry key: " << hint_entry_key;
     }
 
-    EXPECT_EQ(last_loaded_hint()->hint()->key(), host_suffix);
+    EXPECT_EQ(last_loaded_hint()->hint()->key(), host);
     EXPECT_FALSE(last_loaded_hint()->expiry_time().has_value());
   }
 }
@@ -1342,11 +1342,11 @@
   SeedInitialData(MetadataSchemaState::kValid, initial_hint_count);
   CreateDatabase();
 
-  std::string host_suffix = GetHostSuffix(0);
+  std::string host = GetHost(0);
   OptimizationGuideStore::EntryKey hint_entry_key;
 
   // Verify that hint entry keys can't be found when the store is unavailable.
-  EXPECT_FALSE(guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key));
+  EXPECT_FALSE(guide_store()->FindHintEntryKey(host, &hint_entry_key));
 }
 
 TEST_F(OptimizationGuideStoreTest, FindHintEntryKeyInitialData) {
@@ -1360,10 +1360,9 @@
   // as being found and hints that are not containd within the initial data are
   // properly reported as not being found.
   for (size_t i = 0; i < hint_count * 2; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey hint_entry_key;
-    bool success =
-        guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key);
+    bool success = guide_store()->FindHintEntryKey(host, &hint_entry_key);
     EXPECT_EQ(success, i < hint_count);
   }
 }
@@ -1387,10 +1386,9 @@
   // by the store as being found and hints that are not containd within the
   // component update are properly reported as not being found.
   for (size_t i = 0; i < update_hint_count * 2; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey hint_entry_key;
-    bool success =
-        guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key);
+    bool success = guide_store()->FindHintEntryKey(host, &hint_entry_key);
     EXPECT_EQ(success, i < update_hint_count);
   }
 }
@@ -1420,10 +1418,9 @@
   UpdateFetchedHints(std::move(update_data));
 
   for (size_t i = 0; i < update_hint_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey hint_entry_key;
-    bool success =
-        guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key);
+    bool success = guide_store()->FindHintEntryKey(host, &hint_entry_key);
     EXPECT_EQ(success, i < update_hint_count);
   }
 }
@@ -1446,11 +1443,11 @@
 
   proto::Hint hint1;
   hint1.set_key("domain1.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   proto::Hint hint2;
   hint2.set_key("host.domain2.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint2));
 
   UpdateComponentHints(std::move(update_data));
@@ -1460,26 +1457,26 @@
   update_data = guide_store()->CreateUpdateDataForFetchedHints(update_time);
 
   proto::Hint hint;
-  hint.set_key("domain2.org");
-  hint.set_key_representation(proto::HOST_SUFFIX);
+  hint.set_key("host.domain2.org");
+  hint.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint));
 
   UpdateFetchedHints(std::move(update_data));
 
   // Hint for host.domain2.org should be a fetched hint ("3_" prefix)
   // as fetched hints take priority.
-  std::string host_suffix = "host.domain2.org";
+  std::string host = "host.domain2.org";
   OptimizationGuideStore::EntryKey hint_entry_key;
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
 
-  EXPECT_EQ(hint_entry_key, "3_domain2.org");
+  EXPECT_EQ(hint_entry_key, "3_host.domain2.org");
 
-  host_suffix = "subdomain.domain1.org";
+  host = "domain1.org";
 
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
 
   EXPECT_EQ(hint_entry_key, "2_2.0.0_domain1.org");
@@ -1502,11 +1499,11 @@
 
   proto::Hint hint1;
   hint1.set_key("domain1.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   proto::Hint hint2;
   hint2.set_key("host.domain2.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint2));
 
   UpdateComponentHints(std::move(update_data));
@@ -1516,30 +1513,30 @@
   update_data = guide_store()->CreateUpdateDataForFetchedHints(update_time);
 
   proto::Hint fetched_hint1;
-  fetched_hint1.set_key("domain2.org");
-  fetched_hint1.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint1.set_key("host.domain2.org");
+  fetched_hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint1));
   proto::Hint fetched_hint2;
   fetched_hint2.set_key("domain3.org");
-  fetched_hint2.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint2));
 
   UpdateFetchedHints(std::move(update_data));
 
   // Hint for host.domain2.org should be a fetched hint ("3_" prefix)
   // as fetched hints take priority.
-  std::string host_suffix = "host.domain2.org";
+  std::string host = "host.domain2.org";
   OptimizationGuideStore::EntryKey hint_entry_key;
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
 
-  EXPECT_EQ(hint_entry_key, "3_domain2.org");
+  EXPECT_EQ(hint_entry_key, "3_host.domain2.org");
 
-  host_suffix = "subdomain.domain1.org";
+  host = "domain1.org";
 
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
 
   EXPECT_EQ(hint_entry_key, "2_2.0.0_domain1.org");
@@ -1549,13 +1546,13 @@
   histogram_tester.ExpectBucketCount(
       "OptimizationGuide.ClearFetchedHints.StoreAvailable", true, 1);
 
-  host_suffix = "domain1.org";
+  host = "domain1.org";
   // Component hint should still exist.
-  EXPECT_TRUE(guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key));
+  EXPECT_TRUE(guide_store()->FindHintEntryKey(host, &hint_entry_key));
 
-  host_suffix = "domain3.org";
+  host = "domain3.org";
   // Fetched hint should not still exist.
-  EXPECT_FALSE(guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key));
+  EXPECT_FALSE(guide_store()->FindHintEntryKey(host, &hint_entry_key));
 
   // Add Components back - newer version.
   base::Version version3("3.0.0");
@@ -1565,29 +1562,29 @@
   ASSERT_TRUE(update_data2);
 
   proto::Hint new_hint2;
-  new_hint2.set_key("domain2.org");
-  new_hint2.set_key_representation(proto::HOST_SUFFIX);
+  new_hint2.set_key("host.domain2.org");
+  new_hint2.set_key_representation(proto::HOST);
   update_data2->MoveHintIntoUpdateData(std::move(new_hint2));
 
   UpdateComponentHints(std::move(update_data2));
 
-  host_suffix = "host.domain2.org";
-  EXPECT_TRUE(guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key));
+  host = "host.domain2.org";
+  EXPECT_TRUE(guide_store()->FindHintEntryKey(host, &hint_entry_key));
 
   update_data = guide_store()->CreateUpdateDataForFetchedHints(update_time);
   proto::Hint new_hint;
   new_hint.set_key("domain1.org");
-  new_hint.set_key_representation(proto::HOST_SUFFIX);
+  new_hint.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(new_hint));
 
   UpdateFetchedHints(std::move(update_data));
 
   // Add fetched hints to the store that overlap with the same hosts as the
   // initial set.
-  host_suffix = "subdomain.domain1.org";
+  host = "domain1.org";
 
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
 
   EXPECT_EQ(hint_entry_key, "3_domain1.org");
@@ -1610,11 +1607,11 @@
 
   proto::Hint hint1;
   hint1.set_key("domain1.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   proto::Hint hint2;
   hint2.set_key("host.domain2.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint2));
 
   UpdateComponentHints(std::move(update_data));
@@ -1625,13 +1622,13 @@
 
   proto::Hint fetched_hint1;
   fetched_hint1.set_key("domain2.org");
-  fetched_hint1.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint1.set_key_representation(proto::HOST);
   fetched_hint1.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta::FromDays(7).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint1));
   proto::Hint fetched_hint2;
   fetched_hint2.set_key("domain3.org");
-  fetched_hint2.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint2.set_key_representation(proto::HOST);
   fetched_hint1.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta::FromDays(7).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint2));
@@ -1643,13 +1640,13 @@
 
   proto::Hint fetched_hint3;
   fetched_hint1.set_key("domain4.org");
-  fetched_hint1.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint1.set_key_representation(proto::HOST);
   fetched_hint1.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta::FromDays(-7).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint1));
   proto::Hint fetched_hint4;
   fetched_hint2.set_key("domain5.org");
-  fetched_hint2.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint2.set_key_representation(proto::HOST);
   fetched_hint2.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta::FromDays(-7).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint2));
@@ -1682,11 +1679,11 @@
 
   proto::Hint hint1;
   hint1.set_key("domain1.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   proto::Hint hint2;
   hint2.set_key("host.domain2.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint2));
 
   UpdateComponentHints(std::move(update_data));
@@ -1695,26 +1692,26 @@
   update_data = guide_store()->CreateUpdateDataForFetchedHints(update_time);
 
   proto::Hint fetched_hint1;
-  fetched_hint1.set_key("domain2.org");
-  fetched_hint1.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint1.set_key("host.domain2.org");
+  fetched_hint1.set_key_representation(proto::HOST);
   fetched_hint1.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta().FromDays(-10).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint1));
   proto::Hint fetched_hint2;
   fetched_hint2.set_key("domain3.org");
-  fetched_hint2.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint2));
 
   UpdateFetchedHints(std::move(update_data));
 
   // Hint for host.domain2.org should be a fetched hint ("3_" prefix)
   // as fetched hints take priority.
-  std::string host_suffix = "host.domain2.org";
+  std::string host = "host.domain2.org";
   OptimizationGuideStore::EntryKey hint_entry_key;
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
-  EXPECT_EQ(hint_entry_key, "3_domain2.org");
+  EXPECT_EQ(hint_entry_key, "3_host.domain2.org");
   guide_store()->LoadHint(
       hint_entry_key, base::BindOnce(&OptimizationGuideStoreTest::OnHintLoaded,
                                      base::Unretained(this)));
@@ -1747,11 +1744,11 @@
 
   proto::Hint hint1;
   hint1.set_key("domain1.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint1));
   proto::Hint hint2;
   hint2.set_key("host.domain2.org");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(hint2));
 
   UpdateComponentHints(std::move(update_data));
@@ -1760,26 +1757,26 @@
   update_data = guide_store()->CreateUpdateDataForFetchedHints(update_time);
 
   proto::Hint fetched_hint1;
-  fetched_hint1.set_key("domain2.org");
-  fetched_hint1.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint1.set_key("host.domain2.org");
+  fetched_hint1.set_key_representation(proto::HOST);
   fetched_hint1.mutable_max_cache_duration()->set_seconds(
       base::TimeDelta().FromDays(10).InSeconds());
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint1));
   proto::Hint fetched_hint2;
   fetched_hint2.set_key("domain3.org");
-  fetched_hint2.set_key_representation(proto::HOST_SUFFIX);
+  fetched_hint2.set_key_representation(proto::HOST);
   update_data->MoveHintIntoUpdateData(std::move(fetched_hint2));
 
   UpdateFetchedHints(std::move(update_data));
 
   // Hint for host.domain2.org should be a fetched hint ("3_" prefix)
   // as fetched hints take priority.
-  std::string host_suffix = "host.domain2.org";
+  std::string host = "host.domain2.org";
   OptimizationGuideStore::EntryKey hint_entry_key;
-  if (!guide_store()->FindHintEntryKey(host_suffix, &hint_entry_key)) {
-    FAIL() << "Hint entry not found for host suffix: " << host_suffix;
+  if (!guide_store()->FindHintEntryKey(host, &hint_entry_key)) {
+    FAIL() << "Hint entry not found for host: " << host;
   }
-  EXPECT_EQ(hint_entry_key, "3_domain2.org");
+  EXPECT_EQ(hint_entry_key, "3_host.domain2.org");
   guide_store()->LoadHint(
       hint_entry_key, base::BindOnce(&OptimizationGuideStoreTest::OnHintLoaded,
                                      base::Unretained(this)));
@@ -1978,10 +1975,10 @@
   UpdateHostModelFeatures(std::move(update_data));
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
     bool success =
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key);
+        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key);
     EXPECT_EQ(success, i < update_host_model_features_count);
   }
 }
@@ -2006,10 +2003,10 @@
   UpdateHostModelFeatures(std::move(update_data));
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
     bool success =
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key);
+        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key);
     EXPECT_TRUE(success);
 
     guide_store()->LoadHostModelFeatures(
@@ -2025,7 +2022,7 @@
              << entry_key;
     }
 
-    EXPECT_EQ(last_loaded_host_model_features()->host(), host_suffix);
+    EXPECT_EQ(last_loaded_host_model_features()->host(), host);
   }
 }
 
@@ -2062,7 +2059,7 @@
   // Build a list of the hosts that are stored in the store.
   base::flat_set<std::string> hosts = {};
   for (size_t i = 0; i < update_host_model_features_count; i++)
-    hosts.insert(GetHostSuffix(i));
+    hosts.insert(GetHost(i));
 
   // Make sure all of the hosts of the host model features are returned.
   for (const auto& host_model_features : *all_host_model_features)
@@ -2089,10 +2086,9 @@
   UpdateHostModelFeatures(std::move(update_data));
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_TRUE(
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key));
+    EXPECT_TRUE(guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
   }
 
   // Remove the host model features from the OptimizationGuideStore.
@@ -2101,10 +2097,10 @@
       "OptimizationGuide.ClearHostModelFeatures.StoreAvailable", true, 1);
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
     EXPECT_FALSE(
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key));
+        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
   }
 }
 
@@ -2128,20 +2124,19 @@
   UpdateHostModelFeatures(std::move(update_data));
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
-    EXPECT_TRUE(
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key));
+    EXPECT_TRUE(guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
   }
 
   // Remove expired host model features from the opt. guide store.
   PurgeExpiredHostModelFeatures();
 
   for (size_t i = 0; i < update_host_model_features_count; ++i) {
-    std::string host_suffix = GetHostSuffix(i);
+    std::string host = GetHost(i);
     OptimizationGuideStore::EntryKey entry_key;
     EXPECT_FALSE(
-        guide_store()->FindHostModelFeaturesEntryKey(host_suffix, &entry_key));
+        guide_store()->FindHostModelFeaturesEntryKey(host, &entry_key));
   }
 }
 
diff --git a/components/optimization_guide/optimization_guide_switches_unittest.cc b/components/optimization_guide/optimization_guide_switches_unittest.cc
index 41b11ae..b2f5db0d 100644
--- a/components/optimization_guide/optimization_guide_switches_unittest.cc
+++ b/components/optimization_guide/optimization_guide_switches_unittest.cc
@@ -51,7 +51,7 @@
   optimization_guide::proto::Configuration config;
   optimization_guide::proto::Hint* hint = config.add_hints();
   hint->set_key("somedomain.org");
-  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint->set_key_representation(optimization_guide::proto::HOST);
 
   std::string encoded_config;
   config.SerializeToString(&encoded_config);
diff --git a/components/optimization_guide/store_update_data_unittest.cc b/components/optimization_guide/store_update_data_unittest.cc
index 682209c..edf1880 100644
--- a/components/optimization_guide/store_update_data_unittest.cc
+++ b/components/optimization_guide/store_update_data_unittest.cc
@@ -24,12 +24,12 @@
   base::Version v1("1.2.3.4");
   proto::Hint hint1;
   hint1.set_key("foo.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   proto::PageHint* page_hint1 = hint1.add_page_hints();
   page_hint1->set_page_pattern("slowpage");
   proto::Hint hint2;
   hint2.set_key("bar.com");
-  hint2.set_key_representation(proto::HOST_SUFFIX);
+  hint2.set_key_representation(proto::HOST);
   proto::PageHint* page_hint2 = hint2.add_page_hints();
   page_hint2->set_page_pattern("slowpagealso");
 
@@ -50,7 +50,7 @@
   base::Time update_time = base::Time::Now();
   proto::Hint hint1;
   hint1.set_key("foo.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   proto::PageHint* page_hint1 = hint1.add_page_hints();
   page_hint1->set_page_pattern("slowpage");
 
@@ -85,7 +85,7 @@
   base::Time update_time = base::Time::Now();
   proto::Hint hint1;
   hint1.set_key("foo.org");
-  hint1.set_key_representation(proto::HOST_SUFFIX);
+  hint1.set_key_representation(proto::HOST);
   hint1.mutable_max_cache_duration()->set_seconds(max_cache_duration_secs);
   proto::PageHint* page_hint1 = hint1.add_page_hints();
   page_hint1->set_page_pattern("slowpage");
diff --git a/components/optimization_guide/test_hints_component_creator.cc b/components/optimization_guide/test_hints_component_creator.cc
index 2b8d700..ebd1a6c 100644
--- a/components/optimization_guide/test_hints_component_creator.cc
+++ b/components/optimization_guide/test_hints_component_creator.cc
@@ -43,14 +43,14 @@
 optimization_guide::HintsComponentInfo
 TestHintsComponentCreator::CreateHintsComponentInfoWithPageHints(
     optimization_guide::proto::OptimizationType optimization_type,
-    const std::vector<std::string>& page_hint_host_suffixes,
+    const std::vector<std::string>& page_hint_hosts,
     const std::string& page_pattern,
     const std::vector<std::string>& resource_blocking_patterns) {
   optimization_guide::proto::Configuration config;
-  for (const auto& page_hint_site : page_hint_host_suffixes) {
+  for (const auto& page_hint_site : page_hint_hosts) {
     optimization_guide::proto::Hint* hint = config.add_hints();
     hint->set_key(page_hint_site);
-    hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint->set_key_representation(optimization_guide::proto::HOST);
     hint->set_version(GetDefaultHintVersionString());
 
     optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
@@ -73,14 +73,12 @@
   // Always stick something with no hint version in here.
   optimization_guide::proto::Hint* no_version_hint = config.add_hints();
   no_version_hint->set_key("noversion.com");
-  no_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  no_version_hint->set_key_representation(optimization_guide::proto::HOST);
   no_version_hint->add_page_hints()->set_page_pattern("*");
   // Always stick something with a bad hint version in here.
   optimization_guide::proto::Hint* bad_version_hint = config.add_hints();
   bad_version_hint->set_key("badversion.com");
-  bad_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  bad_version_hint->set_key_representation(optimization_guide::proto::HOST);
   bad_version_hint->set_version("notaversion");
   bad_version_hint->add_page_hints()->set_page_pattern("*");
 
@@ -90,13 +88,13 @@
 optimization_guide::HintsComponentInfo
 TestHintsComponentCreator::CreateHintsComponentInfoWithExperimentalPageHints(
     optimization_guide::proto::OptimizationType optimization_type,
-    const std::vector<std::string>& page_hint_host_suffixes,
+    const std::vector<std::string>& page_hint_hosts,
     const std::vector<std::string>& experimental_resource_patterns) {
   optimization_guide::proto::Configuration config;
-  for (const auto& page_hint_site : page_hint_host_suffixes) {
+  for (const auto& page_hint_site : page_hint_hosts) {
     optimization_guide::proto::Hint* hint = config.add_hints();
     hint->set_key(page_hint_site);
-    hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint->set_key_representation(optimization_guide::proto::HOST);
     hint->set_version(GetDefaultHintVersionString());
 
     optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
@@ -119,14 +117,12 @@
   // Always stick something with no hint version in here.
   optimization_guide::proto::Hint* no_version_hint = config.add_hints();
   no_version_hint->set_key("noversion.com");
-  no_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  no_version_hint->set_key_representation(optimization_guide::proto::HOST);
   no_version_hint->add_page_hints()->set_page_pattern("*");
   // Always stick something with a bad hint version in here.
   optimization_guide::proto::Hint* bad_version_hint = config.add_hints();
   bad_version_hint->set_key("badversion.com");
-  bad_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  bad_version_hint->set_key_representation(optimization_guide::proto::HOST);
   bad_version_hint->set_version("notaversion");
   bad_version_hint->add_page_hints()->set_page_pattern("*");
 
@@ -136,14 +132,14 @@
 optimization_guide::HintsComponentInfo
 TestHintsComponentCreator::CreateHintsComponentInfoWithMixPageHints(
     optimization_guide::proto::OptimizationType optimization_type,
-    const std::vector<std::string>& page_hint_host_suffixes,
+    const std::vector<std::string>& page_hint_hosts,
     const std::vector<std::string>& experimental_resource_patterns,
     const std::vector<std::string>& default_resource_patterns) {
   optimization_guide::proto::Configuration config;
-  for (const auto& page_hint_site : page_hint_host_suffixes) {
+  for (const auto& page_hint_site : page_hint_hosts) {
     optimization_guide::proto::Hint* hint = config.add_hints();
     hint->set_key(page_hint_site);
-    hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint->set_key_representation(optimization_guide::proto::HOST);
     hint->set_version(GetDefaultHintVersionString());
 
     optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
@@ -184,14 +180,12 @@
   // Always stick something with no hint version in here.
   optimization_guide::proto::Hint* no_version_hint = config.add_hints();
   no_version_hint->set_key("noversion.com");
-  no_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  no_version_hint->set_key_representation(optimization_guide::proto::HOST);
   no_version_hint->add_page_hints()->set_page_pattern("*");
   // Always stick something with a bad hint version in here.
   optimization_guide::proto::Hint* bad_version_hint = config.add_hints();
   bad_version_hint->set_key("badversion.com");
-  bad_version_hint->set_key_representation(
-      optimization_guide::proto::HOST_SUFFIX);
+  bad_version_hint->set_key_representation(optimization_guide::proto::HOST);
   bad_version_hint->set_version("notaversion");
   bad_version_hint->add_page_hints()->set_page_pattern("*");
 
diff --git a/components/optimization_guide/test_hints_component_creator.h b/components/optimization_guide/test_hints_component_creator.h
index c95396e..e4449a40 100644
--- a/components/optimization_guide/test_hints_component_creator.h
+++ b/components/optimization_guide/test_hints_component_creator.h
@@ -29,17 +29,17 @@
   TestHintsComponentCreator();
   ~TestHintsComponentCreator();
 
-  // Creates component data based on |whitelisted_host_suffixes| and
+  // Creates component data based on |whitelisted_hosts| and
   // |page_pattern| with page hints for type |optimization_type| blocking
   // resources specified by |resource_patterns|, and returns the
   // HintsComponentInfo for it.
   optimization_guide::HintsComponentInfo CreateHintsComponentInfoWithPageHints(
       optimization_guide::proto::OptimizationType optimization_type,
-      const std::vector<std::string>& whitelisted_host_suffixes,
+      const std::vector<std::string>& whitelisted_hosts,
       const std::string& page_pattern,
       const std::vector<std::string>& resource_patterns);
 
-  // Creates component data based on |whitelisted_host_suffixes| with page hints
+  // Creates component data based on |whitelisted_hosts| with page hints
   // for type |optimization_type| blocking resources specified by
   // |experimental_resource_patterns|, and returns the HintsComponentInfo for
   // it. The loading hints are set as experimental with experiment name set to
@@ -47,23 +47,23 @@
 
   // Creates component data for testing with experimental optimizations. It
   // creates a PageHint (with page pattern "*" for each key in
-  // |whitelisted_host_suffixes| that each has resource blocking patterns from
+  // |whitelisted_hosts| that each has resource blocking patterns from
   // |experimental_resource_patterns|.
   optimization_guide::HintsComponentInfo
   CreateHintsComponentInfoWithExperimentalPageHints(
       optimization_guide::proto::OptimizationType optimization_type,
-      const std::vector<std::string>& whitelisted_host_suffixes,
+      const std::vector<std::string>& whitelisted_hosts,
       const std::vector<std::string>& experimental_resource_patterns);
 
   // Creates component data for testing with both default and experimental
   // optimizations. It creates a PageHint (with page pattern "*" for each key in
-  // |whitelisted_host_suffixes| that each has resource blocking patterns from
+  // |whitelisted_hosts| that each has resource blocking patterns from
   // |default_resource_patterns| and |experimental_resource_patterns|. The
   // experimental hints are guarded behind experiment kFooExperimentName.
   optimization_guide::HintsComponentInfo
   CreateHintsComponentInfoWithMixPageHints(
       optimization_guide::proto::OptimizationType optimization_type,
-      const std::vector<std::string>& whitelisted_host_suffixes,
+      const std::vector<std::string>& whitelisted_hosts,
       const std::vector<std::string>& experimental_resource_patterns,
       const std::vector<std::string>& default_resource_patterns);
 
diff --git a/components/paint_preview/common/paint_preview_tracker.cc b/components/paint_preview/common/paint_preview_tracker.cc
index adfbed4..8222a512 100644
--- a/components/paint_preview/common/paint_preview_tracker.cc
+++ b/components/paint_preview/common/paint_preview_tracker.cc
@@ -147,6 +147,28 @@
                      out_rect.height())));
 }
 
+uint32_t PaintPreviewTracker::TransformContentForRemoteFrame(uint32_t old_id) {
+  if (matrix_.isIdentity())
+    return old_id;
+
+  auto pic_it = subframe_pics_.find(old_id);
+  if (pic_it == subframe_pics_.end())
+    return old_id;
+
+  SkRect out_rect;
+  matrix_.mapRect(&out_rect, pic_it->second->cullRect());
+
+  base::UnguessableToken embedding_token =
+      content_id_to_embedding_token_[old_id];
+  uint32_t new_id = CreateContentForRemoteFrame(
+      gfx::Rect(out_rect.x(), out_rect.y(), out_rect.width(),
+                out_rect.height()),
+      embedding_token);
+  subframe_pics_.erase(old_id);
+  content_id_to_embedding_token_.erase(old_id);
+  return new_id;
+}
+
 void PaintPreviewTracker::CustomDataToSkPictureCallback(SkCanvas* canvas,
                                                         uint32_t content_id) {
   auto map_it = content_id_to_embedding_token_.find(content_id);
diff --git a/components/paint_preview/common/paint_preview_tracker.h b/components/paint_preview/common/paint_preview_tracker.h
index c7a1151..0cc06ef 100644
--- a/components/paint_preview/common/paint_preview_tracker.h
+++ b/components/paint_preview/common/paint_preview_tracker.h
@@ -72,6 +72,10 @@
   // Adds |link| with bounding box |rect| to the list of links.
   void AnnotateLink(const GURL& link, const SkRect& rect);
 
+  // Transforms the cull rect for |id| to be in the correct place and return a
+  // non-zero replacement ID if the cull rect needed to be updated.
+  uint32_t TransformContentForRemoteFrame(uint32_t id);
+
   // Data Serialization -------------------------------------------------------
   // NOTE: once any of these methods are called the PaintPreviewTracker should
   // be considered immutable.
@@ -93,6 +97,11 @@
   // Moves |links_| to out. Invalidates existing entries in |links_|.
   void MoveLinks(std::vector<mojom::LinkDataPtr>* out);
 
+  const base::flat_map<uint32_t, sk_sp<SkPicture>>&
+  GetSubframePicsForTesting() {
+    return subframe_pics_;
+  }
+
  private:
   const base::UnguessableToken guid_;
   const base::Optional<base::UnguessableToken> embedding_token_;
diff --git a/components/paint_preview/renderer/paint_preview_recorder_utils.cc b/components/paint_preview/renderer/paint_preview_recorder_utils.cc
index d15b478..a7d2306 100644
--- a/components/paint_preview/renderer/paint_preview_recorder_utils.cc
+++ b/components/paint_preview/renderer/paint_preview_recorder_utils.cc
@@ -41,7 +41,12 @@
                               annotate_op->rect);
         // Delete the data. We no longer need it.
         annotate_op->data.reset();
-        return;
+        break;
+      }
+      case cc::PaintOpType::CustomData: {
+        auto* custom_op = static_cast<cc::CustomDataOp*>(*it);
+        custom_op->id = tracker->TransformContentForRemoteFrame(custom_op->id);
+        break;
       }
       case cc::PaintOpType::Save: {
         tracker->Save();
diff --git a/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc b/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
index f67984c..028f44d 100644
--- a/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
+++ b/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
@@ -157,6 +157,45 @@
   EXPECT_EQ(links[3]->rect.height(), rect_4.height());
 }
 
+TEST(PaintPreviewRecorderUtilsTest, TestTransformSubframeRects) {
+  PaintPreviewTracker tracker(base::UnguessableToken::Create(),
+                              base::UnguessableToken::Create(), true);
+  gfx::Rect rect(20, 30, 40, 50);
+  auto subframe_token = base::UnguessableToken::Create();
+  int old_id = tracker.CreateContentForRemoteFrame(rect, subframe_token);
+
+  cc::PaintFlags flags;
+  cc::PaintRecorder recorder;
+  cc::PaintCanvas* canvas = recorder.beginRecording(500, 500);
+  canvas->save();
+  canvas->translate(10, 20);
+  canvas->recordCustomData(old_id);
+  canvas->restore();
+  auto record = recorder.finishRecordingAsPicture();
+
+  auto map = tracker.GetSubframePicsForTesting();
+  auto it = map.find(old_id);
+  ASSERT_NE(it, map.end());
+  auto old_cull_rect = it->second->cullRect();
+  EXPECT_EQ(rect.x(), old_cull_rect.x());
+  EXPECT_EQ(rect.y(), old_cull_rect.y());
+  EXPECT_EQ(rect.width(), old_cull_rect.width());
+  EXPECT_EQ(rect.height(), old_cull_rect.height());
+
+  ParseGlyphsAndLinks(record.get(), &tracker);
+
+  map = tracker.GetSubframePicsForTesting();
+  ASSERT_EQ(map.size(), 1U);
+  // Iterate over the one element since we don't know the key.
+  for (const auto& pair : map) {
+    auto old_cull_rect = pair.second->cullRect();
+    EXPECT_EQ(rect.x() + 10, old_cull_rect.x());
+    EXPECT_EQ(rect.y() + 20, old_cull_rect.y());
+    EXPECT_EQ(rect.width(), old_cull_rect.width());
+    EXPECT_EQ(rect.height(), old_cull_rect.height());
+  }
+}
+
 class PaintPreviewRecorderUtilsSerializeAsSkPictureTest
     : public testing::TestWithParam<mojom::Persistence> {
  public:
diff --git a/components/pdf_strings.grdp b/components/pdf_strings.grdp
index c9fbba9..423ae71 100644
--- a/components/pdf_strings.grdp
+++ b/components/pdf_strings.grdp
@@ -61,6 +61,9 @@
     <message name="IDS_PDF_TWO_UP_VIEW_DISABLE" desc="Button text for the button which stops displaying two pages of a PDF on the screen horizontally">
       Single page view
     </message>
+    <message name="IDS_PDF_ANNOTATIONS_SHOW_TOGGLE" desc="Button text for toggling showing annotations on the PDF document">
+      Show annotations
+    </message>
     <message name="IDS_PDF_TOOLTIP_ZOOM_IN" desc="Button tooltip for the button which zooms in a PDF, so that the document appears larger">
       Zoom in
     </message>
diff --git a/components/pdf_strings_grdp/IDS_PDF_ANNOTATIONS_SHOW_TOGGLE.png.sha1 b/components/pdf_strings_grdp/IDS_PDF_ANNOTATIONS_SHOW_TOGGLE.png.sha1
new file mode 100644
index 0000000..a42c2fd
--- /dev/null
+++ b/components/pdf_strings_grdp/IDS_PDF_ANNOTATIONS_SHOW_TOGGLE.png.sha1
@@ -0,0 +1 @@
+918d58cc3d028785ff713ac65e106423bfdbcc0c
\ No newline at end of file
diff --git a/components/policy/core/common/policy_pref_names.cc b/components/policy/core/common/policy_pref_names.cc
index b983642..95c4e855 100644
--- a/components/policy/core/common/policy_pref_names.cc
+++ b/components/policy/core/common/policy_pref_names.cc
@@ -53,5 +53,10 @@
 const char kUserAgentClientHintsEnabled[] =
     "policy.user_agent_client_hints_enabled";
 
+#if defined(OS_ANDROID)
+// Boolean policy preference to disable the BackForwardCache feature.
+const char kBackForwardCacheEnabled[] = "policy.back_forward_cache_enabled";
+#endif  // defined(OS_ANDROID)
+
 }  // namespace policy_prefs
 }  // namespace policy
diff --git a/components/policy/core/common/policy_pref_names.h b/components/policy/core/common/policy_pref_names.h
index 8885b8a..f54fc29e 100644
--- a/components/policy/core/common/policy_pref_names.h
+++ b/components/policy/core/common/policy_pref_names.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_PREF_NAMES_H_
 #define COMPONENTS_POLICY_CORE_COMMON_POLICY_PREF_NAMES_H_
 
+#include "build/build_config.h"
 #include "components/policy/policy_export.h"
 
 namespace policy {
@@ -21,6 +22,9 @@
 POLICY_EXPORT extern const char kUserPolicyRefreshRate[];
 POLICY_EXPORT extern const char kIntensiveWakeUpThrottlingEnabled[];
 POLICY_EXPORT extern const char kUserAgentClientHintsEnabled[];
+#if defined(OS_ANDROID)
+POLICY_EXPORT extern const char kBackForwardCacheEnabled[];
+#endif  // defined(OS_ANDROID)
 
 }  // namespace policy_prefs
 }  // namespace policy
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 0e7c41f..f60a5c4 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -15929,6 +15929,7 @@
         'dynamic_refresh': True,
         'per_profile': True
       },
+      'deprecated': True,
       'example_value': ['abcdefghabcdefghabcdefghabcdefgh'],
       'id': 377,
       'caption': '''Whitelist note-taking apps allowed on the <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> lock screen''',
@@ -15942,6 +15943,38 @@
       As a consequence, setting this policy to an empty list will disable note-taking on the lock screen entirely.
       Note that the policy containing an app ID does not necessarily mean that the user will be able to enable the app as a note-taking app on the lock screen - for example, on Chrome 61, the set of available apps is additionally restricted by the platform.
 
+      If the policy is left unset, there will be no restrictions on the set of apps the user can enable on the lock screen imposed by the policy.
+
+      This policy is deprecated, please use <ph name="NOTE_TAKING_APPS_LOCK_SCREEN_ALLOWLIST">NoteTakingAppsLockScreenAllowlist</ph> instead.'''
+    },
+    {
+      'name': 'NoteTakingAppsLockScreenAllowlist',
+      'owners': ['tbarzic@chromium.org'],
+      'type': 'list',
+      'schema': {
+        'type': 'array',
+        'items': { 'type': 'string' },
+      },
+      'supported_on': [
+        'chrome_os:86-',
+      ],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True
+      },
+      'example_value': ['abcdefghabcdefghabcdefghabcdefgh'],
+      'id': 759,
+      'caption': '''The list of note-taking apps allowed on the <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> lock screen''',
+      'tags': [],
+      'desc': '''Specifies list of apps that can be enabled as a note-taking app on the <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> lock screen.
+
+      If the preferred note-taking app is enabled on the lock screen, the lock screen will contain UI element for launching the preferred note taking app.
+      When launched, the app will be able to create an app window on top of the lock screen, and create data items (notes) in the lock screen context. The app will be able to import created notes to the primary user session, when the session is unlocked. Currently, only Chrome note-taking apps are supported on the lock screen.
+
+      If the policy is set, the user will be allowed to enable an app on the lock screen only if the app's extension ID is contained in the policy list value.
+      As a consequence, setting this policy to an empty list will disable note-taking on the lock screen entirely.
+      Note that the policy containing an app ID does not necessarily mean that the user will be able to enable the app as a note-taking app on the lock screen - for example, on Chrome 61, the set of available apps is additionally restricted by the platform.
+
       If the policy is left unset, there will be no restrictions on the set of apps the user can enable on the lock screen imposed by the policy.'''
     },
     {
@@ -18332,6 +18365,7 @@
         'cloud_only': True,
       },
       'supported_on': ['chrome.*:72-', 'chrome_os:81-'],
+      'future_on': [ 'ios' ],
       'caption': '''Enables <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> cloud reporting''',
       'example_value': True,
       'desc': '''This policy controls <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> cloud reporting which uploads information about the browser operation to Google Admin console.
@@ -21136,7 +21170,6 @@
       'label': '''Set memory limit for Chrome instances''',
     },
     {
-      # TODO(https://crbug.com/1012400): Remove this policy in M86.
       'id': 626,
       'name': 'TLS13HardeningForLocalAnchorsEnabled',
       'owners': ['file://net/ssl/OWNERS'],
@@ -21149,7 +21182,7 @@
         'dynamic_refresh': True,
         'per_profile': True,
       },
-      'supported_on': ['chrome.*:79-', 'chrome_os:79-', 'android:79-'],
+      'supported_on': ['chrome.*:79-85', 'chrome_os:79-85', 'android:79-85'],
       'caption': '''Enable a TLS 1.3 security feature for local trust anchors.''',
       'tags': ['system-security'],
       'desc': '''This policy controls a security feature in TLS 1.3 which protects connections against downgrade attacks. It is backwards-compatible and will not affect connections to compliant TLS 1.2 servers or proxies. However, older versions of some TLS-intercepting proxies have an implementation flaw which causes them to be incompatible.
@@ -21158,7 +21191,7 @@
 
       If this policy is set to False, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will disable these security protections for connections authenticated with locally-installed CA certificates. These protections are always enabled for connections authenticated with publicly-trusted CA certificates.
 
-      The default value for this policy was changed in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> 81 from false to true. Affected proxies are expected to fail connections with an error code of ERR_TLS13_DOWNGRADE_DETECTED. Administrators who need more time to upgrade affected proxies may use this policy to temporarily disable this security feature. This policy will be removed after version 85.
+      The default value for this policy was changed in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> 81 from false to true. Affected proxies are expected to fail connections with an error code of ERR_TLS13_DOWNGRADE_DETECTED. Administrators who need more time to upgrade affected proxies may use this policy to temporarily disable this security feature. This policy was removed in version 86.
       '''
     },
     {
@@ -22380,6 +22413,34 @@
           ''',
     },
     {
+      'name': 'BackForwardCacheEnabled',
+      'owners': ['chrome-bfcache@google.com'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['android:86-'],
+      'features': {
+        'per_profile': False,
+        'dynamic_refresh': True,
+      },
+      'example_value': True,
+      'id': 758,
+      'caption': '''Control the <ph name="PRODUCT_NAME">BackForwardCache</ph> feature.''',
+      'tags': [],
+      'desc': '''When enabled the <ph name="PRODUCT_NAME">BackForwardCache</ph> feature causes web pages to be preserved in its current state (document tree, script, etc.) into the back-forward cache when navigated away from the page.
+          If we navigated back to the page, the page will be restored from the back-forward cache, showing it in the state it was in when cached before.
+
+          This feature might break some websites that does not expect itself to
+          get cached, particularly websites that depend on unload handlers being
+          fired when navigated away from the page, as the unload event will
+          not be dispatched when navigated away from a page and it gets saved
+          in the back-forward cache.
+
+          If this policy is set to enabled or not set, the <ph name="PRODUCT_NAME">BackForwardCache</ph> feature will be enabled.
+
+          If this policy is set to disabled then the feature will be force disabled.
+          ''',
+    },
+    {
       'name': 'PinUnlockAutosubmitEnabled',
       'owners': ['rrsilva@google.com', 'cros-oac@google.com'],
       'future': True,
@@ -23417,6 +23478,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 476, 546, 562, 569, 578],
-  'highest_id_currently_used': 757,
+  'highest_id_currently_used': 759,
   'highest_atomic_group_id_currently_used': 39
 }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 0905c72..fdc2d9f 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -638,26 +638,6 @@
 <translation id="2082205219176343977">Konfigurieren Sie die für das Gerät erforderliche Mindestversion von Chrome.</translation>
 <translation id="209586405398070749">Stabiler Kanal</translation>
 <translation id="2098658257603918882">Berichte mit Nutzungs- und Absturzdaten erstellen</translation>
-<translation id="210034539800365161">Mit dieser Richtlinie wird die Anforderung an die zulässige Mindestversion von <ph name="PRODUCT_OS_NAME" /> konfiguriert.
-
-      Wenn diese Richtlinie auf eine nicht leere Liste festgelegt wird, passiert Folgendes:
-Wenn der Wert für <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> bei keinem Eintrag höher als die aktuelle Version auf dem Gerät ist, gelten keine Einschränkungen und bestehende Einschränkungen werden aufgehoben.
-      Wenn der Wert für <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> bei mindestens einem Eintrag höher als die aktuelle Version ist, wird der stärkste Eintrag ausgewählt, dessen Version der aktuellen Version am nächsten kommt.
-      Bei einem Konflikt hat der Eintrag mit dem niedrigeren Wert für <ph name="WARNING_PERIOD_PROPERTY_NAME" /> oder <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> Vorrang und die Richtlinie wird mit diesem Eintrag angewendet.
-
-      Wenn die aktuelle Version während einer Nutzersitzung durch eine neue abgelöst wird, das aktuelle Netzwerk automatische Updates aber nicht zulässt, erscheint auf dem Bildschirm eine Benachrichtigung, dass das Gerät innerhalb der angezeigten <ph name="WARNING_PERIOD_PROPERTY_NAME" />-Frist aktualisiert werden muss.
-      Es werden keine Benachrichtigungen angezeigt, wenn das aktuelle Netzwerk automatische Updates zulässt. Das Gerät muss innerhalb der <ph name="WARNING_PERIOD_PROPERTY_NAME" />-Frist aktualisiert werden.
-      Die <ph name="WARNING_PERIOD_PROPERTY_NAME" />-Frist beginnt mit dem Anwenden der Richtlinie.
-      Wenn das Gerät bis zum Ablauf der <ph name="WARNING_PERIOD_PROPERTY_NAME" />-Frist nicht aktualisiert wird, wird der Nutzer von der Sitzung abgemeldet.
-      Wenn die <ph name="WARNING_PERIOD_PROPERTY_NAME" />-Frist abgelaufen ist und bei der Anmeldung festgestellt wird, dass die aktuelle Version veraltet ist, muss der Nutzer das Gerät zuerst aktualisieren, bevor er sich anmelden kann.
-
-      Wenn die aktuelle Version während einer Nutzersitzung durch eine neue abgelöst wird und das Ablaufdatum für die automatische Aktualisierung erreicht wurde, erscheint auf dem Bildschirm eine Benachrichtigung, dass das Gerät innerhalb der <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />-Frist zurückgegeben werden muss.
-      Wenn die <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />-Frist abgelaufen ist und bei der Anmeldung festgestellt wird, dass das Ablaufdatum für die automatische Aktualisierung erreicht ist, können sich auf dem Gerät keine Nutzer mehr anmelden.
-
-      Wenn diese Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, gelten keine Einschränkungen, bestehende Einschränkungen werden aufgehoben und der Nutzer kann sich unabhängig von der <ph name="PRODUCT_OS_NAME" />-Version anmelden.
-
-      Mit <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> ist entweder eine exakte Versionsangabe wie "13305.0.0" oder ein Versionspräfix wie "13305" gemeint.
-      Die Werte für <ph name="WARNING_PERIOD_PROPERTY_NAME" /> und <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> sind optional und werden in Tagen angegeben. Der Standardwert liegt bei 0 Tagen.</translation>
 <translation id="2104418465060359056">Daten von Erweiterungen und Plug-ins erfassen</translation>
 <translation id="2106627642643925514">Hiermit wird der Standardmodus für den PIN-Druck überschrieben. Wenn der Modus nicht verfügbar ist, wird diese Richtlinie ignoriert.</translation>
 <translation id="2107601598727098402">
@@ -4599,13 +4579,6 @@
 
       Sie können die Such-URL von Google so angeben: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Remotezugriff</translation>
-<translation id="7898879331506985900">Diese Richtlinie kann nur übergangsweise verwendet werden und wird in M86 entfernt.
-
-      Die standardmäßige Verweisrichtlinie in Chrome wird verschärft. Hierzu wird der Standardwert von "no-referrer-when-downgrade" zum sichereren Wert "strict-origin-when-cross-origin" geändert. Die Umstellung erfolgt graduell und soll mit M80 (stabil) abgeschlossen sein.
-
-      Bis zur Einführung hat diese Richtlinie keine Auswirkungen. Wird sie nach der Einführung aktiviert, wird die standardmäßige Verweisrichtlinie in Chrome auf den Wert aus den Versionen vor M80 zurückgesetzt, also auf "no-referrer-when-downgrade".
-
-      Diese Richtlinie ist standardmäßig deaktiviert.</translation>
 <translation id="7902040092815978832">Numerische Tastatur für Passwort anzeigen</translation>
 <translation id="7912255076272890813">Zulässige App- bzw. Erweiterungstypen konfigurieren</translation>
 <translation id="7922358664346625612">Letzten in Chrome geöffneten Tab beibehalten.</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index c198518..53f94f4e 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -660,26 +660,6 @@
 <translation id="2082205219176343977">Configura la versión mínima permitida de Chrome para el dispositivo.</translation>
 <translation id="209586405398070749">Canal estable</translation>
 <translation id="2098658257603918882">Habilitar informes de uso y datos relacionados con bloqueos</translation>
-<translation id="210034539800365161">Configura el requisito de la versión mínima permitida de <ph name="PRODUCT_OS_NAME" />.
-
-      Cuando se configura esta política con una lista no vacía:
-      Si ninguna de las entradas tiene un valor de <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> mayor que la versión actual del dispositivo, no se aplicarán restricciones y se revocarán las restricciones existentes.
-      Si al menos una de las entradas tiene un valor de <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> mayor que la versión actual, se seleccionará la entrada cuya versión sea la mayor y más cercana a la actual.
-      En caso de conflicto, se le dará preferencia a la versión con el menor valor de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, y se aplicará la política conforme a esa entrada.
-
-      Si la versión actual se vuelve obsoleta durante la sesión de usuario y la red actual limita las actualizaciones automáticas, se mostrará una notificación en pantalla solicitando la actualización del dispositivo en el período especificado en el valor de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> de la notificación.
-      Si la red actual permite las actualizaciones automáticas y el dispositivo debe actualizarse en el período especificado en <ph name="WARNING_PERIOD_PROPERTY_NAME" />, no se mostrarán notificaciones.
-      El valor de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> comienza a partir de que se aplica la política.
-      Si no se actualiza el dispositivo para cuando caduca <ph name="WARNING_PERIOD_PROPERTY_NAME" />, se forzará al usuario a salir de la sesión.
-      Si se advierte que la versión actual es obsoleta al momento de acceder con <ph name="WARNING_PERIOD_PROPERTY_NAME" /> vencido, el usuario deberá actualizar el dispositivo para poder acceder.
-
-      Si la versión actual se vuelve obsoleta durante la sesión de usuario y el dispositivo alcanzó la fecha de vencimiento de las actualizaciones automáticas, se mostrará una notificación en pantalla indicando que el dispositivo deberá devolverse en el período especificado en <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Si se advierte que el dispositivo alcanzó la fecha de vencimiento de las actualizaciones automáticas al momento de acceder con <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> vencido, se bloqueará el acceso al dispositivo para todos los usuarios.
-
-      Si no estableces esta política o la estableces como vacía, no se aplicarán restricciones, se revocarán las existentes, y el usuario podrá acceder independientemente de la versión de <ph name="PRODUCT_OS_NAME" />.
-
-      Aquí el valor de <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> puede ser exacto, como "13305.0.0", o el prefijo de una versión, como "13305".
-      Los valores <ph name="WARNING_PERIOD_PROPERTY_NAME" /> y <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> son opcionales y se especifican en número de días. El valor predeterminado de esos valores es 0 días, lo que significa que no hay un período de advertencia.</translation>
 <translation id="2104418465060359056">Enviar información de extensiones y complementos</translation>
 <translation id="2106627642643925514">Anula el modo de impresión con PIN predeterminado. Si el modo no está disponible, se ignorará esta política.</translation>
 <translation id="2107601598727098402">
@@ -4622,13 +4602,6 @@
 
       Puedes especificar la URL de búsqueda de Google de la siguiente manera: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Acceso remoto</translation>
-<translation id="7898879331506985900">Esta política es una adaptación por corto plazo y se quitará en la versión M86.
-
-      Para fortalecer la política del referente predeterminado de Chrome, su valor actual de "sin referente cuando cambia a una versión inferior" cambia al valor más seguro "origen estricto cuando el origen es cruzado" mediante un lanzamiento gradual que apunta a la versión M80 estable.
-
-      Antes del lanzamiento, esta política empresarial no tendrá efecto. Después del lanzamiento, cuando se habilite esta política empresarial, se configurará la política del referente predeterminado de Chrome al valor previo al lanzamiento de la versión M80: "sin referente cuando cambia a una versión inferior".
-
-      De forma predeterminada, esta política empresarial está inhabilitada.</translation>
 <translation id="7902040092815978832">Muestra el teclado numérico para la contraseña</translation>
 <translation id="7912255076272890813">Configurar tipos de extensiones o aplicaciones permitidos</translation>
 <translation id="7922358664346625612">Mantener la última pestaña abierta en Chrome</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 2dbe34f..eaed62b6 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -669,26 +669,6 @@
 <translation id="2082205219176343977">Configurar la versión mínima permitida de Chrome en el dispositivo.</translation>
 <translation id="209586405398070749">Canal estable</translation>
 <translation id="2098658257603918882">Habilitar informes de uso y de datos sobre fallos</translation>
-<translation id="210034539800365161">Configura el requisito de la versión mínima permitida de <ph name="PRODUCT_OS_NAME" />.
-
-      Cuando a esta política se le asigna una lista que no esté vacía:
-      Si ninguna de las entradas tiene un valor de <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superior a la versión actual en el dispositivo, no se aplicará ninguna restricción y se revocarán las restricciones existentes.
-      Si alguna de las entradas tiene un valor de <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superior a la versión actual, se elegirá la entrada más fuerte cuya versión sea superior y más próxima a la actual.
-      En caso de que se produzca un conflicto, se le dará preferencia a la que tenga un valor de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> menor y se aplicará la política usando esa entrada.
-
-      Si la versión actual queda obsoleta durante una sesión y la red actual limita las actualizaciones automáticas, se mostrará una notificación en la pantalla para pedir que se actualice el dispositivo durante el <ph name="WARNING_PERIOD_PROPERTY_NAME" /> que se muestra en la notificación.
-      Si la red actual permite las actualizaciones automáticas y es necesario actualizar el dispositivo antes de que termine el <ph name="WARNING_PERIOD_PROPERTY_NAME" />, no se mostrará ninguna notificación.
-      El periodo de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> empieza en el momento en que se aplica la política.
-      Si no se actualiza el dispositivo antes de que termine el periodo de <ph name="WARNING_PERIOD_PROPERTY_NAME" />, se desconectará al usuario del sistema.
-      Si la versión actual está obsoleta en el momento de inicio de sesión y el periodo de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> ha terminado, el usuario deberá actualizar el dispositivo antes de iniciar sesión.
-
-      Si la versión actual queda obsoleta durante una sesión y el dispositivo ha alcanzado la fecha de caducidad de las actualizaciones automáticas, se mostrará una notificación en la pantalla para pedir que se devuelva el dispositivo en el periodo de <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Si se determina que el dispositivo ha alcanzado la fecha de caducidad de las actualizaciones automáticas en el momento de iniciar sesión y el periodo de <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> ha terminado, el dispositivo se bloquea y ningún usuario podrá iniciar sesión.
-
-      Si no se define esta política o se deja vacía, no se aplicará ninguna restricción, se revocarán las restricciones existentes y el usuario podrá iniciar sesión independientemente de la versión de <ph name="PRODUCT_OS_NAME" />.
-
-      <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> puede hacer referencia a una versión exacta como "13305.0.0", o al prefijo de una versión, como "13305".
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> y <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> son valores opcionales especificados en número de días. El valor predeterminado es 0 días, lo que significa que no hay ningún periodo de advertencia.</translation>
 <translation id="2104418465060359056">Recoger información sobre extensiones y complementos</translation>
 <translation id="2106627642643925514">Anula el modo predeterminado de impresión con PIN Si este modo no está disponible, se ignorará esta política.</translation>
 <translation id="2107601598727098402">
@@ -4666,13 +4646,6 @@
 
       Puedes especificar la URL de la Búsqueda de Google introduciendo lo siguiente: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Acceso remoto</translation>
-<translation id="7898879331506985900">Esta política de empresa sirve para una adaptación a corto plazo y se eliminará en la versión M86.
-
-      Se refuerza la política de referrer predeterminada de Chrome a partir de su valor actual de no-referrer-when-downgrade para mejorar la seguridad con strict-origin-when-cross-origin mediante un lanzamiento gradual orientado a la versión estable M80.
-
-      Esta política de empresa no tendrá ningún efecto antes del lanzamiento. Después del lanzamiento, cuando se habilite esta política de empresa, a la política de referrer predeterminada de Chrome se le asignará el valor de no-referrer-when-downgrade anterior al de la versión M80.
-
-      Esta política de empresa está inhabilitada de forma predeterminada.</translation>
 <translation id="7902040092815978832">Muestra el teclado numérico para introducir la contraseña</translation>
 <translation id="7912255076272890813">Configurar tipos de extensiones o aplicaciones permitidos</translation>
 <translation id="7922358664346625612">Mantener abierta la última pestaña en Chrome.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 4f63bdeb..16a62ad 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -672,26 +672,6 @@
 <translation id="2082205219176343977">Configurer la version Chrome minimale autorisée de l'appareil.</translation>
 <translation id="209586405398070749">Version stable</translation>
 <translation id="2098658257603918882">Autoriser l'envoi de statistiques d'utilisation et de rapports d'erreur</translation>
-<translation id="210034539800365161">Permet de configurer la version minimale autorisée requise de <ph name="PRODUCT_OS_NAME" />.
-
-      Lorsque cette règle est définie sur des entrées de la liste :
-      Si aucune des entrées de la liste ne possède une "<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />" ultérieure à la version actuelle de l'appareil, aucune restriction n'est alors appliquée, et les restrictions existantes sont révoquées.
-      Si au moins une entrée possède une "<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />" ultérieure à la version actuelle, l'entrée choisie est celle qui est la plus performante et dont la version est supérieure et la plus proche de la version actuelle.
-      En cas de conflit, la préférence est donnée à celle dont la "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" ou la "<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />" est la plus réduite. De plus, la règle est appliquée avec cette entrée.
-
-      Si la version actuelle devient obsolète pendant la session utilisateur et que le réseau actuel limite les mises à jour automatiques, une notification s'affiche à l'écran pour inviter l'utilisateur à mettre à jour l'appareil dans la "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" qui lui est indiquée.
-      En revanche, si le réseau actuel autorise les mises à jour automatiques et que l'appareil doit être mis à jour dans la "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" définie, aucune notification ne s'affiche.
-      La "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" commence à partir de l'application de la règle.
-      Si l'appareil n'est pas mis à jour avant la fin de la "<ph name="WARNING_PERIOD_PROPERTY_NAME" />", l'utilisateur est déconnecté de la session.
-      Si la version actuelle s'avère obsolète au moment de la connexion, et si la "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" est arrivée à expiration, l'utilisateur doit mettre à jour l'appareil avant de se connecter.
-
-      Si la version actuelle devient obsolète pendant la session utilisateur et que la date d'expiration des mises à jour automatiques associée à l'appareil est atteinte, une notification s'affiche à l'écran pour appliquer de nouveau la "<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />" à l'appareil.
-      Si la date d'expiration des mises à jour automatiques associée à l'appareil est atteinte au moment de la connexion et que la "<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />" est arrivée à expiration, aucun utilisateur ne peut se connecter à l'appareil.
-
-      Si cette règle n'est pas configurée ou si aucune entrée ne figure dans la liste, aucune restriction n'est appliquée, les restrictions existantes sont révoquées, et l'utilisateur peut se connecter quelle que soit la version de <ph name="PRODUCT_OS_NAME" />.
-
-      Dans le cas présent, "<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />" peut désigner une version exacte telle que "13305.0.0" ou le préfixe d'une version tel que "13305".
-      Les "<ph name="WARNING_PERIOD_PROPERTY_NAME" />" et "<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />" sont des valeurs facultatives exprimées en nombre de jours. Elles sont définies par défaut sur 0 jour, ce qui signifie qu'il n'y a pas de période d'avertissement.</translation>
 <translation id="2104418465060359056">Enregistrer les informations des extensions et des plug-ins</translation>
 <translation id="2106627642643925514">Remplace le mode d'impression par code défini par défaut. Si le mode est indisponible, cette règle est ignorée.</translation>
 <translation id="2107601598727098402">
@@ -4650,13 +4630,6 @@
 
       Vous pouvez spécifier cette URL comme suit : <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Accès à distance</translation>
-<translation id="7898879331506985900">Cette règle permet d'assurer la transition vers la version M86, de laquelle elle sera supprimée.
-
-      La règle par défaut de Chrome en matière d'URL de provenance est renforcée. L'objectif est de favoriser une transition progressive de sa valeur actuelle (no-referrer-when-downgrade) à une nouvelle valeur plus sécurisée (strict-origin-when-cross-origin) afin d'obtenir une version M80 stable.
-
-      Avant le déploiement, cette règle n'a aucun d'effet. Après le déploiement, lorsque cette règle est activée, la règle par défaut de Chrome en matière d'URL de provenance reprend sa valeur antérieure à celle de la version M80 (no-referrer-when-downgrade).
-
-      Cette règle est désactivée par défaut.</translation>
 <translation id="7902040092815978832">Afficher le clavier numérique pour la saisie du mot de passe</translation>
 <translation id="7912255076272890813">Configurer les types d'applications ou d'extensions autorisés</translation>
 <translation id="7922358664346625612">Laisser le dernier onglet ouvert dans Chrome.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 8e0d2d8..1b35bb9 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -153,8 +153,8 @@
       Jika kebijakan tidak disetel atau disetel ke false, Transisi Cepat tidak dapat digunakan.
       Jika disetel ke true, Transisi Cepat dapat digunakan saat titik akses nirkabel mendukungnya.</translation>
 <translation id="1240722269871366886">Kebijakan ini memungkinkan <ph name="PRODUCT_OS_NAME" /> menyarankan emoji saat pengguna mengetikkan teks dengan keyboard virtual atau fisik.
-      Jika kebijakan ini disetel ke benar (true), fitur akan diaktifkan, dan pengguna dapat mengubahnya.
-      Kebijakan ini disetel ke salah (false) secara default, emoji tidak akan disarankan dan pengguna tidak dapat menggantinya.</translation>
+      Jika kebijakan ini disetel ke benar, fitur akan diaktifkan, dan pengguna dapat mengubahnya.
+      Kebijakan ini disetel ke salah secara default, emoji tidak akan disarankan dan pengguna tidak dapat menggantinya.</translation>
 <translation id="1243570869342663665">Mengontrol pemfilteran konten khusus dewasa SafeSites.</translation>
 <translation id="1257550411839719984">Setel direktori download default</translation>
 <translation id="1265053460044691532">Batasi waktu bagi pengguna yang diautentikasi melalui SAML untuk dapat masuk saat offline.</translation>
@@ -653,26 +653,6 @@
 <translation id="2082205219176343977">Mengonfigurasi versi minimum Chrome yang diizinkan untuk perangkat.</translation>
 <translation id="209586405398070749">Saluran stabil</translation>
 <translation id="2098658257603918882">Aktifkan laporan data penggunaan dan yang terkait error</translation>
-<translation id="210034539800365161">Mengonfigurasi persyaratan versi minimum <ph name="PRODUCT_OS_NAME" /> yang diizinkan.
-
-      Jika kebijakan ini disetel ke daftar tidak kosong:
-      Jika tidak ada entri yang memiliki <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> yang lebih baru daripada versi di perangkat saat ini, tidak ada batasan yang akan diterapkan dan batasan yang telah diterapkan akan dicabut.
-      Jika setidaknya salah satu entri memiliki <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> yang lebih baru daripada versi saat ini, entri terkuat yang memiliki versi lebih baru dan paling dekat dengan versi saat ini akan dipilih.
-      Jika terjadi konflik, preferensi akan diberikan pada entri dengan <ph name="WARNING_PERIOD_PROPERTY_NAME" /> atau <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> yang lebih singkat dan kebijakan diterapkan menggunakan entri tersebut.
-
-      Jika versi saat ini menjadi tidak terpakai saat sesi pengguna berlangsung dan jaringan saat ini membatasi update otomatis, akan muncul notifikasi pada layar untuk mengupdate perangkat dalam <ph name="WARNING_PERIOD_PROPERTY_NAME" /> yang ditampilkan di notifikasi.
-      Tidak ada notifikasi yang ditampilkan jika jaringan saat ini mengizinkan update otomatis dan perangkat harus diupdate dalam <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> akan dimulai pada saat kebijakan diterapkan.
-      Jika perangkat tidak diupdate hingga <ph name="WARNING_PERIOD_PROPERTY_NAME" /> berakhir, pengguna akan dipaksa logout dari sesi.
-      Jika diketahui bahwa versi saat ini tidak terpakai saat login ketika <ph name="WARNING_PERIOD_PROPERTY_NAME" /> berakhir, pengguna diminta mengupdate perangkat sebelum login.
-
-      Jika versi saat ini menjadi tidak terpakai saat sesi pengguna berlangsung dan perangkat telah mencapai batas akhir update otomatis, akan muncul notifikasi pada layar untuk mengembalikan perangkat dalam <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Jika diketahui bahwa perangkat telah mencapai batas akhir update otomatis saat login ketika <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> berakhir, perangkat akan diblokir bagi siapa pun yang ingin login.
-
-      Jika kebijakan ini tidak disetel atau dibiarkan kosong, tidak ada batasan yang akan diterapkan, batasan yang ada akan dicabut, dan pengguna dapat login, berapa pun versi <ph name="PRODUCT_OS_NAME" />.
-
-      <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> di sini bisa merupakan versi yang tepat seperti '13305.0.0' atau awalan versi, seperti '13305'.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> dan <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> adalah nilai opsional yang ditentukan dalam jumlah hari. Nilai defaultnya adalah 0 hari, yang artinya tidak ada periode peringatan.</translation>
 <translation id="2104418465060359056">Melaporkan informasi Ekstensi dan Plugin</translation>
 <translation id="2106627642643925514">Mengganti mode pencetakan PIN default. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan.</translation>
 <translation id="2107601598727098402">
@@ -4630,13 +4610,6 @@
 
       Anda dapat menentukan URL penelusuran Google sebagai: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Akses jarak jauh</translation>
-<translation id="7898879331506985900">Kebijakan perusahaan ini berlaku untuk adaptasi jangka pendek dan akan dihapus di M86.
-
-      Kebijakan perujuk default Chrome sedang diperkuat dari nilainya saat ini, yaitu no-referrer-when-downgrade, ke strict-origin-when-cross-origin yang lebih aman melalui peluncuran bertahap yang menargetkan M80 stabil.
-
-      Sebelum peluncuran, kebijakan perusahaan ini tidak akan berlaku. Setelah peluncuran, ketika kebijakan perusahaan ini diaktifkan, kebijakan perujuk default Chrome akan ditetapkan ke nilai pra-M80, yaitu no-referrer-when-downgrade.
-
-      Kebijakan perusahaan ini dinonaktifkan secara default.</translation>
 <translation id="7902040092815978832">Menampilkan keyboard numerik untuk sandi</translation>
 <translation id="7912255076272890813">Konfigurasikan jenis aplikasi/ekstensi yang diizinkan</translation>
 <translation id="7922358664346625612">Biarkan tab terakhir terbuka di Chrome.</translation>
@@ -5335,9 +5308,9 @@
       Kebijakan ini akan dihapus setelah Chrome 84.</translation>
 <translation id="8937562488500723400">Mengontrol apakah persetujuan oleh kebijakan KDC dipatuhi untuk menentukan pendelegasian tiket <ph name="KERBEROS" />.
 
-          Jika kebijakan ini disetel ke benar (true), autentikasi HTTP akan mematuhi persetujuan oleh kebijakan KDC, yaitu Chrome hanya akan mendelegasikan kredensial jika KDS menyetel <ph name="OK_AS_DELEGATE" /> pada tiket layanan. Buka https://tools.ietf.org/html/rfc5896.html untuk informasi selengkapnya. Layanan juga harus cocok dengan kebijakan 'AuthNegotiateDelegateAllowlist'.
+          Jika kebijakan ini disetel ke benar, autentikasi HTTP akan mematuhi persetujuan oleh kebijakan KDC, yaitu Chrome hanya akan mendelegasikan kredensial jika KDS menyetel <ph name="OK_AS_DELEGATE" /> pada tiket layanan. Buka https://tools.ietf.org/html/rfc5896.html untuk informasi selengkapnya. Layanan juga harus cocok dengan kebijakan 'AuthNegotiateDelegateAllowlist'.
 
-          Jika kebijakan ini tidak disetel atau disetel ke salah (false), kebijakan KDC akan diabaikan di platform yang didukung, dan hanya kebijakan 'AuthNegotiateDelegateAllowlist' yang akan dipatuhi.
+          Jika kebijakan ini tidak disetel atau disetel ke salah, kebijakan KDC akan diabaikan di platform yang didukung, dan hanya kebijakan 'AuthNegotiateDelegateAllowlist' yang akan dipatuhi.
 
           Di Windows, kebijakan KDC selalu dipatuhi.</translation>
 <translation id="8938932171964587769">Tidak digunakan lagi di M69. Sebagai gantinya, gunakan OverrideSecurityRestrictionsOnInsecureOrigin.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 80185e0..e64a0a9 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -631,26 +631,6 @@
 <translation id="2082205219176343977">Configura la versione minima di Chrome consentita per il dispositivo.</translation>
 <translation id="209586405398070749">Canale stabile</translation>
 <translation id="2098658257603918882">Attiva rapporti sull'utilizzo e sui dati relativi agli arresti anomali</translation>
-<translation id="210034539800365161">Consente di configurare il requisito della versione minima consentita di <ph name="PRODUCT_OS_NAME" />.
-
-      Se per questo criterio viene impostato un elenco non vuoto:
-      Se nessuna voce ha un valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superiore alla versione corrente del dispositivo, non vengono applicate limitazioni e le limitazioni esistenti vengono revocate.
-      Se almeno una voce ha un valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> superiore alla versione corrente, viene scelta la voce più forte la cui versione è superiore e più simile a quella corrente.
-      In caso di conflitto, si preferisce la voce con il valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> inferiore e il criterio viene applicato usando tale voce.
-
-      Se la versione corrente diventa obsoleta durante la sessione utente e la rete corrente limita gli aggiornamenti automatici, sullo schermo viene mostrata una notifica che invita l'utente ad aggiornare il dispositivo entro il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> mostrato nella notifica.
-      Se la rete corrente consente gli aggiornamenti automatici, non viene mostrata alcuna notifica e il dispositivo deve essere aggiornato entro il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      Il periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" /> parte dal momento in cui viene applicato il criterio.
-      Se il dispositivo non viene aggiornato entro la scadenza del periodo indicato nel valore <ph name="WARNING_PERIOD_PROPERTY_NAME" />, l'utente viene disconnesso dalla sessione.
-      Se la versione corrente risulta obsoleta al momento dell'accesso con periodo <ph name="WARNING_PERIOD_PROPERTY_NAME" /> scaduto, all'utente viene richiesto di aggiornare il dispositivo prima di accedere.
-
-      Se la versione corrente diventa obsoleta durante la sessione utente e il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico, sullo schermo viene mostrata una notifica che invita l'utente a restituire il dispositivo entro il periodo indicato nel valore <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Se risulta che il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico al momento dell'accesso con periodo <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> scaduto, il dispositivo viene bloccato e nessun utente può eseguire l'accesso.
-
-      Se questo criterio non viene impostato o viene lasciato vuoto, non vengono applicate limitazioni, vengono revocate quelle esistenti e l'utente può accedere qualunque sia la versione di <ph name="PRODUCT_OS_NAME" />.
-
-      Il valore <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> può essere una versione esatta, ad esempio "13305.0.0", oppure un prefisso di versione, ad esempio "13305".
-      I valori <ph name="WARNING_PERIOD_PROPERTY_NAME" /> e <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> sono facoltativi e specificati in numero di giorni. Il valore predefinito è 0 giorni, a indicare nessun periodo di avviso.</translation>
 <translation id="2104418465060359056">Segnala i dati delle estensioni e dei plug-in</translation>
 <translation id="2106627642643925514">Consente di sostituire la modalità di stampa PIN predefinita. Se la modalità non è disponibile, questa norma viene ignorata.</translation>
 <translation id="2107601598727098402">
@@ -4594,13 +4574,6 @@
 
       Puoi specificare l'URL di ricerca di Google come: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Accesso remoto</translation>
-<translation id="7898879331506985900">Questo criterio aziendale è finalizzato al periodo di transizione e verrà rimosso nella versione M86.
-
-      Il criterio relativo al referrer predefinito di Chrome sarà rafforzato passando dal relativo valore corrente no-referrer-when-downgrade al più sicuro strict-origin-when-cross-origin tramite un rilascio graduale della release stabile di M80.
-
-      Prima del lancio, questo criterio aziendale non avrà alcun effetto. Dopo il lancio, una volta attivato questo criterio aziendale, il criterio relativo al referrer predefinito di Chrome verrà impostato sul suo valore della pre-release M80, no-referrer-when-downgrade.
-
-      Questo criterio aziendale è disattivato per impostazione predefinita.</translation>
 <translation id="7902040092815978832">Mostra la tastiera numerica per la password</translation>
 <translation id="7912255076272890813">Configura tipi di app/estensioni consentiti</translation>
 <translation id="7922358664346625612">Mantieni l'ultima scheda aperta in Chrome.</translation>
@@ -5292,13 +5265,13 @@
       Se questo criterio viene impostato su False o non viene impostato, gli elementi di controllo modulo verranno attivati come nel lancio delle versioni M81, M82 e M83.
 
       Questo criterio verrà rimosso nelle versioni successive alla versione 84 di Chrome.</translation>
-<translation id="8937562488500723400">Controlla se l'approvazione della norma KDC viene rispettata per decidere se delegare i ticket <ph name="KERBEROS" />.
+<translation id="8937562488500723400">Controlla se l'approvazione del criterio KDC viene rispettata per decidere se delegare i ticket <ph name="KERBEROS" />.
 
-          Se questo criterio viene impostato su vero, l'autenticazione HTTP rispetta l'approvazione da parte della norma KDC, ad esempio Chrome delega solo le credenziali se il KDC imposta <ph name="OK_AS_DELEGATE" /> su un ticket di servizio. Per ulteriori informazioni, consulta https://tools.ietf.org/html/rfc5896.html. Il servizio deve corrispondere anche al criterio "AuthNegotiateDelegateAllowlist".
+          Se questo criterio viene impostato su vero, l'autenticazione HTTP rispetta l'approvazione da parte del criterio KDC, ad esempio Chrome delega solo le credenziali se il KDC imposta <ph name="OK_AS_DELEGATE" /> su un ticket di servizio. Per ulteriori informazioni, consulta https://tools.ietf.org/html/rfc5896.html. Il servizio deve corrispondere anche al criterio "AuthNegotiateDelegateAllowlist".
 
-          Se questo criterio non viene impostato o viene impostato su falso, la norma KDC viene ignorata sulle piattaforme supportate e il verrà rispettato solo il criterio "AuthNegotiateDelegateAllowlist".
+          Se questo criterio non viene impostato o viene impostato su falso, il criterio KDC viene ignorato sulle piattaforme supportate e verrà rispettato solo il criterio "AuthNegotiateDelegateAllowlist".
 
-          Su Windows la norma KDC viene sempre rispettata.</translation>
+          Su Windows il criterio KDC viene sempre rispettato.</translation>
 <translation id="8938932171964587769">Ritirata in M69. Utilizza la norma OverrideSecurityRestrictionsOnInsecureOrigin.
 
 Questa norma consente di specificare un elenco di origini (URL) o di schemi di nomi host (ad esempio "*.example.com") a cui non vengono applicate limitazioni di sicurezza previste per le origini non sicure.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 6a3dba9..884e33f 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -654,26 +654,6 @@
 <translation id="2082205219176343977">デバイスでの使用を許可する Chrome の最小バージョンを設定する。</translation>
 <translation id="209586405398070749">Stable チャンネル</translation>
 <translation id="2098658257603918882">使用状況とクラッシュ関連データのレポートを有効にする</translation>
-<translation id="210034539800365161">最低限必要な <ph name="PRODUCT_OS_NAME" /> のバージョンを設定します。
-
-      このポリシーで空でないリストを設定した場合、次のように処理されます。
-      デバイスの現在のバージョンより新しい「<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />」のエントリがない場合、制限は適用されず、すでに存在する制限は取り消されます。
-      現在のバージョンより新しい「<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />」のエントリが少なくとも 1 つある場合、現在のバージョンに最も近い新しいバージョンのエントリが選ばれます。
-      競合が発生した場合、「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」か「<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />」の値が小さい方のエントリを使用してポリシーが適用されます。
-
-      ユーザー セッション中に現在のバージョンがサポート終了となり、さらに現在のネットワークで自動更新が制限されている場合、「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」の期限内にデバイスを更新するよう求める通知が画面に表示されます。
-      現在のネットワークで自動更新が許可されていて、「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」の期限内にデバイスが更新されることが確実な場合、通知は表示されません。
-      「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」は、ポリシーを適用した時点からカウントされます。
-      デバイスを「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」の期限内に更新しない場合、ユーザーはセッションからログアウトされます。
-      ログイン時に、現在のバージョンが「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」の期限を過ぎてサポート終了となっていることが検出された場合、ユーザーはデバイスを更新するまでログインできなくなります。
-
-      ユーザー セッション中に現在のバージョンがサポート終了となり、さらにデバイスが自動更新の有効期限に達している場合、「<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />」の期限内にデバイスを返却するよう求める通知が画面に表示されます。
-      ログイン時に、デバイスが「<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />」の期限を過ぎて自動更新の有効期限に達していることが検出された場合、どのユーザーもデバイスにログインできなくなります。
-
-      このポリシーを設定しないか、空のリストを設定した場合、制限は適用されず、すでに存在する制限は取り消されます。ユーザーは <ph name="PRODUCT_OS_NAME" /> のバージョンに関係なくログインできます。
-
-      「<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />」には、正確なバージョン(13305.0.0 など)かバージョンのプレフィックス(13305 など)を指定できます。
-      「<ph name="WARNING_PERIOD_PROPERTY_NAME" />」と「<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />」には、日数を指定します(省略可)。デフォルトの値は 0 日で、この場合は警告期間がないことを意味します。</translation>
 <translation id="2104418465060359056">拡張機能とプラグインの情報についてレポートを作成する</translation>
 <translation id="2106627642643925514">デフォルトの PIN 印刷モードをオーバーライドします。このモードを使用できない場合、このポリシーは無視されます。</translation>
 <translation id="2107601598727098402">
@@ -2386,7 +2366,7 @@
 
       <ph name="FILTER_PLACEHOLDER" /> セクションの使用例:
 
-      * <ph name="FILTER_PLACEHOLDER" /> に <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" /> を設定した場合、発行元の CommonName が <ph name="ISSUER_CN_PLACEHOLDER" /> のクライアント証明書のみが選択されます。
+      * <ph name="FILTER_PLACEHOLDER" /> に <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" /> を設定した場合、発行元の CommonName が <ph name="ISSUER_CN_PLACEHOLDER" /> であるクライアント証明書のみが選択されます。
 
       * <ph name="FILTER_PLACEHOLDER" /> に <ph name="ISSUER_STRING_VALUE" /> と <ph name="SUBJECT_STRING_VALUE" /> の両方のセクションを含めた場合は、両方の条件を満たすクライアント証明書のみが選択されます。
 
@@ -4572,13 +4552,6 @@
 
       Google の検索 URL は次のように指定できます。<ph name="GOOGLE_SEARCH_URL" /></translation>
 <translation id="7895553628261067384">リモート アクセス</translation>
-<translation id="7898879331506985900">この企業向けのポリシーは一時的な適用を想定しており、M86 で削除される予定です。
-
-      Chrome のデフォルトのリファラー ポリシーは、M80 安定版の公開に向けた段階的措置として、現在の「no-referrer-when-downgrade」からさらに安全な「strict-origin-when-cross-origin」に変更され、セキュリティが強化されます。
-
-      安定版の公開まで、このポリシーは無視されます。公開後、このポリシーを有効にしている場合は、Chrome のデフォルトのリファラー ポリシーが M80 より前の値「no-referrer-when-downgrade」に設定されます。
-
-      このポリシーはデフォルトで無効になっています。</translation>
 <translation id="7902040092815978832">パスワード入力用に数字キーボードを表示する</translation>
 <translation id="7912255076272890813">許可されるアプリ/拡張機能のタイプを設定する</translation>
 <translation id="7922358664346625612">最後のタブを Chrome で開いたままにします。</translation>
@@ -5408,7 +5381,7 @@
 
       <ph name="FILTER_PLACEHOLDER" /> セクションの使用例:
 
-      * <ph name="FILTER_PLACEHOLDER" /> に <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" /> を設定した場合、発行元の CommonName が <ph name="ISSUER_CN_PLACEHOLDER" /> のクライアント証明書のみが選択されます。
+      * <ph name="FILTER_PLACEHOLDER" /> に <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" /> を設定した場合、発行元の CommonName が <ph name="ISSUER_CN_PLACEHOLDER" /> であるクライアント証明書のみが選択されます。
 
       * <ph name="FILTER_PLACEHOLDER" /> に <ph name="ISSUER_STRING_VALUE" /> と <ph name="SUBJECT_STRING_VALUE" /> の両方のセクションを含めた場合は、両方の条件を満たすクライアント証明書のみが選択されます。
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 4c0bd68..af9f7a9d 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -163,9 +163,9 @@
 
       정책이 설정되지 않거나 False로 설정되면 빠른 전환이 사용되지 않습니다.
       True로 설정하면 무선 액세스 포인트에서 지원하는 경우 빠른 전환이 사용됩니다.</translation>
-<translation id="1240722269871366886">이 정책을 사용하면 <ph name="PRODUCT_OS_NAME" />에서 사용자가 가상 키보드 또는 물리 키보드로 텍스트를 입력할 때 그림 이모티콘을 제안할 수 있습니다.
-      정책을 True로 설정하면 이 기능이 사용 설정되며 사용자가 변경할 수 있습니다.
-      이 정책은 기본적으로 False로 설정되어 있어 추천 그림 이모티콘이 표시되지 않으며 사용자는 이를 재정의할 수 없습니다.</translation>
+<translation id="1240722269871366886">이 정책을 사용하면 <ph name="PRODUCT_OS_NAME" />에서 사용자가 가상 키보드 또는 물리 키보드로 텍스트를 입력할 때 그림 이모티콘을 추천할 수 있습니다.
+      정책을 '참'으로 설정하면 이 기능이 사용 설정되며 사용자가 변경할 수 있습니다.
+      이 정책은 기본적으로 '거짓'으로 설정되어 있어 추천 그림 이모티콘이 표시되지 않으며 사용자는 이를 재정의할 수 없습니다.</translation>
 <translation id="1243570869342663665">SafeSites 성인용 콘텐츠 필터링을 관리합니다.</translation>
 <translation id="1257550411839719984">기본 다운로드 디렉터리 설정</translation>
 <translation id="1265053460044691532">SAML을 통해 인증한 사용자가 오프라인에서 로그인할 수 있는 기간을 제한</translation>
@@ -667,26 +667,6 @@
 <translation id="2082205219176343977">기기에 허용되는 최소 Chrome 버전을 설정합니다.</translation>
 <translation id="209586405398070749">정식 채널</translation>
 <translation id="2098658257603918882">사용 및 비정상 종료 관련 데이터 보고 사용</translation>
-<translation id="210034539800365161"><ph name="PRODUCT_OS_NAME" />의 최소 허용 버전 요건을 구성합니다.
-
-      이 정책이 비어 있지 않은 목록으로 설정된 경우:
-      기기의 현재 버전보다 높은 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />을 포함하는 항목이 없으면 제한사항이 적용되지 않으며 기존의 제한사항도 취소됩니다.
-      현재 버전보다 높은 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />이 하나 이상의 항목에 포함되어 있으면 버전이 가장 크고 현재 버전과 가장 가까우며 가장 강력한 항목이 선택됩니다.
-      충돌이 발생하는 경우 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 또는 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />가 낮은 항목이 우선권을 가지며 해당 항목을 사용하여 정책이 적용됩니다.
-
-      현재 버전이 사용자 세션 중에 지원 중단되고 현재 네트워크에서 자동 업데이트를 제한하면 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 이내로 기기를 업데이트하라는 알림이 화면에 표시됩니다.
-      현재 네트워크에서 자동 업데이트를 허용할 경우 알림이 표시되지 않으며 기기는 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 이내에 업데이트되어야 합니다.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" />는 정책이 적용되는 시점부터 시작합니다.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 만료 시까지 기기가 업데이트되지 않으면 사용자가 세션에서 로그아웃됩니다.
-      로그인 시 <ph name="WARNING_PERIOD_PROPERTY_NAME" />가 만료되어 현재 버전이 지원 중단된 것으로 확인되면 사용자는 기기를 업데이트해야 로그인할 수 있습니다.
-
-      사용자 세션 중에 현재 버전이 지원 중단되고 기기가 자동 업데이트 만료에 도달하면 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> 이내로 기기를 반납하라는 알림이 화면에 표시됩니다.
-      로그인 시 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />가 만료되고 기기가 자동 업데이트 만료에 도달한 것으로 확인되면 기기에 어떤 사용자도 로그인할 수 없게 됩니다.
-
-      정책이 설정되지 않거나 비어 있으면 제한사항이 적용되지 않으며 기존의 제한사항도 취소됩니다. 또한 사용자는 <ph name="PRODUCT_OS_NAME" /> 버전과 관계없이 로그인할 수 있습니다.
-
-      이때 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" />은 '13305.0.0'과 같은 정확한 버전 또는 '13305'와 같은 버전 접두어 중 하나를 의미합니다.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 및 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />는 일 단위로 지정되는 선택적인 값입니다. 기본값은 0일이며, 이는 경고 기간이 없다는 의미입니다.</translation>
 <translation id="2104418465060359056">확장 프로그램 및 플러그인 정보 보고</translation>
 <translation id="2106627642643925514">기본 PIN 인쇄 모드를 재정의합니다. 이 모드를 사용할 수 없는 경우 이 정책은 무시됩니다.</translation>
 <translation id="2107601598727098402">
@@ -4667,13 +4647,6 @@
 
       Google 검색 URL은 <ph name="GOOGLE_SEARCH_URL" />으로 지정할 수 있습니다.</translation>
 <translation id="7895553628261067384">원격 액세스</translation>
-<translation id="7898879331506985900">이 기업 정책은 단기적인 적응을 위해 마련되었으며 M86에서는 삭제될 예정입니다.
-
-      Chrome의 기본 리퍼러 정책은 M80 공개 버전을 대상으로 하는 점진적 출시를 통해 현재 값인 no-referrer-when-downgrade에서 더욱 안전한 strict-origin-when-cross-origin으로 강화되는 중입니다.
-
-      출시 전에는 이 기업 정책이 적용되지 않습니다. 출시 후 이 정책을 사용 설정하면 Chrome의 기본 리퍼러 정책이 M80 이전 값인 no-referrer-when-downgrade로 설정됩니다.
-
-      이 기업 정책은 기본적으로 사용 중지되어 있습니다.</translation>
 <translation id="7902040092815978832">비밀번호 입력 시 숫자 키보드 표시</translation>
 <translation id="7912255076272890813">허용된 앱/확장 프로그램 설정</translation>
 <translation id="7922358664346625612">Chrome에서 마지막 탭을 열어둠</translation>
@@ -5397,9 +5370,9 @@
       이 정책은 Chrome 84 이후 삭제됩니다.</translation>
 <translation id="8937562488500723400">KDC 정책에 의한 승인을 인정할지 지정하여 <ph name="KERBEROS" /> 티켓을 위임할지 결정합니다.
 
-          이 정책을 True로 설정하면 HTTP 인증에서 KDC 정책에 의한 승인을 인정합니다. 즉, Chrome은 KDC가 서비스 티켓에 <ph name="OK_AS_DELEGATE" />를 설정하는 경우에만 사용자 인증 정보를 위임합니다. 자세한 내용은 https://tools.ietf.org/html/rfc5896.html을 참고하세요. 서비스는 'AuthNegotiateDelegateAllowlist' 정책과도 일치해야 합니다.
+          이 정책을 '참'으로 설정하면 HTTP 인증에서 KDC 정책에 의한 승인을 인정합니다. 즉, Chrome은 KDC가 서비스 티켓에 <ph name="OK_AS_DELEGATE" />를 설정하는 경우에만 사용자 인증 정보를 위임합니다. 자세한 내용은 https://tools.ietf.org/html/rfc5896.html을 참고하세요. 서비스는 'AuthNegotiateDelegateAllowlist' 정책과도 일치해야 합니다.
 
-          정책을 설정하지 않거나 False로 설정하면 지원되는 플랫폼에서 KDC 정책이 무시되고 'AuthNegotiateDelegateAllowlist' 정책만 인정됩니다.
+          정책을 설정하지 않거나 '거짓'으로 설정하면 지원되는 플랫폼에서 KDC 정책이 무시되고 'AuthNegotiateDelegateAllowlist' 정책만 인정됩니다.
 
           Windows에서는 KDC 정책이 항상 인정됩니다.</translation>
 <translation id="8938932171964587769">M69에서 지원이 중단되었습니다. 대신
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 9f48e47a..00383a77 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -165,8 +165,8 @@
       Als er geen beleid is ingesteld of het beleid is ingesteld op 'False', wordt Fast Transition niet gebruikt.
       Als het beleid is ingesteld op 'True', wordt Fast Transition gebruikt wanneer dit wordt ondersteund door het draadloze toegangspunt.</translation>
 <translation id="1240722269871366886">Met dit beleid kan <ph name="PRODUCT_OS_NAME" /> emoji's voorstellen als gebruikers tekst typen met hun virtuele of fysieke toetsenborden.
-      Als dit beleid is ingesteld op True, is de functie ingeschakeld en kunnen gebruikers het wijzigen.
-      Dit beleid is standaard ingesteld op False. Er worden geen suggesties voor emoji's weergegeven en gebruikers kunnen dit niet overschrijven.</translation>
+      Als dit beleid is ingesteld op 'waar', is de functie ingeschakeld en kunnen gebruikers het wijzigen.
+      Dit beleid is standaard ingesteld op 'onwaar'. Er worden geen suggesties voor emoji's weergegeven en gebruikers kunnen dit niet overschrijven.</translation>
 <translation id="1243570869342663665">SafeSites-filters voor content voor volwassenen beheren.</translation>
 <translation id="1257550411839719984">Standaardmap voor downloads instellen</translation>
 <translation id="1265053460044691532">De offline inlogtijd beperken voor een gebruiker die is geverifieerd via SAML</translation>
@@ -207,7 +207,7 @@
 <translation id="138847842893090358">OS-updatestatus rapporten</translation>
 <translation id="1390901586107713894">Hiermee kun je aangeven welke extensies gebruikers NIET kunnen installeren. Extensies die al zijn geïnstalleerd, worden uitgeschakeld als ze op de blokkeringslijst staan. De gebruiker kan ze niet weer inschakelen. Als een extensie die is uitgeschakeld op basis van de blokkeringslijst, van die lijst wordt verwijderd, wordt de extensie automatisch weer ingeschakeld.
 
-          De waarde '*' op de blokkeringslijst betekent dat alle extensies worden geblokkeerd, tenzij ze expliciet worden vermeld op de toelatingslijst.
+          De waarde * op de blokkeringslijst betekent dat alle extensies worden geblokkeerd, tenzij ze expliciet worden vermeld op de toelatingslijst.
 
           Als je dit beleid niet instelt, kan de gebruiker elke extensie installeren in <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1393485621820363363">Zakelijke apparaatprinters ingeschakeld</translation>
@@ -648,26 +648,6 @@
 <translation id="2082205219176343977">Configureer de minimaal toegestane Chrome-versie voor het apparaat.</translation>
 <translation id="209586405398070749">Stabiel kanaal</translation>
 <translation id="2098658257603918882">Rapportage van gebruiks- en crashgegevens inschakelen</translation>
-<translation id="210034539800365161">Hiermee configureer je de vereiste voor de minimaal toegestane versie van <ph name="PRODUCT_OS_NAME" />.
-
-      Als dit beleid is ingesteld op een niet-lege lijst:
-      Als geen van de items een <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> hoger dan de huidige versie van het apparaat heeft, worden er geen beperkingen toegepast en worden bestaande beperkingen ingetrokken.
-      Als ten minste één van de items een <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> hoger dan de huidige versie van het apparaat heeft, wordt het sterkste item gekozen waarvan de versie het dichtst in de buurt van de huidige versie komt.
-      In geval van een conflict wordt de voorkeur gegeven aan het item met de kortere <ph name="WARNING_PERIOD_PROPERTY_NAME" /> of <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> en wordt het beleid toegepast met dat item.
-
-      Als de huidige versie verouderd raakt tijdens een gebruikerssessie en automatische updates door het huidige netwerk worden beperkt, wordt er een melding op het scherm weergegeven dat de gebruiker het apparaat moet updaten binnen de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> in de melding.
-      Er worden geen meldingen weergegeven als automatische updates door het huidige netwerk zijn toegestaan en het apparaat moet worden geüpdatet binnen de <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      De <ph name="WARNING_PERIOD_PROPERTY_NAME" /> start vanaf het moment dat het beleid wordt toegepast.
-      Als het apparaat niet wordt geüpdatet voordat de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> is verlopen, wordt de gebruiker uitgelogd van de sessie.
-      Als blijkt dat de huidige versie verouderd is op het moment dat de gebruiker inlogt terwijl de <ph name="WARNING_PERIOD_PROPERTY_NAME" /> is verlopen, moet de gebruiker het apparaat updaten voordat hij of zij inlogt.
-
-      Als de huidige versie verouderd raakt tijdens een gebruikerssessie en het apparaat de vervaldatum voor automatische updates heeft bereikt, wordt er een melding op het scherm weergegeven dat de gebruiker het apparaat moet retourneren binnen de <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Als het apparaat de vervaldatum voor het controleren op automatische updates heeft bereikt op het moment dat de gebruiker inlogt en de <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> is verlopen, wordt het apparaat geblokkeerd zodat gebruikers niet kunnen inloggen.
-
-      Als dit beleid niet is ingesteld of is ingesteld op een lege waarde, worden er geen beperkingen toegepast, worden bestaande beperkingen ingetrokken en kan de gebruiker inloggen ongeacht de versie van <ph name="PRODUCT_OS_NAME" />.
-
-      <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> kan in dit geval een exacte versie zijn (zoals '13305.0.0') of een versievoorvoegsel (zoals '13305').
-      De <ph name="WARNING_PERIOD_PROPERTY_NAME" /> en <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> zijn optionele waarden die worden gespecificeerd als een aantal dagen. De standaardwaarde is 0 dagen, wat inhoudt dat er geen waarschuwingsperiode is.</translation>
 <translation id="2104418465060359056">Gegevens over extensies en plug-ins rapporteren</translation>
 <translation id="2106627642643925514">Hiermee wordt de standaardmodus voor afdrukken met pincode overschreven. Als de modus niet beschikbaar is, wordt dit beleid genegeerd.</translation>
 <translation id="2107601598727098402">
@@ -4623,13 +4603,6 @@
 
       Je kunt de zoek-URL van Google opgeven als: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Externe toegang</translation>
-<translation id="7898879331506985900">Dit bedrijfsbeleid is voor kortdurende aanpassing en wordt verwijderd in M86.
-
-      Het standaardbeleid van Chrome voor verwijzende URL's wordt versterkt van de huidige waarde 'no-referrer-when-downgrade' naar de beter beveiligde waarde 'strict-origin-when-cross-origin' via een geleidelijke uitrol die de stabiele versie M80 target.
-
-      Vóór de uitrol heeft dit bedrijfsbeleid geen effect. Als dit bedrijfsbeleid na de uitrol is ingeschakeld, wordt het standaardbeleid van Chrome voor verwijzende URL's ingesteld op de waarde 'no-referrer-when-downgrade' die vóór M80 van kracht was.
-
-      Dit bedrijfsbeleid is standaard uitgeschakeld.</translation>
 <translation id="7902040092815978832">Numeriek toetsenbord weergeven voor wachtwoord</translation>
 <translation id="7912255076272890813">Toegestane typen apps/extensies configureren</translation>
 <translation id="7922358664346625612">Laatste tabblad open houden in Chrome.</translation>
@@ -5330,9 +5303,9 @@
       Dit beleid wordt na Chrome 84 verwijderd.</translation>
 <translation id="8937562488500723400">Regelt of goedkeuring op basis van KDC-beleid wordt gerespecteerd om te bepalen of <ph name="KERBEROS" />-tickets worden gedelegeerd.
 
-          Als dit beleid is ingesteld op True, respecteert de HTTP-verificatie de goedkeuring op basis van KDC-beleid (dat wil zeggen, Chrome delegeert inloggegevens alleen als het KDC-beleid <ph name="OK_AS_DELEGATE" /> instelt op een serviceticket). Zie https://tools.ietf.org/html/rfc5896.html voor meer informatie. De service moet ook overeenkomen met het beleid 'AuthNegotiateDelegateAllowlist'.
+          Als dit beleid is ingesteld op 'waar', respecteert de HTTP-verificatie de goedkeuring op basis van KDC-beleid (dat wil zeggen, Chrome delegeert inloggegevens alleen als het KDC-beleid <ph name="OK_AS_DELEGATE" /> instelt op een serviceticket). Zie https://tools.ietf.org/html/rfc5896.html voor meer informatie. De service moet ook overeenkomen met het beleid 'AuthNegotiateDelegateAllowlist'.
 
-          Als dit beleid niet is ingesteld of is ingesteld op False, wordt het KDC-beleid genegeerd op ondersteunde platforms en wordt alleen het beleid 'AuthNegotiateDelegateAllowlist' gerespecteerd.
+          Als dit beleid niet is ingesteld of is ingesteld op 'onwaar', wordt het KDC-beleid genegeerd op ondersteunde platforms en wordt alleen het beleid 'AuthNegotiateDelegateAllowlist' gerespecteerd.
 
           Op Windows wordt het KDC-beleid altijd gerespecteerd.</translation>
 <translation id="8938932171964587769">Beëindigd in M69. Gebruik in plaats hiervan
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index ca416483..b91fdfac 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -647,26 +647,6 @@
 <translation id="2082205219176343977">Configurar a versão mínima permitida do Chrome para o dispositivo.</translation>
 <translation id="209586405398070749">Canal Estável</translation>
 <translation id="2098658257603918882">Ativar relato de uso e dados relacionados a falhas</translation>
-<translation id="210034539800365161">Configura o requisito da versão mínima permitida do <ph name="PRODUCT_OS_NAME" />.
-
-      Quando esta política for definida como uma lista não vazia:
-      Se nenhuma das entradas tiver uma <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> mais recente do que a versão atual no dispositivo, nenhuma restrição será aplicada e as restrições já existentes serão revogadas.
-      Se pelo menos uma das entradas tiver uma <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> mais recente do que a versão atual, a entrada escolhida será a com versão mais próxima da atual.
-      Em caso de conflito, será dada preferência à versão com menor <ph name="WARNING_PERIOD_PROPERTY_NAME" /> ou <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> e a política será aplicada usando essa entrada.
-
-      Se a versão atual ficar obsoleta durante a sessão do usuário e a rede atual limitar as atualizações automáticas, uma notificação será exibida na tela para atualizar o dispositivo dentro do <ph name="WARNING_PERIOD_PROPERTY_NAME" /> mostrado na notificação.
-      Nenhuma notificação será exibida se a rede atual permitir atualizações automáticas e o dispositivo precisar ser atualizado dentro do <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      O <ph name="WARNING_PERIOD_PROPERTY_NAME" /> começará a partir do momento em que a política for aplicada.
-      Se o dispositivo não for atualizado até a expiração do <ph name="WARNING_PERIOD_PROPERTY_NAME" />, o usuário será desconectado da sessão.
-      Se a versão atual estiver obsoleta no momento do login com o <ph name="WARNING_PERIOD_PROPERTY_NAME" /> expirado, o usuário precisará atualizar o dispositivo antes de fazer login.
-
-      Se a versão atual ficar obsoleta durante a sessão do usuário e o dispositivo tiver atingido a data de expiração da atualização automática, uma notificação será exibida na tela para que o dispositivo seja devolvido dentro do <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Se o dispositivo tiver atingido a data de expiração da atualização automática no momento do login com o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> expirado, o login de todos os usuários será bloqueado no dispositivo.
-
-      Se esta política não for definida ou for configurada como vazia, nenhuma restrição será aplicada, as já existentes serão revogadas e o usuário poderá fazer login independentemente da versão do <ph name="PRODUCT_OS_NAME" />.
-
-      Aqui, <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> pode ser uma versão exata, como "13305.0.0", ou um prefixo de versão, como "13305".
-      O <ph name="WARNING_PERIOD_PROPERTY_NAME" /> e o <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> são valores opcionais especificados em número de dias. O valor padrão para eles é 0 dia, o que significa que não há um período de aviso.</translation>
 <translation id="2104418465060359056">Fornecer informações sobre extensões e plug-ins</translation>
 <translation id="2106627642643925514">Modifica o modo padrão de impressão com PIN. Se o modo não estiver disponível, a política será ignorada.</translation>
 <translation id="2107601598727098402">
@@ -4589,13 +4569,6 @@
 
       É possível especificar o URL de pesquisa do Google como: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Acesso remoto</translation>
-<translation id="7898879331506985900">Esta política corporativa é para adaptação a curto prazo e será removida na versão M86.
-
-      A política do referenciador padrão do Chrome está sendo fortalecida do valor atual de no-referrer-when-downgrade para a mais segura, strict-origin-when-cross-origin, por meio do lançamento gradual voltado à versão M80 estável.
-
-      Esta política comercial não terá efeito antes do lançamento. Após o lançamento, quando esta política for ativada, a política do referenciador padrão do Chrome será definida com o valor pré-M80 de no-referrer-when-downgrade.
-
-      Esta política comercial fica desativada por padrão.</translation>
 <translation id="7902040092815978832">Mostrar teclado numérico para senha</translation>
 <translation id="7912255076272890813">Configurar tipos permitidos de aplicativo/extensão</translation>
 <translation id="7922358664346625612">Mantém a última guia aberta no Chrome.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 2166407..f4ab771f 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -647,26 +647,6 @@
 <translation id="2082205219176343977">Настройка версии Chrome, минимально допустимой для устройства</translation>
 <translation id="209586405398070749">Стабильный канал</translation>
 <translation id="2098658257603918882">Включить в отчеты данные об использовании и сбоях</translation>
-<translation id="210034539800365161">Это правило позволяет указать минимально допустимую версию <ph name="PRODUCT_OS_NAME" />.
-
-      Если в правиле задан непустой список:
-      При условии, что ни в одной из записей значение <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> не превышает значение текущей версии ОС на устройстве, ограничения не применяются (существующие ограничения снимаются).
-      При условии, что хотя бы в одной записи значение <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> превышает значение текущей версии ОС, выбирается запись с более новой версией, номер которой максимально близок к номеру текущей.
-      В случае конфликта приоритет отдается записи с меньшим значением параметра <ph name="WARNING_PERIOD_PROPERTY_NAME" /> или <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, и тогда правило применяется на основании этой записи.
-
-      Если текущая версия устаревает во время сеанса, а автоматическое обновление блокируется настройками сети, то на экране появляется уведомление о необходимости обновить устройство в срок, который определяется параметром <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      Если автоматическое обновление разрешено в сети и устройство требуется обновить в срок, определенный параметром <ph name="WARNING_PERIOD_PROPERTY_NAME" />, то никакие уведомления не показываются.
-      Отсчет срока <ph name="WARNING_PERIOD_PROPERTY_NAME" /> начинается с момента применения правила.
-      Если срок <ph name="WARNING_PERIOD_PROPERTY_NAME" /> истек, а устройство не обновлено, сеанс пользователя принудительно завершается.
-      Если текущая версия оказалась устаревшей во время входа, а срок <ph name="WARNING_PERIOD_PROPERTY_NAME" /> истек, пользователь не сможет войти в систему, не обновив устройство.
-
-      Если текущая версия устаревает во время сеанса, а автоматическое обновление больше не поддерживается, на экране появляется уведомление о необходимости вернуть устройство в срок, который определяется параметром <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Если автоматическое обновление больше не поддерживается и истек срок <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, ни один пользователь не сможет войти в систему на устройстве.
-
-      Если правило не настроено или список для него пуст, ограничения не применяются, существующие ограничения снимаются, а пользователи могут выполнять вход независимо от версии <ph name="PRODUCT_OS_NAME" />.
-
-      В качестве значения параметра <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> можно указывать точную версию, например 13305.0.0, или первое число в ее номере, например 13305.
-      Параметры <ph name="WARNING_PERIOD_PROPERTY_NAME" /> и <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, которые выражаются в количестве дней, задавать не обязательно. По умолчанию для них установлено значение "0", то есть периода действия предупреждения нет.</translation>
 <translation id="2104418465060359056">Передавать информацию о расширениях и плагинах</translation>
 <translation id="2106627642643925514">Переопределяет режим печати с вводом PIN-кода по умолчанию. Если этот режим недоступен, правило будет игнорироваться.</translation>
 <translation id="2107601598727098402">
@@ -2392,13 +2372,13 @@
       Если правило включено принудительно, страницы можно просматривать ТОЛЬКО в режиме инкогнито. Принудительное применение не работает в приложениях Android для устройств Chrome.</translation>
 <translation id="4600786265870346112">Включение большого курсора</translation>
 <translation id="4604931264910482931">Создание черного списка для хостов обмена сообщениями с оригинальными приложениями</translation>
-<translation id="4607416370554533118">Это правило позволяет создать список шаблонов URL с целью указать сайты, для которых Chrome сможет автоматически выбирать сертификат клиента. Значение представляет собой массив словарей JSON, преобразованных в строки. Каждый словарь должен иметь форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, где <ph name="URL_PATTERN_PLACEHOLDER" /> – это шаблон настроек контента. <ph name="FILTER_PLACEHOLDER" /> определяет набор сертификатов клиента, из которых браузер будет автоматически выбирать нужный. Независимо от настроек фильтра, выбираются только сертификаты, соответствующие запросу сервера.
+<translation id="4607416370554533118">Это правило позволяет создать список шаблонов URL с целью указать сайты, для которых Chrome сможет автоматически выбирать сертификат клиента. Значение представляет собой массив словарей JSON, преобразованных в строки. Каждый словарь должен иметь форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, где <ph name="URL_PATTERN_PLACEHOLDER" /> – это шаблон настроек контента. <ph name="FILTER_PLACEHOLDER" /> определяет набор сертификатов клиента, из которых браузер будет автоматически выбирать нужный. Независимо от настроек фильтра выбираются только сертификаты, соответствующие запросу сервера.
 
       Примеры использования фрагмента <ph name="FILTER_PLACEHOLDER" />:
 
       * Если <ph name="FILTER_PLACEHOLDER" /> имеет форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" />, выбираются только сертификаты клиента, выданные сертификатом с общим названием CommonName <ph name="ISSUER_CN_PLACEHOLDER" />.
 
-      * Если <ph name="FILTER_PLACEHOLDER" /> содержит одновременно фрагмент <ph name="ISSUER_STRING_VALUE" /> и <ph name="SUBJECT_STRING_VALUE" />, выбираются только сертификаты клиента, отвечающие обоим условиям.
+      * Если <ph name="FILTER_PLACEHOLDER" /> содержит одновременно фрагменты <ph name="ISSUER_STRING_VALUE" /> и <ph name="SUBJECT_STRING_VALUE" />, выбираются только сертификаты клиента, отвечающие обоим условиям.
 
       * Если <ph name="FILTER_PLACEHOLDER" /> содержит фрагмент <ph name="SUBJECT_STRING_VALUE" /> со значением <ph name="FILTER_STRING_ORGANIZATION" />, может быть выбран только сертификат, в котором хотя бы одно название организации соответствует указанному значению.
 
@@ -4627,13 +4607,6 @@
 
       URL поисковой системы Google можно указать так: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Удаленный доступ</translation>
-<translation id="7898879331506985900">Это корпоративное правило добавляется на небольшой срок. Оно будет удалено в версии M86.
-
-      Сейчас мы улучшаем правило по умолчанию в отношении URL перехода. К выпуску стабильной версии M80 мы будем постепенно внедрять более безопасное значение – strict-origin-when-cross-origin вместо no-referrer-when-downgrade.
-
-      До выпуска стабильной версии M80 это правило действовать не будет. Если включить это правило после выпуска, для правила по умолчанию в отношении URL перехода будет установлено старое значение – no-referrer-when-downgrade.
-
-      По умолчанию это правило отключено.</translation>
 <translation id="7902040092815978832">Показывать цифровую клавиатуру при вводе пароля</translation>
 <translation id="7912255076272890813">Разрешенные типы приложений и расширений</translation>
 <translation id="7922358664346625612">Оставлять открытой последнюю вкладку в Chrome</translation>
@@ -5465,13 +5438,13 @@
       Если правило не настроено, <ph name="PRODUCT_NAME" /> использует объем по умолчанию. В этом случае пользователи могут менять размер кеша с помощью экспериментального параметра --disk-cache-size.</translation>
 <translation id="9057444687284972605">Это правило позволяет создать список шаблонов URL с целью указать сайты, для которых при запросе сертификат клиента будет автоматически выбран на экране входа во фрейме, содержащем механизм аутентификации с использованием SAML. Например, можно задать такие настройки, чтобы поставщику идентификационной информации SAML предоставлялся сертификат, действительный для определенного устройства.
 
-      Значение представляет собой массив словарей JSON, преобразованных в строки. Каждый словарь должен иметь форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, где <ph name="URL_PATTERN_PLACEHOLDER" /> – это шаблон настроек контента. <ph name="FILTER_PLACEHOLDER" /> определяет набор сертификатов клиента, из которых браузер будет автоматически выбирать нужный. Независимо от настроек фильтра, выбираются только сертификаты, соответствующие запросу сервера.
+      Значение представляет собой массив словарей JSON, преобразованных в строки. Каждый словарь должен иметь форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, где <ph name="URL_PATTERN_PLACEHOLDER" /> – это шаблон настроек контента. <ph name="FILTER_PLACEHOLDER" /> определяет набор сертификатов клиента, из которых браузер будет автоматически выбирать нужный. Независимо от настроек фильтра выбираются только сертификаты, соответствующие запросу сервера.
 
       Примеры использования фрагмента <ph name="FILTER_PLACEHOLDER" />:
 
       * Если <ph name="FILTER_PLACEHOLDER" /> имеет форму <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" />, выбираются только сертификаты клиента, выданные сертификатом с общим названием CommonName <ph name="ISSUER_CN_PLACEHOLDER" />.
 
-      * Если <ph name="FILTER_PLACEHOLDER" /> содержит одновременно фрагмент <ph name="ISSUER_STRING_VALUE" /> и <ph name="SUBJECT_STRING_VALUE" />, выбираются только сертификаты клиента, отвечающие обоим условиям.
+      * Если <ph name="FILTER_PLACEHOLDER" /> содержит одновременно фрагменты <ph name="ISSUER_STRING_VALUE" /> и <ph name="SUBJECT_STRING_VALUE" />, выбираются только сертификаты клиента, отвечающие обоим условиям.
 
       * Если <ph name="FILTER_PLACEHOLDER" /> содержит фрагмент <ph name="SUBJECT_STRING_VALUE" /> со значением <ph name="FILTER_STRING_ORGANIZATION" />, может быть выбран только сертификат, в котором хотя бы одно название организации соответствует указанному значению.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 2b7aca23..62ff4d1 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -640,26 +640,6 @@
 <translation id="2082205219176343977">กำหนดค่าเวอร์ชัน Chrome ขั้นต่ำที่อุปกรณ์จะใช้ได้</translation>
 <translation id="209586405398070749">เวอร์ชันเสถียร</translation>
 <translation id="2098658257603918882">เปิดใช้งานการรายงานการใช้และข้อมูลเกี่ยวกับการขัดข้อง</translation>
-<translation id="210034539800365161">กำหนดค่าข้อกำหนดของ <ph name="PRODUCT_OS_NAME" /> เวอร์ชันต่ำสุดที่อนุญาต
-
-      เมื่อตั้งค่านโยบายนี้เป็นรายการที่ไม่ว่างเปล่า
-      หากไม่มีรายการใดมี <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> สูงกว่าเวอร์ชันปัจจุบันของอุปกรณ์ ก็จะไม่มีการใช้ข้อจำกัดและข้อจำกัดที่มีอยู่แล้วจะถูกเพิกถอน
-      หากมีอย่างน้อย 1 รายการที่มี <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> สูงกว่าเวอร์ชันปัจจุบัน จะมีการเลือกรายการที่เหมาะสมที่สุดซึ่งมีเวอร์ชันสูงกว่าและใกล้เคียงกับเวอร์ชันปัจจุบันมากที่สุด
-      ในกรณีที่มีความขัดแย้ง ระบบจะเลือกรายการที่มี <ph name="WARNING_PERIOD_PROPERTY_NAME" /> หรือ <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> ต่ำกว่าและนำนโยบายนี้ไปใช้โดยใช้รายการนั้น
-
-      หากเวอร์ชันปัจจุบันล้าสมัยในระหว่างที่ผู้ใช้กำลังมีการใช้งานและเครือข่ายปัจจุบันจำกัดการอัปเดตอัตโนมัติ ระบบจะแสดงการแจ้งเตือนบนหน้าจอให้อัปเดตอุปกรณ์ภายใน <ph name="WARNING_PERIOD_PROPERTY_NAME" /> ซึ่งระบุในการแจ้งเตือนนั้น
-      จะไม่มีการแจ้งเตือนหากเครือข่ายปัจจุบันอนุญาตการอัปเดตอัตโนมัติและต้องมีการอัปเดตอุปกรณ์ภายใน <ph name="WARNING_PERIOD_PROPERTY_NAME" />
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> จะเริ่มนับจากเวลาที่นำนโยบายไปใช้
-      หากไม่มีการอัปเดตอุปกรณ์จนกระทั่ง <ph name="WARNING_PERIOD_PROPERTY_NAME" /> หมดเวลา ผู้ใช้จะออกจากระบบเซสชันที่ใช้งานอยู่โดยอัตโนมัติ
-      หากพบว่าเวอร์ชันปัจจุบันล้าสมัยในขณะที่มีการเข้าสู่ระบบและ <ph name="WARNING_PERIOD_PROPERTY_NAME" /> หมดเวลาแล้ว ระบบจะแจ้งให้ผู้ใช้อัปเดตอุปกรณ์ก่อนลงชื่อเข้าใช้
-
-      หากเวอร์ชันปัจจุบันล้าสมัยในระหว่างที่ผู้ใช้กำลังมีการใช้งานและการอัปเดตอัตโนมัติของอุปกรณ์ถึงวันหมดอายุแล้ว ระบบจะแสดงการแจ้งเตือนบนหน้าจอให้ส่งคืนอุปกรณ์ภายใน <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />
-      หากพบว่าการอัปเดตอัตโนมัติของอุปกรณ์ถึงวันหมดอายุแล้ว ณ เวลาที่ลงชื่อเข้าใช้โดยที่ <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> หมดเวลาแล้ว ระบบจะบล็อกอุปกรณ์นั้นไม่ให้ผู้ใช้คนใดก็ตามลงชื่อเข้าใช้
-
-      หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็นว่างเปล่า จะไม่มีการใช้ข้อจำกัด ข้อจำกัดที่มีอยู่แล้วจะถูกเพิกถอน และผู้ใช้จะลงชื่อเข้าใช้ได้ไม่ว่า <ph name="PRODUCT_OS_NAME" /> จะเป็นเวอร์ชันใดก็ตาม
-
-      ในที่นี้ ค่า <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> อาจหมายถึงเวอร์ชันที่เจาะจง เช่น "13305.0.0" หรือตัวเลขนำหน้าเวอร์ชัน เช่น "13305"
-      ค่า <ph name="WARNING_PERIOD_PROPERTY_NAME" /> และ <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> เป็นค่าที่ไม่บังคับและกำหนดให้ระบุเป็นจำนวนวัน ค่าเริ่มต้นคือ 0 วันซึ่งหมายความว่าไม่มีช่วงเวลาเตือน</translation>
 <translation id="2104418465060359056">รายงานข้อมูลเกี่ยวกับส่วนขยายและปลั๊กอิน</translation>
 <translation id="2106627642643925514">ลบล้างโหมดการพิมพ์ด้วย PIN ที่เป็นค่าเริ่มต้น หากโหมดนี้ไม่พร้อมใช้งาน ระบบจะไม่สนใจนโยบายนี้</translation>
 <translation id="2107601598727098402">
@@ -4589,13 +4569,6 @@
 
       คุณระบุ URL การค้นหาของ Google เป็น <ph name="GOOGLE_SEARCH_URL" /> ได้</translation>
 <translation id="7895553628261067384">การเข้าถึงระยะไกล</translation>
-<translation id="7898879331506985900">นโยบายระดับองค์กรนี้มีไว้สำหรับการใช้งานในระยะสั้น และเราจะนำนโยบายนี้ออกในรุ่น M86
-
-      นโยบาย URL ที่มาตามค่าเริ่มต้นของ Chrome เข้มงวดขึ้น จากค่า "ไม่มี URL ที่มาเมื่อดาวน์เกรด" ในปัจจุบันเป็นค่า "ต้นทางที่เข้มงวดเมื่อข้ามต้นทาง" ที่ปลอดภัยยิ่งขึ้นผ่านการทยอยเปิดตัวที่มีเป้าหมายเป็นรุ่น M80 เวอร์ชันเสถียร
-
-      ทั้งนี้ นโยบายระดับองค์กรนี้จะไม่มีผลก่อนการเปิดตัวดังกล่าว หลังจากการเปิดตัว เมื่อเปิดใช้นโยบายระดับองค์กรนี้ นโยบาย URL ที่มาตามค่าเริ่มต้นของ Chrome จะตั้งค่าเป็น "ไม่มี URL ที่มาเมื่อดาวน์เกรด" ซึ่งเป็นค่าก่อนรุ่น M80
-
-      นโยบายระดับองค์กรนี้จะปิดใช้โดยค่าเริ่มต้น</translation>
 <translation id="7902040092815978832">แสดงแป้นพิมพ์ตัวเลขสำหรับรหัสผ่าน</translation>
 <translation id="7912255076272890813">กำหนดค่าประเภทแอปพลิเคชัน/ส่วนขยายที่อนุญาต</translation>
 <translation id="7922358664346625612">เปิดแท็บสุดท้ายไว้ใน Chrome</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index acdae7e..12f85fc 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -638,26 +638,6 @@
 <translation id="2082205219176343977">Cihaz için izin verilen minimum Chrome sürümünü yapılandır.</translation>
 <translation id="209586405398070749">Mevcut ürün kanalı</translation>
 <translation id="2098658257603918882">Kullanım ve kilitlenme ile ilgili verilerin raporlanmasını etkinleştir</translation>
-<translation id="210034539800365161">İzin verilen minimum <ph name="PRODUCT_OS_NAME" /> sürümü gereksinimini yapılandırır.
-
-      Bu politika boş olmayan bir listeye ayarlandığında:
-      Girişlerin hiçbirinin <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> sürümü cihazın mevcut sürümünden yüksek değilse herhangi bir kısıtlama uygulanmaz ve mevcut kısıtlamalar iptal edilir.
-      Girişlerden en az birinin <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> sürümü cihazın mevcut sürümünden yüksekse sürümü en yüksek ve mevcut sürüme en yakın olan en güçlü giriş seçilir.
-      İhtilaf olması durumunda, daha düşük <ph name="WARNING_PERIOD_PROPERTY_NAME" /> veya <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> sürümlü giriş tercih edilir ve politika, bu giriş kullanılarak uygulanır.
-
-      Kullanıcı oturumu esnasında mevcut sürüm geçersiz hale gelirse ve mevcut ağ otomatik güncellemelere izin vermiyorsa cihazın belirtilen <ph name="WARNING_PERIOD_PROPERTY_NAME" /> içinde güncellenmesi için bir ekran bildirimi gösterilir.
-      Mevcut ağ otomatik güncellemelere izin veriyorsa herhangi bir bildirim gösterilmez ve cihazın <ph name="WARNING_PERIOD_PROPERTY_NAME" /> içinde güncellenmesi gerekir.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> politika uygulandığı zaman başlar.
-      Cihaz <ph name="WARNING_PERIOD_PROPERTY_NAME" /> sona erene kadar güncellenmezse kullanıcının oturumu kapatılır.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> sona erdikten sonra giriş yapıldığında mevcut sürüm eskiyse kullanıcının tekrar oturum açmadan önce güncelleme yapması gerekir.
-
-      Kullanıcı oturumu esnasında mevcut sürüm geçersiz hale gelirse ve cihaz otomatik güncelleme süresinin sonuna ulaştıysa cihazın <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> içinde geri verilmesi için bir ekran bildirimi gösterilir.
-      <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> sona erdikten sonra giriş yapıldığında cihaz otomatik güncelleme süresinin sonuna ulaştıysa cihazda herhangi bir kullanıcının oturum açması engellenir.
-
-      Bu politika ayarlanmaz veya boş olarak ayarlanırsa hiçbir kısıtlama uygulanmaz, mevcut kısıtlamalar iptal edilir ve kullanıcı, <ph name="PRODUCT_OS_NAME" /> sürümüne bakılmaksızın oturum açabilir.
-
-      Burada <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> ile kastedilen, "13305.0.0" gibi bir tam sürüm veya "13305" gibi bir sürüm öneki olabilir.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> ve <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, gün sayısı şeklinde belirtilen isteğe bağlı değerlerdir. Bunlar için varsayılan değer 0 gündür ve uyarı süresi olmadığı anlamına gelir.</translation>
 <translation id="2104418465060359056">Uzantı ve Eklenti bilgilerini bildirme</translation>
 <translation id="2106627642643925514">Varsayılan PIN ile yazdırma modunu geçersiz kılar. Mod kullanılamıyorsa bu politika yoksayılır.</translation>
 <translation id="2107601598727098402">
@@ -4623,13 +4603,6 @@
 
       Google'ın arama URL'sini şu şekilde belirtebilirsiniz: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Uzaktan erişim</translation>
-<translation id="7898879331506985900">Bu kurumsal politika, kısa süreli uyum süreci için geçerli olup M86 sürümünde kaldırılacaktır.
-
-      Chrome'un varsayılan yönlendirme politikasının şu anda geçerli olan "no-referrer-when-downgrade" değeri güçlendirilerek daha güvenli olan "strict-origin-when-cross-origin" değerine geçirilmektedir. Burada kademeli olarak kullanıma sunma söz konusu olup M80 kararlı sürümü hedeflenmektedir.
-
-      Kullanıma sunma işleminden önce bu kurumsal politikanın hiçbir etkisi olmayacaktır. Kullanıma sunulduktan sonra, bu kurumsal politika etkinleştirildiğinde Chrome'un varsayılan yönlendirme politikası, M80 sürümünden önceki "no-referrer-when-downgrade" değerine ayarlanacaktır.
-
-      Bu kurumsal politika varsayılan olarak devre dışıdır.</translation>
 <translation id="7902040092815978832">Şifre için sayısal klavyeyi gösterir</translation>
 <translation id="7912255076272890813">İzin verilen uygulama/uzantı türlerini yapılandır</translation>
 <translation id="7922358664346625612">Chrome'da son sekmeyi açık tut.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 46e165b..d17c4c5 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -667,26 +667,6 @@
 <translation id="2082205219176343977">Налаштуйте мінімальну дозволену версію Chrome для пристрою.</translation>
 <translation id="209586405398070749">Стабільна версія</translation>
 <translation id="2098658257603918882">Увімкнути звіти про використання та дані, пов’язані з аварійним завершенням роботи</translation>
-<translation id="210034539800365161">Указує вимоги до мінімальних дозволених версій <ph name="PRODUCT_OS_NAME" />.
-
-      Якщо для цього правила вказано непорожній список, виконуються вказані нижче умови.
-      Якщо немає записів, для яких значення <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> більше за поточну версію пристрою, нові обмеження не застосовуються, а вже наявні скасовуються.
-      Якщо принаймні для одного запису значення <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> більше за поточну версію, вибирається запис, версія якого найближча до поточної.
-      У разі конфлікту перевага надається запису з меншим значенням <ph name="WARNING_PERIOD_PROPERTY_NAME" /> або <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />, і правило застосовується з використанням цього запису.
-
-      Якщо поточна версія стає застарілою під час сеансу користувача, а поточна мережа обмежує автоматичні оновлення, на екрані з'являється сповіщення із запитом оновити пристрій протягом зазначеного періоду (<ph name="WARNING_PERIOD_PROPERTY_NAME" />).
-      Сповіщення не з'являються, якщо поточна мережа дозволяє автоматичні оновлення, а пристрій потрібно оновити протягом зазначеного періоду (<ph name="WARNING_PERIOD_PROPERTY_NAME" />).
-      Період <ph name="WARNING_PERIOD_PROPERTY_NAME" /> починається з моменту застосування правила.
-      Якщо не оновити пристрій до завершення періоду <ph name="WARNING_PERIOD_PROPERTY_NAME" />, користувач вийде із сеансу.
-      Якщо на момент входу поточна версія застаріла, а період <ph name="WARNING_PERIOD_PROPERTY_NAME" /> завершився, користувач повинен оновити пристрій перед входом.
-
-      Якщо поточна версія стає застарілою під час сеансу користувача, а термін дії автоматичних оновлень пристрою завершився, з'явиться сповіщення із запитом повернути пристрій упродовж зазначеного періоду (<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />).
-      Якщо під час входу в систему виявиться, що термін дії автоматичних оновлень пристрою завершився, а час на повернення пристрою (<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />) минув, вхід на пристрої буде заблоковано для всіх користувачів.
-
-      Якщо це правило не налаштовано або для нього не вказано значення, нові обмеження не застосовуються, наявні скасовуються, а користувач може ввійти незалежно від версії <ph name="PRODUCT_OS_NAME" />.
-
-      Тут <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> може означати точний номер (як-от "13305.0.0") або префікс версії (наприклад, "13305").
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> та <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> – необов'язкові значення, указані в днях. Значення за умовчанням – 0 днів, тобто періоду попередження немає.</translation>
 <translation id="2104418465060359056">Повідомляти дані розширень і плагінів</translation>
 <translation id="2106627642643925514">Замінює режим друку з PIN-кодом за умовчанням. Якщо такий режим недоступний, це правило ігнорується.</translation>
 <translation id="2107601598727098402">
@@ -4643,13 +4623,6 @@
 
       Ви можете вказати URL-адресу пошуку в Google як <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Віддалений доступ</translation>
-<translation id="7898879331506985900">Це корпоративне правило призначене для короткочасної адаптації та буде вилучене у версії M86.
-
-      Поточне значення no-referrer-when-downgrade правила напрямку переходу Chrome за умовчанням змінено на надійніше значення strict-origin-when-cross-origin шляхом поступового впровадження стабільної версії M80.
-
-      Це правило не діятиме до випуску. Коли його буде ввімкнено після випуску, для правила напрямку переходу Chrome за умовчанням буде встановлено значення no-referrer-when-downgrade, яке було до версії M80.
-
-      За умовчанням це корпоративне правило вимкнено.</translation>
 <translation id="7902040092815978832">Показати цифрову клавіатуру для пароля</translation>
 <translation id="7912255076272890813">Налаштувати типи дозволених додатків або розширень</translation>
 <translation id="7922358664346625612">Залишити останню вкладку відкритою в Chrome.</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 93e4cbd..c1f806e 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -665,26 +665,6 @@
 <translation id="2082205219176343977">Định cấu hình phiên bản Chrome tối thiểu được phép cho thiết bị.</translation>
 <translation id="209586405398070749">Kênh ổn định</translation>
 <translation id="2098658257603918882">Bật tính năng báo cáo sử dụng và dữ liệu liên quan đến sự cố</translation>
-<translation id="210034539800365161">Định cấu hình yêu cầu phiên bản tối thiểu được phép của <ph name="PRODUCT_OS_NAME" />.
-
-      Khi bạn đặt chính sách này thành danh sách không phải là danh sách trống:
-      Nếu không mục nào có <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> cao hơn phiên bản thiết bị đang dùng, thì sẽ không áp dụng hạn chế và các hạn chế đã có sẽ được thu hồi.
-      Nếu ít nhất một trong các mục có <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> cao hơn phiên bản đang dùng, thì mục có phiên bản cao hơn và sát với phiên bản đang dùng nhất sẽ được chọn.
-      Trong trường hợp xung đột, mục có <ph name="WARNING_PERIOD_PROPERTY_NAME" /> hoặc <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> thấp hơn sẽ được ưu tiên và chính sách này sẽ được áp dụng bằng cách dùng mục đó.
-
-      Nếu phiên bản đang dùng đã lỗi thời trong phiên đăng nhập của người dùng và mạng hiện tại giới hạn số lượt tự động cập nhật, thì màn hình sẽ hiển thị thông báo cập nhật thiết bị trong vòng <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      Màn hình sẽ không hiển thị thông báo nào nếu mạng hiện tại cho phép tự động cập nhật và thiết bị phải được cập nhật trong vòng <ph name="WARNING_PERIOD_PROPERTY_NAME" />.
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> sẽ bắt đầu từ thời điểm áp dụng chính sách này.
-      Nếu cho đến khi kết thúc <ph name="WARNING_PERIOD_PROPERTY_NAME" /> mà vẫn chưa cập nhật thiết bị, thì người dùng sẽ bị đăng xuất khỏi phiên đăng nhập.
-      Nếu phiên bản đang dùng đã lỗi thời tại thời điểm đăng nhập mà <ph name="WARNING_PERIOD_PROPERTY_NAME" /> lại hết hạn, thì người dùng sẽ phải cập nhật thiết bị trước khi đăng nhập.
-
-      Nếu phiên bản đang dùng đã lỗi thời trong phiên đăng nhập của người dùng và thiết bị đã hết hạn tự động cập nhật, thì màn hình sẽ hiển thị thông báo trả lại thiết bị trong vòng <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />.
-      Nếu thiết bị hết hạn tự động cập nhật tại thời điểm đăng nhập mà <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> đã kết thúc, thì mọi phiên đăng nhập của người dùng sẽ bị chặn trên thiết bị đó.
-
-      Nếu bạn không đặt hoặc để trống chính sách này, thì không có hạn chế nào được áp dụng. Các hạn chế đã có sẽ được thu hồi và người dùng có thể đăng nhập bất kể phiên bản của <ph name="PRODUCT_OS_NAME" />.
-
-      Ở đây, <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> có thể là phiên bản chính xác, chẳng hạn như "13305.0.0" hoặc chỉ có tiền tố của phiên bản, chẳng hạn như "13305".
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> và <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> là các giá trị không bắt buộc, được chỉ định theo số ngày. Giá trị mặc định là 0 ngày, tức là không có khoảng thời gian cảnh báo.</translation>
 <translation id="2104418465060359056">Báo cáo thông tin về Tiện ích và Plugin</translation>
 <translation id="2106627642643925514">Ghi đè chế độ in mã PIN mặc định. Nếu không có chế độ này, thì chính sách này sẽ bị bỏ qua.</translation>
 <translation id="2107601598727098402">
@@ -4660,13 +4640,6 @@
 
       Bạn có thể chỉ định URL tìm kiếm của Google là: <ph name="GOOGLE_SEARCH_URL" />.</translation>
 <translation id="7895553628261067384">Truy cập từ xa</translation>
-<translation id="7898879331506985900">Chúng tôi chỉ áp dụng chính sách doanh nghiệp này trong một khoảng thời gian ngắn và sẽ xóa trên phiên bản M86.
-
-      Chúng tôi đang củng cố chính sách liên kết giới thiệu mặc định của Chrome bằng cách chuyển từ giá trị hiện tại no-referrer-when-downgrade sang giá trị strict-origin-when-cross-origin có mức độ bảo mật cao hơn nhằm mục đích phát hành dần bản M80 chính thức.
-
-      Chính sách này sẽ chỉ có hiệu lực sau khi chúng tôi triển khai phiên bản nêu trên. Sau khi triển khai bản M80 và bật chính sách doanh nghiệp này, chúng tôi sẽ đặt chính sách liên kết giới thiệu mặc định của Chrome về giá trị của bản phát hành trước M80 là no-referrer-when-downgrade.
-
-      Chính sách doanh nghiệp này bị tắt theo mặc định.</translation>
 <translation id="7902040092815978832">Hiển thị bàn phím số để nhập mật khẩu</translation>
 <translation id="7912255076272890813">Định cấu hình loại ứng dụng/tiện ích được cho phép</translation>
 <translation id="7922358664346625612">Tiếp tục mở thẻ cuối cùng trong Chrome.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 6d9d6ae..5c40c56 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -150,7 +150,7 @@
 
       如果此政策未设置或设为 false,系统便不会使用快速切换功能。
       如果设为 true,系统会使用快速切换功能(如果无线接入点支持该功能的话)。</translation>
-<translation id="1240722269871366886">通过设置此政策,您可让 <ph name="PRODUCT_OS_NAME" />在用户使用虚拟键盘或物理键盘输入文字时建议表情符号。
+<translation id="1240722269871366886">通过设置此政策,您可让 <ph name="PRODUCT_OS_NAME" />在用户使用虚拟键盘或实体键盘输入文字时建议表情符号。
       如果此政策设为 true,该功能便会处于开启状态,但用户可以自行更改此设置。
       此政策默认设为 false,在这种情况下,系统不会建议任何表情符号,而且用户无法覆盖此设置。</translation>
 <translation id="1243570869342663665">控制 SafeSites 的成人内容滤除机制。</translation>
@@ -622,26 +622,6 @@
 <translation id="2082205219176343977">为设备配置允许使用的最低 Chrome 版本。</translation>
 <translation id="209586405398070749">稳定版</translation>
 <translation id="2098658257603918882">启用关于使用情况和崩溃相关数据的报告</translation>
-<translation id="210034539800365161">此政策旨在配置允许使用的最低 <ph name="PRODUCT_OS_NAME" />版本的要求。
-
-      当此政策设为非空列表时:
-      如果所有条目的“<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />”都不高于设备中的当前版本,系统将不会应用任何限制,而且已有的限制会被撤消。
-      如果有至少 1 个条目的“<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />”高于当前版本,系统会从中选择所对应版本与当前版本最接近的那个条目。
-      如果存在冲突,系统会优先考虑“<ph name="WARNING_PERIOD_PROPERTY_NAME" />”或“<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />”较低的那个条目,并会使用该条目应用此政策。
-
-      如果当前版本在用户使用期间变为过时版本,并且当前网络限制自动更新,系统会在屏幕上显示通知,以要求用户在通知中显示的“<ph name="WARNING_PERIOD_PROPERTY_NAME" />”期限内更新设备。
-      如果当前网络允许自动更新,系统将不会显示任何通知,但用户必须在“<ph name="WARNING_PERIOD_PROPERTY_NAME" />”期限内更新设备。
-      “<ph name="WARNING_PERIOD_PROPERTY_NAME" />”期限的起算点是此政策被应用时。
-      如果设备在“<ph name="WARNING_PERIOD_PROPERTY_NAME" />”期限内一直未更新,系统会强制用户退出登录。
-      如果当前版本在用户登录时已过时,并且“<ph name="WARNING_PERIOD_PROPERTY_NAME" />”期限已过,用户必须更新设备才能登录。
-
-      如果当前版本在用户使用期间变为过时版本,并且设备的自动更新期限已过,系统会在屏幕上显示通知,以要求用户在“<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />”期限内退还设备。
-      如果用户登录时设备的自动更新期限已过,并且“<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />”期限已过,任何用户都无法登录设备。
-
-      如果此政策未设置或设为空列表,系统将不会应用任何限制,已有的限制会被撤消,并且无论使用的是哪个 <ph name="PRODUCT_OS_NAME" />版本,用户都能登录。
-
-      此处的“<ph name="CHROMEOS_VERSION_PROPERTY_NAME" />”既可以是确切版本(如“13305.0.0”),也可以是版本前缀(如“13305”)。
-      “<ph name="WARNING_PERIOD_PROPERTY_NAME" />”和“<ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" />”都是可选值,在使用时应以天数为单位指定。这两个期限的默认值都是 0 天,表示没有警告期。</translation>
 <translation id="2104418465060359056">报告扩展程序和插件信息</translation>
 <translation id="2106627642643925514">替换默认 PIN 码打印模式。如果这种模式不适用,系统会忽略此政策。</translation>
 <translation id="2107601598727098402">
@@ -4558,13 +4538,6 @@
 
       您可按以下格式指定 Google 的搜索网址:<ph name="GOOGLE_SEARCH_URL" />。</translation>
 <translation id="7895553628261067384">远程访问</translation>
-<translation id="7898879331506985900">这项企业政策只是短期的适应性措施,将在 M86 中移除。
-
-      为配合 M80 稳定版的逐步推出,Chrome 的默认引荐来源网址政策正从其当前值 no-referrer-when-downgrade 强化为更安全的 strict-origin-when-cross-origin。
-
-      在 M80 稳定版发布前,这项企业政策将不会产生任何效力。在 M80 稳定版发布后,当这项企业政策处于启用状态时,Chrome 的默认引荐来源网址政策值将被设为 M80 预发布版本中采用的值 no-referrer-when-downgrade。
-
-      默认情况下,这项企业政策会处于停用状态。</translation>
 <translation id="7902040092815978832">在用户输入密码时显示数字键盘</translation>
 <translation id="7912255076272890813">配置允许的应用/扩展程序类型</translation>
 <translation id="7922358664346625612">使 Chrome 中仅剩的那个标签页保持打开状态。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index fe7462d8..da42d90 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -153,7 +153,7 @@
 
       如果不設定這項政策或設為 False,系統不會使用「快速轉換」。
       如果將這項政策設為 True,只要無線存取點支援「快速轉換」,系統便會使用該功能。</translation>
-<translation id="1240722269871366886">這項政策可讓 <ph name="PRODUCT_OS_NAME" />在使用者透過虛擬鍵盤或實體鍵盤輸入文字時提供表情符號建議。
+<translation id="1240722269871366886">這項政策可讓 <ph name="PRODUCT_OS_NAME" />在使用者透過虛擬或實體鍵盤輸入文字時提供表情符號建議。
       如果將這項政策設為 True,系統會啟用這項功能,且使用者將可變更這項設定。
       這項政策的預設值為 False,系統不會提供任何表情符號建議,且使用者無法覆寫這項設定。</translation>
 <translation id="1243570869342663665">控制安全網站成人內容篩選設定。</translation>
@@ -620,26 +620,6 @@
 <translation id="2082205219176343977">設定裝置的最低 Chrome 版本限制。</translation>
 <translation id="209586405398070749">穩定版</translation>
 <translation id="2098658257603918882">啟用使用量和當機相關資料的報告功能</translation>
-<translation id="210034539800365161">設定 <ph name="PRODUCT_OS_NAME" />的最低版本限制。
-
-      將這項政策設為非空白的清單時:
-      如果沒有任何項目的 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> 高於裝置的目前版本,則系統不會套用任何限制,並會撤銷現有限制。
-      如果至少有一個項目的 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> 高於目前版本,系統會選擇其版本最接近目前版本 (且高於目前版本) 的項目。
-      如果發生衝突,系統會優先選擇 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 或 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> 值較小的項目,並使用該項目套用政策。
-
-      如果目前版本在使用者工作階段期間成為過時版本,且目前的網路限制自動更新,系統會在畫面上顯示通知,要求使用者在通知中顯示的 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 期限內更新裝置。
-      如果目前的網路允許自動更新,系統不會顯示通知,且使用者必須在 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 期限內更新裝置。
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 自系統套用政策時起算。
-      如果使用者未在 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 到期前更新裝置,系統會將使用者登出工作階段。
-      如果使用者登入時 <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 已過期,且目前版本已過時,則使用者必須先更新裝置才能登入。
-
-      如果目前版本在使用者工作階段期間成為過時版本,且裝置的自動更新期限已結束,系統會在畫面上顯示通知,要求使用者在 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> 期限內退還裝置。
-      如果使用者登入時 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> 已過期,且裝置的自動更新期限已結束,則系統會禁止任何使用者登入裝置。
-
-      如果不設定這項政策或設為空白,系統不會套用任何限制,並會撤銷現有限制;不論使用哪種 <ph name="PRODUCT_OS_NAME" />版本,使用者皆可登入。
-
-      此處的 <ph name="CHROMEOS_VERSION_PROPERTY_NAME" /> 可以指確切版本 (例如「13305.0.0」),也可以指版本前置字元 (例如「13305」)。
-      <ph name="WARNING_PERIOD_PROPERTY_NAME" /> 和 <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME" /> 是選用值,以天數為單位。這兩個期間的預設值是 0 天,表示沒有任何警告期間。</translation>
 <translation id="2104418465060359056">回報擴充功能和外掛程式資訊</translation>
 <translation id="2106627642643925514">覆寫預設的 PIN 碼列印模式。如果設定的模式不適用,系統會忽略這項政策。</translation>
 <translation id="2107601598727098402">
@@ -2353,11 +2333,11 @@
 
       * 如果將 <ph name="FILTER_PLACEHOLDER" /> 設為 <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" />,瀏覽器只會選取由 CommonName <ph name="ISSUER_CN_PLACEHOLDER" /> 憑證所核發的用戶端憑證。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含<ph name="ISSUER_STRING_VALUE" />和<ph name="SUBJECT_STRING_VALUE" />區段,則瀏覽器只會選取同時符合兩個條件的用戶端憑證。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含 <ph name="ISSUER_STRING_VALUE" /> 和 <ph name="SUBJECT_STRING_VALUE" /> 區段,則瀏覽器只會選取同時符合兩個條件的用戶端憑證。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為<ph name="FILTER_STRING_ORGANIZATION" />的<ph name="SUBJECT_STRING_VALUE" />區段,憑證必須有至少一個機構與指定值相符,才會納入選取範圍。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為 <ph name="FILTER_STRING_ORGANIZATION" /> 的 <ph name="SUBJECT_STRING_VALUE" /> 區段,憑證必須有至少一個機構與指定值相符,才會納入選取範圍。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為<ph name="FILTER_STRING_ORGANIZATIONAL_UNIT" />的<ph name="SUBJECT_STRING_VALUE" />區段,憑證必須有至少一個機構單位與指定值相符,才會納入選取範圍。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為 <ph name="FILTER_STRING_ORGANIZATIONAL_UNIT" /> 的 <ph name="SUBJECT_STRING_VALUE" /> 區段,憑證必須有至少一個機構單位與指定值相符,才會納入選取範圍。
 
       * 如果將 <ph name="FILTER_PLACEHOLDER" /> 設為 <ph name="EMPTY_DICTIONARY" />,則瀏覽器在選取用戶端憑證時不會受到額外限制。請注意,由網路伺服器所提供的篩選器仍然適用。
 
@@ -4556,13 +4536,6 @@
 
       你可以將 Google 的搜尋網址指定為:<ph name="GOOGLE_SEARCH_URL" />。</translation>
 <translation id="7895553628261067384">遠端存取</translation>
-<translation id="7898879331506985900">這項企業政策只是暫時性措施,將在 M86 版中移除。
-
-      透過漸進式的 M80 穩定版發布作業,Chrome 的預設參照政策已從目前的值 no-referrer-when-downgrade 強化為更安全的 strict-origin-when-cross-origin。
-
-      在發布之前,這項企業政策不會生效。如果你在發布之後啟用這項企業政策,Chrome 的預設參照政策將設為 M80 預先發布版的值 no-referrer-when-downgrade。
-
-      在預設狀態下,系統會停用這項企業政策。</translation>
 <translation id="7902040092815978832">在輸入密碼時顯示數字鍵盤</translation>
 <translation id="7912255076272890813">設定允許的應用程式/擴充功能類型</translation>
 <translation id="7922358664346625612">讓 Chrome 中的最後一個分頁保持開啟。</translation>
@@ -5267,7 +5240,7 @@
 
           如果不設定這項政策或設為 False,支援平台會忽略 KDC 政策,只遵循「AuthNegotiateDelegateAllowlist」政策。
 
-          在 Windows 上,系統一律會遵循 KDC 政策。</translation>
+          Windows 作業系統一律遵循 KDC 政策。</translation>
 <translation id="8938932171964587769">這項政策自 M69 起已淘汰,請改用 OverrideSecurityRestrictionsOnInsecureOrigin。
 
 這項政策可指定要視為安全內容的來源 (網址) 或主機名稱模式 (例如「*.example.com」),清單中的內容來源將不會套用針對不安全來源所設的安全性限制。
@@ -5371,7 +5344,7 @@
       如果設定這項政策,無論使用者是否指定 --disk-cache-size 旗標,<ph name="PRODUCT_NAME" /> 都會使用你提供的快取大小 (MB 以下的值會進位為 MB)。
 
       如果未設定,<ph name="PRODUCT_NAME" /> 會使用預設大小,使用者可透過 --disk-cache-size 旗標來變更這項設定。</translation>
-<translation id="9057444687284972605">你可以設定網址模式清單,指定在 SAML 流程代管架構的登入畫面中,系統要為哪些網站自動選取用戶端憑證 (如果網站要求憑證的話)。實際應用範例:設定要提供給 SAML IdP 的裝置通用憑證。
+<translation id="9057444687284972605">你可以設定網址模式清單,用於指定在 SAML 流程代管架構的登入畫面中,如果網站要求憑證,系統會自動選取用戶端憑證的網站。實際應用範例:設定要提供給 SAML IdP 的裝置通用憑證。
 
       政策的值是字串化的 JSON 條目陣列,每個條目的格式都是 <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />,其中 <ph name="URL_PATTERN_PLACEHOLDER" /> 是內容設定格式。<ph name="FILTER_PLACEHOLDER" /> 會限制瀏覽器可自動選取的用戶端憑證。無論是否設定篩選器,瀏覽器都只會選取符合伺服器憑證要求的憑證。
 
@@ -5379,11 +5352,11 @@
 
       * 如果將 <ph name="FILTER_PLACEHOLDER" /> 設為 <ph name="AUTO_SELECT_CERTIFICATE_FOR_URLS_FILTER_EXAMPLE" />,瀏覽器只會選取由 CommonName <ph name="ISSUER_CN_PLACEHOLDER" /> 憑證所核發的用戶端憑證。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含<ph name="ISSUER_STRING_VALUE" />和<ph name="SUBJECT_STRING_VALUE" />區段,則瀏覽器只會選取同時符合兩個條件的用戶端憑證。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含 <ph name="ISSUER_STRING_VALUE" /> 和 <ph name="SUBJECT_STRING_VALUE" /> 區段,則瀏覽器只會選取同時符合兩個條件的用戶端憑證。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為<ph name="FILTER_STRING_ORGANIZATION" />的<ph name="SUBJECT_STRING_VALUE" />區段,憑證必須有至少一個機構與指定值相符,才會納入選取範圍。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為 <ph name="FILTER_STRING_ORGANIZATION" /> 的 <ph name="SUBJECT_STRING_VALUE" /> 區段,憑證必須有至少一個機構與指定值相符,才會納入選取範圍。
 
-      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為<ph name="FILTER_STRING_ORGANIZATIONAL_UNIT" />的<ph name="SUBJECT_STRING_VALUE" />區段,憑證必須有至少一個機構單位與指定值相符,才會納入選取範圍。
+      * 如果 <ph name="FILTER_PLACEHOLDER" /> 包含值為 <ph name="FILTER_STRING_ORGANIZATIONAL_UNIT" /> 的 <ph name="SUBJECT_STRING_VALUE" /> 區段,憑證必須有至少一個機構單位與指定值相符,才會納入選取範圍。
 
       * 如果將 <ph name="FILTER_PLACEHOLDER" /> 設為 <ph name="EMPTY_DICTIONARY" />,則瀏覽器在選取用戶端憑證時不會受到額外限制。請注意,由網路伺服器所提供的篩選器仍然適用。
 
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 727b84e..1bfe4ee5 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -1646,6 +1646,7 @@
 <translation id="7791011319128895129">لم يتم إصدارها</translation>
 <translation id="7791196057686275387">حزمة</translation>
 <translation id="7791543448312431591">إضافة</translation>
+<translation id="7792318290931435557">عرض صفحة واحدة</translation>
 <translation id="7798389633136518089">تم التجاهل لعدم إعداد السياسة من خلال أحد مصادر السحابة الإلكترونية.</translation>
 <translation id="7800304661137206267">تم ترميز الاتصال باستخدام <ph name="CIPHER" />، مع <ph name="MAC" /> لمصادقة الرسالة و<ph name="KX" /> كآلية التبادل الرئيسية.</translation>
 <translation id="7802523362929240268">الموقع الإلكتروني مشروع</translation>
@@ -1741,6 +1742,7 @@
 <translation id="8220146938470311105">‏C7/C6 (مغلف)</translation>
 <translation id="8221250263817408492">‏لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. لذا ينصح Chromium بالانتقال إلى <ph name="WEBSITE_1" />، وأيّ مواقع إلكترونية أخرى تستخدم فيها كلمة المرور هذه، وبتغيير الكلمة الآن.</translation>
 <translation id="8225771182978767009">اختار الشخص الذي أعد جهاز الكمبيوتر حظر الموقع الإلكتروني هذا.</translation>
+<translation id="8228419419708659934">عرض صفحتين</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />، <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">درجة حرارة النظام الأساسي</translation>
 <translation id="8238581221633243064">يمكنك فتح الصفحة في علامة تبويب جديدة للتصفح المتخفي</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb
index fe181213..ec96315 100644
--- a/components/strings/components_strings_az.xtb
+++ b/components/strings/components_strings_az.xtb
@@ -1641,6 +1641,7 @@
 <translation id="7791011319128895129">Buraxılmayıb</translation>
 <translation id="7791196057686275387">Balanslaşdırın</translation>
 <translation id="7791543448312431591">Əlavə etmək</translation>
+<translation id="7792318290931435557">Bir səhifə görünüşü</translation>
 <translation id="7798389633136518089">Siyasət bulud mənbəyi tərəfindən təyin edilmədiyinə görə nəzərə alınmayıb.</translation>
 <translation id="7800304661137206267">Bağlantı <ph name="CIPHER" /> istifadə olunaraq şifrələndi, mesaj doğrulanması üçün <ph name="MAC" /> və açar mübadiləsi mexanizmi üçün <ph name="KX" /> oldu.</translation>
 <translation id="7802523362929240268">Sayt qanunidir</translation>
@@ -1736,6 +1737,7 @@
 <translation id="8220146938470311105">C7/C6 (Zərf)</translation>
 <translation id="8221250263817408492">İndicə parolunuzu aldadıcı saytda daxil etdiniz. Chromium indi <ph name="WEBSITE_1" /> və bu parolu istifadə etdiyiniz digər saytlara keçərək parolunuzu dəyişmənizi tövsiyə edir.</translation>
 <translation id="8225771182978767009">Kompüteri quraşdıran şəxs bu saytı blok etməyi seçib.</translation>
+<translation id="8228419419708659934">İki səhifə görünüşü</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Platforma temperaturu</translation>
 <translation id="8238581221633243064">Yeni Gizli tabda səhifə açın</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb
index dac7b41..134b570 100644
--- a/components/strings/components_strings_be.xtb
+++ b/components/strings/components_strings_be.xtb
@@ -1646,6 +1646,7 @@
 <translation id="7791011319128895129">Не апублікавана</translation>
 <translation id="7791196057686275387">Стос</translation>
 <translation id="7791543448312431591">Дадаць</translation>
+<translation id="7792318290931435557">Аднастаронкавы выгляд</translation>
 <translation id="7798389633136518089">Не прымяняецца, паколькі палітыка не вызначана з воблака.</translation>
 <translation id="7800304661137206267">Падключэнне зашыфравана з дапамогай <ph name="CIPHER" />, для аўтэнтыфікацыі паведамленняў выкарыстоўваецца <ph name="MAC" />, механізм абмену ключамі – <ph name="KX" />.</translation>
 <translation id="7802523362929240268">Сайт надзейны</translation>
@@ -1741,6 +1742,7 @@
 <translation id="8220146938470311105">C7/C6 (канверт)</translation>
 <translation id="8221250263817408492">Вы толькі што ўвялі свой пароль на сайце, вядомым падманнымі паводзінамі. Chromium рэкамендуе неадкладна змяніць пароль на сайце <ph name="WEBSITE_1" /> і на іншых сайтах, дзе выкарыстоўваецца гэты пароль.</translation>
 <translation id="8225771182978767009">Карыстальнік, які наладжваў гэты камп'ютар, вырашыў заблакіраваць гэты сайт.</translation>
+<translation id="8228419419708659934">Двухстаронкавы выгляд</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Тэмпература платформы</translation>
 <translation id="8238581221633243064">Адкрыйце старонку ва ўкладцы інкогніта</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 829d621..84b5e3e8 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -1629,6 +1629,7 @@
 <translation id="7791011319128895129">Nevydáno</translation>
 <translation id="7791196057686275387">Balení</translation>
 <translation id="7791543448312431591">Přidat</translation>
+<translation id="7792318290931435557">Zobrazení jedné stránky</translation>
 <translation id="7798389633136518089">Ignorováno, protože tuto zásadu nenastavil cloudový zdroj.</translation>
 <translation id="7800304661137206267">Připojení je šifrováno pomocí standardu <ph name="CIPHER" /> s algoritmem <ph name="MAC" /> pro ověřování zpráv a mechanizmem výměny klíčů <ph name="KX" />.</translation>
 <translation id="7802523362929240268">Web je důvěryhodný</translation>
@@ -1724,6 +1725,7 @@
 <translation id="8220146938470311105">C7/C6 (obálka)</translation>
 <translation id="8221250263817408492">Právě jste své heslo zadali na klamavém webu. Chromium doporučuje navštívit web <ph name="WEBSITE_1" /> a další weby, kde toto heslo používáte, a okamžitě jej změnit.</translation>
 <translation id="8225771182978767009">Uživatel, který tento počítač nastavoval, se rozhodl tento web blokovat.</translation>
+<translation id="8228419419708659934">Zobrazení dvou stránek</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Teplota platformy</translation>
 <translation id="8238581221633243064">Otevřete stránku na nové anonymní kartě</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 8331d3f..5219daef 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -1646,6 +1646,7 @@
 <translation id="7791011319128895129">Hindi pa na-release</translation>
 <translation id="7791196057686275387">Bale</translation>
 <translation id="7791543448312431591">Idagdag</translation>
+<translation id="7792318290931435557">Isang page na view</translation>
 <translation id="7798389633136518089">Binalewala dahil hindi itinakda ng isang cloud source ang patakaran.</translation>
 <translation id="7800304661137206267">Na-encrypt ang koneksyon gamit ang <ph name="CIPHER" />, kasama ang <ph name="MAC" /> para sa pagpapatunay ng mensahe at <ph name="KX" /> bilang mekanismo ng pangunahing pagpapalit.</translation>
 <translation id="7802523362929240268">Lehitimo ang site</translation>
@@ -1741,6 +1742,7 @@
 <translation id="8220146938470311105">C7/C6 (Envelope)</translation>
 <translation id="8221250263817408492">Kakalagay mo lang ng iyong password sa isang mapanlinang na site. Inirerekomenda ng Chromium na pumunta sa <ph name="WEBSITE_1" /> at sa iba pang site kung saan mo ginamit ang password na ito at baguhin ito ngayon.</translation>
 <translation id="8225771182978767009">Pinili ng taong nag-set up ng computer na ito na i-block ang site na ito.</translation>
+<translation id="8228419419708659934">Dalawang page na view</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Temperatura ng platform</translation>
 <translation id="8238581221633243064">Buksan ang page sa bagong Incognito tab</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 6d5ec43e..fadb951d 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -1643,6 +1643,7 @@
 <translation id="7791011319128895129">अप्रकाशित</translation>
 <translation id="7791196057686275387">बेल</translation>
 <translation id="7791543448312431591">जोड़ें</translation>
+<translation id="7792318290931435557">एक पेज वाला व्यू</translation>
 <translation id="7798389633136518089">नीति को किसी क्लाउड स्रोत के ज़रिए सेट नहीं किया गया है। इसलिए, इसे स्वीकार नहीं किया गया.</translation>
 <translation id="7800304661137206267">कनेक्शन को <ph name="MAC" /> का इस्तेमाल करके मैसेज की पुष्टि के लिए <ph name="KX" /> के साथ सुरक्षित किया गया है और यह मुख्य एक्सचेंज तकनीक के तौर पर <ph name="CIPHER" /> का इस्तेमाल करता है.</translation>
 <translation id="7802523362929240268">साइट वैध है</translation>
@@ -1738,6 +1739,7 @@
 <translation id="8220146938470311105">सी7/सी6 (एन्वेलप)</translation>
 <translation id="8221250263817408492">आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. क्रोमियम, <ph name="WEBSITE_1" /> और उन साइटों पर जाकर पासवर्ड बदलने का सुझाव देता है जिन पर आपने इसे इस्तेमाल किया था.</translation>
 <translation id="8225771182978767009">जिस व्यक्ति ने इस कंप्यूटर को सेट किया है, उसने इस साइट को ब्लॉक करना चुना है.</translation>
+<translation id="8228419419708659934">दो पेजों वाला व्यू</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">प्लैटफ़ॉर्म का तापमान</translation>
 <translation id="8238581221633243064">पेज को नए गुप्त टैब में खोलें</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 7f7a27a..0cf3965 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -1360,7 +1360,7 @@
 <translation id="6646269444027925224">{COUNT,plural, =0{Nessuno}=1{Da 1 sito (non verrai disconnesso dal tuo Account Google)}other{Da # siti (non verrai disconnesso dal tuo Account Google)}}</translation>
 <translation id="6652101503459149953">Usa Windows Hello</translation>
 <translation id="6657585470893396449">Password</translation>
-<translation id="666259744093848177">(x86_64 con traduzione)</translation>
+<translation id="666259744093848177">(x86_64 translated)</translation>
 <translation id="6665553082534466207">Tripla perforatura a destra</translation>
 <translation id="6671697161687535275">Rimuovere il suggerimento per i moduli da Chromium?</translation>
 <translation id="6685834062052613830">Esci e completa la configurazione</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 580fb45..947d9ff 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -1353,7 +1353,7 @@
 <translation id="6646269444027925224">{COUNT,plural, =0{なし}=1{1 件のサイト(Google アカウントへのログイン状態は維持されます)}other{# 件のサイト(Google アカウントへのログイン状態は維持されます)}}</translation>
 <translation id="6652101503459149953">Windows Hello を使用</translation>
 <translation id="6657585470893396449">パスワード</translation>
-<translation id="666259744093848177">(x86_64 translated)</translation>
+<translation id="666259744093848177">(x86_64 翻訳)</translation>
 <translation id="6665553082534466207">3 穴パンチ(右)</translation>
 <translation id="6671697161687535275">Chromium から候補を削除してもよろしいですか?</translation>
 <translation id="6685834062052613830">ログアウトして設定を完了してください</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb
index 3ccd34a..90b460c 100644
--- a/components/strings/components_strings_kk.xtb
+++ b/components/strings/components_strings_kk.xtb
@@ -1363,7 +1363,7 @@
 <translation id="6646269444027925224">{COUNT,plural, =0{Жоқ}=1{1 сайттан (Google есептік жазбаңыздан шықпайсыз)}other{# сайттан (Google есептік жазбаңыздан шықпайсыз)}}</translation>
 <translation id="6652101503459149953">Windows Hello қолдану</translation>
 <translation id="6657585470893396449">Құпия сөз</translation>
-<translation id="666259744093848177">(x86_64 translated)</translation>
+<translation id="666259744093848177">(x86_64 үшін аударылған)</translation>
 <translation id="6665553082534466207">Оң жағын үш рет тесу</translation>
 <translation id="6671697161687535275">Chromium жүйесінен нысан ұсынысын алып тастау керек пе?</translation>
 <translation id="6685834062052613830">Жүйеден шығып, орнатуды аяқтаңыз</translation>
@@ -1645,6 +1645,7 @@
 <translation id="7791011319128895129">Шығарылмаған</translation>
 <translation id="7791196057686275387">Қабаттау</translation>
 <translation id="7791543448312431591">Қосу</translation>
+<translation id="7792318290931435557">Бір бетті көру</translation>
 <translation id="7798389633136518089">Саясатты бұлт қызметі орнатпағандықтан, еленбейді</translation>
 <translation id="7800304661137206267">Байланыс хабар аутентификациясы мен негізгі ауыстыру жүйесі ретіндегі <ph name="KX" /> үшін <ph name="CIPHER" /> көмегімен <ph name="MAC" /> арқылы шифрланған.</translation>
 <translation id="7802523362929240268">Сайт заңды</translation>
@@ -1740,6 +1741,7 @@
 <translation id="8220146938470311105">C7/C6 (Envelope)</translation>
 <translation id="8221250263817408492">Жаңа ғана құпия сөзіңізді алаяқтық сайтқа енгіздіңіз. Chromium осы құпия сөз енгізілген <ph name="WEBSITE_1" /> және тағы басқа сайттарға кіріп, оны дереу өзгертуге кеңес береді.</translation>
 <translation id="8225771182978767009">Бұл компьютерді орнатқан адам осы сайтты бөгеуді ұйғарды.</translation>
+<translation id="8228419419708659934">Екі бетті көру</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Платформа температурасы</translation>
 <translation id="8238581221633243064">Бетті жаңа инкогнито қойындысында ашу</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index 5d6b86e..d7ee512 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -1651,6 +1651,7 @@
 <translation id="7791011319128895129">មិនទាន់​ដាក់ចេញ</translation>
 <translation id="7791196057686275387">ចងរមូរ</translation>
 <translation id="7791543448312431591">បន្ថែម</translation>
+<translation id="7792318290931435557">ការមើលជាទំព័រ​មួយ</translation>
 <translation id="7798389633136518089">មិនអើពើ ដោយសារ​គោលការណ៍មិនត្រូវបានកំណត់ដោយ​ប្រភព​ពពកទេ។</translation>
 <translation id="7800304661137206267">ការភ្ជាប់ត្រូវបានអ៊ីនគ្រីប ដោយប្រើ <ph name="CIPHER" /> ជាមួយ <ph name="MAC" /> សម្រាប់ការសម្គាល់អត្តសញ្ញាណសារ និង <ph name="KX" /> ជាយន្តការផ្តោះប្តូរសោ។</translation>
 <translation id="7802523362929240268">ទំព័រ​ស្របច្បាប់</translation>
@@ -1746,6 +1747,7 @@
 <translation id="8220146938470311105">C7/C6 (ស្រោម​សំបុត្រ)</translation>
 <translation id="8221250263817408492">អ្នកទើបតែ​បានបញ្ចូល​ពាក្យសម្ងាត់​របស់អ្នក​នៅលើ​គេហទំព័របញ្ឆោត។ Chromium សូមណែនាំឱ្យ​ចូលទៅកាន់ <ph name="WEBSITE_1" /> និងគេហទំព័រ​ផ្សេងទៀត ​ដែលអ្នកប្រើ​ពាក្យសម្ងាត់​នេះ រួច​ប្ដូរ​ពាក្យសម្ងាត់​ឥឡូវនេះ។</translation>
 <translation id="8225771182978767009">អ្នកដែលដំឡើងកុំព្យូទ័រនេះបានជ្រើសយកការរារាំងគេហទំព័រនេះ</translation>
+<translation id="8228419419708659934">ការមើល​ជាទំព័រពីរ</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">សីតុណ្ហភាព​ប្រព័ន្ធ</translation>
 <translation id="8238581221633243064">បើក​ទំព័រ​នៅក្នុង​ផ្ទាំង​ឯកជន​ថ្មី</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index bdbd17a..08ab5e4 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -1645,6 +1645,7 @@
 <translation id="7791011319128895129">Чыга элек</translation>
 <translation id="7791196057686275387">Таңуу</translation>
 <translation id="7791543448312431591">Кошуу</translation>
+<translation id="7792318290931435557">Бир барак көрүнүшү</translation>
 <translation id="7798389633136518089">Этибарга алынган жок, анткени саясат булут булагынан коюлган жок.</translation>
 <translation id="7800304661137206267">Туташуу <ph name="CIPHER" /> аркылуу, билдирүүнүн аныктыгын текшерүү үчүн <ph name="MAC" /> жана ачкыч алмашуу механизми катары <ph name="KX" /> менен шифрленген.</translation>
 <translation id="7802523362929240268">Бул сайт коопсуз</translation>
@@ -1740,6 +1741,7 @@
 <translation id="8220146938470311105">C7/C6 (Конверт)</translation>
 <translation id="8221250263817408492">Сырсөзүңүздү жаңы эле адаштыруучу сайтта киргиздиңиз. Chromium ушул сырсөздү колдонгон <ph name="WEBSITE_1" /> жана башка сайттарга өтүп, аны азыр өзгөртүүнү сунуштайт.</translation>
 <translation id="8225771182978767009">Бул компьютерди жөндөгөн адам ушул сайтты бөгөттөп салган.</translation>
+<translation id="8228419419708659934">Эки барак көрүнүшү</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Платформанын температурасы</translation>
 <translation id="8238581221633243064">Баракчаны жаңы жашыруун өтмөктө ачуу</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 949ef18e..82d679a 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -1643,6 +1643,7 @@
 <translation id="7791011319128895129">Nav izlaista</translation>
 <translation id="7791196057686275387">Iepakojums</translation>
 <translation id="7791543448312431591">Pievienot</translation>
+<translation id="7792318290931435557">Vienas lappuses skats</translation>
 <translation id="7798389633136518089">Ignorēta, jo politika nav iestatīta mākoņa avotā.</translation>
 <translation id="7800304661137206267">Savienojums ir šifrēts, izmantojot <ph name="CIPHER" />, ar <ph name="MAC" /> ziņojumu autentifikācijai un <ph name="KX" /> kā atslēgu apmaiņas mehānismu.</translation>
 <translation id="7802523362929240268">Vietne ir uzticama</translation>
@@ -1738,6 +1739,7 @@
 <translation id="8220146938470311105">C7/C6 (aploksne)</translation>
 <translation id="8221250263817408492">Jūs tikko ievadījāt savu paroli maldinošā vietnē. Chromium ieteikums: tūlīt apmeklējiet vietni <ph name="WEBSITE_1" /> un citas vietnes, kurās izmantojat šo paroli, un nomainiet to.</translation>
 <translation id="8225771182978767009">Persona, kura iestatīja šo datoru, izvēlējās bloķēt šo vietni.</translation>
+<translation id="8228419419708659934">Divu lappušu skats</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Platformas temperatūra</translation>
 <translation id="8238581221633243064">Atvērt lapu jaunā inkognito režīma cilnē</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 085ed17..a44e2a1f 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -1638,6 +1638,7 @@
 <translation id="7791011319128895129">റിലീസ് ചെയ്യാത്തത്</translation>
 <translation id="7791196057686275387">ബെയ്‌ൽ</translation>
 <translation id="7791543448312431591">ചേര്‍ക്കൂ</translation>
+<translation id="7792318290931435557">ഒറ്റ പേജ് കാഴ്ച</translation>
 <translation id="7798389633136518089">നയം സജ്ജീകരിച്ചത് ക്ലൗഡിൽ നിന്ന് അല്ലാത്തതിനാൽ അവഗണിച്ചു.</translation>
 <translation id="7800304661137206267">സന്ദേശ പരിശോധിച്ചുറപ്പിക്കലിനായി <ph name="KX" /> കീ എക്സേഞ്ച് മെക്കാനിസമായി <ph name="CIPHER" /> ഉപയോഗിച്ച് ഈ കണക്ഷനെ <ph name="MAC" /> എന്നതുമായി എന്‍‌ക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു.</translation>
 <translation id="7802523362929240268">സൈറ്റ് നിയമാനുസൃതമാണ്</translation>
@@ -1733,6 +1734,7 @@
 <translation id="8220146938470311105">C7/C6 (എൻവലപ്പ്)</translation>
 <translation id="8221250263817408492">വഞ്ചനാപരമായ സൈറ്റിൽ നിങ്ങൾ ഇപ്പോൾ പാസ്‍വേഡ് നൽകി. നിങ്ങൾ ഈ പാസ്‌വേഡ് ഉപയോഗിക്കുന്ന <ph name="WEBSITE_1" /> എന്നതിലേക്കും മറ്റ് സൈറ്റുകളിലേക്കും പോയി, ഇപ്പോൾ തന്നെ അത് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation>
 <translation id="8225771182978767009">ഈ കമ്പ്യൂട്ടർ സജ്ജമാക്കിയ വ്യക്തി, ഈ സൈറ്റ് ബ്ലോക്ക് ചെയ്യാൻ തീരുമാനിച്ചിരുന്നു.</translation>
+<translation id="8228419419708659934">രണ്ട് പേജ് കാഴ്ച</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">പ്ലാറ്റ്‌ഫോം താപനില</translation>
 <translation id="8238581221633243064">പുതിയൊരു അദൃശ്യ ടാബിൽ പേജ് തുറക്കുക</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index aeaee92..a9870311 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -1645,6 +1645,7 @@
 <translation id="7791011319128895129">Ikke lansert</translation>
 <translation id="7791196057686275387">Bunt</translation>
 <translation id="7791543448312431591">Legg til</translation>
+<translation id="7792318290931435557">Visning med én side</translation>
 <translation id="7798389633136518089">Ignorert fordi regelen ikke er angitt av en skykilde.</translation>
 <translation id="7800304661137206267">Tilkoblingen er kryptert ved hjelp av <ph name="CIPHER" />, med <ph name="MAC" /> for autentisering av meldinger og <ph name="KX" /> som nøkkelutvekslingsmekanisme.</translation>
 <translation id="7802523362929240268">Nettstedet er legitimt</translation>
@@ -1740,6 +1741,7 @@
 <translation id="8220146938470311105">C7/C6 (konvolutt)</translation>
 <translation id="8221250263817408492">Du har nettopp skrevet inn passordet ditt på et villedende nettsted. Chromium anbefaler at du går til <ph name="WEBSITE_1" />, samt andre nettsteder der du bruker dette passordet, og bytter det nå.</translation>
 <translation id="8225771182978767009">Personen som konfigurerte denne datamaskinen, har valgt å blokkere dette nettstedet.</translation>
+<translation id="8228419419708659934">Visning med to sider</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Plattformtemperatur</translation>
 <translation id="8238581221633243064">Åpne siden i et nytt inkognitovindu</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 140241a..e1bec1a9 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -1644,6 +1644,7 @@
 <translation id="7791011319128895129">Nelansată</translation>
 <translation id="7791196057686275387">Balot</translation>
 <translation id="7791543448312431591">Adaugă</translation>
+<translation id="7792318290931435557">Vizualizare cu o pagină</translation>
 <translation id="7798389633136518089">Ignorată, deoarece politica nu este configurată de o sursă din cloud.</translation>
 <translation id="7800304661137206267">Conexiunea este criptată utilizând <ph name="CIPHER" />, cu <ph name="MAC" /> pentru autentificarea mesajelor și <ph name="KX" /> ca mecanism de schimb al cheii.</translation>
 <translation id="7802523362929240268">Site-ul este legitim</translation>
@@ -1739,6 +1740,7 @@
 <translation id="8220146938470311105">C7/C6 (Plic)</translation>
 <translation id="8221250263817408492">Ai introdus parola pe un site înșelător. Chromium recomandă să accesezi <ph name="WEBSITE_1" /> și alte site-uri pe care folosești această parolă și să o schimbi acum.</translation>
 <translation id="8225771182978767009">Persoana care a configurat computerul a ales să blocheze acest site.</translation>
+<translation id="8228419419708659934">Vizualizare cu două pagini</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Temperatura platformei</translation>
 <translation id="8238581221633243064">Deschide pagina într-o filă incognito nouă</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 3f91da2c..67d8e1b 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -1646,6 +1646,7 @@
 <translation id="7791011319128895129">Neobjavljeno</translation>
 <translation id="7791196057686275387">Vezava »bale«</translation>
 <translation id="7791543448312431591">Dodaj</translation>
+<translation id="7792318290931435557">Pogled ene strani</translation>
 <translation id="7798389633136518089">Prezrto, ker pravilnika ni nastavil vir iz oblaka.</translation>
 <translation id="7800304661137206267">Povezava je šifrirana s <ph name="CIPHER" /> in uporablja <ph name="MAC" /> za preverjanje pristnosti sporočil ter <ph name="KX" /> kot mehanizem za izmenjavo ključev.</translation>
 <translation id="7802523362929240268">Spletno mesto je legitimno</translation>
@@ -1741,6 +1742,7 @@
 <translation id="8220146938470311105">C7/C6 (Envelope)</translation>
 <translation id="8221250263817408492">Pravkar ste vnesli geslo na zavajajočem spletnem mestu. Chromium priporoča, da obiščete <ph name="WEBSITE_1" /> ter druga spletna mesta, na katerih uporabljate to geslo, in ga takoj spremenite.</translation>
 <translation id="8225771182978767009">Oseba, ki je nastavila ta računalnik, je blokirala to spletno mesto.</translation>
+<translation id="8228419419708659934">Pogled dveh strani</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Temperatura platforme</translation>
 <translation id="8238581221633243064">Odpiranje strani v novem zavihku brez beleženja zgodovine.</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb
index 46b847c..ea1ee8e3 100644
--- a/components/strings/components_strings_sq.xtb
+++ b/components/strings/components_strings_sq.xtb
@@ -1640,6 +1640,7 @@
 <translation id="7791011319128895129">E papublikuar</translation>
 <translation id="7791196057686275387">Lidhja në stivë</translation>
 <translation id="7791543448312431591">Shtoje</translation>
+<translation id="7792318290931435557">Pamja e një faqeje</translation>
 <translation id="7798389633136518089">U shpërfill sepse politika nuk është caktuar nga një burim në renë kompjuterike.</translation>
 <translation id="7800304661137206267">Lidhja është e enkriptuar me <ph name="CIPHER" />, me <ph name="MAC" /> për vërtetimin e mesazhit dhe <ph name="KX" /> si mekanizmi i shkëmbimit të çelësit.</translation>
 <translation id="7802523362929240268">Sajti është i ligjshëm</translation>
@@ -1735,6 +1736,7 @@
 <translation id="8220146938470311105">C7/C6 (Zarf)</translation>
 <translation id="8221250263817408492">Sapo fute fjalëkalimin tënd në një sajt mashtrues. Chromium rekomandon që të shkosh te <ph name="WEBSITE_1" /> dhe sajte të tjera ku e përdor këtë fjalëkalim dhe ta ndryshosh atë.</translation>
 <translation id="8225771182978767009">Personi që ka konfiguruar këtë kompjuter ka zgjedhur ta bllokojë këtë sajt.</translation>
+<translation id="8228419419708659934">Pamja me dy faqe</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Temperatura e platformës</translation>
 <translation id="8238581221633243064">Hape faqen në një skedë të re "të fshehtë"</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb
index 05c74de..3935df0d 100644
--- a/components/strings/components_strings_uz.xtb
+++ b/components/strings/components_strings_uz.xtb
@@ -1640,6 +1640,7 @@
 <translation id="7791011319128895129">Hali chiqmagan</translation>
 <translation id="7791196057686275387">Beyl</translation>
 <translation id="7791543448312431591">Qo‘shish</translation>
+<translation id="7792318290931435557">Bitta sahifani koʻrsatish</translation>
 <translation id="7798389633136518089">Parametr bulutli manba tomonidan belgilangani sababli inkor qilindi.</translation>
 <translation id="7800304661137206267">Xabarlar haqiqiyligi tekshiruvi uchun <ph name="KX" /> algoritmli <ph name="MAC" />, kalitlar almashinuvi uchun esa <ph name="CIPHER" /> mexanizmidan foydalanilmoqda.</translation>
 <translation id="7802523362929240268">Bu – xavfsiz sayt</translation>
@@ -1735,6 +1736,7 @@
 <translation id="8220146938470311105">C7/C6 (Envelope)</translation>
 <translation id="8221250263817408492">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" /> va boshqa saytlardagi shu parolingizni yangilashni tavsiya qiladi.</translation>
 <translation id="8225771182978767009">Bu saytga kirish ushbu kompyuter sozlamalarida taqiqlab qo‘yilgan.</translation>
+<translation id="8228419419708659934">Ikkita sahifani koʻrsatish</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">Platforma harorati</translation>
 <translation id="8238581221633243064">Sahifani yangi inkognito varaqda ochish</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index a64ee25..646dfaa71 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -1348,7 +1348,7 @@
 <translation id="6646269444027925224">{COUNT,plural, =0{无}=1{来自 1 个网站(这不会致使您退出自己的 Google 帐号)}other{来自 # 个网站(这不会致使您退出自己的 Google 帐号)}}</translation>
 <translation id="6652101503459149953">使用 Windows Hello</translation>
 <translation id="6657585470893396449">密码</translation>
-<translation id="666259744093848177">(x86_64 已转译)</translation>
+<translation id="666259744093848177">(经过翻译的 x86_64)</translation>
 <translation id="6665553082534466207">三孔(右侧)</translation>
 <translation id="6671697161687535275">要从 Chromium 中移除表单填写建议吗?</translation>
 <translation id="6685834062052613830">请退出并完成设置</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 21b444f..bb26234a 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -1633,6 +1633,7 @@
 <translation id="7791011319128895129">未發佈</translation>
 <translation id="7791196057686275387">綑綁式釘裝</translation>
 <translation id="7791543448312431591">新增</translation>
+<translation id="7792318290931435557">單頁檢視</translation>
 <translation id="7798389633136518089">由於政策並非透過雲端來源設定,因此已忽略。</translation>
 <translation id="7800304661137206267">連線採用 <ph name="CIPHER" /> 加密,並設有 <ph name="MAC" /> 訊息驗證及 <ph name="KX" /> 金鑰交換機制。</translation>
 <translation id="7802523362929240268">合法網站</translation>
@@ -1728,6 +1729,7 @@
 <translation id="8220146938470311105">C7/C6 (信封)</translation>
 <translation id="8221250263817408492">您剛才在欺詐網站上輸入了密碼。Chromium 建議前往 <ph name="WEBSITE_1" /> 以及其他您使用此密碼的網站,並立即變更密碼。</translation>
 <translation id="8225771182978767009">設定此電腦的用戶已封鎖此網站。</translation>
+<translation id="8228419419708659934">雙頁檢視</translation>
 <translation id="822964464349305906"><ph name="TYPE_1" />、<ph name="TYPE_2" /></translation>
 <translation id="8232343881378637145">平台溫度</translation>
 <translation id="8238581221633243064">在新無痕式分頁中開啟網頁</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 250e643..22bc1cec 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -1353,7 +1353,7 @@
 <translation id="6646269444027925224">{COUNT,plural, =0{無}=1{1 個網站 (你不會因此登出 Google 帳戶)}other{# 個網站 (你不會因此登出 Google 帳戶)}}</translation>
 <translation id="6652101503459149953">使用 Windows Hello</translation>
 <translation id="6657585470893396449">密碼</translation>
-<translation id="666259744093848177">(已翻譯 x86_64)</translation>
+<translation id="666259744093848177">(經過翻譯的 x86_64)</translation>
 <translation id="6665553082534466207">三孔 (右側)</translation>
 <translation id="6671697161687535275">要從 Chromium 中移除表單填寫建議嗎?</translation>
 <translation id="6685834062052613830">請登出並完成設定程序</translation>
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index ad36d1e..8cf7fb7f 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -157,11 +157,12 @@
   UpdateHistogramsOnOtherThread();
 }
 
+void BrowserAccessibilityStateImpl::SetCaretBrowsingState(bool enabled) {
+  caret_browsing_enabled_ = enabled;
+}
+
 bool BrowserAccessibilityStateImpl::IsCaretBrowsingEnabled() const {
-  // TODO(crbug.com/1018947): Refine this check once UX provided to toggle caret
-  // browsing mode.
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableCaretBrowsing);
+  return caret_browsing_enabled_;
 }
 
 void BrowserAccessibilityStateImpl::UpdateHistogramsOnUIThread() {
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.h b/content/browser/accessibility/browser_accessibility_state_impl.h
index 49aaf7d..d266cb6 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.h
+++ b/content/browser/accessibility/browser_accessibility_state_impl.h
@@ -60,10 +60,11 @@
   bool IsAccessibleBrowser() override;
   void AddUIThreadHistogramCallback(base::OnceClosure callback) override;
   void AddOtherThreadHistogramCallback(base::OnceClosure callback) override;
-
   void UpdateHistogramsForTesting() override;
+  void SetCaretBrowsingState(bool enabled) override;
 
-  // Returns whether caret browsing is enabled for this browser session.
+  // Returns whether caret browsing is enabled for the most recently
+  // used profile.
   bool IsCaretBrowsingEnabled() const;
 
   // AXModeObserver
@@ -114,6 +115,10 @@
 
   bool disable_hot_tracking_;
 
+  // Keeps track of whether caret browsing is enabled for the most
+  // recently used profile.
+  bool caret_browsing_enabled_ = false;
+
 #if defined(OS_WIN)
   // Only used on Windows
   std::unique_ptr<gfx::SingletonHwndObserver> singleton_hwnd_observer_;
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index da10c540..d430f19 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -20,6 +20,7 @@
 #include "content/browser/accessibility/accessibility_event_recorder.h"
 #include "content/browser/accessibility/browser_accessibility.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
+#include "content/browser/accessibility/browser_accessibility_state_impl.h"
 #include "content/browser/accessibility/dump_accessibility_browsertest_base.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/accessibility_tree_formatter.h"
@@ -30,6 +31,7 @@
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/test_utils.h"
 #include "content/shell/browser/shell.h"
+#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
 
 namespace content {
 
@@ -502,9 +504,12 @@
 #endif
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
                        MAYBE_AccessibilityEventsCaretBrowsingEnabled) {
-  // Add command line switch that forces caret browsing on.
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableCaretBrowsing);
+  // This actually enables caret browsing without setting the pref.
+  shell()->web_contents()->GetMutableRendererPrefs()->caret_browsing_enabled =
+      true;
+  // This notifies accessibility that caret browsing is on so that it sends
+  // accessibility events when the caret moves.
+  BrowserAccessibilityStateImpl::GetInstance()->SetCaretBrowsingState(true);
 
   RunEventTest(FILE_PATH_LITERAL("caret-browsing-enabled.html"));
 }
diff --git a/content/browser/conversions/conversion_storage_sql.cc b/content/browser/conversions/conversion_storage_sql.cc
index 4f09d01..80604e1c 100644
--- a/content/browser/conversions/conversion_storage_sql.cc
+++ b/content/browser/conversions/conversion_storage_sql.cc
@@ -101,15 +101,18 @@
 
   if (!opened || !InitializeSchema()) {
     db_.reset();
+    db_is_open_ = false;
     return false;
   }
+
+  db_is_open_ = true;
   return true;
 }
 
 void ConversionStorageSql::StoreImpression(
     const StorableImpression& impression) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return;
 
   // Cleanup any impression that may be expired by this point. This is done when
@@ -171,7 +174,7 @@
 int ConversionStorageSql::MaybeCreateAndStoreConversionReports(
     const StorableConversion& conversion) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return 0;
 
   const url::Origin& conversion_origin = conversion.conversion_origin();
@@ -296,7 +299,7 @@
 std::vector<ConversionReport> ConversionStorageSql::GetConversionsToReport(
     base::Time max_report_time) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return {};
 
   // Get all entries in the conversions table with a |report_time| less than
@@ -357,7 +360,7 @@
 
 std::vector<StorableImpression> ConversionStorageSql::GetActiveImpressions() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return {};
 
   const char kGetImpressionsSql[] =
@@ -392,7 +395,7 @@
 
 int ConversionStorageSql::DeleteExpiredImpressions() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return 0;
 
   // Delete all impressions that have no associated conversions and are past
@@ -424,7 +427,7 @@
 
 bool ConversionStorageSql::DeleteConversion(int64_t conversion_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return false;
 
   // Delete the row identified by |conversion_id|.
@@ -445,7 +448,7 @@
     base::Time delete_end,
     base::RepeatingCallback<bool(const url::Origin&)> filter) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_)
+  if (!db_is_open_)
     return;
 
   SCOPED_UMA_HISTOGRAM_TIMER("Conversions.ClearDataTime");
@@ -764,12 +767,13 @@
   }
 
   // The default handling is to assert on debug and to ignore on release.
-  if (!sql::Database::IsExpectedSqliteError(extended_error))
+  if (!sql::Database::IsExpectedSqliteError(extended_error) &&
+      !ignore_errors_for_testing_)
     DLOG(FATAL) << db_->GetErrorMessage();
 
-  // Null the database if we did not attempt to recover so we did not produce
-  // further errors.
-  db_.reset();
+  // Consider the  database closed if we did not attempt to recover so we did
+  // not produce further errors.
+  db_is_open_ = false;
 }
 
 }  // namespace content
diff --git a/content/browser/conversions/conversion_storage_sql.h b/content/browser/conversions/conversion_storage_sql.h
index 0e77c373..69144beb 100644
--- a/content/browser/conversions/conversion_storage_sql.h
+++ b/content/browser/conversions/conversion_storage_sql.h
@@ -37,6 +37,10 @@
   ConversionStorageSql& operator=(const ConversionStorageSql& other) = delete;
   ~ConversionStorageSql() override;
 
+  void set_ignore_errors_for_testing(bool ignore_for_testing) {
+    ignore_errors_for_testing_ = ignore_for_testing;
+  }
+
  private:
   // ConversionStorage
   bool Initialize() override;
@@ -66,12 +70,18 @@
 
   static bool g_run_in_memory_;
 
+  // If set, database errors will not crash the client when run in debug mode.
+  bool ignore_errors_for_testing_ = false;
+
   const base::FilePath path_to_database_;
 
+  // Whether the db is open and should be accessed. False if database
+  // initialization failed, or if the db suffered from an unrecoverable error.
+  bool db_is_open_ = false;
+
   // May be null if the database:
   //  - could not be opened
   //  - table/index initialization failed
-  //  - suffered from an unrecoverable error.
   std::unique_ptr<sql::Database> db_;
 
   // Must outlive |this|.
diff --git a/content/browser/conversions/conversion_storage_sql_unittest.cc b/content/browser/conversions/conversion_storage_sql_unittest.cc
index ca408b72..5b501d80 100644
--- a/content/browser/conversions/conversion_storage_sql_unittest.cc
+++ b/content/browser/conversions/conversion_storage_sql_unittest.cc
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "base/test/simple_test_clock.h"
@@ -55,8 +56,10 @@
 
   ConfigurableStorageDelegate* delegate() { return delegate_; }
 
- private:
+ protected:
   base::ScopedTempDir temp_directory_;
+
+ private:
   std::unique_ptr<ConversionStorage> storage_;
   ConfigurableStorageDelegate* delegate_ = nullptr;
   base::SimpleTestClock clock_;
@@ -259,4 +262,18 @@
   EXPECT_EQ(2u, conversion_rows);
 }
 
+TEST_F(ConversionStorageSqlTest, CantOpenDb_FailsSilentlyInRelease) {
+  base::CreateDirectoryAndGetError(db_path(), nullptr);
+
+  auto sql_storage = std::make_unique<ConversionStorageSql>(
+      temp_directory_.GetPath(),
+      std::make_unique<ConfigurableStorageDelegate>(), clock());
+  sql_storage->set_ignore_errors_for_testing(true);
+
+  // Initialize() is private on ConserionStorageSql, so convert to
+  // ConversionStorage.
+  std::unique_ptr<ConversionStorage> storage = std::move(sql_storage);
+  EXPECT_FALSE(storage->Initialize());
+}
+
 }  // namespace content
diff --git a/content/browser/form_controls_browsertest.cc b/content/browser/form_controls_browsertest.cc
index d49534cc..d171bb5 100644
--- a/content/browser/form_controls_browsertest.cc
+++ b/content/browser/form_controls_browsertest.cc
@@ -2,14 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/files/file_util.h"
 #include "base/path_service.h"
-#include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "cc/test/pixel_comparator.h"
-#include "cc/test/pixel_test_utils.h"
-#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/public/browser/render_widget_host_view.h"
 #include "content/public/common/content_paths.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -18,162 +16,145 @@
 #include "content/public/test/test_utils.h"
 #include "content/shell/browser/shell.h"
 #include "ui/base/ui_base_features.h"
-#include "ui/display/display_switches.h"
-#include "ui/gfx/image/image.h"
-#include "ui/gfx/skbitmap_operations.h"
 
-// To rebaseline this test on android:
-// 1. Run a CQ+1 dry run
-// 2. Click the failing android bot
-// 3. Find the failing content_browsertests step
-// 4. Click the "Deterministic failure" link for the failing test case
-// 5. Copy the "Actual pixels" data url and paste into browser
-// 6. Save the image into your chromium checkout in content/test/data/forms/
+#if defined(OS_ANDROID)
+#include "base/android/build_info.h"
+#endif
+
+// TODO(crbug.com/958242): Move the baselines to skia gold for easier
+//   rebaselining when all platforms are supported.
+
+// To rebaseline this test on all platforms:
+// 1. Run a CQ+1 dry run.
+// 2. Click the failing bots for android, windows, mac, and linux.
+// 3. Find the failing interactive_ui_browsertests step.
+// 4. Click the "Deterministic failure" link for the failing test case.
+// 5. Copy the "Actual pixels" data url and paste into browser.
+// 6. Save the image into your chromium checkout in content/test/data/forms/.
 
 namespace content {
 
 class FormControlsBrowserTest : public ContentBrowserTest {
  public:
-  FormControlsBrowserTest() = default;
+  FormControlsBrowserTest() {
+    feature_list_.InitWithFeatures({features::kFormControlsRefresh}, {});
+  }
 
   void SetUp() override {
-    EnablePixelOutput();
+    EnablePixelOutput(/*force_device_scale_factor=*/1.f);
     ContentBrowserTest::SetUp();
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     ContentBrowserTest::SetUpCommandLine(command_line);
-    feature_list_ = std::make_unique<base::test::ScopedFeatureList>();
-    feature_list_->InitWithFeatures({features::kFormControlsRefresh}, {});
+
+    // The --disable-lcd-text flag helps text render more similarly on
+    // different bots and platform.
+    command_line->AppendSwitch(switches::kDisableLCDText);
   }
 
-  void TearDown() override { feature_list_.reset(); }
-
-  void AsyncSnapshotCallback(const gfx::Image& image) {
-    got_snapshot_ = true;
-    snapshot_ = image;
-  }
-
-  void RunFormControlsTest(const std::string& expected_filename,
-                           const std::string& body_html,
-                           int screenshot_width,
-                           int screenshot_height) {
+  void RunTest(const std::string& screenshot_filename,
+               const std::string& body_html,
+               int screenshot_width,
+               int screenshot_height) {
     base::ScopedAllowBlockingForTesting allow_blocking;
+
     ASSERT_TRUE(features::IsFormControlsRefreshEnabled());
 
-    std::string url =
-        "data:text/html,<!DOCTYPE html>"
-        "<head>"
-        // The <meta name=viewport> tag helps make the pixel output of
-        // different android trybots more similar.
-        "  <meta name=\"viewport\" content=\"width=640, initial-scale=1, "
-        "    maximum-scale=1, minimum-scale=1\">"
-        "</head>"
-        "<body>" +
-        body_html + "</body>";
-    ASSERT_TRUE(NavigateToURL(shell(), GURL(url)));
-
-    RenderWidgetHostImpl* const rwh =
-        RenderWidgetHostImpl::From(shell()
-                                       ->web_contents()
-                                       ->GetRenderWidgetHostView()
-                                       ->GetRenderWidgetHost());
-    CHECK(rwh);
-    rwh->GetSnapshotFromBrowser(
-        base::BindOnce(&FormControlsBrowserTest::AsyncSnapshotCallback,
-                       base::Unretained(this)),
-        /* from_surface */ true);
-    while (!got_snapshot_)
-      base::RunLoop().RunUntilIdle();
-    SkBitmap bitmap = SkBitmapOperations::CreateTiledBitmap(
-        *snapshot_.ToSkBitmap(), /* src_x */ 0, /* src_y */ 0, screenshot_width,
-        screenshot_height);
+    std::string platform_suffix;
+#if defined(OS_MAC)
+    platform_suffix = "_mac";
+#elif defined(OS_WIN)
+    platform_suffix = "_win";
+#elif defined(OS_CHROMEOS)
+    platform_suffix = "_chromeos";
+#elif defined(OS_ANDROID)
+    int sdk_int = base::android::BuildInfo::GetInstance()->sdk_int();
+    if (sdk_int == base::android::SDK_VERSION_KITKAT) {
+      platform_suffix = "_android_kitkat";
+    } else {
+      platform_suffix = "_android";
+    }
+#endif
 
     base::FilePath dir_test_data;
     ASSERT_TRUE(base::PathService::Get(DIR_TEST_DATA, &dir_test_data));
-    std::string filename_with_extension = expected_filename;
-#if defined(OS_ANDROID)
-    filename_with_extension += "_android";
-#endif
-    filename_with_extension += ".png";
-    base::FilePath expected_path =
-        dir_test_data.AppendASCII("forms").AppendASCII(filename_with_extension);
-    SkBitmap expected_bitmap;
-    ASSERT_TRUE(cc::ReadPNGFile(expected_path, &expected_bitmap));
+    base::FilePath golden_filepath =
+        dir_test_data.AppendASCII("forms").AppendASCII(screenshot_filename +
+                                                       ".png");
 
-    EXPECT_TRUE(cc::MatchesBitmap(
-        bitmap, expected_bitmap,
+    base::FilePath golden_filepath_platform =
+        golden_filepath.InsertBeforeExtensionASCII(platform_suffix);
+    if (base::PathExists(golden_filepath_platform)) {
+      golden_filepath = golden_filepath_platform;
+    }
+
+    ASSERT_TRUE(NavigateToURL(
+        shell()->web_contents(),
+        GURL("data:text/html,<!DOCTYPE html><body>" + body_html + "</body>")));
+
 #if defined(OS_MAC)
-        // The Mac 10.12 trybot has more significant subpixel rendering
-        // differences which we accommodate for here with a large avg/max
-        // per-pixel error limit.
-        // TODO(crbug.com/1037971): Remove this special case for mac once this
-        // bug is resolved.
-        cc::FuzzyPixelComparator(/* discard_alpha */ true,
-                                 /* error_pixels_percentage_limit */ 7.f,
-                                 /* small_error_pixels_percentage_limit */ 0.f,
-                                 /* avg_abs_error_limit */ 16.f,
-                                 /* max_abs_error_limit */ 79.f,
-                                 /* small_error_threshold */ 0)));
+    // This fuzzy pixel comparator handles several mac behaviors:
+    // - Different font rendering after 10.14
+    // - 10.12 subpixel rendering differences: crbug.com/1037971
+    // - Slight differences in radio and checkbox rendering in 10.15
+    cc::FuzzyPixelComparator comparator(
+        /* discard_alpha */ true,
+        /* error_pixels_percentage_limit */ 9.f,
+        /* small_error_pixels_percentage_limit */ 0.f,
+        /* avg_abs_error_limit */ 20.f,
+        /* max_abs_error_limit */ 79.f,
+        /* small_error_threshold */ 0);
+#elif defined(OS_ANDROID)
+    // Different versions of android may have slight differences in rendering.
+    // Some versions have more significant differences than others, which are
+    // tracked separately in separate baseline image files. The less significant
+    // differences are accommodated for with this fuzzy pixel comparator.
+    cc::FuzzyPixelComparator comparator(
+        /* discard_alpha */ true,
+        /* error_pixels_percentage_limit */ 6.f,
+        /* small_error_pixels_percentage_limit */ 0.f,
+        /* avg_abs_error_limit */ 2.f,
+        /* max_abs_error_limit */ 3.f,
+        /* small_error_threshold */ 0);
 #else
-        // We use a fuzzy comparator to accommodate for slight
-        // differences between the kitkat and marshmallow trybots that aren't
-        // visible to the human eye. We use a very low error limit because the
-        // pixels that are different are very similar shades of color.
-        cc::FuzzyPixelComparator(/* discard_alpha */ true,
-                                 /* error_pixels_percentage_limit */ 6.f,
-                                 /* small_error_pixels_percentage_limit */ 0.f,
-                                 /* avg_abs_error_limit */ 4.f,
-                                 /* max_abs_error_limit */ 4.f,
-                                 /* small_error_threshold */ 0)));
+    cc::ExactPixelComparator comparator(/* disard_alpha */ true);
 #endif
+    EXPECT_TRUE(CompareWebContentsOutputToReference(
+        shell()->web_contents(), golden_filepath,
+        gfx::Size(screenshot_width, screenshot_height), comparator));
   }
 
-  bool got_snapshot_ = false;
-  gfx::Image snapshot_;
-  std::unique_ptr<base::test::ScopedFeatureList> feature_list_;
+ private:
+  base::test::ScopedFeatureList feature_list_;
 };
 
-// Flaky: https://crbug.com/1091661.
-#if defined(OS_ANDROID)
-#define MAYBE_Checkbox DISABLED_CheckBox
-#else
-#define MAYBE_Checkbox CheckBox
-#endif
-IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_Checkbox) {
-  RunFormControlsTest(
-      "form_controls_browsertest_checkbox",
-      "<input type=checkbox>"
-      "<input type=checkbox checked>"
-      "<input type=checkbox disabled>"
-      "<input type=checkbox checked disabled>"
-      "<input type=checkbox id=\"indeterminate\">"
-      "<script>"
-      "  document.getElementById('indeterminate').indeterminate = true"
-      "</script>",
-      /* screenshot_width */ 130,
-      /* screenshot_height */ 40);
+IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Checkbox) {
+  RunTest("form_controls_browsertest_checkbox",
+          "<input type=checkbox>"
+          "<input type=checkbox checked>"
+          "<input type=checkbox disabled>"
+          "<input type=checkbox checked disabled>"
+          "<input type=checkbox id=\"indeterminate\">"
+          "<script>"
+          "  document.getElementById('indeterminate').indeterminate = true"
+          "</script>",
+          /* screenshot_width */ 130,
+          /* screenshot_height */ 40);
 }
 
-// Flaky: https://crbug.com/1091661.
-#if defined(OS_ANDROID)
-#define MAYBE_Radio DISABLED_Radio
-#else
-#define MAYBE_Radio Radio
-#endif
-IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, MAYBE_Radio) {
-  RunFormControlsTest(
-      "form_controls_browsertest_radio",
-      "<input type=radio>"
-      "<input type=radio checked>"
-      "<input type=radio disabled>"
-      "<input type=radio checked disabled>"
-      "<input type=radio id=\"indeterminate\">"
-      "<script>"
-      "  document.getElementById('indeterminate').indeterminate = true"
-      "</script>",
-      /* screenshot_width */ 140,
-      /* screenshot_height */ 40);
+IN_PROC_BROWSER_TEST_F(FormControlsBrowserTest, Radio) {
+  RunTest("form_controls_browsertest_radio",
+          "<input type=radio>"
+          "<input type=radio checked>"
+          "<input type=radio disabled>"
+          "<input type=radio checked disabled>"
+          "<input type=radio id=\"indeterminate\">"
+          "<script>"
+          "  document.getElementById('indeterminate').indeterminate = true"
+          "</script>",
+          /* screenshot_width */ 140,
+          /* screenshot_height */ 40);
 }
 
 // TODO(jarhar): Add tests for other elements from
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc
index 974fa0a..40ca34d 100644
--- a/content/browser/media/media_web_contents_observer.cc
+++ b/content/browser/media/media_web_contents_observer.cc
@@ -220,6 +220,8 @@
     IPC_MESSAGE_HANDLER(
         MediaPlayerDelegateHostMsg_OnPictureInPictureAvailabilityChanged,
         OnPictureInPictureAvailabilityChanged)
+    IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnBufferUnderflow,
+                        OnBufferUnderflow)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -373,6 +375,13 @@
       MediaPlayerId(render_frame_host, delegate_id), available);
 }
 
+void MediaWebContentsObserver::OnBufferUnderflow(
+    RenderFrameHost* render_frame_host,
+    int delegate_id) {
+  const MediaPlayerId id(render_frame_host, delegate_id);
+  web_contents_impl()->MediaBufferUnderflow(id);
+}
+
 device::mojom::WakeLock* MediaWebContentsObserver::GetAudioWakeLock() {
   // Here is a lazy binding, and will not reconnect after connection error.
   if (!audio_wake_lock_) {
diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h
index 0655686..39cef801 100644
--- a/content/browser/media/media_web_contents_observer.h
+++ b/content/browser/media/media_web_contents_observer.h
@@ -148,6 +148,7 @@
   void OnPictureInPictureAvailabilityChanged(RenderFrameHost* render_frame_host,
                                              int delegate_id,
                                              bool available);
+  void OnBufferUnderflow(RenderFrameHost* render_frame_host, int delegate_id);
 
   device::mojom::WakeLock* GetAudioWakeLock();
 
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index a5c29402..22d001d 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -152,6 +152,13 @@
       return true;
     }
 
+    if (sandbox_type_ == sandbox::policy::SandboxType::kSpeechRecognition) {
+      policy->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
+      policy->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW);
+      policy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS,
+                            sandbox::USER_LIMITED);
+    }
+
     if (sandbox_type_ == sandbox::policy::SandboxType::kIconReader) {
       policy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS,
                             sandbox::USER_LOCKDOWN);
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index ce5a358..eb1a234 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2246,9 +2246,6 @@
   if (IsSpatialNavigationDisabled())
     prefs.spatial_navigation_enabled = false;
 
-  prefs.caret_browsing_enabled =
-      command_line.HasSwitch(switches::kEnableCaretBrowsing);
-
   prefs.disable_reading_from_canvas =
       command_line.HasSwitch(switches::kDisableReadingFromCanvas);
 
@@ -7611,6 +7608,11 @@
     observer.MediaResized(size, id);
 }
 
+void WebContentsImpl::MediaBufferUnderflow(const MediaPlayerId& id) {
+  for (auto& observer : observers_)
+    observer.MediaBufferUnderflow(id);
+}
+
 void WebContentsImpl::MediaEffectivelyFullscreenChanged(bool is_fullscreen) {
   for (auto& observer : observers_)
     observer.MediaEffectivelyFullscreenChanged(is_fullscreen);
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index f0a15ba..8c82eaa 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1052,6 +1052,10 @@
   void MediaResized(const gfx::Size& size, const MediaPlayerId& id);
   void MediaEffectivelyFullscreenChanged(bool is_fullscreen);
 
+  // Called by MediaWebContentsObserver when a buffer underflow occurs. See the
+  // WebContentsObserver function stubs for more details.
+  void MediaBufferUnderflow(const MediaPlayerId& id);
+
   int GetCurrentlyPlayingVideoCount() override;
   base::Optional<gfx::Size> GetFullscreenVideoSize() override;
 
diff --git a/content/browser/webui/web_ui_browsertest.cc b/content/browser/webui/web_ui_browsertest.cc
index 1b6d765..664ff17 100644
--- a/content/browser/webui/web_ui_browsertest.cc
+++ b/content/browser/webui/web_ui_browsertest.cc
@@ -14,9 +14,11 @@
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "content/browser/webui/content_web_ui_controller_factory.h"
+#include "content/browser/webui/web_ui_impl.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -52,6 +54,10 @@
         "notifyFinish",
         base::BindRepeating(&TestWebUIMessageHandler::OnNotifyFinish,
                             base::Unretained(this)));
+    web_ui()->RegisterMessageCallback(
+        "sendMessage",
+        base::BindRepeating(&TestWebUIMessageHandler::OnSendMessase,
+                            base::Unretained(this)));
   }
 
   void set_finish_closure(base::RepeatingClosure closure) {
@@ -72,6 +78,13 @@
       finish_closure_.Run();
   }
 
+  void OnSendMessase(const base::ListValue* args) {
+    AllowJavascript();
+
+    if (finish_closure_)
+      std::move(finish_closure_).Run();
+  }
+
   int message_requiring_gesture_count_ = 0;
   base::RepeatingClosure finish_closure_;
 };
@@ -338,6 +351,34 @@
             web_contents->GetTitle());
 }
 
+// Verify that we can successfully navigate to a chrome-untrusted:// URL
+// without a crash while WebUI::Send is being performed.
+IN_PROC_BROWSER_TEST_F(WebUIImplBrowserTest, NavigateWhileWebUISend) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  auto* web_contents = shell()->web_contents();
+  ASSERT_TRUE(NavigateToURL(web_contents, GetWebUIURL(kChromeUIGpuHost)));
+
+  auto* test_handler = new TestWebUIMessageHandler;
+  web_contents->GetWebUI()->AddMessageHandler(base::WrapUnique(test_handler));
+
+  auto* webui = static_cast<WebUIImpl*>(web_contents->GetWebUI());
+  EXPECT_EQ(web_contents->GetMainFrame(), webui->frame_host_for_test());
+
+  test_handler->set_finish_closure(base::BindLambdaForTesting([&]() {
+    EXPECT_NE(web_contents->GetMainFrame(), webui->frame_host_for_test());
+  }));
+
+  web_contents->GetMainFrame()->ExecuteJavaScriptForTests(
+      base::ASCIIToUTF16("onunload=function() { chrome.send('sendMessage')}"),
+      base::NullCallback());
+
+  RenderFrameDeletedObserver delete_observer(web_contents->GetMainFrame());
+  EXPECT_TRUE(NavigateToURL(
+      web_contents, embedded_test_server()->GetURL("/simple_page.html")));
+  delete_observer.WaitUntilDeleted();
+}
+
 class WebUIRequestSchemesTest : public ContentBrowserTest {
  public:
   WebUIRequestSchemesTest() {
diff --git a/content/browser/webui/web_ui_impl.cc b/content/browser/webui/web_ui_impl.cc
index e3da9c29..8753a5e 100644
--- a/content/browser/webui/web_ui_impl.cc
+++ b/content/browser/webui/web_ui_impl.cc
@@ -203,13 +203,11 @@
 }
 
 bool WebUIImpl::CanCallJavascript() {
-  RenderFrameHost* frame_host = web_contents_->GetMainFrame();
-  return frame_host &&
-         (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
-              frame_host->GetProcess()->GetID()) ||
+  return (ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
+              frame_host_->GetProcess()->GetID()) ||
           // It's possible to load about:blank in a Web UI renderer.
           // See http://crbug.com/42547
-          frame_host->GetLastCommittedURL().spec() == url::kAboutBlankURL);
+          frame_host_->GetLastCommittedURL().spec() == url::kAboutBlankURL);
 }
 
 void WebUIImpl::CallJavascriptFunctionUnsafe(const std::string& function_name) {
diff --git a/content/browser/webui/web_ui_impl.h b/content/browser/webui/web_ui_impl.h
index f3fde2a..46a7d3b 100644
--- a/content/browser/webui/web_ui_impl.h
+++ b/content/browser/webui/web_ui_impl.h
@@ -93,6 +93,8 @@
 
   const mojo::Remote<mojom::WebUI>& GetRemoteForTest() const { return remote_; }
 
+  RenderFrameHost* frame_host_for_test() const { return frame_host_; }
+
  private:
   class MainFrameNavigationObserver;
 
diff --git a/content/common/content_navigation_policy.cc b/content/common/content_navigation_policy.cc
index f83937c..1e02c24 100644
--- a/content/common/content_navigation_policy.cc
+++ b/content/common/content_navigation_policy.cc
@@ -6,9 +6,11 @@
 
 #include <bitset>
 
+#include "base/command_line.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/system/sys_info.h"
 #include "content/public/common/content_features.h"
+#include "content/public/common/content_switches.h"
 
 namespace content {
 
@@ -33,6 +35,12 @@
 bool IsBackForwardCacheEnabled() {
   if (!DeviceHasEnoughMemoryForBackForwardCache())
     return false;
+
+  if (base::CommandLine::InitializedForCurrentProcess() &&
+      base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableBackForwardCache)) {
+    return false;
+  }
   // The feature needs to be checked last, because checking the feature
   // activates the field trial and assigns the client either to a control or an
   // experiment group - such assignment should be final.
diff --git a/content/common/media/media_player_delegate_messages.h b/content/common/media/media_player_delegate_messages.h
index 39b8f92..c8091a5 100644
--- a/content/common/media/media_player_delegate_messages.h
+++ b/content/common/media/media_player_delegate_messages.h
@@ -120,4 +120,7 @@
     int /* delegate_id, distinguishes instances */,
     bool /* picture-in-picture availability */)
 
+IPC_MESSAGE_ROUTED1(MediaPlayerDelegateHostMsg_OnBufferUnderflow,
+                    int /* delegate_id, distinguishes instances */)
+
 #endif  // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_DELEGATE_MESSAGES_H_
diff --git a/content/public/browser/browser_accessibility_state.h b/content/public/browser/browser_accessibility_state.h
index 94afa543..806276e 100644
--- a/content/public/browser/browser_accessibility_state.h
+++ b/content/public/browser/browser_accessibility_state.h
@@ -66,6 +66,9 @@
   virtual void AddOtherThreadHistogramCallback(base::OnceClosure callback) = 0;
 
   virtual void UpdateHistogramsForTesting() = 0;
+
+  // Update BrowserAccessibilityState with the current status of caret browsing.
+  virtual void SetCaretBrowsingState(bool enabled) = 0;
 };
 
 }  // namespace content
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h
index b85c57bc..3666e035 100644
--- a/content/public/browser/web_contents_observer.h
+++ b/content/public/browser/web_contents_observer.h
@@ -582,6 +582,7 @@
   virtual void MediaEffectivelyFullscreenChanged(bool is_fullscreen) {}
   virtual void MediaPictureInPictureChanged(bool is_picture_in_picture) {}
   virtual void MediaMutedStatusChanged(const MediaPlayerId& id, bool muted) {}
+  virtual void MediaBufferUnderflow(const MediaPlayerId& id) {}
 
   // Invoked when the renderer process changes the page scale factor.
   virtual void OnPageScaleFactorChanged(float page_scale_factor) {}
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index a7f8944a..aa7b5ad 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -179,7 +179,6 @@
   IPC_STRUCT_TRAITS_MEMBER(cookie_enabled)
   IPC_STRUCT_TRAITS_MEMBER(navigate_on_drag_drop)
   IPC_STRUCT_TRAITS_MEMBER(spatial_navigation_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(caret_browsing_enabled)
   IPC_STRUCT_TRAITS_MEMBER(v8_cache_options)
   IPC_STRUCT_TRAITS_MEMBER(accelerated_video_decode_enabled)
   IPC_STRUCT_TRAITS_MEMBER(animation_policy)
@@ -316,6 +315,7 @@
   IPC_STRUCT_TRAITS_MEMBER(accept_languages)
   IPC_STRUCT_TRAITS_MEMBER(disable_client_blocked_error_page)
   IPC_STRUCT_TRAITS_MEMBER(plugin_fullscreen_allowed)
+  IPC_STRUCT_TRAITS_MEMBER(caret_browsing_enabled)
 #if defined(OS_LINUX)
   IPC_STRUCT_TRAITS_MEMBER(system_font_family_name)
 #endif
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index a387962..6d7b23c 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -176,7 +176,7 @@
 
 // Enable document policy for configuring and restricting feature behavior.
 const base::Feature kDocumentPolicy{"DocumentPolicy",
-                                    base::FEATURE_DISABLED_BY_DEFAULT};
+                                    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable document policy negotiation mechanism.
 const base::Feature kDocumentPolicyNegotiation{
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc
index ee04a0e3..cd3bda8e 100644
--- a/content/public/common/content_switch_dependent_feature_overrides.cc
+++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -44,9 +44,6 @@
        std::cref(network::features::kCrossOriginEmbedderPolicy),
        base::FeatureList::OVERRIDE_ENABLE_FEATURE},
       {switches::kEnableExperimentalWebPlatformFeatures,
-       std::cref(features::kDocumentPolicy),
-       base::FeatureList::OVERRIDE_ENABLE_FEATURE},
-      {switches::kEnableExperimentalWebPlatformFeatures,
        std::cref(features::kDocumentPolicyNegotiation),
        base::FeatureList::OVERRIDE_ENABLE_FEATURE},
       {switches::kEnableExperimentalWebPlatformFeatures,
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 86f9241..2ab2a020 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -105,6 +105,9 @@
 const char kDisableBackgroundTimerThrottling[] =
     "disable-background-timer-throttling";
 
+// Disables the BackForwardCache feature.
+const char kDisableBackForwardCache[] = "disable-back-forward-cache";
+
 // Disable one or more Blink runtime-enabled features.
 // Use names from runtime_enabled_features.json5, separated by commas.
 // Applied after kEnableBlinkFeatures, and after other flags that change these
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 36867bd4..12f04f6 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -40,6 +40,7 @@
 CONTENT_EXPORT extern const char
     kDisableBackgroundingOccludedWindowsForTesting[];
 CONTENT_EXPORT extern const char kDisableBackgroundTimerThrottling[];
+CONTENT_EXPORT extern const char kDisableBackForwardCache[];
 CONTENT_EXPORT extern const char kDisableBlinkFeatures[];
 CONTENT_EXPORT extern const char kDisableDatabases[];
 CONTENT_EXPORT extern const char kDisableDisplayList2dCanvas[];
diff --git a/content/public/common/web_preferences.cc b/content/public/common/web_preferences.cc
index 066c799..8a50eef5f 100644
--- a/content/public/common/web_preferences.cc
+++ b/content/public/common/web_preferences.cc
@@ -173,7 +173,6 @@
       smart_insert_delete_enabled(false),
 #endif
       spatial_navigation_enabled(false),
-      caret_browsing_enabled(false),
       navigate_on_drag_drop(true),
       v8_cache_options(blink::mojom::V8CacheOptions::kDefault),
       record_whole_document(false),
diff --git a/content/public/common/web_preferences.h b/content/public/common/web_preferences.h
index e2183b7..d4ba8636 100644
--- a/content/public/common/web_preferences.h
+++ b/content/public/common/web_preferences.h
@@ -178,7 +178,6 @@
   bool initialize_at_minimum_page_scale;
   bool smart_insert_delete_enabled;
   bool spatial_navigation_enabled;
-  bool caret_browsing_enabled;
   bool navigate_on_drag_drop;
   blink::mojom::V8CacheOptions v8_cache_options;
   bool record_whole_document;
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index d4d39c7..b8d0ab4 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -3052,38 +3052,6 @@
   run_loop_.Quit();
 }
 
-ConsoleObserverDelegate::ConsoleObserverDelegate(WebContents* web_contents,
-                                                 const std::string& filter)
-    : web_contents_(web_contents), filter_(filter) {}
-
-ConsoleObserverDelegate::~ConsoleObserverDelegate() {}
-
-void ConsoleObserverDelegate::Wait() {
-  run_loop_.Run();
-}
-
-bool ConsoleObserverDelegate::DidAddMessageToConsole(
-    WebContents* source,
-    blink::mojom::ConsoleMessageLevel log_level,
-    const base::string16& message,
-    int32_t line_no,
-    const base::string16& source_id) {
-  DCHECK(source == web_contents_);
-
-  std::string ascii_message = base::UTF16ToASCII(message);
-  if (base::MatchPattern(ascii_message, filter_)) {
-    messages_.push_back(ascii_message);
-    run_loop_.Quit();
-  }
-  return false;
-}
-
-std::string ConsoleObserverDelegate::message() {
-  if (messages_.empty())
-    return std::string();
-  return messages_.back();
-}
-
 namespace {
 mojo::Remote<blink::mojom::FileSystemManager> GetFileSystemManager(
     RenderProcessHost* rph) {
@@ -3595,9 +3563,11 @@
     runner_->Quit();
 }
 
-bool CompareWebContentsOutputToReference(WebContents* web_contents,
-                                         const base::FilePath& expected_path,
-                                         const gfx::Size& snapshot_size) {
+bool CompareWebContentsOutputToReference(
+    WebContents* web_contents,
+    const base::FilePath& expected_path,
+    const gfx::Size& snapshot_size,
+    const cc::PixelComparator& comparator) {
   // Produce a frame of output first to ensure the system is in a consistent,
   // known state.
   {
@@ -3633,8 +3603,7 @@
               SkIRect::MakeWH(snapshot_size.width(), snapshot_size.height()));
 
           snapshot_matches =
-              cc::MatchesPNGFile(clipped_bitmap, expected_path,
-                                 cc::ManhattanDistancePixelComparator());
+              cc::MatchesPNGFile(clipped_bitmap, expected_path, comparator);
 
           // When rebaselining the pixel test, the test may fail. However, the
           // reference file will still be overwritten.
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 536701c9..49ef8c989 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -25,6 +25,7 @@
 #include "base/strings/string16.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
+#include "cc/test/pixel_test_utils.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "content/public/browser/browser_message_filter.h"
 #include "content/public/browser/notification_observer.h"
@@ -1575,9 +1576,6 @@
 // A test utility that monitors console messages sent to a WebContents. This
 // can be used to wait for a message that matches a specific filter, an
 // arbitrary message, or monitor all messages sent to the WebContents' console.
-// TODO(devlin): Convert existing tests to Use this in lieu of
-// ConsoleObserverDelegate, since it doesn't require overriding the WebContents'
-// delegate (which isn't always appropriate in a test).
 class WebContentsConsoleObserver : public WebContentsObserver {
  public:
   struct Message {
@@ -1626,41 +1624,6 @@
   std::vector<Message> messages_;
 };
 
-// A WebContentsDelegate that catches messages sent to the console.
-// DEPRECATED. Prefer WebContentsConsoleObserver.
-// TODO(devlin): Update usages and remove this.
-class ConsoleObserverDelegate : public WebContentsDelegate {
- public:
-  ConsoleObserverDelegate(WebContents* web_contents, const std::string& filter);
-  ~ConsoleObserverDelegate() override;
-
-  // WebContentsDelegate method:
-  bool DidAddMessageToConsole(WebContents* source,
-                              blink::mojom::ConsoleMessageLevel log_level,
-                              const base::string16& message,
-                              int32_t line_no,
-                              const base::string16& source_id) override;
-
-  // Returns all the messages sent to the console.
-  std::vector<std::string> messages() { return messages_; }
-
-  // Returns the most recent message sent to the console.
-  std::string message();
-
-  // Waits for the next message captured by the filter to be sent to the
-  // console.
-  void Wait();
-
- private:
-  WebContents* web_contents_;
-  std::string filter_;
-  std::vector<std::string> messages_;
-
-  base::RunLoop run_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(ConsoleObserverDelegate);
-};
-
 // Static methods that inject particular IPCs into the message pipe as if they
 // came from |process|. Used to simulate a compromised renderer.
 class PwnMessageHelper {
@@ -1911,9 +1874,12 @@
 // ManhattanDistancePixelComparator which allows some small differences.  If
 // the flag switches::kRebaselinePixelTests (--rebaseline-pixel-tests) is set,
 // this function will (over)write the reference file with the produced output.
-bool CompareWebContentsOutputToReference(WebContents* web_contents,
-                                         const base::FilePath& expected_path,
-                                         const gfx::Size& snapshot_size);
+bool CompareWebContentsOutputToReference(
+    WebContents* web_contents,
+    const base::FilePath& expected_path,
+    const gfx::Size& snapshot_size,
+    const cc::PixelComparator& comparator =
+        cc::ManhattanDistancePixelComparator());
 
 }  // namespace content
 
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc
index 1b91e32f..dac5291 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.cc
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -222,6 +222,11 @@
       routing_id(), delegate_id, available));
 }
 
+void RendererWebMediaPlayerDelegate::DidBufferUnderflow(int player_id) {
+  Send(new MediaPlayerDelegateHostMsg_OnBufferUnderflow(routing_id(),
+                                                        player_id));
+}
+
 void RendererWebMediaPlayerDelegate::WasHidden() {
   RecordAction(base::UserMetricsAction("Media.Hidden"));
 
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h
index 686c3f9f..251e7f2 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.h
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -72,6 +72,7 @@
       const media_session::MediaPosition& position) override;
   void DidPictureInPictureAvailabilityChange(int delegate_id,
                                              bool available) override;
+  void DidBufferUnderflow(int player_id) override;
 
   // content::RenderFrameObserver overrides.
   void WasHidden() override;
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index b7e7b1f..07c7e50 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -2144,6 +2144,7 @@
 }
 
 void RenderThreadImpl::ReleaseFreeMemory() {
+  TRACE_EVENT0("blink", "RenderThreadImpl::ReleaseFreeMemory()");
   base::allocator::ReleaseFreeMemory();
   discardable_memory_allocator_->ReleaseFreeMemory();
 
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 3c8aebe7..739b8726 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -682,8 +682,6 @@
   if (prefs.spatial_navigation_enabled)
     WebRuntimeFeatures::EnableKeyboardFocusableScrollers(true);
 
-  settings->SetCaretBrowsingEnabled(prefs.caret_browsing_enabled);
-
   settings->SetSelectionIncludesAltImageText(true);
 
   settings->SetV8CacheOptions(
@@ -1650,9 +1648,12 @@
     blink::SetFocusRingColor(renderer_prefs.focus_ring_color);
   }
 
-  if (GetWebView() &&
-      old_accept_languages != renderer_preferences_.accept_languages) {
-    GetWebView()->AcceptLanguagesChanged();
+  if (GetWebView()) {
+    if (old_accept_languages != renderer_preferences_.accept_languages)
+      GetWebView()->AcceptLanguagesChanged();
+
+    GetWebView()->GetSettings()->SetCaretBrowsingEnabled(
+        renderer_preferences_.caret_browsing_enabled);
   }
 }
 
diff --git a/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png b/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png
new file mode 100644
index 0000000..296a7d8
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_checkbox_android_kitkat.png
Binary files differ
diff --git a/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png b/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png
new file mode 100644
index 0000000..a3f467dfb
--- /dev/null
+++ b/content/test/data/forms/form_controls_browsertest_radio_android_kitkat.png
Binary files differ
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index a5e7408..f5828d0 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -845,7 +845,7 @@
 crbug.com/1092734 [ android qualcomm-adreno-(tm)-540 passthrough ] conformance2/textures/webgl_canvas/tex-2d-rgb565-rgb-unsigned_byte.html [ Failure ]
 crbug.com/1095679 [ android qualcomm-adreno-(tm)-540 no-passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ RetryOnFailure ]
 crbug.com/1095679 [ android qualcomm-adreno-(tm)-540 no-passthrough ] conformance2/textures/canvas/tex-2d-rgb10_a2-rgba-unsigned_int_2_10_10_10_rev.html [ RetryOnFailure ]
-
+crbug.com/1111516 [ android qualcomm-adreno-(tm)-540 no-passthrough ] conformance2/textures/canvas/tex-2d-r11f_g11f_b10f-rgb-unsigned_int_10f_11f_11f_rev.html [ RetryOnFailure ]
 
 # This test is failing on Android Pixel 2 and 3 (Qualcomm)
 # Seems to be an OpenGL ES bug.
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index 1625233..d291625c 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -51,4 +51,9 @@
 const base::Feature kReportKeepaliveUkm{"ReportKeepaliveUkm",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables the granted OAuth2 scopes to be returned in the GetAuthToken callback
+// function.
+const base::Feature kReturnScopesInGetAuthToken{
+    "ReturnScopesInGetAuthToken", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace extensions_features
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index f874de04..57894da 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -29,6 +29,8 @@
 
 extern const base::Feature kReportKeepaliveUkm;
 
+extern const base::Feature kReturnScopesInGetAuthToken;
+
 }  // namespace extensions_features
 
 #endif  // EXTENSIONS_COMMON_EXTENSION_FEATURES_H_
diff --git a/google_apis/gaia/fake_gaia.cc b/google_apis/gaia/fake_gaia.cc
index 75d65cc2..92176c8 100644
--- a/google_apis/gaia/fake_gaia.cc
+++ b/google_apis/gaia/fake_gaia.cc
@@ -748,6 +748,7 @@
       response_dict.SetString("expiresIn",
                               base::NumberToString(token_info->expires_in));
       response_dict.SetString("token", token_info->token);
+      response_dict.SetString("grantedScopes", scope);
       response_dict.SetString("id_token", token_info->id_token);
       FormatOkJSONResponse(response_dict, http_response);
       return;
diff --git a/google_apis/gaia/oauth2_mint_token_flow.cc b/google_apis/gaia/oauth2_mint_token_flow.cc
index 0a2d292..8ea14b3a 100644
--- a/google_apis/gaia/oauth2_mint_token_flow.cc
+++ b/google_apis/gaia/oauth2_mint_token_flow.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <set>
 #include <string>
 #include <vector>
 
@@ -54,6 +55,7 @@
 const char kConsentKey[] = "consent";
 const char kExpiresInKey[] = "expiresIn";
 const char kScopesKey[] = "scopes";
+const char kGrantedScopesKey[] = "grantedScopes";
 const char kDescriptionKey[] = "description";
 const char kDetailKey[] = "detail";
 const char kDetailSeparators[] = "\n";
@@ -169,10 +171,12 @@
 
 OAuth2MintTokenFlow::~OAuth2MintTokenFlow() { }
 
-void OAuth2MintTokenFlow::ReportSuccess(const std::string& access_token,
-                                        int time_to_live) {
+void OAuth2MintTokenFlow::ReportSuccess(
+    const std::string& access_token,
+    const std::set<std::string>& granted_scopes,
+    int time_to_live) {
   if (delegate_)
-    delegate_->OnMintTokenSuccess(access_token, time_to_live);
+    delegate_->OnMintTokenSuccess(access_token, granted_scopes, time_to_live);
 
   // |this| may already be deleted.
 }
@@ -292,10 +296,19 @@
   }
 
   std::string access_token;
+  std::set<std::string> granted_scopes;
   int time_to_live;
-  if (ParseMintTokenResponse(&(*value), &access_token, &time_to_live)) {
-    RecordApiCallResult(OAuth2MintTokenApiCallResult::kMintTokenSuccess);
-    ReportSuccess(access_token, time_to_live);
+  if (ParseMintTokenResponse(&(*value), &access_token, &granted_scopes,
+                             &time_to_live)) {
+    if (granted_scopes.empty()) {
+      granted_scopes.insert(parameters_.scopes.begin(),
+                            parameters_.scopes.end());
+      RecordApiCallResult(
+          OAuth2MintTokenApiCallResult::kMintTokenSuccessWithFallbackScopes);
+    } else {
+      RecordApiCallResult(OAuth2MintTokenApiCallResult::kMintTokenSuccess);
+    }
+    ReportSuccess(access_token, granted_scopes, time_to_live);
   } else {
     RecordApiCallResult(OAuth2MintTokenApiCallResult::kParseMintTokenFailure);
     ReportFailure(GoogleServiceAuthError::FromUnexpectedServiceResponse(
@@ -315,12 +328,15 @@
 }
 
 // static
-bool OAuth2MintTokenFlow::ParseMintTokenResponse(const base::Value* dict,
-                                                 std::string* access_token,
-                                                 int* time_to_live) {
+bool OAuth2MintTokenFlow::ParseMintTokenResponse(
+    const base::Value* dict,
+    std::string* access_token,
+    std::set<std::string>* granted_scopes,
+    int* time_to_live) {
   CHECK(dict);
   CHECK(dict->is_dict());
   CHECK(access_token);
+  CHECK(granted_scopes);
   CHECK(time_to_live);
 
   const std::string* ttl_string = dict->FindStringKey(kExpiresInKey);
@@ -332,6 +348,27 @@
     return false;
 
   *access_token = *access_token_ptr;
+
+  const std::string* granted_scopes_string =
+      dict->FindStringKey(kGrantedScopesKey);
+
+  if (!granted_scopes_string) {
+    // TODO(https://crbug.com/1100535): Once unbundled consent has successfully
+    // launched, remove the fallback to the requested scopes when the
+    // grantedScopes parameter is missing from the response. After launch,
+    // ParseMintTokenResponse should return false in these situations.
+    return true;
+  }
+
+  const std::vector<std::string> granted_scopes_vector =
+      base::SplitString(*granted_scopes_string, " ", base::TRIM_WHITESPACE,
+                        base::SPLIT_WANT_NONEMPTY);
+  if (granted_scopes_vector.empty())
+    return false;
+
+  const std::set<std::string> granted_scopes_set(granted_scopes_vector.begin(),
+                                                 granted_scopes_vector.end());
+  *granted_scopes = std::move(granted_scopes_set);
   return true;
 }
 
diff --git a/google_apis/gaia/oauth2_mint_token_flow.h b/google_apis/gaia/oauth2_mint_token_flow.h
index dfb3ca67..8de169d 100644
--- a/google_apis/gaia/oauth2_mint_token_flow.h
+++ b/google_apis/gaia/oauth2_mint_token_flow.h
@@ -5,6 +5,7 @@
 #ifndef GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
 #define GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
 
+#include <set>
 #include <string>
 #include <vector>
 
@@ -41,7 +42,8 @@
   // DEPRECATED:
   // kRemoteConsentFallback = 8
   kParseRemoteConsentFailure = 9,
-  kMaxValue = kParseRemoteConsentFailure
+  kMintTokenSuccessWithFallbackScopes = 10,
+  kMaxValue = kMintTokenSuccessWithFallbackScopes
 };
 
 // IssueAdvice: messages to show to the user to get a user's approval.
@@ -134,6 +136,7 @@
   class Delegate {
    public:
     virtual void OnMintTokenSuccess(const std::string& access_token,
+                                    const std::set<std::string>& granted_scopes,
                                     int time_to_live) {}
     virtual void OnIssueAdviceSuccess(const IssueAdviceInfo& issue_advice)  {}
     virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) {}
@@ -191,7 +194,9 @@
                            ParseRemoteConsentResponse_BadCookieList);
   FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseMintTokenResponse);
 
-  void ReportSuccess(const std::string& access_token, int time_to_live);
+  void ReportSuccess(const std::string& access_token,
+                     const std::set<std::string>& granted_scopes,
+                     int time_to_live);
   void ReportIssueAdviceSuccess(const IssueAdviceInfo& issue_advice);
   void ReportRemoteConsentSuccess(
       const RemoteConsentResolutionData& resolution_data);
@@ -202,8 +207,17 @@
   static bool ParseRemoteConsentResponse(
       const base::Value* dict,
       RemoteConsentResolutionData* resolution_data);
+
+  // Currently, grantedScopes is a new parameter for an unlaunched feature, so
+  // it may not always be populated in server responses. In those cases,
+  // ParseMintTokenResponse can still succeed and will just leave the
+  // granted_scopes set unmodified. When the grantedScopes parameter is present
+  // and the function returns true, granted_scopes will include the scopes
+  // returned by the server. Once the feature is fully launched, this function
+  // will be updated to fail if the grantedScopes parameter is missing.
   static bool ParseMintTokenResponse(const base::Value* dict,
                                      std::string* access_token,
+                                     std::set<std::string>* granted_scopes,
                                      int* time_to_live);
 
   Delegate* delegate_;
diff --git a/google_apis/gaia/oauth2_mint_token_flow_unittest.cc b/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
index 39e698e..80247f9 100644
--- a/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
+++ b/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
@@ -7,6 +7,7 @@
 #include "google_apis/gaia/oauth2_mint_token_flow.h"
 
 #include <memory>
+#include <set>
 #include <string>
 #include <vector>
 
@@ -35,8 +36,25 @@
     "{"
     "  \"token\": \"at1\","
     "  \"issueAdvice\": \"Auto\","
+    "  \"expiresIn\": \"3600\","
+    "  \"grantedScopes\": \"http://scope1 http://scope2\""
+    "}";
+
+static const char kTokenResponseNoGrantedScopes[] =
+    "{"
+    "  \"token\": \"at1\","
+    "  \"issueAdvice\": \"Auto\","
     "  \"expiresIn\": \"3600\""
     "}";
+
+static const char kTokenResponseEmptyGrantedScopes[] =
+    "{"
+    "  \"token\": \"at1\","
+    "  \"issueAdvice\": \"Auto\","
+    "  \"expiresIn\": \"3600\","
+    "  \"grantedScopes\": \"\""
+    "}";
+
 static const char kTokenResponseNoAccessToken[] =
     "{"
     "  \"issueAdvice\": \"Auto\""
@@ -182,8 +200,10 @@
   MockDelegate() {}
   ~MockDelegate() override {}
 
-  MOCK_METHOD2(OnMintTokenSuccess, void(const std::string& access_token,
-                                        int time_to_live));
+  MOCK_METHOD3(OnMintTokenSuccess,
+               void(const std::string& access_token,
+                    const std::set<std::string>& granted_scopes,
+                    int time_to_live));
   MOCK_METHOD1(OnIssueAdviceSuccess,
                void (const IssueAdviceInfo& issue_advice));
   MOCK_METHOD1(OnRemoteConsentSuccess,
@@ -354,20 +374,46 @@
 TEST_F(OAuth2MintTokenFlowTest, ParseMintTokenResponse) {
   {  // Access token missing.
     std::unique_ptr<base::Value> json = ParseJson(kTokenResponseNoAccessToken);
-    std::string at;
-    int ttl;
-    EXPECT_FALSE(OAuth2MintTokenFlow::ParseMintTokenResponse(json.get(), &at,
-                                                             &ttl));
-    EXPECT_TRUE(at.empty());
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    int time_to_live;
+    EXPECT_FALSE(OAuth2MintTokenFlow::ParseMintTokenResponse(
+        json.get(), &access_token, &granted_scopes, &time_to_live));
+    EXPECT_TRUE(access_token.empty());
+  }
+  {  // Granted scopes parameter is there but is empty.
+    std::unique_ptr<base::Value> json =
+        ParseJson(kTokenResponseEmptyGrantedScopes);
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    int time_to_live;
+    EXPECT_FALSE(OAuth2MintTokenFlow::ParseMintTokenResponse(
+        json.get(), &access_token, &granted_scopes, &time_to_live));
+    EXPECT_TRUE(granted_scopes.empty());
+  }
+  {  // Granted scopes parameter is missing.
+    std::unique_ptr<base::Value> json =
+        ParseJson(kTokenResponseNoGrantedScopes);
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    int time_to_live;
+    EXPECT_TRUE(OAuth2MintTokenFlow::ParseMintTokenResponse(
+        json.get(), &access_token, &granted_scopes, &time_to_live));
+    EXPECT_EQ("at1", access_token);
+    EXPECT_EQ(3600, time_to_live);
+    EXPECT_TRUE(granted_scopes.empty());
   }
   {  // All good.
     std::unique_ptr<base::Value> json = ParseJson(kValidTokenResponse);
-    std::string at;
-    int ttl;
-    EXPECT_TRUE(OAuth2MintTokenFlow::ParseMintTokenResponse(json.get(), &at,
-                                                            &ttl));
-    EXPECT_EQ("at1", at);
-    EXPECT_EQ(3600, ttl);
+    std::string access_token;
+    std::set<std::string> granted_scopes;
+    int time_to_live;
+    EXPECT_TRUE(OAuth2MintTokenFlow::ParseMintTokenResponse(
+        json.get(), &access_token, &granted_scopes, &time_to_live));
+    EXPECT_EQ("at1", access_token);
+    EXPECT_EQ(3600, time_to_live);
+    EXPECT_EQ(std::set<std::string>({"http://scope1", "http://scope2"}),
+              granted_scopes);
   }
 }
 
@@ -569,7 +615,8 @@
 
 TEST_F(OAuth2MintTokenFlowTest, ProcessApiCallSuccess_GoodToken) {
   CreateFlow(OAuth2MintTokenFlow::MODE_MINT_TOKEN_NO_FORCE);
-  EXPECT_CALL(delegate_, OnMintTokenSuccess("at1", 3600));
+  std::set<std::string> granted_scopes = {"http://scope1", "http://scope2"};
+  EXPECT_CALL(delegate_, OnMintTokenSuccess("at1", granted_scopes, 3600));
   ProcessApiCallSuccess(head_200_.get(),
                         std::make_unique<std::string>(kValidTokenResponse));
   histogram_tester_.ExpectUniqueSample(
@@ -657,3 +704,14 @@
       kOAuth2MintTokenApiCallResultHistogram,
       OAuth2MintTokenApiCallResult::kApiCallFailure, 1);
 }
+
+TEST_F(OAuth2MintTokenFlowTest, ProcessApiCallSuccess_NoGrantedScopes) {
+  CreateFlow(OAuth2MintTokenFlow::MODE_MINT_TOKEN_NO_FORCE);
+  std::set<std::string> granted_scopes = {"http://scope1", "http://scope2"};
+  EXPECT_CALL(delegate_, OnMintTokenSuccess("at1", granted_scopes, 3600));
+  ProcessApiCallSuccess(head_200_.get(), std::make_unique<std::string>(
+                                             kTokenResponseNoGrantedScopes));
+  histogram_tester_.ExpectUniqueSample(
+      kOAuth2MintTokenApiCallResultHistogram,
+      OAuth2MintTokenApiCallResult::kMintTokenSuccessWithFallbackScopes, 1);
+}
diff --git a/gpu/command_buffer/service/image_reader_gl_owner.cc b/gpu/command_buffer/service/image_reader_gl_owner.cc
index 47e1b0a6a..32e0536 100644
--- a/gpu/command_buffer/service/image_reader_gl_owner.cc
+++ b/gpu/command_buffer/service/image_reader_gl_owner.cc
@@ -419,7 +419,7 @@
   image_reader_ptr->frame_available_cb_.Run();
 }
 
-void ImageReaderGLOwner::GetCodedSizeAndVisibleRect(
+bool ImageReaderGLOwner::GetCodedSizeAndVisibleRect(
     gfx::Size rotated_visible_size,
     gfx::Size* coded_size,
     gfx::Rect* visible_rect) {
@@ -436,7 +436,7 @@
   if (!buffer) {
     *coded_size = gfx::Size();
     *visible_rect = gfx::Rect();
-    return;
+    return false;
   }
   // Get the buffer descriptor. Note that for querying the buffer descriptor, we
   // do not need to wait on the AHB to be ready.
@@ -445,6 +445,8 @@
 
   *visible_rect = GetCropRect();
   *coded_size = gfx::Size(desc.width, desc.height);
+
+  return true;
 }
 
 ImageReaderGLOwner::ImageRef::ImageRef() = default;
diff --git a/gpu/command_buffer/service/image_reader_gl_owner.h b/gpu/command_buffer/service/image_reader_gl_owner.h
index b9205e36..b6c2d2c 100644
--- a/gpu/command_buffer/service/image_reader_gl_owner.h
+++ b/gpu/command_buffer/service/image_reader_gl_owner.h
@@ -41,7 +41,7 @@
   void ReleaseBackBuffers() override;
   std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
   GetAHardwareBuffer() override;
-  void GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
+  bool GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
                                   gfx::Size* coded_size,
                                   gfx::Rect* visible_rect) override;
 
diff --git a/gpu/command_buffer/service/mock_texture_owner.h b/gpu/command_buffer/service/mock_texture_owner.h
index 8f861c31..2cf23aff 100644
--- a/gpu/command_buffer/service/mock_texture_owner.h
+++ b/gpu/command_buffer/service/mock_texture_owner.h
@@ -37,7 +37,7 @@
   MOCK_METHOD1(OnTextureDestroyed, void(gpu::gles2::AbstractTexture*));
   MOCK_METHOD1(SetFrameAvailableCallback, void(const base::RepeatingClosure&));
   MOCK_METHOD3(GetCodedSizeAndVisibleRect,
-               void(gfx::Size rotated_visible_size,
+               bool(gfx::Size rotated_visible_size,
                     gfx::Size* coded_size,
                     gfx::Rect* visible_rect));
 
diff --git a/gpu/command_buffer/service/surface_texture_gl_owner.cc b/gpu/command_buffer/service/surface_texture_gl_owner.cc
index c729672..a99a5c42 100644
--- a/gpu/command_buffer/service/surface_texture_gl_owner.cc
+++ b/gpu/command_buffer/service/surface_texture_gl_owner.cc
@@ -94,7 +94,7 @@
   return nullptr;
 }
 
-void SurfaceTextureGLOwner::GetCodedSizeAndVisibleRect(
+bool SurfaceTextureGLOwner::GetCodedSizeAndVisibleRect(
     gfx::Size rotated_visible_size,
     gfx::Size* coded_size,
     gfx::Rect* visible_rect) {
@@ -104,7 +104,7 @@
   if (!surface_texture_) {
     *visible_rect = gfx::Rect();
     *coded_size = gfx::Size();
-    return;
+    return false;
   }
 
   float mtx[16];
@@ -139,6 +139,8 @@
 
     base::debug::DumpWithoutCrashing();
   }
+
+  return true;
 }
 
 // static
diff --git a/gpu/command_buffer/service/surface_texture_gl_owner.h b/gpu/command_buffer/service/surface_texture_gl_owner.h
index e6d851c..d1ecf45d 100644
--- a/gpu/command_buffer/service/surface_texture_gl_owner.h
+++ b/gpu/command_buffer/service/surface_texture_gl_owner.h
@@ -36,7 +36,7 @@
   void ReleaseBackBuffers() override;
   std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
   GetAHardwareBuffer() override;
-  void GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
+  bool GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
                                   gfx::Size* coded_size,
                                   gfx::Rect* visible_rect) override;
 
diff --git a/gpu/command_buffer/service/texture_owner.h b/gpu/command_buffer/service/texture_owner.h
index fcd781b8..81bd88c1 100644
--- a/gpu/command_buffer/service/texture_owner.h
+++ b/gpu/command_buffer/service/texture_owner.h
@@ -98,7 +98,8 @@
   // expect to have rotation and MediaPlayer reports rotated size. For
   // MediaCodec we don't expect rotation in ST so visible_size (i.e crop rect
   // from codec) can be used.
-  virtual void GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
+  // Returns whether call was successful or not.
+  virtual bool GetCodedSizeAndVisibleRect(gfx::Size rotated_visible_size,
                                           gfx::Size* coded_size,
                                           gfx::Rect* visible_rect) = 0;
 
diff --git a/gpu/ipc/service/stream_texture_android.cc b/gpu/ipc/service/stream_texture_android.cc
index f89f5a4..c23515f 100644
--- a/gpu/ipc/service/stream_texture_android.cc
+++ b/gpu/ipc/service/stream_texture_android.cc
@@ -225,8 +225,12 @@
 
   gfx::Rect visible_rect;
   gfx::Size coded_size;
-  texture_owner_->GetCodedSizeAndVisibleRect(rotated_visible_size_, &coded_size,
-                                             &visible_rect);
+  if (!texture_owner_->GetCodedSizeAndVisibleRect(rotated_visible_size_,
+                                                  &coded_size, &visible_rect)) {
+    // if we failed to get right size fallback to visible size.
+    coded_size = rotated_visible_size_;
+    visible_rect = gfx::Rect(coded_size);
+  }
 
   if (coded_size != coded_size_ || visible_rect != visible_rect_) {
     coded_size_ = coded_size;
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index dea7e98..9ce80989 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -1222,10 +1222,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/mac10.13_retina-blink-rel"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/mac10.14-blink-rel"
         includable_only: true
       }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 9e531db..87343bc 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -10255,7 +10255,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/archive\":{\"archive_datas\":[{\"archive_type\":\"ARCHIVE_TYPE_ZIP\",\"dirs\":[\"locales\",\"swiftshader\"],\"files\":[\"chrome\",\"chrome_100_percent.pak\",\"chrome_200_percent.pak\",\"crashpad_handler\",\"headless_lib.pak\",\"icudtl.dat\",\"nacl_helper\",\"nacl_irt_x86_64.nexe\",\"resources.pak\",\"snapshot_blob.bin\"],\"gcs_bucket\":\"ash-chromium-on-linux-prebuilts\",\"gcs_path\":\"x86_64/{%position%}/ash-chromium.zip\"}]},\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"mastername\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
+      properties: "{\"$build/archive\":{\"archive_datas\":[{\"archive_type\":\"ARCHIVE_TYPE_ZIP\",\"dirs\":[\"locales\",\"swiftshader\"],\"files\":[\"chrome\",\"chrome_100_percent.pak\",\"chrome_200_percent.pak\",\"crashpad_handler\",\"headless_lib.pak\",\"icudtl.dat\",\"libminigbm.so\",\"nacl_helper\",\"nacl_irt_x86_64.nexe\",\"resources.pak\",\"snapshot_blob.bin\"],\"gcs_bucket\":\"ash-chromium-on-linux-prebuilts\",\"gcs_path\":\"x86_64/{%position%}/ash-chromium.zip\"}]},\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"mastername\":\"chromium.fyi\",\"recipe\":\"chromium\"}"
       execution_timeout_secs: 36000
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -27177,42 +27177,6 @@
       }
     }
     builders {
-      name: "mac10.13_retina-blink-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        cmd: "recipes"
-      }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"mastername\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "luci-resultdb"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-      }
-    }
-    builders {
       name: "mac10.14-blink-rel"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 324df5d..45645ec 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -15540,9 +15540,6 @@
     name: "buildbucket/luci.chromium.try/mac10.13-blink-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/mac10.13_retina-blink-rel"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/mac10.14-blink-rel"
   }
   builders {
diff --git a/infra/config/subprojects/chromium/master-only/ci.star b/infra/config/subprojects/chromium/master-only/ci.star
index 1917fe5..b51c09e 100644
--- a/infra/config/subprojects/chromium/master-only/ci.star
+++ b/infra/config/subprojects/chromium/master-only/ci.star
@@ -1520,6 +1520,7 @@
                     'crashpad_handler',
                     'headless_lib.pak',
                     'icudtl.dat',
+                    'libminigbm.so',
                     'nacl_helper',
                     'nacl_irt_x86_64.nexe',
                     'resources.pak',
diff --git a/infra/config/subprojects/chromium/master-only/try.star b/infra/config/subprojects/chromium/master-only/try.star
index 449fb86..d0e0385 100644
--- a/infra/config/subprojects/chromium/master-only/try.star
+++ b/infra/config/subprojects/chromium/master-only/try.star
@@ -61,10 +61,6 @@
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.13_retina-blink-rel',
-)
-
-try_.blink_mac_builder(
     name = 'mac10.14-blink-rel',
 )
 
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index edc2fbb..9c60400 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">‏تعذّر على متصفِّح Chromium التحقُّق من كلمات المرور. يُرجى التحقُّق من اتصال الإنترنت.</translation>
 <translation id="3639997914391704523">‏يجب تسجيل الدخول إلى حسابك على Google ليتمكّن Chromium من التحقُّق من كلمات المرور.</translation>
 <translation id="3805899903892079518">‏لا تتوفر لدى Chromium إمكانية الدخول إلى الصور أو الفيديوهات. تستطيع تفعيل الدخول في إعدادات نظام التشغيل iOS &gt; الخصوصية &gt; الصور.</translation>
+<translation id="4166206055865952171">‏جعل Chromium المتصفِّح التلقائي</translation>
 <translation id="4555020257205549924">‏عند تفعيل هذه الميزة، سيقترح Chromium ترجمة الصفحات المكتوبة بلغات أخرى باستخدام "ترجمة Google". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">‏تفعيل الماسح الضوئي في Chromium</translation>
 <translation id="4787850887676698916">‏ستظهر علامات التبويب التي فتحتها في Chromium على أجهزتك الأخرى هنا.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">‏استمتع بتجربة أفضل في Chromium حسب موقعك.</translation>
 <translation id="6820823224820483452">‏تعذّر على متصفِّح Chromium التحقُّق من جميع كلمات المرور. يُرجى إعادة المحاولة غدًا.</translation>
 <translation id="7099326575020694068">‏يتعذر على Chromium استخدام الكاميرا في وضع تقسيم العرض</translation>
+<translation id="7118091470949186573">‏يمكنك الآن استخدام Chromium في أي وقت تنقر فيه على روابط في الرسائل والمستندات والتطبيقات الأخرى.</translation>
 <translation id="7173114856073700355">فتح الإعدادات</translation>
 <translation id="7208566199746267865">‏يوفر Chromium وقتك من خلال تجميع حساباتك على الويب. يمكنك إضافة حسابات أو إزالتها في الإعدادات.</translation>
 <translation id="7269362888766543920">‏تتسبب بعض الإضافات في تعطل Chromium. يُرجى إلغاء تثبتها.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">‏لجعل Chromium المتصفِّح التلقائي، اتّبِع الخطوات التالية:
+        1- افتح "الإعدادات". 
+        2- انقر على "تطبيق المتصفِّح التلقائي".
+        3- اختَر Chromium.</translation>
 <translation id="7357211569052832586">‏تمت إزالة البيانات المُحددة من Chromium والأجهزة التي تمت مزامنتها. قد يحتوي حسابك في Google على نماذج أخرى من سجل التصفح، مثل عمليات البحث والأنشطة من خدمات Google الأخرى في history.google.com.</translation>
 <translation id="7400689562045506105">‏استخدام Chromium في كل مكان</translation>
 <translation id="766897673682622022">‏تم الكشف عن كلمة المرور الخاصة بك في عملية اختراق بيانات. لذا ينصح Chromium بتغيير كلمة المرور الآن.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
index 583fa74a..0316007 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium parollarınızı yoxlaya bilmədi. İnternet bağlantınızı yoxlayın.</translation>
 <translation id="3639997914391704523">Google Hesabınız ilə daxil olduqda Chromium parollarınızı yoxlaya bilər.</translation>
 <translation id="3805899903892079518">Chromium məhsulunun foto və videolarınıza girişi yoxdur. iOS Ayarları &gt; Məxfilik &gt; Fotolar bölməsindən girişi aktiv edin.</translation>
+<translation id="4166206055865952171">Chromium'u Defolt Edin</translation>
 <translation id="4555020257205549924">Bu funksiya aktiv olduqda, Chromium Google Tərcümədən istifadə edərək başqa dillərdə yazılmış səhifələri tərcümə etməyi təklif edəcək. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium skanerini aktiv edin</translation>
 <translation id="4787850887676698916">Başqa cihaz ilə Chromium'da açdığınız panellər burada görünəcək.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Məkanınıza əsasən Chromium'da daha yaxşı təcrübə əldə edin.</translation>
 <translation id="6820823224820483452">Chromium bütün parolları yoxlaya bilmədi. Sabah yenidən cəhd edin.</translation>
 <translation id="7099326575020694068">Chromium kameranızı Bölünmüş Görüntü rejimində istifadə edə bilməz</translation>
+<translation id="7118091470949186573">İndi istənilən vaxt mesajlar, sənədlər və digər tətbiqlərdə keçidlərə toxunduqda Chromium'u istifadə edə bilərsiniz.</translation>
 <translation id="7173114856073700355">Ayarları Açın</translation>
 <translation id="7208566199746267865">Chromium hesablarınızı vebə gətirməklə vaxtınıza qənaət edir. Hesabları Ayarlar bölməsindən əlavə edə və ya silə bilərsiniz.</translation>
 <translation id="7269362888766543920">Bəzi addonlar Chromium'da xətaya səbəb oldu. Lütfən, onları sistemdən silməyə cəhd edin.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium'u defolt etmək üçün:
+        1. Ayarları açın. 
+        2. Defolt Brauzer Tətbiqi seçiminə toxunun.
+        3. Chromium seçin.</translation>
 <translation id="7357211569052832586">Seçilmiş data Chromium və sinxronizasiya olunmuş cihazdan silindi. Google Hesabınızın history.google.com linkində axtarış və digər Google xidmətlərindən fəaliyyət kimi axtarış tarixçəsi formaları ola bilər.</translation>
 <translation id="7400689562045506105">Chromium'u Hər yerdə İstifadə edin</translation>
 <translation id="766897673682622022">Parolunuz data pozulması zamanı ələ keçirilib. Chromium parolunuzu indi dəyişməyi məsləhət görür.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
index 452c12e..c4e895f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Браўзеру Chromium не ўдалося праверыць паролі. Паспрабуйце праверыць падключэнне да інтэрнэту.</translation>
 <translation id="3639997914391704523">Chromium зможа праверыць паролі толькі пасля таго, як вы ўвойдзеце ва Уліковы запіс Google.</translation>
 <translation id="3805899903892079518">Chromium не мае доступу да вашых фота і відэа. Даць доступ можна ў меню iOS "Налады &gt; Прыватнасць &gt; Фота".</translation>
+<translation id="4166206055865952171">Зрабіце Chromium стандартным браўзерам</translation>
 <translation id="4555020257205549924">Калі гэта функцыя ўключана, Chromium будзе прапаноўваць перакласці старонкі на іншых мовах з дапамогай Перакладчыка Google. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Уключыце сканер Chromium</translation>
 <translation id="4787850887676698916">Тут з'явяцца ўкладкі, адкрытыя вамі ў браўзеры Chromium на іншых прыладах.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Дзякуючы даным аб вашым месцазнаходжанні вы зможаце карыстацца палепшанымі функцыямі Chromium.</translation>
 <translation id="6820823224820483452">Браўзеру Chromium не ўдалося праверыць усе паролі. Паўтарыце спробу заўтра.</translation>
 <translation id="7099326575020694068">Chromium не можа выкарыстоўваць камеру ў рэжыме раздзеленага кадра</translation>
+<translation id="7118091470949186573">Цяпер вы можаце выкарыстоўваць Chromium кожны раз, калі націскаеце на спасылкі ў паведамленнях, дакументах або іншых праграмах.</translation>
 <translation id="7173114856073700355">Адкрыць Налады</translation>
 <translation id="7208566199746267865">Chromium зберагае вам час, злучаючы вашы ўліковыя запісы з інтэрнэтам. Вы можаце дадаваць або выдаляць уліковыя запісы ў "Наладах".</translation>
 <translation id="7269362888766543920">Некаторыя дадатковыя кампаненты выклікаюць збой у браўзеры Chromium. Паспрабуйце выдаліць іх.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Як зрабіць Chromium стандартным браўзерам:
+        1. Адкрыйце праграму Settings ("Налады"). 
+        2. Націсніце Default Browser App ("Стандартны браўзер").
+        3. Выберыце Chromium.</translation>
 <translation id="7357211569052832586">Выбраныя даныя выдалены з браўзера Chromium і сінхранізаваных прылад. На сайце history.google.com могуць быць размешчаны іншыя формы гісторыі праглядаў сайтаў з вашага ўліковага запісу Google, напрыклад пошукавыя запыты і дзеянні ў іншых сэрвісах.</translation>
 <translation id="7400689562045506105">Выкарыстоўвайце Chromium усюды</translation>
 <translation id="766897673682622022">Пры ўцечцы даных быў раскрыты ваш пароль. Chromium рэкамендуе неадкладна змяніць яго.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
index 0098d53..c83fd38e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_cs.xtb
@@ -22,6 +22,7 @@
 <translation id="3344973607274501920">Chromiu se nepodařilo zkontrolovat hesla. Zkuste zkontrolovat připojení k internetu.</translation>
 <translation id="3639997914391704523">Když se přihlásíte pomocí účtu Google, může vám Chromium kontrolovat hesla.</translation>
 <translation id="3805899903892079518">Chromium nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení &gt; Soukromí &gt; Fotky.</translation>
+<translation id="4166206055865952171">Nastavení Chromia jako výchozího prohlížeče</translation>
 <translation id="4555020257205549924">Pokud je tato funkce zapnutá, bude Chromium nabízet překlad stránek v jiných jazycích pomocí Překladače Google.<ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Zapněte čtečku prohlížeče Chromium</translation>
 <translation id="4787850887676698916">Zde se objeví karty, které jste otevřeli v prohlížeči Chromium ve svých ostatních zařízeních.</translation>
@@ -38,10 +39,15 @@
 <translation id="6604711459180487467">Získejte v prohlížeči Chromium lepší funkce založené na poloze.</translation>
 <translation id="6820823224820483452">Chromiu se nepodařilo zkontrolovat všechna hesla. Zkuste to znovu zítra.</translation>
 <translation id="7099326575020694068">Prohlížeč Chromium nemůže používat fotoaparát v režimu Split View.</translation>
+<translation id="7118091470949186573">Nyní můžete Chromium použít pokaždé, když klepnete na odkazy ve zprávách, dokumentech a ostatních aplikacích.</translation>
 <translation id="7173114856073700355">Otevřít nastavení</translation>
 <translation id="7208566199746267865">Chromium vám šetří čas tím, že vaše účty přenáší na web. Účty můžete přidat nebo odstranit v Nastavení.</translation>
 <translation id="7269362888766543920">Některé doplňky způsobují selhání prohlížeče Chromium. Zkuste je prosím odinstalovat.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Postup nastavení Chromia jako výchozího prohlížeče:
+        1. Otevřete nastavení. 
+        2. Klepněte na Výchozí prohlížeč.
+        3. Vyberte Chromium.</translation>
 <translation id="7357211569052832586">Vybraná data byla z prohlížeče Chromium a synchronizovaných zařízení odstraněna. Na stránce history.google.com mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google, například vyhledávací dotazy a aktivita z ostatních služeb Google.</translation>
 <translation id="7400689562045506105">Používejte Chromium všude</translation>
 <translation id="766897673682622022">Vaše heslo bylo vyzrazeno při porušení zabezpečení údajů. Chromium doporučuje heslo okamžitě změnit.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
index 2964b25..21e56dc 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Hindi masuri ng Chromium ang iyong mga password. Subukang tingnan ang iyong koneksyon sa internet.</translation>
 <translation id="3639997914391704523">Masusuri ng Chromium ang iyong mga password kapag nag-sign in ka sa Google Account mo.</translation>
 <translation id="3805899903892079518">Walang access ang Chromium sa mga larawan o video mo. I-enable ang access sa Mga Setting ng iOS &gt; Privacy &gt; Mga Larawan.</translation>
+<translation id="4166206055865952171">Itakda ang Chromium bilang Iyong Default</translation>
 <translation id="4555020257205549924">Kapag naka-on ang feature na ito, mag-aalok ang Chromium na magsalin ng mga page na nakasulat sa ibang mga wika gamit ang Google Translate. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">I-on ang scanner ng Chromium</translation>
 <translation id="4787850887676698916">Dito lalabas ang mga nabuksan mong tab sa Chromium sa iba mo pang mga device.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Magkaroon ng mas mahusay na karanasan sa Chromium batay sa iyong lokasyon.</translation>
 <translation id="6820823224820483452">Hindi masuri ng Chromium ang lahat ng password. Subukan ulit bukas.</translation>
 <translation id="7099326575020694068">Hindi magamit ng Chromium ang iyong camera sa Split View mode</translation>
+<translation id="7118091470949186573">Magagamit mo na ngayon ang Chromium sa tuwing magta-tap ka ng mga link sa mga mensahe, dokumento, at iba pang app.</translation>
 <translation id="7173114856073700355">Buksan ang Mga Setting</translation>
 <translation id="7208566199746267865">Nakakatipid ka ng oras sa Chromium sa pamamagitan ng pagdadala ng iyong mga account sa web. Maaari kang magdagdag o mag-alis ng mga account sa Mga Setting.</translation>
 <translation id="7269362888766543920">Nagiging dahilan ng pag-crash ng Chromium ang ilang add-on. Pakisubukang i-uninstall ang mga ito.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Para itakda ang Chromium bilang iyong default:
+        1. Buksan ang Mga Setting. 
+        2. I-tap ang Default na Browser App.
+        3. Piliin ang Chromium.</translation>
 <translation id="7357211569052832586">Inalis ang piniling data mula sa Chromium at mga naka-sync na device. Maaaring mayroong ibang mga uri ng history ng pag-browse ang iyong Google Account gaya ng mga paghahanap at aktibidad mula sa iba pang mga serbisyo ng Google sa history.google.com.</translation>
 <translation id="7400689562045506105">Gamitin ang Chromium Kahit Saan</translation>
 <translation id="766897673682622022">Na-expose ang password mo sa isang paglabag sa data. Inirerekomenda ng Chromium na palitan ang password ngayon.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
index 0737308..cd5a577 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -22,6 +22,7 @@
 <translation id="3344973607274501920">क्रोमियम आपके पासवर्ड की जांच नहीं कर सका. अपने इंटरनेट कनेक्शन की जांच करें.</translation>
 <translation id="3639997914391704523">जब आप Google खाते से साइन इन करते हैं, तब क्रोमियम आपके पासवर्ड की जांच कर सकता है.</translation>
 <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; गोपनीयता &gt; फ़ोटो में एक्सेस चालू करें.</translation>
+<translation id="4166206055865952171">क्रोमियम को अपना डिफ़ॉल्ट ब्राउज़र बनाएं</translation>
 <translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">अपना क्रोमियम स्कैनर चालू करें</translation>
 <translation id="4787850887676698916">आपके अन्य डिवाइस पर क्रोमियम में खोले हुए आपके टैब यहां दिखाई देंगे.</translation>
@@ -38,10 +39,15 @@
 <translation id="6604711459180487467">अपने स्थान के आधार पर क्रोमियम में बेहतर अनुभव पाएं.</translation>
 <translation id="6820823224820483452">क्रोमियम सभी पासवर्ड की जांच नहीं कर सका. कल कोशिश करें.</translation>
 <translation id="7099326575020694068">क्रोमियम स्प्लिट व्यू मोड में आपके कैमरे का इस्तेमाल नहीं कर सकता</translation>
+<translation id="7118091470949186573">अब आप मैसेज, दस्तावेज़ों, और दूसरे ऐप्लिकेशन में मिले लिंक पर टैप करके, किसी भी समय क्रोमियम का इस्तेमाल कर सकते हैं.</translation>
 <translation id="7173114856073700355">सेटिंग खोलें</translation>
 <translation id="7208566199746267865">क्रोमियम आपके खातों को वेब पर लाकर आपका समय बचाता है. आप सेटिंग में खातों को जोड़ सकते हैं या निकाल सकते हैं.</translation>
 <translation id="7269362888766543920">कुछ ऐड-ऑन के कारण क्रोमियम बंद हो जाता है. कृपया उन्हें अनइंस्टॉल करके देखें.</translation>
 <translation id="7337881442233988129">क्रोमियम</translation>
+<translation id="7349905826685622881">क्रोमियम को डिफ़ॉल्ट ब्राउज़र के तौर पर सेट करने के लिए:
+        1. सेटिंग खोलें. 
+        2. डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन पर टैप करें.
+        3. क्रोमियम चुनें.</translation>
 <translation id="7357211569052832586">चयनित डेटा को क्रोमियम और सिंक किए हुए डिवाइस से निकाल दिया गया है. आपके Google खाते में history.google.com पर की जाने वाली खोजों अन्य Google सेवाओं की गतिविधि जैसेे ब्राउज़िंग इतिहास के अन्य प्रारूप हो सकते हैं.</translation>
 <translation id="7400689562045506105">क्रोमियम का उपयोग हर जगह करें</translation>
 <translation id="766897673682622022">डेटा के गलत इस्तेमाल की वजह से, आपका पासवर्ड बिना अनुमति के सार्वजनिक हो गया था. क्रोमियम का सुझाव है कि आप अभी पासवर्ड बदल लें.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
index f6e3ea2..4fde4e49 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium сіздің құпия сөздеріңізді тексере алмады. Интернет байланысын тексеріп көріңіз.</translation>
 <translation id="3639997914391704523">Google есептік жазбаңызбен кіргенде, Chromium сіздің құпия сөздеріңізді тексере алады.</translation>
 <translation id="3805899903892079518">Chromium сурет пен бейнелерге кіре алмайды. "iOS параметрлері &gt; Құпиялылық &gt; Фотосуреттер" арқылы рұқсат беру қажет.</translation>
+<translation id="4166206055865952171">Chromium браузерін әдепкі браузер ету</translation>
 <translation id="4555020257205549924">Бұл функция қосылған кезде, Chromium басқа тілдерде жазылған беттерді Google Translate арқылы аударуды ұсынады. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium сканерін іске қосу</translation>
 <translation id="4787850887676698916">Басқа құрылғыларда Chromium браузерінен ашылған қойындылар осы жерде шығады.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Орналасқан жеріңізге байланысты Chromium браузерін пайдалануда жақсырақ тәжірибеге қол жеткізіңіз.</translation>
 <translation id="6820823224820483452">Chromium барлық құпия сөзді тексере алмады. Ертең қайталап көріңіз.</translation>
 <translation id="7099326575020694068">Chromium қолданбасы камераны қатар ашу режимінде пайдалана алмайды</translation>
+<translation id="7118091470949186573">Енді хабарларда, құжаттарда және басқа қолданбаларда сілтемелерді түртіп, Chromium браузерін кез келген уақытта пайдалана аласыз.</translation>
 <translation id="7173114856073700355">Параметрлерді ашу</translation>
 <translation id="7208566199746267865">Chromium браузері есептік жазбаларыңызды вебке алып келу арқылы уақыт үнемдейді. "Параметрлер" бөлімінде есептік жазбаларды қосуға немесе жоюға болады.</translation>
 <translation id="7269362888766543920">Кейбір қондырмалар Chromium қызметін бұзады. Оларды жойып көріңіз.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium браузерін әдепкі браузер ету:
+        1. Параметрлерді ашыңыз. 
+        2. "Әдепкі браузер қолданбасы" түймесін түртіңіз.
+        3. Chromium браузерін таңдаңыз.</translation>
 <translation id="7357211569052832586">Таңдалған деректер Chromium жүйесінен және синхрондалған құрылғылардан өшірілді. Google есептік жазбасының шолу тарихы басқа Google қызметтеріндегі іздеулер мен әрекеттер тізімі түрінде де болуы мүмкін, оларды history.google.com мекенжайынан табуға болады.</translation>
 <translation id="7400689562045506105">Chromium браузерін барлық жерде пайдаланыңыз</translation>
 <translation id="766897673682622022">Деректердің қауіпсіздігі бұзылған кезде, құпия сөзіңізді біліп қойды. Chromium құпия сөзіңізді дереу өзгертуге кеңес береді.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb
index 79bb0596..a2093c9 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_km.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium មិនអាចពិនិត្យ​ពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមសាកល្បងពិនិត្យ​ការតភ្ជាប់អ៊ីនធឺណិត​របស់អ្នក។</translation>
 <translation id="3639997914391704523">Chromium អាចពិនិត្យពាក្យសម្ងាត់របស់អ្នក នៅពេលអ្នកចូល​ដោយប្រើគណនី Google របស់អ្នក។</translation>
 <translation id="3805899903892079518">Chromium មិនមានលទ្ធភាពចូលប្រើរូបថត និងវីដេអូរបស់អ្នកទេ។ សូមបើកដំណើរការចូលប្រើនៅក្នុងការកំណត់ iOS &gt; ភាពឯកជន &gt; រូបថត។</translation>
+<translation id="4166206055865952171">កំណត់ Chromium ជាកម្មវិធី​រុករក​តាមអ៊ីនធឺណិតលំនាំដើម​របស់អ្នក</translation>
 <translation id="4555020257205549924">នៅពេលដែលមុខងារនេះបើក Chromium នឹងផ្តល់ជូនការបកប្រែទំព័រដែលសរសេរជាភាសាផ្សេងទៀតដោយប្រើ Google បកប្រែ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">បើក​កម្មវិធី​ស្កេន Chromium</translation>
 <translation id="4787850887676698916">ផ្ទាំងដែលអ្នកបានបើកនៅក្នុង Chromium នៅលើឧបករណ៍ផ្សេងទៀតរបស់អ្នកនឹងបង្ហាញនៅទីនេះ។</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">ទទួលបានការប្រើប្រាស់ Chromium ប្រសើរជាងមុន ដោយផ្អែកលើទីតាំងរបស់អ្នក។</translation>
 <translation id="6820823224820483452">Chromium មិនអាចពិនិត្យពាក្យសម្ងាត់ទាំងអស់បានទេ។ សូម​ព្យាយាម​ម្ដងទៀតនៅថ្ងៃស្អែក។</translation>
 <translation id="7099326575020694068">Chromium មិនអាចប្រើកាមេរ៉ារបស់អ្នកនៅក្នុងមុខងារបំបែកការមើលបានទេ</translation>
+<translation id="7118091470949186573">ឥឡូវនេះ អ្នកអាចប្រើ Chromium រាល់ពេល​ដែលអ្នកចុចលើតំណនៅក្នុងសារ ឯកសារ និងកម្មវិធីផ្សេងទៀត។</translation>
 <translation id="7173114856073700355">បើកការកំណត់</translation>
 <translation id="7208566199746267865">Chromium សន្សំពេលវេលាដោយប្រើគណនីរបស់អ្នកនៅលើបណ្តាញអ៊ីនធឺណិត។ អ្នកអាចបញ្ចូល ឬលុបគណនីនៅក្នុងការកំណត់។</translation>
 <translation id="7269362888766543920">កម្មវិធីបន្ថែមមួយចំនួនអាចធ្វើឲ្យ Chromium គាំង។ សូមសាកល្បងលុបការដំឡើងពួកវា។</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">ដើម្បីកំណត់ Chromium ជាកម្មវិធី​រុករក​តាមអ៊ីនធឺណិតលំនាំដើម​របស់អ្នក៖
+        1. បើកការកំណត់។ 
+        2. ចុច​កម្មវិធីរុករកតាមអ៊ីនធឺណិតលំនាំដើម។
+        3. ជ្រើសរើស Chromium។</translation>
 <translation id="7357211569052832586">ទិន្នន័យដែលបានជ្រើសរើសត្រូវបានលុបចេញពី Chromium និងឧបករណ៍ដែលបានធ្វើសមកាលកម្មហើយ។ គណនី Google របស់អ្នកអាចនឹងមានទម្រង់ប្រវត្តិរុករកផ្សេងទៀត ដូចជា៖ ការស្វែងរក និងសកម្មភាពចេញពីសេវាកម្ម Google ផ្សេងទៀតនៅ history.google.com</translation>
 <translation id="7400689562045506105">ប្រើ Chromium គ្រប់ទីកន្លែង</translation>
 <translation id="766897673682622022">​ពាក្យសម្ងាត់​របស់អ្នកត្រូវបានបញ្ចេញនៅក្នុង​ការបែកធ្លាយ​ទិន្នន័យ។ Chromium សូមណែនាំ​ឱ្យប្ដូរ​ពាក្យសម្ងាត់​ឥឡូវនេះ។</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb
index 1600f6e3..5103a701 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium сырсөздөрүңүздү текшере алган жок. Интернет байланышын текшерип көрүңүз.</translation>
 <translation id="3639997914391704523">Google аккаунтуңуз менен киргенде Chromium сырсөздөрүңүздү текшерет.</translation>
 <translation id="3805899903892079518">Chromium сүрөттөрүңүздү же видеолоруңузду көрө албайт. Көрүү үчүн iOS Жөндөөлөрү &gt; Купуялык &gt; Сүрөттөргө өтүңүз.</translation>
+<translation id="4166206055865952171">Chromium'ду демейки серепчи кылып алыңыз</translation>
 <translation id="4555020257205549924">Бул функция иштетилгенде, Chromium Google Котормочу аркылуу башка тилдерде жазылган барактарды которууну сунуштайт. <ph name="BEGIN_LINK" />Көбүрөөк маалымат<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium'дун сканерин күйгүзүү</translation>
 <translation id="4787850887676698916">Башка түзмөктөрүңүздөн Chromium аркылуу ачылган өтмөктөр ушул жерден көрүнөт.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Chromium'ду жайгашкан жериңизге ылайык пайдаланыңыз.</translation>
 <translation id="6820823224820483452">Chromium бардык сырсөздөрдү текшере алган жок. Эртең кайталап көрүңүз.</translation>
 <translation id="7099326575020694068">Экранды бөлүп көрсөтүү режиминде Chromium камераны иштете албайт</translation>
+<translation id="7118091470949186573">Эми билдирүүлөрдөгү шилтемелерди, документтерди жана башка колдонмолорду Chromium'да ача аласыз.</translation>
 <translation id="7173114856073700355">Жөндөөлөрдү ачуу</translation>
 <translation id="7208566199746267865">Аккаунттарыңызды желеге жайгаштыруу менен Chromium убакытыңызды үнөмдөйт. Аккаунттарды Жөндөөлөрдөн кошуп же алып салсаңыз болот.</translation>
 <translation id="7269362888766543920">Айрым көмөкчү жөндөөлөрдөн улам Chromium бузулуп калды. Аларды өчүрүп көрүңүз.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium'ду демейки серепчи кылуу үчүн:
+        1. Жөндөөлөрдү ачыңыз. 
+        2. Демейки серепчи колдонмосун басыңыз.
+        3. Chromium'ду тандаңыз.</translation>
 <translation id="7357211569052832586">Тандалган дайындар Chromium'дан жана шайкештирилген түзмөктөрдөн өчүрүлдү. Google Аккаунтуңуздун башка Google кызматтарынан алынган серептөө таржымалы history.google.com дарегинде болушу мүмкүн.</translation>
 <translation id="7400689562045506105">Chromium'ду каалаган жерден пайдаланыңыз</translation>
 <translation id="766897673682622022">Сырсөзүңүздү кимдир-бирөө билип алды. Chromium сырсөзүңүздү азыр өзгөртүүнү сунуштайт.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
index a89b21c..d6d9900 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Pārlūkprogrammā Chromium nevarēja pārbaudīt jūsu paroles. Pārbaudiet interneta savienojumu.</translation>
 <translation id="3639997914391704523">Pārlūkprogrammā Chromium var pārbaudīt jūsu paroles, ja esat pierakstījies savā Google kontā.</translation>
 <translation id="3805899903892079518">Chromium nevar piekļūt jūsu fotoattēliem un videoklipiem. Iespējojiet piekļuvi: iOS Settings &gt; Privacy &gt; Photos.</translation>
+<translation id="4166206055865952171">Iestatiet Chromium kā noklusējuma pārlūku</translation>
 <translation id="4555020257205549924">Ja šī funkcija ir ieslēgta, Chromium piedāvā tulkot citās valodās rakstītas lapas, izmantojot Google tulkotāju. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
 <translation id="4681781466797808448">Ieslēgt Chromium skeneri</translation>
 <translation id="4787850887676698916">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chromium citās ierīcēs.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Uzlabojiet savu pieredzi pārlūkā Chromium, sūtot informāciju par savu atrašanās vietu.</translation>
 <translation id="6820823224820483452">Pārlūkprogrammā Chromium nevarēja pārbaudīt visas paroles. Mēģiniet vēlreiz rīt.</translation>
 <translation id="7099326575020694068">Chromium nevar izmantot kameru dalītā skata režīmā.</translation>
+<translation id="7118091470949186573">Tagad varat izmantot Chromium ikreiz, kad pieskaraties saitēm ziņojumos, dokumentos un citās lietotnēs.</translation>
 <translation id="7173114856073700355">Atvērt iestatījumus</translation>
 <translation id="7208566199746267865">Chromium ietaupa jūsu laiku, pievienojot jūsu kontus tīmeklim. Kontus varat pievienot vai noņemt sadaļā Iestatījumi.</translation>
 <translation id="7269362888766543920">Daži papildinājumi var izraisīt pārlūka Chromium avarēšanu. Lūdzu, atinstalējiet tos.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Lai iestatītu Chromium kā noklusējuma pārlūkprogrammu, veiciet tālāk norādītās darbības.
+        1. Atveriet lietotni Settings (Iestatījumi). 
+        2. Pieskarieties vienumam “Default Browser App” (Noklusējuma pārlūka lietotne).
+        3. Atlasiet Chromium.</translation>
 <translation id="7357211569052832586">Atlasītie dati ir noņemti no pārlūka Chromium un sinhronizētajām ierīcēm. Jūsu Google kontam vietnē history.google.com var būt citu veidu pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation>
 <translation id="7400689562045506105">Chromium lietošana visur</translation>
 <translation id="766897673682622022">Jūsu parole tika atklāta datu noplūdes dēļ. Chromium iesaka pēc iespējas ātrāk nomainīt paroli.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
index 1512912..79868d15 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium-ന് നിങ്ങളുടെ പാസ്‌വേഡുകൾ പരിശോധിക്കാനായില്ല. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക.</translation>
 <translation id="3639997914391704523">Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുമ്പോൾ Chromium-ന് നിങ്ങളുടെ പാസ്‌വേഡുകൾ പരിശോധിക്കാനാകും.</translation>
 <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
+<translation id="4166206055865952171">Chromium നിങ്ങളുടെ ഡിഫോൾട്ടാക്കുക</translation>
 <translation id="4555020257205549924">ഈ ഫീച്ചർ ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chromium ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium സ്‌കാനർ ഓണാക്കുക</translation>
 <translation id="4787850887676698916">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ Chromium-ത്തിൽ തുറന്ന ടാബുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കി Chromium-ത്തിൽ മികച്ച അനുഭവം സ്വന്തമാക്കുക.</translation>
 <translation id="6820823224820483452">എല്ലാ പാസ്‌വേഡുകളും Chromium-ന് പരിശോധിക്കാനായില്ല. നാളെ വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="7099326575020694068">വിഭജിത കാഴ്‌ച മോഡിൽ Chromium-ത്തിന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation>
+<translation id="7118091470949186573">സന്ദേശങ്ങൾ, ഡോക്യുമെന്റുകൾ, മറ്റ് ആപ്പുകൾ എന്നിവയിലെ ലിങ്കുകളിൽ ടാപ്പ് ചെയ്യുന്ന ഏതുസമയത്തും നിങ്ങൾക്ക് ഇപ്പോൾ Chromium ഉപയോഗിക്കാനാകും.</translation>
 <translation id="7173114856073700355">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="7208566199746267865">വെബിൽ അക്കൗണ്ടുകൾ കൊണ്ടുവരുന്നതിലൂടെ Chromium നിങ്ങളുടെ സമയം ലാഭിക്കുന്നു. ക്രമീകരണത്തിൽ നിങ്ങൾക്ക്‌ അക്കൗണ്ടുകൾ ചേർക്കാനോ നീക്കംചെയ്യാനോ കഴിയും.</translation>
 <translation id="7269362888766543920">ചില ആഡ് ഓണുകൾ Chromium ക്രാഷാകാനിടയാക്കും. അവ അൺഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് പരീക്ഷിച്ചുനോക്കൂ.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium നിങ്ങളുടെ ഡിഫോൾട്ട് ആക്കാൻ:
+        1. ക്രമീകരണം തുറക്കുക. 
+        2. ഡിഫോൾട്ട് ബ്രൗസർ ആപ്പ് ടാപ്പ് ചെയ്യുക.
+        3. Chromium തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="7357211569052832586">തിരഞ്ഞെടുത്ത വിവരങ്ങൾ Chromium-ത്തിൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="7400689562045506105">എല്ലായിടത്തും Chromium ഉപയോഗിക്കുക</translation>
 <translation id="766897673682622022">ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായി നിങ്ങളുടെ പാസ്‌വേഡ് വെളിപ്പെട്ടു. ഇപ്പോൾ തന്നെ പാസ്‍വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
index 18f4e535..0f9737f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium kunne ikke sjekke passordene dine. Se om du er koblet til internett.</translation>
 <translation id="3639997914391704523">Chromium kan sjekke passordene dine når du logger på med Google-kontoen din.</translation>
 <translation id="3805899903892079518">Chromium har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene &gt; Personvern &gt; Bilder.</translation>
+<translation id="4166206055865952171">Velg Chromium som standardnettleser</translation>
 <translation id="4555020257205549924">Når denne funksjonen er slått på, tilbyr Chromium å oversette sider som er skrevet på andre språk, ved hjelp av Google Oversetter. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Slå på Chromium-skanneren</translation>
 <translation id="4787850887676698916">Faner du har åpnet i Chromium på de andre enhetene dine, vises her.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Få en bedre Chromium-opplevelse basert på hvor du er.</translation>
 <translation id="6820823224820483452">Chromium kunne ikke sjekke alle passordene. Prøv på nytt i morgen.</translation>
 <translation id="7099326575020694068">Chromium kan ikke bruke kameraet i modus for delt visning</translation>
+<translation id="7118091470949186573">Du kan nå bruke Chromium hver gang du trykker på linker i meldinger, dokumenter og andre apper.</translation>
 <translation id="7173114856073700355">Åpne Innstillinger</translation>
 <translation id="7208566199746267865">Med Chromium kan du spare tid, siden du får tilgang til kontoene dine på nettet. Du kan legge til eller fjerne kontoer i Innstillinger.</translation>
 <translation id="7269362888766543920">Noen tillegg fører til at Chromium krasjer. Prøv å avinstallere dem.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Slik velger du Chromium som standardnettleser:
+        1. Åpne Innstillinger. 
+        2. Trykk på «Default Browser App» (Standard nettleserapp).
+        3. Velg Chromium.</translation>
 <translation id="7357211569052832586">De valgte dataene er fjernet fra Chromium og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettleserlogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="7400689562045506105">Bruk Chromium overalt</translation>
 <translation id="766897673682622022">Passordet ditt har vært avdekket i et databrudd. Chromium anbefaler at du bytter passord nå.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
index dd365df2..a9c30e4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium nu a putut verifica parolele. Verifică-ți conexiunea la internet.</translation>
 <translation id="3639997914391704523">Chromium poate să îți verifice parolele atunci când te conectezi folosind Contul Google.</translation>
 <translation id="3805899903892079518">Chromium nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS &gt; Confidențialitate &gt; Fotografii.</translation>
+<translation id="4166206055865952171">Setează Chromium ca browser prestabilit</translation>
 <translation id="4555020257205549924">Când această funcție este activată, Chromium se va oferi să traducă paginile scrise în alte limbi utilizând Google Traducere. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Activează scanerul din Chromium</translation>
 <translation id="4787850887676698916">Filele deschise în Chromium pe alte dispozitive vor apărea aici.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Beneficiază de o experiență mai bună în Chromium pe baza locației.</translation>
 <translation id="6820823224820483452">Chromium nu a putut verifica toate parolele. Încearcă din nou mâine.</translation>
 <translation id="7099326575020694068">Chromium nu poate folosi camera foto în modul Vizualizare împărțită</translation>
+<translation id="7118091470949186573">Acum poți folosi Chromium oricând atingi linkuri în mesaje, documente și alte aplicații.</translation>
 <translation id="7173114856073700355">Deschide Setările</translation>
 <translation id="7208566199746267865">Folosind Chromium, economisești timp, deoarece te conectează la conturi și pe web. Poți să adaugi sau să elimini conturi din Setări.</translation>
 <translation id="7269362888766543920">Unele suplimente blochează Chromium. Încearcă să le dezinstalezi.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Pentru a seta Chromium ca browser prestabilit:
+        1. deschide Setările; 
+        2. atinge Aplicația browser prestabilită;
+        3. selectează Chromium.</translation>
 <translation id="7357211569052832586">Datele selectate au fost eliminate din Chromium și de pe dispozitivele sincronizate. Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi căutările și activitatea din alte servicii Google, la history.google.com.</translation>
 <translation id="7400689562045506105">Folosește Chromium pretutindeni</translation>
 <translation id="766897673682622022">Parola a fost expusă în urma încălcării securității datelor. Chromium recomandă să-ți schimbi acum parola.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
index 7d49550f..5e66c19 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromiumu ni uspelo preveriti vaših gesel. Poskusite preveriti internetno povezavo.</translation>
 <translation id="3639997914391704523">Chromium lahko preveri vaša gesla, ko se prijavite z računom Google.</translation>
 <translation id="3805899903892079518">Chromium nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings &gt; Privacy &gt; Photos.</translation>
+<translation id="4166206055865952171">Nastavite Chromium kot privzeti brskalnik</translation>
 <translation id="4555020257205549924">Kadar je vklopljena ta funkcija, bo Chromium ponudil, da z uporabo Google Prevajalnika prevede strani v drugih jezikih. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Vklopite optični bralnik Chromium</translation>
 <translation id="4787850887676698916">Zavihki, ki ste jih odprli v Chromiumu v drugih napravah, bodo prikazani tukaj.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Zagotovite si boljšo izkušnjo uporabe Chromiuma na podlagi lokacije.</translation>
 <translation id="6820823224820483452">Chromiumu ni uspelo preveriti vseh gesel. Poskusite znova jutri.</translation>
 <translation id="7099326575020694068">Chromium ne more uporabljati fotoaparata v načinu razdeljenega pogleda</translation>
+<translation id="7118091470949186573">Zdaj lahko uporabljate Chromium, kadar koli se dotaknete povezav v sporočilih, dokumentih in drugih aplikacijah.</translation>
 <translation id="7173114856073700355">Odpri nastavitve</translation>
 <translation id="7208566199746267865">Chromium poskrbi, da so vaši računi v spletu, in vam tako prihrani čas. Račune lahko dodajate ali odstranjujete v nastavitvah.</translation>
 <translation id="7269362888766543920">Nekateri dodatki povzročajo zrušitve Chromiuma. Poskusite jih odstraniti.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium nastavite kot privzeti tiskalnik tako:
+        1. Odprite nastavitve. 
+        2. Dotaknite se možnosti za privzeto aplikacijo za brskanje.
+        3. Izberite Chromium.</translation>
 <translation id="7357211569052832586">Izbrani podatki so bili odstranjeni iz Chromiuma in sinhroniziranih naprav. V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in dejavnosti iz drugih Googlovih storitev, na history.google.com.</translation>
 <translation id="7400689562045506105">Uporaba Chromiuma povsod</translation>
 <translation id="766897673682622022">Geslo je bilo razkrito zaradi podatkovne kršitve. Chromium priporoča, da takoj spremenite geslo.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
index 0f0b158..8be18024 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium nuk mund t'i kontrollonte fjalëkalimet e tua. Provo të kontrollosh lidhjen e internetit.</translation>
 <translation id="3639997914391704523">Chromium mund t'i kontrollojë fjalëkalimet e tua kur të identifikohesh me "Llogarinë tënde të Google".</translation>
 <translation id="3805899903892079518">Chromium nuk ka qasje te fotografitë apo videot e tua. Aktivizo qasjen te Cilësimet e iOS &gt; Privatësia &gt; Fotografitë.</translation>
+<translation id="4166206055865952171">Bëje Chromium shfletuesin tënd të parazgjedhur</translation>
 <translation id="4555020257205549924">Kur ky funksion është i aktivizuar, Chromium do të ofrojë që të përkthejë faqet e shkruara në gjuhë të tjera duke përdorur "Përkthe me Google". <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Aktivizo skanerin e Chromium</translation>
 <translation id="4787850887676698916">Skedat që ke hapur në Chromium në pajisjet e tjera do të shfaqen këtu.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Merr një përvojë më të mirë në Chromium bazuar në vendndodhjen tënde.</translation>
 <translation id="6820823224820483452">Chromium nuk mund t'i kontrollonte të gjitha fjalëkalimet. Provo sërish nesër.</translation>
 <translation id="7099326575020694068">Chromium nuk mund ta përdorë kamerën tënde në modalitetin e "Pamjes së ndarë"</translation>
+<translation id="7118091470949186573">Tani mund të përdorësh Chromium sa herë që troket te lidhjet në mesazhe, dokumente dhe aplikacione të tjera.</translation>
 <translation id="7173114856073700355">Hap cilësimet</translation>
 <translation id="7208566199746267865">Chromium të kursen kohë duke i sjellë llogaritë e tua në ueb. Mund të shtosh ose heqësh llogari te "Cilësimet".</translation>
 <translation id="7269362888766543920">Disa përbërës shtesë shkaktojnë ndërprerje aksidentale të Chromium. Provo t'i çinstalosh ata.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Për ta bërë Chromium shfletuesin e parazgjedhur:
+        1. Hap "Cilësimet". 
+        2. Trokit tek "Aplikacioni i parazgjedhur i shfletuesit".
+        3. Zgjidh Chromium.</translation>
 <translation id="7357211569052832586">Të dhënat e zgjedhura janë hequr nga Chromium dhe nga pajisjet e sinkronizuara. Llogaria jote e Google mund të ketë forma të tjera të historikut të shfletimit, si kërkimet dhe aktivitetet nga shërbimet e tjera të Google në history.google.com.</translation>
 <translation id="7400689562045506105">Përdore Chromium kudo</translation>
 <translation id="766897673682622022">Fjalëkalimi yt është ekspozuar në një nxjerrje të paautorizuar të të dhënave. Chromium rekomandon që ta ndryshosh fjalëkalimin tani.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb
index cfa7733..53503b32 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium parollaringizni tekshira olmadi. Internet aloqasini tekshiring.</translation>
 <translation id="3639997914391704523">Google hisobingizga kirsangiz, Chromium parollaringizni tekshira oladi.</translation>
 <translation id="3805899903892079518">Chromium rasm va videolaringizni ko‘ra olmayapti. “Sozlamalar &gt; Maxfiylik &gt; Rasmlar” oynasi orqali ruxsat bering.</translation>
+<translation id="4166206055865952171">Chromium brauzerini asosiy qilib belgilang</translation>
 <translation id="4555020257205549924">Agar bu funksiya yoniq bo‘lsa, Chromium sahifalarni Google Tarjimon xizmati yordamida tarjima qilishni taklif qiladi. <ph name="BEGIN_LINK" />Batafsil...<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">Chromium skanerini ochish</translation>
 <translation id="4787850887676698916">Boshqa qurilmalaringizda ochilgan Chromium sahifalari shu yerda ko‘rsatiladi.</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">Joylashuv axboroti bilan Chromium yanada ko‘proq imkoniyatlarga ega bo‘ladi.</translation>
 <translation id="6820823224820483452">Chromium barcha parollarni tekshira olmadi. Ertaga qayta urining.</translation>
 <translation id="7099326575020694068">Chromium kamerangizdan Split View rejimida foydalana olmaydi</translation>
+<translation id="7118091470949186573">Siz endi Chrome brauzerini har doim xabarlar, hujjatlar va boshqa ilovalardagi havolalar ustiga bosib ishga tushirishingiz mumkin.</translation>
 <translation id="7173114856073700355">Sozlamalarni ochish</translation>
 <translation id="7208566199746267865">Chromium xizmatlariga kirishda har safar foydalanuvchi nomi va parol kiritishingiz shart emas. Chromium qurilmada saqlangan hisoblardan foydalanadi. Ularni sozlamalar orqali boshqarishingiz mumkin.</translation>
 <translation id="7269362888766543920">Ba’zi kengaytmalar Chromium brauzerini ishdan chiqaradi. Ularni o‘chirib tashlang.</translation>
 <translation id="7337881442233988129">Chromium</translation>
+<translation id="7349905826685622881">Chromium brauzerini asosiy qilish uchun:
+        1. Sozlamalarni oching. 
+        2. Asosiy brauzer ilovasi ustiga bosing.
+        3. Chromium brauzerini tanlang.</translation>
 <translation id="7357211569052832586">Tanlangan ma’lumotlar Chromium va sinxronlangan qurilmalardan o‘chirildi. Google hisobingiz orqali amalga oshirilgan qidiruvlar, brauzer tarixi va boshqa internetdagi faoliyatingizni history.google.com sahifasi orqali ko‘rishingiz mumkin.</translation>
 <translation id="7400689562045506105">Chromium doim yoningizda</translation>
 <translation id="766897673682622022">Parolingiz oshkor qilingan. Chromimum parolni hoziroq yangilashni tavsiya qiladi.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
index c15f96d7..6dde36d 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
@@ -23,6 +23,7 @@
 <translation id="3344973607274501920">Chromium 無法檢查密碼,請檢查互聯網連線。</translation>
 <translation id="3639997914391704523">Chromium 可在您使用 Google 帳戶登入時檢查密碼。</translation>
 <translation id="3805899903892079518">Chromium 沒有存取相片或影片的權限。請前往「iOS 設定」&gt;「私隱」&gt;「相片」開放權限。</translation>
+<translation id="4166206055865952171">將 Chromium 設定為預設瀏覽器</translation>
 <translation id="4555020257205549924">開啟這項功能後,Chromium 會使用「Google 翻譯」來翻譯其他語言的網頁。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="4681781466797808448">開啟 Chromium 掃瞄器</translation>
 <translation id="4787850887676698916">您在其他裝置上開啟的 Chromium 分頁會在這裡顯示。</translation>
@@ -39,10 +40,15 @@
 <translation id="6604711459180487467">在 Chromium 中根據您的位置,帶來更貼心的體驗。</translation>
 <translation id="6820823224820483452">Chromium 無法檢查所有密碼。請明天再試。</translation>
 <translation id="7099326575020694068">Chromium 無法在「分割檢視」模式中使用相機</translation>
+<translation id="7118091470949186573">您現在只要在訊息、文件或其他應用程式中輕按連結,即可使用 Chromium。</translation>
 <translation id="7173114856073700355">開啟設定</translation>
 <translation id="7208566199746267865">Chromium 允許您將帳戶同步至網路上,以節省時間。您可在設定中新增或移除帳戶。</translation>
 <translation id="7269362888766543920">部份外掛程式導致 Chromium 當機,請解除安裝那些外掛程式。</translation>
 <translation id="7337881442233988129">ChromiumHelper</translation>
+<translation id="7349905826685622881">如要將 Chromium 設定為預設瀏覽器:
+        1. 開啟 [設定]。
+        2. 輕按 [預設的瀏覽器應用程式]。
+        3. 選取 [Chromium]。</translation>
 <translation id="7357211569052832586">所選資料已從 Chromium 和已同步的裝置中移除。不過,您仍可前往 history.google.com 存取 Google 帳戶中保存的其他各種瀏覽紀錄,例如在其他 Google 服務中的搜尋和活動紀錄。</translation>
 <translation id="7400689562045506105">隨時隨地使用 Chromium</translation>
 <translation id="766897673682622022">您的密碼因資料外洩而被洩露。Chromium 建議立即變更密碼。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
index 0ace584..2287889 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">‏لقد تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة الموقع الإلكتروني.</translation>
 <translation id="2199719347983604670">‏البيانات من مزامنة Chrome</translation>
 <translation id="2347208864470321755">‏عند تفعيل هذه الميزة، سيقترح Chrome ترجمة الصفحات المكتوبة بلغات أخرى باستخدام "ترجمة Google". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">‏جعل Chrome المتصفِّح التلقائي</translation>
 <translation id="2574249610672786438">‏للاطّلاع على علامات التبويب من أي جهاز تستخدم فيه Chrome، سجِّل الدخول على جميع أجهزتك.</translation>
 <translation id="2576431527583832481">‏لقد أصبح Chrome أفضل من ذي قبل! يتوفر إصدار جديد.</translation>
 <translation id="257708665678654955">‏هل تريد أن يعرض Google Chrome ترجمة صفحات <ph name="LANGUAGE_NAME" /> من الموقع الإلكتروني هذا في المرة القادمة؟</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">‏تسجيل الدخول إلى Chrome</translation>
 <translation id="3345341804167540816">‏استخدم Chrome في كل مكان</translation>
 <translation id="3522659714780527202">‏للاطّلاع على علامات التبويب من أي جهاز تستخدم فيه Chrome، فعِّل المزامنة.</translation>
+<translation id="3706101708757577809">‏يمكنك الآن استخدام Chrome في أي وقت تنقر فيه على روابط في الرسائل والمستندات والتطبيقات الأخرى.</translation>
 <translation id="384394811301901750">‏يتعذر على Google Chrome استخدام الكاميرا في الوقت الحالي</translation>
 <translation id="3980220367029651214">‏أنت تجري تبديلاً لحسابات المزامنة من <ph name="USER_EMAIL1" /> إلى <ph name="USER_EMAIL2" />. يتم إدارة بيانات Chrome الحالية من خلال <ph name="DOMAIN" />. سيؤدي ذلك إلى إزالة بياناتك من هذا الجهاز، ولكن ستظل بياناتك في <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">‏لا تتوفر لدي Google Chrome إمكانية الدخول إلى الصور أو الفيديوهات. تستطيع تفعيل الدخول في إعدادات iOS &gt; الخصوصية &gt; الصور.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">‏تم النسخ إلى Chrome</translation>
 <translation id="6648150602980899529">‏يتم تسجيل دخولك باستخدام حساب يتم إدارته من خلال <ph name="DOMAIN" /> ومنح مشرفه الحق في التحكم في بياناتك على Chrome. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي تسجيل الخروج من Chrome إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزنة على حسابك في Google.</translation>
 <translation id="6676840375528380067">‏هل تريد محو بيانات Chrome من هذا الجهاز؟</translation>
+<translation id="6724102885918156196">‏لجعل Chrome المتصفِّح التلقائي، اتّبِع الخطوات التالية:
+        1- افتح "الإعدادات". 
+        2- انقر على "تطبيق المتصفِّح التلقائي".
+        3- اختَر Chrome.</translation>
 <translation id="7165736900384873061">‏بدء استخدام الماسح الضوئي للاستجابة السريعة في Google Chrome</translation>
 <translation id="7172660552945675509">‏نصيحة: <ph name="BEGIN_LINK" />نقل Chrome إلى شريط الإرساء<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">فتح الإعدادات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
index eaed1ce..c5ad2c9 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome təsdiq edir ki, <ph name="ISSUER" /> bu veb saytı sertifikatlaşdırıb.</translation>
 <translation id="2199719347983604670">Chrome sinxronizasiya datası</translation>
 <translation id="2347208864470321755">Bu funksiya aktiv olduqda, Chrome Google Tərcümədən istifadə edərək başqa dillərdə yazılmış səhifələri tərcümə etməyi təklif edəcək. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome'u Defolt Edin</translation>
 <translation id="2574249610672786438">Chrome istifadə etdiyiniz hər yerdən tabları görmək üçün bütün cihazlarda daxil olun</translation>
 <translation id="2576431527583832481">Chrome yeniləndi! Yeni versiya əlçatandır.</translation>
 <translation id="257708665678654955">Google Chrome'un növbəti dəfə bu saytdakı <ph name="LANGUAGE_NAME" /> səhifələrini tərcümə etməyini istəyirsiniz?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome'a daxil olun</translation>
 <translation id="3345341804167540816">Chrome'u Hər yerdə İstifadə edin</translation>
 <translation id="3522659714780527202">Chrome istifadə etdiyiniz hər yerdən tabları görmək üçün sinxronizasiyanı aktiv edin</translation>
+<translation id="3706101708757577809">İndi istənilən vaxt mesajlar, sənədlər və digər tətbiqlərdə keçidlərə toxunduqda Chrome'u istifadə edə bilərsiniz.</translation>
 <translation id="384394811301901750">Google Chrome indi kameranızı istifadə edə bilməz</translation>
 <translation id="3980220367029651214">Sinxronizasiya hesablarını <ph name="USER_EMAIL1" /> hesabından <ph name="USER_EMAIL2" /> hesabına keçirirsiniz. Mövcud Chrome datanız <ph name="DOMAIN" /> tərəfindən idarə olunur. Datanızı bu cihazdan siləcək, lakin data <ph name="USER_EMAIL1" /> hesabında qalacaq.</translation>
 <translation id="3988789688219830639">Google Chrome məhsulunun foto və videolarınıza girişi yoxdur. iOS Ayarları &gt; Məxfilik &gt; Fotolar bölməsindən girişi aktiv edin.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Chrome'a kopYanlışır</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> tərəfindən idarə olunan hesab ilə daxil olursunuz və onun administratoruna Chrome datanız üzərində nəzarəti verirsiniz. Datanız həmişəlik bu hesab ilə əlaqələndiriləcək. Chrome'dan çıxmaq datanızı bu cihazdan siləcək, lakin data Google Hesabında qalacaq.</translation>
 <translation id="6676840375528380067">Chrome datası bu cihazdan silinsin?</translation>
+<translation id="6724102885918156196">Chrome'u defolt etmək üçün:
+        1. Ayarları açın. 
+        2. Defolt Brauzer Tətbiqi seçiminə toxunun.
+        3. Chrome seçin.</translation>
 <translation id="7165736900384873061">Google Chrome QR skanerini istifadə etməyə başlayın</translation>
 <translation id="7172660552945675509">İp ucu: <ph name="BEGIN_LINK" />Chrome'u masaüstünüzə köçürün<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Ayarları Açın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb
index 6246317..18ea3fb 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_be.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome спраўдзіў, што выдаўцом сертыфіката гэтага сайта з'яўляецца <ph name="ISSUER" />.</translation>
 <translation id="2199719347983604670">Даныя сінхранізацыі Chrome</translation>
 <translation id="2347208864470321755">Калі гэта функцыя ўключана, Chrome будзе прапаноўваць перакласці старонкі на іншых мовах з дапамогай Перакладчыка Google. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Зрабіце Chrome стандартным браўзерам</translation>
 <translation id="2574249610672786438">Каб мець доступ да сваіх укладак з усіх прылад, на якіх вы выкарыстоўваеце Chrome, увайдзіце на іх ва ўліковы запіс</translation>
 <translation id="2576431527583832481">Chrome стаў яшчэ лепшым! З'явілася новая версія.</translation>
 <translation id="257708665678654955">Ці хочаце, каб Google Chrome наступны раз прапаноўваў перакласці старонкі гэтага сайта на наступнай мове: <ph name="LANGUAGE_NAME" />?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Увайсці ў Chrome</translation>
 <translation id="3345341804167540816">Выкарыстоўвайце Chrome усюды</translation>
 <translation id="3522659714780527202">Каб мець доступ да сваіх укладак з усіх прылад, на якіх вы выкарыстоўваеце Chrome, уключыце сінхранізацыю</translation>
+<translation id="3706101708757577809">Цяпер вы можаце выкарыстоўваць Chrome кожны раз, калі націскаеце на спасылкі ў паведамленнях, дакументах або іншых праграмах.</translation>
 <translation id="384394811301901750">Google Chrome не змог выкарыстаць камеру</translation>
 <translation id="3980220367029651214">Вы пераключаецеся з уліковага запісу сінхранізацыі <ph name="USER_EMAIL1" /> на <ph name="USER_EMAIL2" />. Вашымі існуючымі данымі Chrome кіруе дамен <ph name="DOMAIN" />. З гэтай прылады даныя будуць выдалены, але яны застануцца ва ўліковым запісе <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">У браўзера Google Chrome няма доступу да фота і відэа. Уключыце доступ у меню iOS: "Налады &gt; Прыватнасць &gt; Фота".</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Скапіравана ў Chrome</translation>
 <translation id="6648150602980899529">Вы ўваходзіце праз уліковы запіс, які кіруецца даменам <ph name="DOMAIN" />, што дае адміністратару кантроль над вашымі данымі з браўзера Chrome. Вашы даныя будуць назаўсёды прывязаны да гэтага ўліковага запісу. Калі выйсці з браўзера Chrome, вашы даныя будуць выдалены з гэтай прылады, але застануцца ва Уліковым запісе Google.</translation>
 <translation id="6676840375528380067">Выдаліць даныя Chrome з гэтай прылады?</translation>
+<translation id="6724102885918156196">Як зрабіць Chrome стандартным браўзерам:
+        1. Адкрыйце праграму Settings ("Налады"). 
+        2. Націсніце Default Browser App ("Стандартны браўзер").
+        3. Выберыце Chrome.</translation>
 <translation id="7165736900384873061">Пачніце карыстацца QR-сканерам Google Chrome</translation>
 <translation id="7172660552945675509">Парада. <ph name="BEGIN_LINK" />Перамясціце Chrome на паліцу праграм<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Адкрыць Налады</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
index 5c5c79a7..be46fd4 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_cs.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome ověřil, že certifikát tohoto webu byl vydán vydavatelem <ph name="ISSUER" />.</translation>
 <translation id="2199719347983604670">Data ze synchronizace Chromu</translation>
 <translation id="2347208864470321755">Pokud je tato funkce zapnutá, bude Chrome nabízet překlad stránek v jiných jazycích pomocí Překladače Google. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Nastavení Chromu jako výchozího prohlížeče</translation>
 <translation id="2574249610672786438">Chcete-li mít své karty k dispozici všude, kde používáte Chrome, na všech zařízeních se přihlaste</translation>
 <translation id="2576431527583832481">Chrome je opět o něco lepší. K dispozici je nová verze.</translation>
 <translation id="257708665678654955">Chcete, aby Google Chrome příště pro stránky v jazyce <ph name="LANGUAGE_NAME" /> z tohoto webu nabízel překlad?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Přihlásit se do Chromu</translation>
 <translation id="3345341804167540816">Používejte Chrome všude</translation>
 <translation id="3522659714780527202">Chcete-li mít své karty k dispozici všude, kde používáte Chrome, zapněte synchronizaci</translation>
+<translation id="3706101708757577809">Nyní můžete Chrome použít pokaždé, když klepnete na odkazy ve zprávách, dokumentech a ostatních aplikacích.</translation>
 <translation id="384394811301901750">Google Chrome teď nemůže použít fotoaparát</translation>
 <translation id="3980220367029651214">Přepínáte účet pro synchronizaci z <ph name="USER_EMAIL1" /> na <ph name="USER_EMAIL2" />. Vaše existující data prohlížeče Chrome jsou spravována doménou <ph name="DOMAIN" />. Touto akcí svá data smažete z tohoto zařízení, v účtu <ph name="USER_EMAIL1" /> však vaše data zůstanou.</translation>
 <translation id="3988789688219830639">Google Chrome nemá přístup k vašim fotkám nebo videím. Povolte přístup v systému iOS v Nastavení &gt; Soukromí &gt; Fotky.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Zkopírováno do Chromu</translation>
 <translation id="6648150602980899529">Přihlašujete se pomocí účtu spravovaného doménou <ph name="DOMAIN" /> a poskytujete jeho správci kontrolu nad svými daty prohlížeče Chrome. Vaše data budou trvale přidružena k tomuto účtu. Odhlášením z Chromu svá data smažete z tohoto zařízení, ve vašem účtu Google však uložena zůstanou.</translation>
 <translation id="6676840375528380067">Vymazat z tohoto zařízení data prohlížeče Chrome?</translation>
+<translation id="6724102885918156196">Postup nastavení Chromu jako výchozího prohlížeče:
+        1. Otevřete nastavení. 
+        2. Klepněte na Výchozí prohlížeč.
+        3. Vyberte Chrome.</translation>
 <translation id="7165736900384873061">Začněte používat čtečku QR kódů prohlížeče Google Chrome</translation>
 <translation id="7172660552945675509">Tip: <ph name="BEGIN_LINK" />Přesuňte si Chrome do doku<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Otevřít nastavení</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
index 93116ca..cd03088c3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito.</translation>
 <translation id="2199719347983604670">Data mula sa Chrome sync</translation>
 <translation id="2347208864470321755">Kapag naka-on ang tampok na ito, mag-aalok ang Chrome na magsalin ng mga pahina na nakasulat sa ibang mga wika gamit ang Google Translate. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Itakda ang Chrome bilang Iyong Default</translation>
 <translation id="2574249610672786438">Para makita ang iyong mga tab sa kahit saan ka man gumagamit ng Chrome, mag-sign in sa lahat ng device mo</translation>
 <translation id="2576431527583832481">Naging mas mahusay na ang Chrome! Available na ang bagong bersyon.</translation>
 <translation id="257708665678654955">Gusto mo bang mag-alok ang Google Chrome na isalin ang mga <ph name="LANGUAGE_NAME" /> page mula sa site na ito sa susunod na pagkakataon?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Mag-sign in sa Chrome</translation>
 <translation id="3345341804167540816">Gamitin ang Chrome sa Lahat ng Lugar</translation>
 <translation id="3522659714780527202">Para makita ang iyong mga tab sa kahit saan ka man gumagamit ng Chrome, i-on ang pag-sync</translation>
+<translation id="3706101708757577809">Magagamit mo na ngayon ang Chrome sa tuwing magta-tap ka ng mga link sa mga mensahe, dokumento, at iba pang app.</translation>
 <translation id="384394811301901750">Hindi magamit ng Google Chrome ang camera mo ngayon</translation>
 <translation id="3980220367029651214">Lumilipat ka mula sa naka-sync na account na <ph name="USER_EMAIL1" /> papunta sa <ph name="USER_EMAIL2" />. Pinamamahalaan ng <ph name="DOMAIN" /> ang kasalukuyan mong data sa Chrome. Ide-delete nito ang data mo sa device na ito, ngunit mananatili ang iyong data sa <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Walang access ang Google Chrome sa larawan o video. I-enable ang access sa Mga Setting ng iOS &gt; Privacy &gt; Mga Larawan.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Kinopya sa Chrome</translation>
 <translation id="6648150602980899529">Nagsa-sign in ka gamit ang isang account na pinamamahalaan ng <ph name="DOMAIN" /> at binibigyan mo ang administrator nito ng kontrol sa iyong data sa Chrome. Permanenteng mauugnay ang iyong data sa account na ito. Made-delete ang data mo sa device na ito kapag nag-sign out ka sa Chrome, ngunit mananatili itong naka-store sa iyong Google Account.</translation>
 <translation id="6676840375528380067">I-clear ang iyong data sa Chrome sa device na ito?</translation>
+<translation id="6724102885918156196">Para itakda ang Chrome bilang iyong default:
+        1. Buksan ang Mga Setting. 
+        2. I-tap ang Default na Browser App.
+        3. Piliin ang Chrome.</translation>
 <translation id="7165736900384873061">Simulan ang paggamit ng QR scanner ng Google Chrome</translation>
 <translation id="7172660552945675509">Tip: <ph name="BEGIN_LINK" />Ilipat ang Chrome sa iyong dock<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Buksan ang Mga Setting</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
index 88288325..29202d11 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome ने सत्‍यापित किया है कि वेबसाइट का यह प्रमाणपत्र <ph name="ISSUER" /> ने जारी किया है.</translation>
 <translation id="2199719347983604670">Chrome सिंक का डेटा</translation>
 <translation id="2347208864470321755">जब यह सुविधा चालू होती है, तो Chrome अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome को अपना डिफ़ॉल्ट ब्राउज़र बनाएं</translation>
 <translation id="2574249610672786438">आप जिन डिवाइस पर Chrome का इस्तेमाल करते हैं उन सभी पर खोले गए टैब देखने के लिए, अपने सभी डिवाइस पर साइन इन करें</translation>
 <translation id="2576431527583832481">Chrome अब बेहतर हो गया है! एक नया वर्शन उपलब्ध है.</translation>
 <translation id="257708665678654955">क्या आप चाहते हैं कि Google Chrome अगली बार इस साइट के <ph name="LANGUAGE_NAME" /> पेजों का अनुवाद करने का ऑफ़र दे?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome में साइन इन करें</translation>
 <translation id="3345341804167540816">Chrome का सभी जगह उपयोग करना</translation>
 <translation id="3522659714780527202">आप जिन डिवाइस पर Chrome का इस्तेमाल करते हैं, उन सभी पर खोले गए टैब देखने के लिए, सिंक करने की सुविधा चालू करें</translation>
+<translation id="3706101708757577809">अब आप मैसेज, दस्तावेज़ों, और दूसरे ऐप्लिकेशन में मिले लिंक पर टैप करके, किसी भी समय Chrome का इस्तेमाल कर सकते हैं.</translation>
 <translation id="384394811301901750">Google Chrome इस समय आपके कैमरे का उपयोग नहीं कर सकता</translation>
 <translation id="3980220367029651214">आप सिंक खातों को <ph name="USER_EMAIL1" /> से <ph name="USER_EMAIL2" /> में बदल रहे हैं. आपका मौजूदा Chrome डेटा <ph name="DOMAIN" /> से प्रबंधित किया जाता है. इससे आपका डेटा इस सेवा से मिट जाएगा, लेकिन आपका डेटा <ph name="USER_EMAIL1" /> में बना रहेगा.</translation>
 <translation id="3988789688219830639">Google Chrome के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; निजता &gt; फ़ोटो में जाकर एक्सेस चालू करें.</translation>
@@ -43,6 +45,10 @@
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
 <translation id="6648150602980899529">आप <ph name="DOMAIN" /> से प्रबंधित खाते में साइन इन कर रहे हैं और उसके एडमिन को अपने Chrome डेटा पर नियंत्रण दे रहे हैं. आपका डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. Chrome से साइन आउट करने से आपका डेटा इस डिवाइस से मिट जाएगा, लेकिन वह आपके Google खाते में बना रहेगा.</translation>
 <translation id="6676840375528380067">इस डिवाइस से अपना Chrome डेटा हटाएं?</translation>
+<translation id="6724102885918156196">Chrome को डिफ़ॉल्ट ब्राउज़र के तौर पर सेट करने के लिए:
+        1. सेटिंग खोलें. 
+        2. डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन पर टैप करें.
+        3. Chrome चुनें.</translation>
 <translation id="7165736900384873061">Google Chrome QR स्कैनर उपयोग शुरू करें</translation>
 <translation id="7172660552945675509">सलाह: <ph name="BEGIN_LINK" />Chrome को अपने डॉक में ले जाएं<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">सेटिंग खोलें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
index 4add873..3267981 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome жүйесі <ph name="ISSUER" /> осы веб-сайт сертификатын шығарғанын растайды.</translation>
 <translation id="2199719347983604670">Chrome Sync деректері</translation>
 <translation id="2347208864470321755">Бұл функция қосылған кезде, Chrome басқа тілдерде жазылған беттерді Google Translate арқылы аударуды ұсынады. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome браузерін әдепкі браузер ету</translation>
 <translation id="2574249610672786438">Chrome браузерін кез келген жерде пайдаланғанда, қойындыларды көру үшін барлық құрылғыларда есептік жазбаға кіріңіз.</translation>
 <translation id="2576431527583832481">Chrome жақсара түсті! Жаңа нұсқасын қолданып көріңіз.</translation>
 <translation id="257708665678654955">Google Chrome келесіде осы сайттағы <ph name="LANGUAGE_NAME" /> беттерін аударуды ұсынуын қалайсыз ба?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome жүйесіне кіру</translation>
 <translation id="3345341804167540816">Chrome қолданбасын барлық жерде қолдану</translation>
 <translation id="3522659714780527202">Chrome браузерін пайдаланатын кез келген жерден қойындыларды көру үшін синхрондауды қосыңыз.</translation>
+<translation id="3706101708757577809">Енді хабарларда, құжаттарда және басқа қолданбаларда сілтемелерді түртіп, Chrome браузерін кез келген уақытта пайдалана аласыз.</translation>
 <translation id="384394811301901750">Google Chrome дәл қазір камераны пайдалана алмайды</translation>
 <translation id="3980220367029651214"><ph name="USER_EMAIL1" /> синхрондау есептік жазбасын <ph name="USER_EMAIL2" /> жазбасына ауыстырудасыз. Қолданыстағы Chrome деректерін <ph name="DOMAIN" /> басқарады. Мұның нәтижесінде деректер құрылғыдан жойылады, бірақ <ph name="USER_EMAIL1" /> жазбасында сақталады.</translation>
 <translation id="3988789688219830639">Google Chrome сурет пен бейнелерге кіре алмайды. "iOS параметрлері &gt; Құпиялылық &gt; Фотосуреттер" арқылы рұқсат беру қажет.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Chrome жүйесіне көшірілген</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> басқаратын есептік жазбамен кірудесіз және оның әкімшісіне Chrome деректерін басқару құқығы берілуде. Деректер бұл есептік жазбаға біржола байланыстырылады. Chrome жүйесінен шыққанда, деректер бұл құрылғыдан жойылады, бірақ Google есептік жазбасында сақталады.</translation>
 <translation id="6676840375528380067">Chrome деректері осы құрылғыдан жойылсын ба?</translation>
+<translation id="6724102885918156196">Chrome браузерін әдепкі браузер ету:
+        1. Параметрлерді ашыңыз. 
+        2. "Әдепкі браузер қолданбасы" түймесін түртіңіз.
+        3. Chrome браузерін таңдаңыз.</translation>
 <translation id="7165736900384873061">Google Chrome QR сканерін пайдалана бастау</translation>
 <translation id="7172660552945675509">Кеңес: <ph name="BEGIN_LINK" />Chrome браузерін Dock тақтасына көшіріңіз<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Параметрлерді ашу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb
index d79ce81..9411a070 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_km.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome បានផ្ទៀងផ្ទាត់ថា <ph name="ISSUER" /> បានចេញផ្សាយវិញ្ញាបនបត្ររបស់គេហទំព័រនេះ។</translation>
 <translation id="2199719347983604670">ទិន្នន័យពី Chrome សមកាលកម្ម</translation>
 <translation id="2347208864470321755">នៅពេលដែលលក្ខណៈពិសេសនេះបើក Chrome នឹងបកប្រែទំព័រដែលសរសេរជាភាសាដទៃដោយប្រើកម្មវិធី Google បកប្រែ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">កំណត់ Chrome ជាកម្មវិធី​រុករក​តាមអ៊ីនធឺណិតលំនាំដើម​របស់អ្នក</translation>
 <translation id="2574249610672786438">ដើម្បី​អាចមើលឃើញ​ផ្ទាំង​របស់អ្នក​ពី​ឧបករណ៍ទាំងឡាយ​ដែលអ្នក​ប្រើ Chrome សូមចូលគណនី​នៅលើ​ឧបករណ៍​ទាំងអស់​របស់អ្នក</translation>
 <translation id="2576431527583832481">Chrome កាន់តែប្រសើរជាងមុន! មានកំណែថ្មី។</translation>
 <translation id="257708665678654955">តើអ្នកចង់ឲ្យ Google Chrome ផ្តល់ជូននូវការបកប្រែទំព័រ <ph name="LANGUAGE_NAME" /> ចេញពីគេហទំព័រនេះដែរឬទេនៅពេលក្រោយ?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">ចូលទៅ Chrome</translation>
 <translation id="3345341804167540816">ប្រើ Chrome គ្រប់ទីកន្លែង</translation>
 <translation id="3522659714780527202">ដើម្បី​អាចមើលឃើញ​ផ្ទាំង​របស់អ្នក​ពី​ឧបករណ៍ទាំងឡាយ​ដែលអ្នក​ប្រើ Chrome សូមបើក​សមកាលកម្ម</translation>
+<translation id="3706101708757577809">ឥឡូវនេះ អ្នកអាចប្រើ Chrome រាល់ពេលដែល​អ្នកចុចលើតំណ​នៅក្នុងសារ ឯកសារ និងកម្មវិធី​ផ្សេងទៀត។</translation>
 <translation id="384394811301901750">Google Chrome មិនអាចប្រើកាមេរ៉ារបស់អ្នកបានទេឥឡូវនេះ</translation>
 <translation id="3980220367029651214">អ្នកកំពុងប្តូរគណនីសមកាលកម្មពី <ph name="USER_EMAIL1" /> ទៅ <ph name="USER_EMAIL2" /> ។ ទិន្នន័យ Chrome របស់អ្នកដែលមានស្រាប់ត្រូវបានគ្រប់គ្រងដោយ <ph name="DOMAIN" /> ។ វានឹងលុបទិន្នន័យរបស់អ្នកចេញពីឧបករណ៍នេះ ប៉ុន្តែទិន្នន័យរបស់អ្នកនៅតែមាននៅក្នុង <ph name="USER_EMAIL1" /> ដដែល។</translation>
 <translation id="3988789688219830639">Google Chrome មិនមានលទ្ធភាពចូលប្រើរូបថត និងវីដេអូរបស់អ្នកទេ។ បើកដំណើរការចូលប្រើនៅក្នុងការកំណត់ iOS &gt; ភាពឯកជន &gt; រូបថត។</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">បានចម្លងទៅ Chrome</translation>
 <translation id="6648150602980899529">អ្នកកំពុងចូលដោយប្រើគណនីដែលគ្រប់គ្រងដោយ <ph name="DOMAIN" /> និងកំពុងផ្តល់ឲ្យអ្នកគ្រប់គ្រងរបស់វានូវលទ្ធភាពគ្រប់គ្រងទិន្នន័យ Chrome របស់អ្នក។ ទិន្នន័យរបស់អ្នកនឹងភ្ជាប់ជាមួយគណនីនេះជាអចិន្ត្រៃយ៍។ ការចេញពី Chrome នឹងលុបទិន្នន័យរបស់អ្នកចេញពីឧបករណ៍នេះ ប៉ុន្តែវានឹងនៅតែត្រូវបានរក្សាទុកក្នុងគណនី Google របស់អ្នកដដែល។</translation>
 <translation id="6676840375528380067">សម្អាតទិន្នន័យ​ Chrome ​របស់អ្នកពី​ឧបករណ៍នេះមែនទេ?</translation>
+<translation id="6724102885918156196">ដើម្បីកំណត់ Chrome ជាកម្មវិធី​រុករក​តាមអ៊ីនធឺណិតលំនាំដើម​របស់អ្នក៖
+        1. បើកការកំណត់។ 
+        2. ចុច​កម្មវិធីរុករកតាមអ៊ីនធឺណិតលំនាំដើម។
+        3. ជ្រើសរើស Chrome។</translation>
 <translation id="7165736900384873061">ចាប់ផ្តើមប្រើកម្មវិធីស្កេនកូដ QR របស់ Google Chrome</translation>
 <translation id="7172660552945675509">គន្លឹះ៖ <ph name="BEGIN_LINK" />ផ្លាស់ទី Chrome ទៅដក់របស់អ្នក<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">បើកការកំណត់</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ky.xtb
index 9225f6d..6ae30ea 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ky.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome <ph name="ISSUER" /> бул вебсайт тастыктамасын басып чыгарганын ырастады.</translation>
 <translation id="2199719347983604670">Chrome Шайкештирүүнүн дайындары</translation>
 <translation id="2347208864470321755">Ушул мүмкүнчүлүк иштетилгенде, Chrome Google Котормо кызматы аркылуу башка тилдерде жазылган беттерди которууну сунуштайт. <ph name="BEGIN_LINK" />Көбүрөөк билүү<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome'ду демейки серепчи кылып алыңыз</translation>
 <translation id="2574249610672786438">Chrome колдонулган түзмөктөрдүн баарындагы өтмөктөрүңүздү көрүү үчүн бардык түзмөктөрдөн аккаунтуңузга кириңиз</translation>
 <translation id="2576431527583832481">Chrome жаңы эле жакшыртылды! Эми жаңы нускасы бар.</translation>
 <translation id="257708665678654955">Кийинки жолу Google Chrome ушул сайттагы <ph name="LANGUAGE_NAME" /> тилиндеги барактарды которууну сунуштасынбы?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome'го кириңиз</translation>
 <translation id="3345341804167540816">Бүт жерде Chrome колдонуңуз</translation>
 <translation id="3522659714780527202">Chrome колдонулган түзмөктөрдүн баарындагы өтмөктөрүңүздү көрүү үчүн шайкештирүүнү күйгүзүңүз</translation>
+<translation id="3706101708757577809">Эми билдирүүлөрдөгү шилтемелерди, документтерди жана башка колдонмолорду Chrome'до ача аласыз.</translation>
 <translation id="384394811301901750">Google Chrome камераны иштете албайт</translation>
 <translation id="3980220367029651214">Шайкештирилүүчү каттоо эсебин <ph name="USER_EMAIL1" /> дарегинен <ph name="USER_EMAIL2" /> дарегине которуп жатасыз. Учурдагы Chrome дайын-даректериңиз <ph name="DOMAIN" /> тарабынан башкарылат. Ушуну менен бул түзмөктөн дайын-даректериңиз өчүрүлөт, бирок алар <ph name="USER_EMAIL1" /> дарегинде кала берет.</translation>
 <translation id="3988789688219830639">Google Chrome сүрөттөрүңүздү же видеолоруңузду көрө албайт. Көрүү үчүн iOS Жөндөөлөрү &gt; Купуялык &gt; Сүрөттөргө өтүңүз.</translation>
@@ -43,6 +45,10 @@
 <translation id="6600954340915313787">Chrome'го көчүрүлдү</translation>
 <translation id="6648150602980899529">Сиз <ph name="DOMAIN" /> тарабынан башкарылган аккаунт менен кирип, анын администратор көзөмөлдөрүн Chrome дайындарына өткөрүп жатасыз. Дайын-даректериңиз бул аккаунтка биротоло байланып калат. Chrome аккаунткан чыксаңыз, бул түзмөктөн дайын-даректериңиз өчүрүлөт, бирок Google Каттоо эсебинде сакталып кала берет.</translation>
 <translation id="6676840375528380067">Chrome'догу дайын-даректериңиз бул түзмөктөн өчүрүлсүнбү?</translation>
+<translation id="6724102885918156196">Chrome'ду демейки серепчи кылуу үчүн:
+        1. Жөндөөлөрдү ачыңыз. 
+        2. Демейки серепчи колдонмосун басыңыз.
+        3. Chrome'ду тандаңыз.</translation>
 <translation id="7165736900384873061">Google Chrome'дун QR сканнерин колдонуу</translation>
 <translation id="7172660552945675509">Кеңеш: <ph name="BEGIN_LINK" />Chrome'ду док бекетиңизге көчүрүңүз<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Жөндөөлөрдү ачуу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
index 4c40666..7aaf4b9e 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_lv.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome apstiprināja, ka <ph name="ISSUER" /> izsniedza šīs vietnes sertifikātu.</translation>
 <translation id="2199719347983604670">Chrome sinhronizācijas dati</translation>
 <translation id="2347208864470321755">Ja šī funkcija ir ieslēgta, Chrome piedāvā tulkot citās valodās rakstītas lapas, izmantojot Google tulkotāju. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
+<translation id="2415682770504543561">Chrome kā noklusējuma pārlūka iestatīšana</translation>
 <translation id="2574249610672786438">Lai skatītu cilnes no ierīcēm, kurās lietojat pārlūku Chrome, pierakstieties visās savās ierīcēs.</translation>
 <translation id="2576431527583832481">Pārlūkprogramma Chrome ir uzlabota! Ir pieejama jauna versija.</translation>
 <translation id="257708665678654955">Vai vēlaties, lai Google Chrome nākamreiz piedāvātu tulkot šīs vietnes lapas, kuru saturs ir šādā valodā: <ph name="LANGUAGE_NAME" />?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Pierakstīties pārlūkā Chrome</translation>
 <translation id="3345341804167540816">Izmantojiet Chrome visur</translation>
 <translation id="3522659714780527202">Lai skatītu cilnes no ierīcēm, kurās lietojat pārlūku Chrome, ieslēdziet sinhronizāciju.</translation>
+<translation id="3706101708757577809">Tagad varat izmantot Chrome ikreiz, kad pieskaraties saitēm ziņojumos, dokumentos un citās lietotnēs.</translation>
 <translation id="384394811301901750">Google Chrome pašlaik nevar izmantot kameru.</translation>
 <translation id="3980220367029651214">Jūs pārslēdzat sinhronizējamos kontus no konta <ph name="USER_EMAIL1" /> uz kontu <ph name="USER_EMAIL2" />. Jūsu esošie Chrome dati tiek pārvaldīti domēnā <ph name="DOMAIN" />. Pārslēdzot kontus, jūsu dati tiks dzēsti no šīs ierīces, taču tie paliks kontā <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Google Chrome nevar piekļūt jūsu fotoattēliem vai videoklipiem. Iespējojiet piekļuvi: iOS Settings &gt; Privacy &gt; Photos.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Nokopēta pārlūkā Chrome.</translation>
 <translation id="6648150602980899529">Jūs pierakstāties kontā, kas tiek pārvaldīts domēnā <ph name="DOMAIN" />, un sniedzat tā administratoram kontroli pār saviem Chrome datiem. Jūsu dati tiks neatgriezeniski saistīti ar šo kontu. Izrakstoties no pārlūka Chrome, jūsu dati tiks dzēsti no šīs ierīces, taču tie tiks saglabāti jūsu Google kontā.</translation>
 <translation id="6676840375528380067">Vai dzēst jūsu Chrome datus no šīs ierīces?</translation>
+<translation id="6724102885918156196">Lai iestatītu Chrome kā noklusējuma pārlūkprogrammu, veiciet tālāk norādītās darbības.
+        1. Atveriet lietotni Settings (Iestatījumi). 
+        2. Pieskarieties vienumam “Default Browser App” (Noklusējuma pārlūka lietotne).
+        3. Atlasiet Chrome.</translation>
 <translation id="7165736900384873061">Darba sākšana ar Google Chrome QR skeneri</translation>
 <translation id="7172660552945675509">Padoms. <ph name="BEGIN_LINK" />Pārvietojiet pārlūku Chrome uz savu doku<ph name="END_LINK" />.</translation>
 <translation id="7173114856073700355">Atvērt iestatījumus</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
index 252ce42..252c3db 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">ഈ വെബ്‌സൈറ്റിന്റെ സർട്ടിഫിക്കറ്റ് <ph name="ISSUER" /> നൽകിയതാണെന്ന് Chrome പരിശോധിച്ചുറപ്പിച്ചു.</translation>
 <translation id="2199719347983604670">Chrome സമന്വയത്തിൽ നിന്നുള്ള ഡാറ്റ</translation>
 <translation id="2347208864470321755">ഈ സവിശേഷത ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chrome ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ആക്കുക</translation>
 <translation id="2574249610672786438">Chrome ഉപയോഗിക്കുന്നിടത്തെല്ലാം നിങ്ങളുടെ ടാബുകൾ കാണാൻ, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="2576431527583832481">Chrome ഒന്നുകൂടി മികച്ചതായി! പുതിയ പതിപ്പ് ലഭ്യമാണ്.</translation>
 <translation id="257708665678654955">അടുത്ത തവണ ഈ സൈറ്റിൽ നിന്ന് <ph name="LANGUAGE_NAME" /> പേജുകൾ വിവർത്തനം ചെയ്യാൻ Google Chrome ഓഫർ ചെയ്യുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമുണ്ടോ?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="3345341804167540816">എല്ലായിടത്തും Chrome ഉപയോഗിക്കുക</translation>
 <translation id="3522659714780527202">Chrome ഉപയോഗിക്കുന്നിടത്തെല്ലാം നിങ്ങളുടെ ടാബുകൾ കാണാൻ, സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
+<translation id="3706101708757577809">സന്ദേശങ്ങൾ, ഡോക്യുമെന്റുകൾ, മറ്റ് ആപ്പുകൾ എന്നിവയിലെ ലിങ്കുകളിൽ ടാപ്പ് ചെയ്യുന്ന ഏതുസമയത്തും നിങ്ങൾക്ക് ഇപ്പോൾ Chrome ഉപയോഗിക്കാനാകും.</translation>
 <translation id="384394811301901750">Google Chrome-ന് ഇപ്പോൾ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="3980220367029651214">നിങ്ങൾ <ph name="USER_EMAIL1" /> എന്നതിൽ നിന്ന് <ph name="USER_EMAIL2" /> എന്നതിലേക്ക് സമന്വയ അക്കൗണ്ടുകൾ മാറ്റുകയാണ്. <ph name="DOMAIN" /> ഡൊമെയ്‌നാണ് നിങ്ങളുടെ നിലവിലുള്ള Chrome വിവരങ്ങൾ മാനേജ് ചെയ്യുന്നത്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരം ഇല്ലാതാക്കുമെങ്കിലും, <ph name="USER_EMAIL1" /> എന്നതിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="3988789688219830639">Google Chrome-ന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Chrome-ലേക്ക് പ്കർത്തി</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ട് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുകയും ഇതിന്റെ അഡ്‌മിനിസ്‌ട്രേറ്റർക്ക് നിങ്ങളുടെ Chrome വിവരങ്ങളിന്മേൽ നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു. വിവരങ്ങളെ ഈ അക്കൗണ്ടുമായി ശാശ്വതമായി ബന്ധിപ്പിക്കും. Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുന്നത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരങ്ങളെ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ സൂക്ഷിക്കുന്നതാണ്.</translation>
 <translation id="6676840375528380067">ഉപകരണത്തില്‍ നിന്ന് Chrome ഡാറ്റ മായ്ക്കണോ?</translation>
+<translation id="6724102885918156196">Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ആക്കാൻ:
+        1. ക്രമീകരണം തുറക്കുക. 
+        2. ഡിഫോൾട്ട് ബ്രൗസർ ആപ്പ് ടാപ്പ് ചെയ്യുക.
+        3. Chrome തിരഞ്ഞെടുക്കുക.</translation>
 <translation id="7165736900384873061">Google Chrome QR സ്‌കാനർ ഉപയോഗിക്കാൻ തുടങ്ങൂ</translation>
 <translation id="7172660552945675509">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chrome-നെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">ക്രമീകരണം തുറക്കുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
index 597c268..04215ba 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome bekreftet at sertifikatet for dette nettstedet er utstedt av <ph name="ISSUER" />.</translation>
 <translation id="2199719347983604670">Data fra Chrome-synkronisering</translation>
 <translation id="2347208864470321755">Når denne funksjonen er slått på, tilbyr Chrome å oversette sider som er skrevet på andre språk ved hjelp av Google Oversetter. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Velg Chrome som standardnettleser</translation>
 <translation id="2574249610672786438">For å se fanene dine overalt hvor du bruker Chrome, logg på alle enhetene dine</translation>
 <translation id="2576431527583832481">Chrome har blitt enda bedre. En ny versjon er nå tilgjengelig.</translation>
 <translation id="257708665678654955">Vil du at Google Chrome skal tilby å oversette sider på <ph name="LANGUAGE_NAME" /> på dette nettstedet neste gang?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Logg på Chrome</translation>
 <translation id="3345341804167540816">Bruk Chrome overalt</translation>
 <translation id="3522659714780527202">For å se fanene dine overalt hvor du bruker Chrome, slå på synkronisering</translation>
+<translation id="3706101708757577809">Du kan nå bruke Chrome hver gang du trykker på linker i meldinger, dokumenter og andre apper.</translation>
 <translation id="384394811301901750">Google Chrome kan ikke bruke kameraet akkurat nå</translation>
 <translation id="3980220367029651214">Du bytter synkroniseringskonto fra <ph name="USER_EMAIL1" /> til <ph name="USER_EMAIL2" />. De eksisterende Chrome-dataene dine administreres av <ph name="DOMAIN" />. Dette sletter dataene dine fra denne enheten, men dataene blir værende i <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Google Chrome har ikke tilgang til bildene eller videoene dine. Slå på tilgangen i iOS-innstillingene &gt; Personvern &gt; Bilder.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Kopiert til Chrome</translation>
 <translation id="6648150602980899529">Du logger på med en konto som administreres av <ph name="DOMAIN" />, og du gir administratoren for dette domenet kontroll over Chrome-dataene dine. Dataene dine blir permanent knyttet til denne kontoen. Når du logger av Chrome, slettes dataene dine fra denne enheten, men de lagres fortsatt i Google-kontoen din.</translation>
 <translation id="6676840375528380067">Vil du fjerne Chrome-dataene dine fra denne enheten?</translation>
+<translation id="6724102885918156196">Slik velger du Chrome som standardnettleser:
+        1. Åpne Innstillinger. 
+        2. Trykk på «Default Browser App» (Standard nettleserapp).
+        3. Velg Chrome.</translation>
 <translation id="7165736900384873061">Begynn å bruke Google Chrome QR-skanneren</translation>
 <translation id="7172660552945675509">Tips: <ph name="BEGIN_LINK" />Flytt Chrome til dokken<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Åpne Innstillinger</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
index 1f2e91b..e8fc9021 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ro.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome s-a asigurat că certificatul acestui site a fost emis de <ph name="ISSUER" />.</translation>
 <translation id="2199719347983604670">Datele din Sincronizarea Chrome</translation>
 <translation id="2347208864470321755">Când este activată această funcție, Chrome se va oferi să traducă paginile scrise în alte limbi utilizând Google Traducere. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Setează Chrome ca browser prestabilit</translation>
 <translation id="2574249610672786438">Conectează-te pe toate dispozitivele ca să vezi toate filele tale deschise în Chrome</translation>
 <translation id="2576431527583832481">Chrome a devenit și mai bun! Este disponibilă o nouă versiune.</translation>
 <translation id="257708665678654955">Dorești ca data viitoare Google Chrome să propună traducerea paginilor în limba <ph name="LANGUAGE_NAME" /> de pe acest site?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Conectează-te la Chrome</translation>
 <translation id="3345341804167540816">Folosește Chrome oriunde</translation>
 <translation id="3522659714780527202">Activează sincronizarea ca să vezi toate filele tale deschise în Chrome</translation>
+<translation id="3706101708757577809">Acum poți folosi Chrome oricând atingi linkuri în mesaje, documente și alte aplicații.</translation>
 <translation id="384394811301901750">Momentan, Google Chrome nu poate folosi camera foto</translation>
 <translation id="3980220367029651214">Comuți contul pentru sincronizare de la <ph name="USER_EMAIL1" /> la <ph name="USER_EMAIL2" />. Datele Chrome existente sunt gestionate de <ph name="DOMAIN" />. Astfel, se vor șterge datele de pe acest dispozitiv, dar datele vor rămâne în <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Google Chrome nu are acces la fotografii și videoclipuri. Activează accesul din Setări iOS &gt; Confidențialitate &gt; Fotografii.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Copiat în Chrome</translation>
 <translation id="6648150602980899529">Te conectezi cu un cont gestionat de <ph name="DOMAIN" /> și acorzi administratorului acestuia controlul asupra datelor Chrome. Datele vor fi asociate definitiv acestui cont. Dacă te deconectezi de la Chrome, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne stocate în Contul Google.</translation>
 <translation id="6676840375528380067">Ștergi datele tale Chrome de pe acest dispozitiv?</translation>
+<translation id="6724102885918156196">Pentru a seta Chrome ca browser prestabilit:
+        1. deschide Setările; 
+        2. atinge Aplicația browser prestabilită;
+        3. selectează Chrome.</translation>
 <translation id="7165736900384873061">Începe să folosești scanerul QR din Google Chrome</translation>
 <translation id="7172660552945675509">Sfat: <ph name="BEGIN_LINK" />mută Chrome în bara de andocare<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Deschide Setările</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
index 1a98484..97d02eaf 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sl.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome je preveril, da je izdajatelj <ph name="ISSUER" /> izdal potrdilo tega spletnega mesta.</translation>
 <translation id="2199719347983604670">Podatki iz Sinhronizacije za Chrome</translation>
 <translation id="2347208864470321755">Kadar je vklopljena ta funkcija, bo Chrome ponudil, da z uporabo Google Prevajalnika prevede strani v drugih jezikih. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Nastavite Chrome kot privzeti brskalnik</translation>
 <translation id="2574249610672786438">Če si želite ogledati zavihke iz naprav, v katerih uporabljate Chrome, se prijavite v vseh napravah</translation>
 <translation id="2576431527583832481">Chrome je izboljšan! Na voljo je nova različica.</translation>
 <translation id="257708665678654955">Želite, da Google Chrome naslednjič ponudi prevod strani v jeziku <ph name="LANGUAGE_NAME" /> s tega spletnega mesta?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Prijava v Chrome</translation>
 <translation id="3345341804167540816">Use Chrome Everywhere</translation>
 <translation id="3522659714780527202">Če si želite ogledati zavihke iz naprav, v katerih uporabljate Chrome, vklopite sinhronizacijo</translation>
+<translation id="3706101708757577809">Zdaj lahko uporabljate Chrome, kadar koli se dotaknete povezav v sporočilih, dokumentih in drugih aplikacijah.</translation>
 <translation id="384394811301901750">Google Chrome trenutno ne more uporabljati fotoaparata</translation>
 <translation id="3980220367029651214">Z računa za sinhronizacijo <ph name="USER_EMAIL1" /> boste preklopili na račun <ph name="USER_EMAIL2" />. Obstoječe podatke v Chromu upravlja <ph name="DOMAIN" />. S tem boste izbrisali podatke iz te naprave, vendar bodo vaši podatki še vedno na voljo v računu <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Google Chrome nima dostopa do fotografij ali videoposnetkov. Omogočite dostop v sistemu iOS: Settings &gt; Privacy &gt; Photos.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Kopirano v Chrome</translation>
 <translation id="6648150602980899529">Prijavljate se v račun, ki ga upravlja <ph name="DOMAIN" />, in nadzor nad podatki v Chromu predajate skrbniku. Vaši podatki bodo trajno povezani s tem računom. Če se odjavite iz Chroma, boste izbrisali podatke iz te naprave, vendar bodo še naprej shranjeni v Google Računu.</translation>
 <translation id="6676840375528380067">Ali želite izbrisati podatke v Chromu iz te naprave?</translation>
+<translation id="6724102885918156196">Chrome nastavite kot privzeti tiskalnik tako:
+        1. Odprite nastavitve. 
+        2. Dotaknite se možnosti za privzeto aplikacijo za brskanje.
+        3. Izberite Chrome.</translation>
 <translation id="7165736900384873061">Začetek uporabe bralnika kod QR Google Chroma</translation>
 <translation id="7172660552945675509">Nasvet: <ph name="BEGIN_LINK" />premaknite Chrome v vrstico z aplikacijami<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Odpri nastavitve</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
index d3b82b7..b6d8c39 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome verifikoi që <ph name="ISSUER" /> ka lëshuar certifikatën e këtij sajti të uebit.</translation>
 <translation id="2199719347983604670">Të dhënat nga "Sinkronizimi i Chrome"</translation>
 <translation id="2347208864470321755">Kur ky funksion është i aktivizuar, Chrome do të ofrojë që të përkthejë faqet e shkruara në gjuhë të tjera duke përdorur "Përkthe me Google". <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Bëje Chrome shfletuesin tënd të parazgjedhur</translation>
 <translation id="2574249610672786438">Për të parë skedat e tua nga çdo vend ku përdor Chrome, identifikohu në të gjitha pajisjet e tua</translation>
 <translation id="2576431527583832481">Chrome sapo është përmirësuar! Ofrohet një version i ri.</translation>
 <translation id="257708665678654955">Dëshiron që Google Chrome të ofrojë përkthimin e faqeve në <ph name="LANGUAGE_NAME" /> nga ky sajt herën tjetër?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Identifikohu në Chrome</translation>
 <translation id="3345341804167540816">Përdor Chrome kudo</translation>
 <translation id="3522659714780527202">Për të parë skedat e tua nga çdo vend ku përdor Chrome, aktivizo sinkronizimin</translation>
+<translation id="3706101708757577809">Tani mund të përdorësh Chrome sa herë që troket te lidhjet në mesazhe, dokumente dhe aplikacione të tjera.</translation>
 <translation id="384394811301901750">Google Chrome nuk mund të përdorë kamerën tënde për momentin</translation>
 <translation id="3980220367029651214">Po i ndërron llogaritë e sinkronizimit nga <ph name="USER_EMAIL1" /> te <ph name="USER_EMAIL2" />. Të dhënat ekzistuese të Chrome po menaxhohen nga <ph name="DOMAIN" />. Kjo do t'i fshijë të dhënat e tua nga kjo pajisje, por të dhënat e tua do të mbeten në <ph name="USER_EMAIL1" />.</translation>
 <translation id="3988789688219830639">Google Chrome nuk ka qasje te fotografitë apo videot e tua. Aktivizo qasjen te Cilësimet e iOS &gt; Privatësia &gt; Fotografitë.</translation>
@@ -43,6 +45,10 @@
 <translation id="6600954340915313787">Kopjuar në Chrome</translation>
 <translation id="6648150602980899529">Po identifikohesh me një llogari të menaxhuar nga <ph name="DOMAIN" /> dhe po i jep administratorit të saj kontroll mbi të dhënat e tua të Chrome. Duke dalë nga Chrome do të fshihen të dhënat e tua nga kjo pajisje, por do të mbeten të ruajtura në llogarinë tënde të Google.</translation>
 <translation id="6676840375528380067">Të pastrohen të dhënat e tua të Chrome nga kjo pajisje?</translation>
+<translation id="6724102885918156196">Për ta bërë Chrome shfletuesin e parazgjedhur:
+        1. Hap "Cilësimet". 
+        2. Trokit tek "Aplikacioni i parazgjedhur i shfletuesit".
+        3. Zgjidh Chrome.</translation>
 <translation id="7165736900384873061">Fillo të përdorësh skanerin e kodit QR të Google Chrome</translation>
 <translation id="7172660552945675509">Këshillë: <ph name="BEGIN_LINK" />Zhvendose Chrome te stacioni yt<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Hap cilësimet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb
index 7920bac..f55d968 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome ushbu veb-sayt haqiqiyligi <ph name="ISSUER" /> tomonidan tasdiqlanganligini aniqladi.</translation>
 <translation id="2199719347983604670">Chrome sync maʼlumotlari</translation>
 <translation id="2347208864470321755">Agar bu funksiya yoniq bo‘lsa, Chrome sahifalarni Google Tarjimon xizmati yordamida tarjima qilishni taklif qiladi. <ph name="BEGIN_LINK" />Batafsil...<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">Chrome brauzerini asosiy brauzer qilib belgilash</translation>
 <translation id="2574249610672786438">Boshqa qurilmalardagi Chrome varaqlarini koʻrish uchun barcha qurilmalarda hisobingizga kiring</translation>
 <translation id="2576431527583832481">Chrome ancha yaxshilandi! Uning yangi versiyasi chiqdi.</translation>
 <translation id="257708665678654955">Google Chrome ushbu saytning <ph name="LANGUAGE_NAME" /> tilidagi sahifalarini tarjima qilishni har doim taklif qilsinmi?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">Chrome hisobiga kirish</translation>
 <translation id="3345341804167540816">Chrome’ni o‘zingiz bilan olib yuring</translation>
 <translation id="3522659714780527202">Boshqa qurilmalardagi Chrome varaqlarini koʻrish uchun sinxronizatsiyani yoqing</translation>
+<translation id="3706101708757577809">Siz endi Chromium brauzerini har doim xabarlar, hujjatlar va boshqa ilovalardagi havolalar ustiga bosib ishga tushirishingiz mumkin.</translation>
 <translation id="384394811301901750">Google Chrome hozir kamerangizdan foydalana olmaydi.</translation>
 <translation id="3980220367029651214">Siz <ph name="USER_EMAIL1" /> hisobi ma’lumotlarini <ph name="USER_EMAIL2" /> hisobiga ko‘chirish arafasizdasiz. Mavjud Chrome ma’lumotlaringiz <ph name="DOMAIN" /> domenida boshqariladi. Barcha Chrome ma’lumotlari ushbu qurilmadan o‘chiriladi, lekin <ph name="USER_EMAIL1" /> hisobida saqlanib qoladi.</translation>
 <translation id="3988789688219830639">Google Chrome rasm va videolaringizni ko‘ra olmayapti. “Sozlamalar &gt; Maxfiylik &gt; Rasmlar” oynasida ruxsat bering.</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">Chrome’ga nusxalandi</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> domenida boshqariladigan hisobga kirish bilan siz administratorga Chrome ma’lumotlaringizni boshqarishiga rozilik bildirasiz. Barcha Chrome ma’lumotlaringiz bu hisobga butunlay bog‘langan. Agar hisobdan chiqadigan bo‘lsangiz, bu qurilmadagi barcha ma’lumotlaringiz o‘chib ketadi, lekin Google hisobingizda saqlanib qoladi.</translation>
 <translation id="6676840375528380067">Chrome maʼlumotlaringiz bu qurilmadan tozalansinmi?</translation>
+<translation id="6724102885918156196">Chrome brauzerini asosiy qilish uchun:
+        1. Sozlamalarni oching. 
+        2. Asosiy brauzer ilovasi ustiga bosing.
+        3. Chrome brauzerini tanlang.</translation>
 <translation id="7165736900384873061">Google Chrome QR-kod skaneridan foydalaning</translation>
 <translation id="7172660552945675509">Maslahat: <ph name="BEGIN_LINK" />Chrome brauzerini sevimli ilovalar paneliga qadab oling<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">Sozlamalarni ochish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
index 5adf2a1c..79f6d16 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-HK.xtb
@@ -11,6 +11,7 @@
 <translation id="2147651015520127414">Chrome 驗證到「<ph name="ISSUER" />」已發出此網站的憑證。</translation>
 <translation id="2199719347983604670">從 Chrome 同步的資料</translation>
 <translation id="2347208864470321755">開啟這項功能後,Chrome 會使用 Google 翻譯來翻譯其他語言的網頁。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
+<translation id="2415682770504543561">將 Chrome 設定為預設瀏覽器</translation>
 <translation id="2574249610672786438">如要在任何使用 Chrome 的裝置上查看分頁,請在所有裝置上登入</translation>
 <translation id="2576431527583832481">Chrome 現在更進一步!歡迎您升級使用新版本。</translation>
 <translation id="257708665678654955">您希望 Google Chrome 將來翻譯此網站的<ph name="LANGUAGE_NAME" />頁面嗎?</translation>
@@ -24,6 +25,7 @@
 <translation id="3282568296779691940">登入 Chrome</translation>
 <translation id="3345341804167540816">隨時隨地使用 Chrome</translation>
 <translation id="3522659714780527202">如要在任何使用 Chrome 的裝置上查看分頁,請開啟同步處理功能</translation>
+<translation id="3706101708757577809">您現在只要在訊息、文件或其他應用程式中輕按連結,即可使用 Chrome。</translation>
 <translation id="384394811301901750">Google Chrome 目前無法使用您的相機</translation>
 <translation id="3980220367029651214">您正在將同步處理帳戶從 <ph name="USER_EMAIL1" /> 切換為 <ph name="USER_EMAIL2" />。您現有的 Chrome 資料由 <ph name="DOMAIN" /> 管理。這會刪除此裝置上的資料,但這些資料仍會保留在 <ph name="USER_EMAIL1" /> 中。</translation>
 <translation id="3988789688219830639">Google Chrome 沒有存取相片或影片的權限。請前往「iOS 設定」&gt;「私隱」&gt;「相片」開放權限。</translation>
@@ -44,6 +46,10 @@
 <translation id="6600954340915313787">已複製至 Chrome</translation>
 <translation id="6648150602980899529">您即將登入由 <ph name="DOMAIN" /> 管理的帳戶,並讓帳戶管理員控制您的 Chrome 資料。您的資料將與這個帳戶建立永久連結。如果您登出 Chrome,系統將刪除此裝置上的資料,但這些資料仍會儲存在您的 Google 帳戶中。</translation>
 <translation id="6676840375528380067">要清除此裝置上的 Chrome 資料嗎?</translation>
+<translation id="6724102885918156196">如要將 Chrome 設定為預設瀏覽器:
+        1. 開啟 [設定]。
+        2. 輕按 [預設的瀏覽器應用程式]。
+        3. 選取 [Chrome]。</translation>
 <translation id="7165736900384873061">開始使用 Google Chrome 二維條碼掃描器</translation>
 <translation id="7172660552945675509">提示:<ph name="BEGIN_LINK" />將 Chrome 移至工具列<ph name="END_LINK" /></translation>
 <translation id="7173114856073700355">開啟設定</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb
index f090f76..2411ba8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_af.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-plasing is voltooi.</translation>
 <translation id="1103523840287552314">Vertaal <ph name="LANGUAGE" /> altyd</translation>
 <translation id="1104948393051856124">Aanvaar en gaan voort</translation>
-<translation id="1105578556867525047">Verander wagwoord op webwerf</translation>
 <translation id="1112015203684611006">Kon nie druk nie.</translation>
 <translation id="1125564390852150847">Skep nuwe oortjie.</translation>
 <translation id="1145536944570833626">Vee bestaande data uit.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Stoor prent</translation>
 <translation id="3789841737615482174">Installeer</translation>
 <translation id="3803696231112616155">Bied aan om hierdie werf te vertaal</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Geen wagwoorde is gekompromitteer nie}=1{{COUNT} wagwoord is gekompromitteer}other{{COUNT} wagwoorde is gekompromitteer}}</translation>
 <translation id="385051799172605136">Terug</translation>
 <translation id="3892144330757387737">Jy sal jou geskiedenis hier kry</translation>
 <translation id="3897092660631435901">Kieslys</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Stoor …</translation>
 <translation id="4904877109095351937">Merk as gelees</translation>
 <translation id="4930268273022498155">Vee bestaande data uit. Jy kan dit herwin deur weer na <ph name="USER_EMAIL1" /> oor te skakel.</translation>
+<translation id="4930714375720679147">Skakel aan</translation>
 <translation id="4941089862236492464">Jammer, kon nie jou item deel nie.</translation>
 <translation id="4944543191714094452">Soek op bladsy …</translation>
 <translation id="4945756290001680296">Gaan by wagwoordinstelling in</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Aflaai is klaar</translation>
 <translation id="8073872304774253879">Maak soektogte en blaai-ervaring beter</translation>
 <translation id="8076014560081431679">Gestoorde werfinstellings sal nie uitgevee word nie en sal dalk jou blaaigewoontes weerspieël. <ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Skakel af</translation>
 <translation id="8114753159095730575">Lêer kan afgelaai word. Opsies is naby die onderkant van die skerm beskikbaar.</translation>
 <translation id="8131740175452115882">Bevestig</translation>
 <translation id="8197543752516192074">Vertaal bladsy</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index 2c6818c..5c42b77 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">የFacebook ልጥፍ ተጠናቅቋል።</translation>
 <translation id="1103523840287552314">ሁልጊዜ <ph name="LANGUAGE" />ን መተርጎም</translation>
 <translation id="1104948393051856124">ተቀበል እና ቀጥል</translation>
-<translation id="1105578556867525047">ድር ጣቢያ ላይ የይለፍ ቃል ይቀይሩ</translation>
 <translation id="1112015203684611006">ማተም አልተሳካም።</translation>
 <translation id="1125564390852150847">አዲስ ትር ፍጠር።</translation>
 <translation id="1145536944570833626">ነባሩን ውሂብ ይሰርዙ።</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">ምስሉን አስቀምጥ</translation>
 <translation id="3789841737615482174">ጫን  </translation>
 <translation id="3803696231112616155">ወደዚህ ጣቢያ ለመተርጎም ሐሳብ ያቅርቡ</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ምንም የይለፍ ቃላት አልተጠለፈም}=1{{COUNT} የይለፍ ቃል ተጠልፏል}one{{COUNT} የይለፍ ቃላት ተጠልፈዋል}other{{COUNT} የይለፍ ቃላት ተጠልፈዋል}}</translation>
 <translation id="385051799172605136">ተመለስ</translation>
 <translation id="3892144330757387737">ታሪክዎን እዚህ ያገኛሉ</translation>
 <translation id="3897092660631435901">ምናሌ</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">አስቀምጥ...</translation>
 <translation id="4904877109095351937">እንደተነበበ ምልክት አድርግ</translation>
 <translation id="4930268273022498155">ነባሩን ውሂብ ይሰርዙ። ወደ <ph name="USER_EMAIL1" /> መልሰው በመቀየር ሰርስረው ሊያወጡት ይችላሉ።</translation>
+<translation id="4930714375720679147">አብራ</translation>
 <translation id="4941089862236492464">ይቅርታ፣ ንጥልዎን ማጋራት ላይ ችግር ነበር።</translation>
 <translation id="4944543191714094452">በዚህ ገጽ ውስጥ አግኝ…</translation>
 <translation id="4945756290001680296">የይለፍ ቃል ቅንብሮችን ይደርሱባቸው</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">ማውረድ ተጠናቅቋል</translation>
 <translation id="8073872304774253879">ፍለጋዎችን እና አሰሳን የተሻለ ያድርጉ</translation>
 <translation id="8076014560081431679">የተቀመጡ ጣቢያ ቅንብሮች አይሰረዙም፣ እና የእርስዎን የአሰሳ ልማዶች ሊያንጸባርቁ ይችሉ ይሆናል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">አጥፋ</translation>
 <translation id="8114753159095730575">ፋይል ለመውረድ ይገኛል። አማራጮች ከማያ ገጹ ግርጌ አጠገብ ይገኛሉ።</translation>
 <translation id="8131740175452115882">አረጋግጥ</translation>
 <translation id="8197543752516192074">ገጽን ተርጉም</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index ddfb277..051082c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">‏اكتمل النشر على Facebook.</translation>
 <translation id="1103523840287552314">ترجمة اللغة <ph name="LANGUAGE" /> دائمًا</translation>
 <translation id="1104948393051856124">القبول والمتابعة</translation>
-<translation id="1105578556867525047">تغيير كلمة المرور على الموقع الإلكتروني</translation>
 <translation id="1112015203684611006">تعذّرت الطباعة.</translation>
 <translation id="1125564390852150847">إنشاء علامة تبويب جديدة.</translation>
 <translation id="1145536944570833626">يمكنك حذف البيانات الحالية.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">يتعذر حفظ الصورة</translation>
 <translation id="1180526666083833456">يمكنك المزامنة والحصول على اقتراحات مخصصة على جميع الأجهزة.</translation>
 <translation id="1181037720776840403">إزالة</translation>
+<translation id="1185569544548277362">‏جديد: يمكنك جعل Chrome المتصفِّح التلقائي. <ph name="BEGIN_LINK" />فتح الإعدادات<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">بحث جديد</translation>
 <translation id="1209206284964581585">إخفاء الآن</translation>
 <translation id="1219674500290482172">يتعذر الاتصال بالإنترنت.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">حفظ الصورة</translation>
 <translation id="3789841737615482174">تثبيت</translation>
 <translation id="3803696231112616155">اقتراح ترجمة هذا الموقع الإلكتروني</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ما من كلمات مرور معرّضة للاختراق.}=1{كلمة مرور واحدة ({COUNT}) معرّضة للاختراق.}two{كلمتا مرور ({COUNT}) معرّضتان للاختراق.}few{{COUNT} كلمات مرور معرّضة للاختراق.}many{{COUNT} كلمة مرور معرّضة للاختراق.}other{{COUNT} كلمة مرور معرّضة للاختراق.}}</translation>
 <translation id="385051799172605136">الرجوع إلى الوراء</translation>
 <translation id="3892144330757387737">سيظهر لك السجلّ هنا</translation>
 <translation id="3897092660631435901">قائمة</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">حفظ...</translation>
 <translation id="4904877109095351937">وضع علامة كمقروءة</translation>
 <translation id="4930268273022498155">يمكنك حذف البيانات الحالية. يمكنك استرداد هذه البيانات بالتبديل مرة أخرى إلى <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">تفعيل</translation>
 <translation id="4941089862236492464">عذرًا، حدثت مشكلة أثناء مشاركة العنصر.</translation>
 <translation id="4944543191714094452">البحث في الصفحة…</translation>
 <translation id="4945756290001680296">الوصول إلى إعدادات كلمات المرور</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">اكتمل التنزيل</translation>
 <translation id="8073872304774253879">تحسين عمليات البحث والتصفُّح</translation>
 <translation id="8076014560081431679">لن يتم حذف إعدادات الموقع الإلكتروني المحفوظة وقد تعكس عادات التصفح. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">إيقاف</translation>
 <translation id="8114753159095730575">أصبح بالإمكان تنزيل الملف. يمكنك مراجعة الخيارات في أسفل الشاشة.</translation>
 <translation id="8131740175452115882">التأكيد</translation>
 <translation id="8197543752516192074">ترجمة الصفحة</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">علامات تبويب <ph name="INCOGNITO" /><ph name="FIRST_VISIBLE_TAB" /> عبر <ph name="LAST_VISIBLE_TAB" /> من <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">جديد</translation>
 <translation id="8532105204136943229">عام انتهاء الصلاحية</translation>
+<translation id="8533166274275423134">مفتوح في نافذة أخرى</translation>
 <translation id="8534481786647257214">‏اكتمل النشر على Google+‎.</translation>
 <translation id="8548878600947630424">بحث في الصفحة...</translation>
 <translation id="8574235780160508979">‏سيتم تغيير بنود خدمة Chrome في 31 آذار (مارس). <ph name="BEGIN_LINK" />يُرجى المراجعة<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index 2f98977..a249af1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">ফেচবুক প’ষ্ট দিয়া হ’ল।</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> সদাই অনুবাদ কৰক</translation>
 <translation id="1104948393051856124">গ্ৰহণ কৰক আৰু অব্যাহত ৰাখক</translation>
-<translation id="1105578556867525047">ৱেবছাইটত পাছৱৰ্ড সলনি কৰক</translation>
 <translation id="1112015203684611006">প্ৰিণ্টিং কৰিব পৰা নগ'ল।</translation>
 <translation id="1125564390852150847">নতুন টেব সৃষ্টি কৰক।</translation>
 <translation id="1145536944570833626">পূর্বে থকা ডেটা মচক।</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ছবি ছেভ কৰক</translation>
 <translation id="3789841737615482174">ইনষ্টল কৰক</translation>
 <translation id="3803696231112616155">এই ছাইটটো অনুবাদ কৰাৰ প্ৰস্তাৱ দিয়ক</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{কোনো পাছৱৰ্ড হেক হোৱা নাই}=1{{COUNT} টা পাছৱৰ্ড হেক হৈছে}one{{COUNT} টা পাছৱৰ্ড হেক হৈছে}other{{COUNT} টা পাছৱৰ্ড হেক হৈছে}}</translation>
 <translation id="385051799172605136">উভতি যাওক</translation>
 <translation id="3892144330757387737">ইয়াত আপুনি নিজৰ ইতিহাস বিচাৰি পাব</translation>
 <translation id="3897092660631435901">মেনু</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">ছেভ কৰক...</translation>
 <translation id="4904877109095351937">পঢ়া হিচাপে চিহ্নিত কৰক</translation>
 <translation id="4930268273022498155">পূৰ্বৰে পৰা থকা ডেটা মচক। আপুনি <ph name="USER_EMAIL1" />লৈ ঘূৰি গৈ ইয়াক পুনৰুদ্ধাৰ কৰিব পাৰে।</translation>
+<translation id="4930714375720679147">অন কৰক</translation>
 <translation id="4941089862236492464">দুঃখিত, আপোনাৰ বস্তুটো শ্বেয়াৰ কৰাত কিবা সমস্যা হৈছে।</translation>
 <translation id="4944543191714094452">পৃষ্ঠাখনত বিচাৰক…</translation>
 <translation id="4945756290001680296">পাছৱৰ্ড ছেটিংসমূহত এক্সেছ কৰক</translation>
@@ -607,6 +606,7 @@
 <translation id="8073670137947914548">ডাউনল’ড সম্পূর্ণ হ’ল</translation>
 <translation id="8073872304774253879">সন্ধানসমূহ আৰু ব্ৰাউজিং উন্নত কৰক</translation>
 <translation id="8076014560081431679">ছেভ কৰি ৰখা ছাইটৰ ছেটিংসমূহ মচা নহয় আৰু ই আপোনাৰ ব্ৰাউজিঙৰ আচৰণ প্ৰতিফলন কৰিব পাৰে। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">অফ কৰক</translation>
 <translation id="8114753159095730575">ফাইল ডাউনল’ড উপলব্ধ। স্ক্ৰীণৰ তলৰ অংশৰ কাষত থকা বিকল্পসমূহ।</translation>
 <translation id="8131740175452115882">নিশ্চিত কৰক</translation>
 <translation id="8197543752516192074">পৃষ্ঠা অনুবাদ কৰক</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index d8a66af..8165253b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook paylaşımı tamamlandı.</translation>
 <translation id="1103523840287552314">Həmişə <ph name="LANGUAGE" /> dilinə tərcümə edin</translation>
 <translation id="1104948393051856124">Qəbul edin və Davam edin</translation>
-<translation id="1105578556867525047">Vebsaytda parolu dəyişin</translation>
 <translation id="1112015203684611006">Çap alınmadı.</translation>
 <translation id="1125564390852150847">Yeni panel yaradın.</translation>
 <translation id="1145536944570833626">Mövcud datanı silin.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Təsvir Saxlanıla Bilmir</translation>
 <translation id="1180526666083833456">Cihazlarda sinxronizasiya edin və fərdiləşdirin.</translation>
 <translation id="1181037720776840403">Silin</translation>
+<translation id="1185569544548277362">Yeni: Chrome'u defolt edə bilərsiniz. <ph name="BEGIN_LINK" />Ayarları açın<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Yeni Axtarış</translation>
 <translation id="1209206284964581585">Hələlik gizlədin</translation>
 <translation id="1219674500290482172">İnternetə qoşulmaq mümkün deyil.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Şəkli yadda saxlayın</translation>
 <translation id="3789841737615482174">Quraşdırın</translation>
 <translation id="3803696231112616155">Bu saytı tərcümə etməyi təklif edin</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Heç bir parol ələ keçirilməyib}=1{{COUNT} parol ələ keçirilib}other{{COUNT} parol ələ keçirilib}}</translation>
 <translation id="385051799172605136">Geri</translation>
 <translation id="3892144330757387737">Tarixçəni burada tapa bilərsiniz</translation>
 <translation id="3897092660631435901">Menyu</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Yadda saxlayın...</translation>
 <translation id="4904877109095351937">Oxunmuş Kimi Qeyd Edin</translation>
 <translation id="4930268273022498155">Mövcud datanı silin. Onu, <ph name="USER_EMAIL1" /> hesabına geri qayıdaraq əldə edə bilərsiniz.</translation>
+<translation id="4930714375720679147">Aktiv Edin</translation>
 <translation id="4941089862236492464">Üzr istəyirik, elementi paylaşarkən problem baş verdi.</translation>
 <translation id="4944543191714094452">Səhifədə tapın…</translation>
 <translation id="4945756290001680296">Parol ayarlarına daxil olun</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Endirmə tamamlandı</translation>
 <translation id="8073872304774253879">Axtarışları və Brauzer Fəaliyyətini Təkmilləşdirin</translation>
 <translation id="8076014560081431679">Yadda saxlanmış sayt ayarları silinməyəcək və axtarış təcrübənizə təsir edə bilər. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Deaktiv Edin</translation>
 <translation id="8114753159095730575">Fayl endirilməsi əlçatandır. Seçimlər ekranın aşağısında əlçatandır.</translation>
 <translation id="8131740175452115882">Təsdiq edin</translation>
 <translation id="8197543752516192074">Səhifəni tərcümə edin</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" /> paneldən <ph name="LAST_VISIBLE_TAB" /> üzrə <ph name="FIRST_VISIBLE_TAB" /> <ph name="INCOGNITO" /> panel</translation>
 <translation id="8529767659511976195">Yeni</translation>
 <translation id="8532105204136943229">Bitmə İli</translation>
+<translation id="8533166274275423134">Başqa yerdə açılıb</translation>
 <translation id="8534481786647257214">Google+ postu tamamladı.</translation>
 <translation id="8548878600947630424">Səhifədə tapın...</translation>
 <translation id="8574235780160508979">Chrome’un Xidmət Şərtləri 31 martda dəyişəcək. <ph name="BEGIN_LINK" />Nəzərdən keçirin<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index cc1a63a7..2e78d5c2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Публікацыя ў Facebook выканана.</translation>
 <translation id="1103523840287552314">Заўсёды перакладаць з мовы: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Прыняць і працягнуць</translation>
-<translation id="1105578556867525047">Змяніць пароль на вэб-сайце</translation>
 <translation id="1112015203684611006">Памылка друкавання.</translation>
 <translation id="1125564390852150847">Стварыць новую ўкладку.</translation>
 <translation id="1145536944570833626">Выдаліць існуючыя даныя.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Не ўдалося захаваць відарыс</translation>
 <translation id="1180526666083833456">Сінхранізацыя і персаналізацыя на ўсіх прыладах.</translation>
 <translation id="1181037720776840403">Выдаліць</translation>
+<translation id="1185569544548277362">Новае: вы можаце зрабіць Chrome стандартным браўзерам. <ph name="BEGIN_LINK" />Адкрыць Налады<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Новы пошук</translation>
 <translation id="1209206284964581585">Схаваць гэты раз</translation>
 <translation id="1219674500290482172">Не ўдалося падключыцца да інтэрнэту.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Захаваць відарыс</translation>
 <translation id="3789841737615482174">Усталяваць</translation>
 <translation id="3803696231112616155">Прапаноўваць перакласці гэты сайт</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Няма раскрытых пароляў}=1{{COUNT} раскрыты пароль}one{{COUNT} раскрыты пароль}few{{COUNT} раскрытыя паролі}many{{COUNT} раскрытых пароляў}other{{COUNT} раскрытага пароля}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Ваша гісторыя знаходзіцца тут</translation>
 <translation id="3897092660631435901">Меню</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Захаваць...</translation>
 <translation id="4904877109095351937">Пазначыць як прачытанае</translation>
 <translation id="4930268273022498155">Выдаліць існуючыя даныя. Каб вярнуць іх, можна пераключыцца назад на карыстальніка <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Уключыць</translation>
 <translation id="4941089862236492464">Узнікла праблема з абагульваннем вашага элемента.</translation>
 <translation id="4944543191714094452">Пошук на старонцы…</translation>
 <translation id="4945756290001680296">Доступ да налад пароля</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Спампоўванне завершана</translation>
 <translation id="8073872304774253879">Паскорыць пошук і прагляд</translation>
 <translation id="8076014560081431679">Захаваныя налады сайтаў не будуць выдалены і могуць змяшчаць звесткі аб вашых тыповых дзеяннях у браўзеры. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Выключыць</translation>
 <translation id="8114753159095730575">Файл даступны для спампоўвання. Параметры знаходзяцца ў ніжняй частцы экрана.</translation>
 <translation id="8131740175452115882">Пацвердзіць</translation>
 <translation id="8197543752516192074">Перакласці старонку</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">Укладкі <ph name="INCOGNITO" /> ад <ph name="FIRST_VISIBLE_TAB" /> да <ph name="LAST_VISIBLE_TAB" /> з <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Новае</translation>
 <translation id="8532105204136943229">Год заканчэння тэрміну дзеяння</translation>
+<translation id="8533166274275423134">Налада адкрыта ў іншым акне</translation>
 <translation id="8534481786647257214">Публікацыя ў Google+ выканана.</translation>
 <translation id="8548878600947630424">Знайсці на старонцы...</translation>
 <translation id="8574235780160508979">Умовы выкарыстання Chrome зменяцца 31 сакавіка. <ph name="BEGIN_LINK" />Азнаёмцеся з імі<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index f24d882..b9dccfb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Публикацията във Facebook е завършена.</translation>
 <translation id="1103523840287552314">Винаги да се превежда от <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Приемам и напред</translation>
-<translation id="1105578556867525047">Промяна на паролата на уебсайта</translation>
 <translation id="1112015203684611006">Неуспешно отпечатване.</translation>
 <translation id="1125564390852150847">Създаване на нов раздел.</translation>
 <translation id="1145536944570833626">Изтриване на съществуващите данни.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Запазване на изобрaжението</translation>
 <translation id="3789841737615482174">Инсталиране</translation>
 <translation id="3803696231112616155">Предлагане да се преведе този сайт</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Няма компрометирани пароли}=1{{COUNT} компрометирана парола}other{{COUNT} компрометирани пароли}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Тук ще се показва историята ви</translation>
 <translation id="3897092660631435901">Меню</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Запазване...</translation>
 <translation id="4904877109095351937">Означаване като прочетено</translation>
 <translation id="4930268273022498155">Изтриване на съществуващите данни. Можете да ги извлечете, като превключите обратно към <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Включване</translation>
 <translation id="4941089862236492464">При споделянето на елемента възникна проблем.</translation>
 <translation id="4944543191714094452">Търсене в страницата…</translation>
 <translation id="4945756290001680296">Достъп до настройките за паролите</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Изтеглянето завърши</translation>
 <translation id="8073872304774253879">Подобряване на търсенията и сърфирането</translation>
 <translation id="8076014560081431679">Запазените настройки за сайтове няма да бъдат изтрити и може да отразяват навиците ви при сърфиране. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Изключване</translation>
 <translation id="8114753159095730575">Наличен е файл за изтегляне. Съответните опции са достъпни в долната част на екрана.</translation>
 <translation id="8131740175452115882">Потвърждаване</translation>
 <translation id="8197543752516192074">Превод на страницата</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index 91ce72d..668d215 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook পোষ্ট সম্পূর্ণ হয়েছে৷</translation>
 <translation id="1103523840287552314">সর্বদা অনুবাদ করুন <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">স্বীকার করুন ও চালিয়ে যান</translation>
-<translation id="1105578556867525047">ওয়েবসাইটে গিয়ে পাসওয়ার্ড পরিবর্তন করুন</translation>
 <translation id="1112015203684611006">প্রিন্ট ব্যর্থ হয়েছে।</translation>
 <translation id="1125564390852150847">নতুন ট্যাব তৈরি করুন।</translation>
 <translation id="1145536944570833626">বিদ্যমান ডেটা মুছুন।</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ছবি সেভ করুন</translation>
 <translation id="3789841737615482174">ইনস্টল করুন</translation>
 <translation id="3803696231112616155">এই সাইট অনুবাদ করার প্রস্তাব দিন</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{কোনও পাসওয়ার্ড চুরি যায়নি}=1{{COUNT}টি পাসওয়ার্ড চুরি গেছে}one{{COUNT}টি পাসওয়ার্ড চুরি গেছে}other{{COUNT}টি পাসওয়ার্ড চুরি গেছে}}</translation>
 <translation id="385051799172605136">ফিরুন</translation>
 <translation id="3892144330757387737">আপনি এখানে আপনার ইতিহাস দেখতে পাবেন</translation>
 <translation id="3897092660631435901">মেনু</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">সেভ করুন...</translation>
 <translation id="4904877109095351937">পঠিত হিসেবে চিহ্নিত করুন</translation>
 <translation id="4930268273022498155">বিদ্যমান ডেটা মুছুন। আপনি <ph name="USER_EMAIL1" /> এ ফিরে গিয়ে এটি পুনরুদ্ধার করতে পারেন।</translation>
+<translation id="4930714375720679147">চালু করুন</translation>
 <translation id="4941089862236492464">দুঃখিত, আপনার জিনিস শেয়ার করার সময় একটা সমস্যা ছিল।</translation>
 <translation id="4944543191714094452">পৃষ্ঠাতে খুঁজুন…</translation>
 <translation id="4945756290001680296">পাসওয়ার্ড সেটিংস অ্যাক্সেস করুন</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">ডাউনলোড হয়ে গেছে</translation>
 <translation id="8073872304774253879">সার্চ এবং ব্রাউজিং অভিজ্ঞতা আরও উন্নত করুন</translation>
 <translation id="8076014560081431679">সংরক্ষিত সাইটের সেটিংস মোছা হবে না এবং আপনার ব্রাউজিং অভ্যাস প্রতিফলিত হতে পারে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">বন্ধ করুন</translation>
 <translation id="8114753159095730575">ফাইল ডাউনলোড করা যাবে। স্ক্রিনের নিচের দিকে বিকল্পগুলি উপলভ্য।</translation>
 <translation id="8131740175452115882">নিশ্চিত হন</translation>
 <translation id="8197543752516192074">পৃষ্ঠাটি অনুবাদ করুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index f3021657..49c9e2c9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Objava na Facebooku je završena.</translation>
 <translation id="1103523840287552314">Uvijek prevodi <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Prihvati i nastavi</translation>
-<translation id="1105578556867525047">Promijenite lozinku na Web lokaciji</translation>
 <translation id="1112015203684611006">Štampanje nije uspjelo.</translation>
 <translation id="1125564390852150847">Kreiranje nove kartice.</translation>
 <translation id="1145536944570833626">Brisanje postojećih podataka.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Sačuvaj sliku</translation>
 <translation id="3789841737615482174">Instaliraj</translation>
 <translation id="3803696231112616155">Ponudi prijevod ove web lokacije</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nijedna lozinka nije ugrožena}=1{{COUNT} lozinka je ugrožena}one{{COUNT} lozinka je ugrožena}few{{COUNT} lozinke su ugrožene}other{{COUNT} lozinki je ugroženo}}</translation>
 <translation id="385051799172605136">Nazad</translation>
 <translation id="3892144330757387737">Svoju historiju ćete pronaći ovdje</translation>
 <translation id="3897092660631435901">Meni</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Sačuvaj...</translation>
 <translation id="4904877109095351937">Označi kao pročitano</translation>
 <translation id="4930268273022498155">Izbrišite postojeće podatke. Možete ih preuzeti ako se vratite na <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Uključi</translation>
 <translation id="4941089862236492464">Žao nam je, došlo je do problema prilikom dijeljenja vaše stavke.</translation>
 <translation id="4944543191714094452">Pronađi na stranici…</translation>
 <translation id="4945756290001680296">Pristupite postavkama lozinke</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Preuzimanje je završeno</translation>
 <translation id="8073872304774253879">Poboljšajte pretraživanje i pregledanje</translation>
 <translation id="8076014560081431679">Sačuvane postavke web lokacije se neće izbrisati i one mogu odražavati vaše navike prilikom pregledanja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Isključi</translation>
 <translation id="8114753159095730575">Dostupno je preuzimanje fajla. Opcije koje su dostupne pri dnu ekrana.</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
 <translation id="8197543752516192074">Prevedi stranicu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 0990691..731a97d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">S'ha completat la publicació a Facebook.</translation>
 <translation id="1103523840287552314">Tradueix sempre el text en <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accepta i continua</translation>
-<translation id="1105578556867525047">Canvia la contrasenya al lloc web</translation>
 <translation id="1112015203684611006">Error en imprimir</translation>
 <translation id="1125564390852150847">Crea una pestanya nova.</translation>
 <translation id="1145536944570833626">Suprimeix les dades existents.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Desa la imatge</translation>
 <translation id="3789841737615482174">Instal·la</translation>
 <translation id="3803696231112616155">Proposa traduir aquest lloc web</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Cap contrasenya en perill}=1{{COUNT} contrasenya en perill}other{{COUNT} contrasenyes en perill}}</translation>
 <translation id="385051799172605136">Enrere</translation>
 <translation id="3892144330757387737">Trobaràs l'historial aquí</translation>
 <translation id="3897092660631435901">Menú</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Desa...</translation>
 <translation id="4904877109095351937">Marca com a llegit</translation>
 <translation id="4930268273022498155">Suprimeix les dades existents. Per recuperar-les, torna a <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activa</translation>
 <translation id="4941089862236492464">S'ha produït un problema en compartir el vostre element.</translation>
 <translation id="4944543191714094452">Cerca a la pàgina…</translation>
 <translation id="4945756290001680296">Accedeix a la configuració de la contrasenya</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">La baixada ha finalitzat</translation>
 <translation id="8073872304774253879">Millora les cerques i la navegació</translation>
 <translation id="8076014560081431679">La configuració desada del lloc no se suprimirà i és possible que reflecteixi els vostres hàbits de navegació. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desactiva</translation>
 <translation id="8114753159095730575">La baixada de fitxers està disponible. Opcions disponibles a la part inferior de la pantalla.</translation>
 <translation id="8131740175452115882">Confirma</translation>
 <translation id="8197543752516192074">Tradueix la pàgina</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 9d153569..9b85106 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Příspěvek na Facebook byl odeslán.</translation>
 <translation id="1103523840287552314">Vždy překládat jazyk <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Přijmout a pokračovat</translation>
-<translation id="1105578556867525047">Změňte heslo na webu</translation>
 <translation id="1112015203684611006">Tisk se nezdařil.</translation>
 <translation id="1125564390852150847">Vytvořit novou kartu</translation>
 <translation id="1145536944570833626">Smazat existující data.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Obrázek nelze uložit</translation>
 <translation id="1180526666083833456">Synchronizovat a přizpůsobit na různých zařízeních.</translation>
 <translation id="1181037720776840403">Odebrat</translation>
+<translation id="1185569544548277362">Novinka: Můžete nastavit Chrome jako výchozí prohlížeč. <ph name="BEGIN_LINK" />Otevřít nastavení<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Nové vyhledávání</translation>
 <translation id="1209206284964581585">Prozatím skrýt</translation>
 <translation id="1219674500290482172">Nelze se připojit k internetu.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Uložit obrázek</translation>
 <translation id="3789841737615482174">Instalovat</translation>
 <translation id="3803696231112616155">Nabízet překlad tohoto webu</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Žádná hesla nebyla prolomena}=1{Bylo prolomeno {COUNT} heslo}few{Byla prolomena {COUNT} hesla}many{Bylo prolomeno {COUNT} hesla}other{Bylo prolomeno {COUNT} hesel}}</translation>
 <translation id="385051799172605136">Zpět</translation>
 <translation id="3892144330757387737">Zde najdete svou historii</translation>
 <translation id="3897092660631435901">Nabídka</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Uložit...</translation>
 <translation id="4904877109095351937">Označit jako přečtené</translation>
 <translation id="4930268273022498155">Smazat existující data. Můžete je znovu načíst tím, že přepnete zpět na účet <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Zapnout</translation>
 <translation id="4941089862236492464">Litujeme, ale při sdílení položky došlo k potížím.</translation>
 <translation id="4944543191714094452">Najít na stránce…</translation>
 <translation id="4945756290001680296">Otevřít nastavení hesla</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Stahování bylo dokončeno</translation>
 <translation id="8073872304774253879">Vylepšit vyhledávání a procházení</translation>
 <translation id="8076014560081431679">Uložená nastavení webů nebudou smazána a mohou vypovídat o vašich zvycích při prohlížení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Vypnout</translation>
 <translation id="8114753159095730575">Je k dispozici soubor ke stažení. Možnosti jsou k dispozici ve spodní části obrazovky.</translation>
 <translation id="8131740175452115882">Potvrdit</translation>
 <translation id="8197543752516192074">Přeložit stránku</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" /> – karty <ph name="FIRST_VISIBLE_TAB" /> až <ph name="LAST_VISIBLE_TAB" /> z <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Nové</translation>
 <translation id="8532105204136943229">Rok vypršení platnosti</translation>
+<translation id="8533166274275423134">Otevřeno jinde</translation>
 <translation id="8534481786647257214">Příspěvek na Google+ byl odeslán.</translation>
 <translation id="8548878600947630424">Hledat na stránce...</translation>
 <translation id="8574235780160508979">Smluvní podmínky prohlížeče Chrome se 31. března změní. <ph name="BEGIN_LINK" />Prohlédnout nové smluvní podmínky<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index f0e2a82..35bffc5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Indlæg delt på Facebook.</translation>
 <translation id="1103523840287552314">Oversæt altid <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Acceptér og fortsæt</translation>
-<translation id="1105578556867525047">Skift adgangskoden på websitet</translation>
 <translation id="1112015203684611006">Udskrift mislykkedes.</translation>
 <translation id="1125564390852150847">Opret ny fane.</translation>
 <translation id="1145536944570833626">Slet eksisterende data.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Gem billede</translation>
 <translation id="3789841737615482174">Installer</translation>
 <translation id="3803696231112616155">Tilbyd at oversætte dette website</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ingen adgangskoder er kompromitteret}=1{{COUNT} adgangskode er kompromitteret}one{{COUNT} adgangskode er kompromitteret}other{{COUNT} adgangskoder er kompromitteret}}</translation>
 <translation id="385051799172605136">Tilbage</translation>
 <translation id="3892144330757387737">Her kan du se din historik</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Gem...</translation>
 <translation id="4904877109095351937">Markér som læst</translation>
 <translation id="4930268273022498155">Slet eksisterende data. Du kan hente dem ved at skifte tilbage til <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Aktivér</translation>
 <translation id="4941089862236492464">Beklager, men der opstod et problem med at dele dit element.</translation>
 <translation id="4944543191714094452">Find på siden…</translation>
 <translation id="4945756290001680296">Få adgang til indstillinger for adgangskode</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Downloaden er fuldført</translation>
 <translation id="8073872304774253879">Gør søgninger og browsing endnu bedre</translation>
 <translation id="8076014560081431679">Gemte websiteindstillinger slettes ikke og kan afspejle dine søgevaner. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Deaktiver</translation>
 <translation id="8114753159095730575">Filer kan downloades. Se valgmulighederne nederst på skærmen.</translation>
 <translation id="8131740175452115882">Bekræft</translation>
 <translation id="8197543752516192074">Oversæt side</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index d90fc3d2..d14a4ae 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-Beitrag gepostet</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> immer übersetzen</translation>
 <translation id="1104948393051856124">Akzeptieren &amp; weiter</translation>
-<translation id="1105578556867525047">Passwort auf der Website ändern</translation>
 <translation id="1112015203684611006">Fehler beim Drucken.</translation>
 <translation id="1125564390852150847">Neuen Tab erstellen.</translation>
 <translation id="1145536944570833626">Vorhandene Daten löschen</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Bild speichern</translation>
 <translation id="3789841737615482174">Installieren</translation>
 <translation id="3803696231112616155">Übersetzung für diese Seite anbieten</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Keine Passwörter gehackt}=1{{COUNT} Passwort gehackt}other{{COUNT} Passwörter gehackt}}</translation>
 <translation id="385051799172605136">Zurück</translation>
 <translation id="3892144330757387737">Hier wird Ihr Verlauf angezeigt</translation>
 <translation id="3897092660631435901">Menü</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Wird gespeichert...</translation>
 <translation id="4904877109095351937">Als gelesen markieren</translation>
 <translation id="4930268273022498155">Vorhandene Daten werden gelöscht. Wenn Sie Ihre vorhandenen Daten abrufen möchten, wechseln Sie zurück zu <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Aktivieren</translation>
 <translation id="4941089862236492464">Beim Teilen ist ein Fehler aufgetreten.</translation>
 <translation id="4944543191714094452">Auf Seite suchen…</translation>
 <translation id="4945756290001680296">Auf Passworteinstellungen zugreifen</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Download abgeschlossen</translation>
 <translation id="8073872304774253879">Suchanfragen und das Surfen verbessern</translation>
 <translation id="8076014560081431679">Gespeicherte Website-Einstellungen werden nicht gelöscht und können möglicherweise Ihre Surfgewohnheiten wiedergeben. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Deaktivieren</translation>
 <translation id="8114753159095730575">Dateidownload verfügbar. Optionen stehen unten auf dem Bildschirm zur Verfügung.</translation>
 <translation id="8131740175452115882">Bestätigen</translation>
 <translation id="8197543752516192074">Seite übersetzen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 0e71f41..d492084 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Η ανάρτηση στο Facebook ολοκληρώθηκε.</translation>
 <translation id="1103523840287552314">Να μεταφράζονται πάντα τα <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Αποδοχή και συνέχεια</translation>
-<translation id="1105578556867525047">Αλλαγή κωδικού πρόσβασης στον ιστότοπο</translation>
 <translation id="1112015203684611006">Η εκτύπωση απέτυχε.</translation>
 <translation id="1125564390852150847">Δημιουργία νέας καρτέλας.</translation>
 <translation id="1145536944570833626">Διαγραφή υπαρχόντων δεδομένων.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Αποθήκευση εικόνας</translation>
 <translation id="3789841737615482174">Εγκατάσταση</translation>
 <translation id="3803696231112616155">Πρόταση για μετάφραση αυτού του ιστοτόπου</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Δεν παραβιάστηκαν κωδικοί πρόσβασης.}=1{Παραβιάστηκε {COUNT} κωδικός πρόσβασης.}other{Παραβιάστηκαν {COUNT} κωδικοί πρόσβασης.}}</translation>
 <translation id="385051799172605136">Πίσω</translation>
 <translation id="3892144330757387737">Εδώ θα βρείτε το ιστορικό σας</translation>
 <translation id="3897092660631435901">Μενού</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Αποθήκευση…</translation>
 <translation id="4904877109095351937">Επισήμ. ως αναγνωσμένων</translation>
 <translation id="4930268273022498155">Διαγραφή υπαρχόντων δεδομένων. Μπορείτε να τα επαναφέρετε επιστρέφοντας στον λογαριασμό <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Ενεργοποίηση</translation>
 <translation id="4941089862236492464">Παρουσιάστηκε πρόβλημα με την κοινοποίηση του στοιχείου σας.</translation>
 <translation id="4944543191714094452">Εύρεση στη σελίδα…</translation>
 <translation id="4945756290001680296">Πρόσβαση στις ρυθμίσεις κωδικού πρόσβασης</translation>
@@ -612,6 +611,7 @@
 <translation id="8073670137947914548">Η λήψη ολοκληρώθηκε</translation>
 <translation id="8073872304774253879">Βελτιώστε τις αναζητήσεις και την περιήγηση</translation>
 <translation id="8076014560081431679">Οι αποθηκευμένες ρυθμίσεις ιστότοπου δεν θα διαγραφούν και ενδέχεται να υποδεικνύουν τις συνήθειες περιήγησής σας. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Απενεργοποίηση</translation>
 <translation id="8114753159095730575">Η λήψη του αρχείου είναι διαθέσιμη. Οι διαθέσιμες επιλογές βρίσκονται κοντά στο κάτω μέρος της οθόνης.</translation>
 <translation id="8131740175452115882">Επιβεβαίωση</translation>
 <translation id="8197543752516192074">Μετάφραση σελίδας</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 8e71780..4429e670 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook post completed.</translation>
 <translation id="1103523840287552314">Always translate <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accept &amp; Continue</translation>
-<translation id="1105578556867525047">Change password on website</translation>
 <translation id="1112015203684611006">Printing failed.</translation>
 <translation id="1125564390852150847">Create new tab.</translation>
 <translation id="1145536944570833626">Delete existing data.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Save Image</translation>
 <translation id="3789841737615482174">Install</translation>
 <translation id="3803696231112616155">Offer to translate this site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{No passwords compromised}=1{{COUNT} password compromised}other{{COUNT} passwords compromised}}</translation>
 <translation id="385051799172605136">Back</translation>
 <translation id="3892144330757387737">You'll find your history here</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Save...</translation>
 <translation id="4904877109095351937">Mark Read</translation>
 <translation id="4930268273022498155">Delete existing data. You can retrieve it by switching back to <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Turn On</translation>
 <translation id="4941089862236492464">Sorry, there was a problem sharing your item.</translation>
 <translation id="4944543191714094452">Find in page…</translation>
 <translation id="4945756290001680296">Access password settings</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Download finished</translation>
 <translation id="8073872304774253879">Make searches and browsing better</translation>
 <translation id="8076014560081431679">Saved site settings will not be deleted and may reflect your browsing habits. <ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Turn Off</translation>
 <translation id="8114753159095730575">File download is available. Options available near bottom of screen.</translation>
 <translation id="8131740175452115882">Confirm</translation>
 <translation id="8197543752516192074">Translate page</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index a6f75f0..1d09393 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Entrada de Facebook publicada</translation>
 <translation id="1103523840287552314">Siempre traducir <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Aceptar y continuar</translation>
-<translation id="1105578556867525047">Cambiar la contraseña en el sitio web</translation>
 <translation id="1112015203684611006">Se produjo un error en la impresión.</translation>
 <translation id="1125564390852150847">Crea una pestaña nueva.</translation>
 <translation id="1145536944570833626">Borra los datos existentes.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Guardar imagen</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="3803696231112616155">Ofrecer traducir este sitio</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{No hay contraseñas hackeadas}=1{{COUNT} contraseña hackeada}other{{COUNT} contraseñas hackeadas}}</translation>
 <translation id="385051799172605136">Atrás</translation>
 <translation id="3892144330757387737">Aquí encontrarás tu historial</translation>
 <translation id="3897092660631435901">Menú</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Guardar…</translation>
 <translation id="4904877109095351937">Marcar como leídas</translation>
 <translation id="4930268273022498155">Borra los datos existentes. Para recuperarlos, cambia de nuevo a <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activar</translation>
 <translation id="4941089862236492464">Se produjo un error al compartir tu elemento.</translation>
 <translation id="4944543191714094452">Buscar en la página…</translation>
 <translation id="4945756290001680296">Accede a la configuración de contraseñas</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Descarga completa</translation>
 <translation id="8073872304774253879">Mejorar las búsquedas y la navegación</translation>
 <translation id="8076014560081431679">Las opciones de configuración de sitios guardadas no se borrarán y es posible que reflejen tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desactivar</translation>
 <translation id="8114753159095730575">El archivo ya se puede descargar. Las opciones disponibles se muestran junto a la parte inferior de la pantalla.</translation>
 <translation id="8131740175452115882">Confirmar</translation>
 <translation id="8197543752516192074">Traducir página</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index b10c55e..fb4687c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Publicado en Facebook</translation>
 <translation id="1103523840287552314">Traducir siempre del <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Aceptar y continuar</translation>
-<translation id="1105578556867525047">Cambiar la contraseña en el sitio web</translation>
 <translation id="1112015203684611006">Error al imprimir.</translation>
 <translation id="1125564390852150847">Crear nueva pestaña.</translation>
 <translation id="1145536944570833626">Elimina los datos actuales.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Guardar imagen</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="3803696231112616155">Ofrecer traducir este sitio web</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{No hay contraseñas vulneradas}=1{{COUNT} contraseña vulnerada}other{{COUNT} contraseñas vulneradas}}</translation>
 <translation id="385051799172605136">Atrás</translation>
 <translation id="3892144330757387737">Aquí verás tu historial</translation>
 <translation id="3897092660631435901">Menú</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Guardar...</translation>
 <translation id="4904877109095351937">Marcar como leídas</translation>
 <translation id="4930268273022498155">Elimina los datos actuales. Para recuperarlos, cambia a <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activar</translation>
 <translation id="4941089862236492464">Error al compartir tu elemento</translation>
 <translation id="4944543191714094452">Buscar en la página…</translation>
 <translation id="4945756290001680296">Acceder a los ajustes de contraseña</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Descarga finalizada</translation>
 <translation id="8073872304774253879">Mejorar las búsquedas y la navegación</translation>
 <translation id="8076014560081431679">No se eliminará la configuración guardada de los sitios web, lo cual puede reflejar tus hábitos de navegación. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desactivar</translation>
 <translation id="8114753159095730575">La descarga de archivos está disponible. Hay opciones disponibles en la parte inferior de la pantalla.</translation>
 <translation id="8131740175452115882">Confirmar</translation>
 <translation id="8197543752516192074">Traducir página</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index d756ae6..a643549 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebooki postitus on valmis.</translation>
 <translation id="1103523840287552314">Tõlgi alati: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Nõustu ja jätka</translation>
-<translation id="1105578556867525047">Muuda veebisaidi parooli</translation>
 <translation id="1112015203684611006">Print. ebaõnn.</translation>
 <translation id="1125564390852150847">Loo uus vaheleht.</translation>
 <translation id="1145536944570833626">Kustutage olemasolevad andmed.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Salvesta kujutis</translation>
 <translation id="3789841737615482174">Installi</translation>
 <translation id="3803696231112616155">Selle saidi tõlkimise pakkumine</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ükski parool pole ohus}=1{{COUNT} parool on ohus}other{{COUNT} parooli on ohus}}</translation>
 <translation id="385051799172605136">Tagasi</translation>
 <translation id="3892144330757387737">Leiate oma ajaloo siit</translation>
 <translation id="3897092660631435901">Menüü</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Salvesta …</translation>
 <translation id="4904877109095351937">Märgi loetuks</translation>
 <translation id="4930268273022498155">Kustutage olemasolevad andmed. Need saate hankida, kui lülitate tagasi e-posti aadressile <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Lülita sisse</translation>
 <translation id="4941089862236492464">Kahjuks ilmnes teie üksuse jagamisel probleem.</translation>
 <translation id="4944543191714094452">Otsi lehelt …</translation>
 <translation id="4945756290001680296">Juurdepääs parooliseadetele</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Allalaadimine jõudis lõpule</translation>
 <translation id="8073872304774253879">Otsingute ja sirvimise paremaks muutmine</translation>
 <translation id="8076014560081431679">Saitide salvestatud seadeid ei kustutata ja need võivad kajastada teie sirvimisharjumusi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Lülita välja</translation>
 <translation id="8114753159095730575">Allalaaditav fail on saadaval. Valikud kuvatakse ekraani alaosas.</translation>
 <translation id="8131740175452115882">Kinnita</translation>
 <translation id="8197543752516192074">Tõlgi leht</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index 4f57993..0aa15ed6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Mezua Facebook-en argitaratu da.</translation>
 <translation id="1103523840287552314">Itzuli <ph name="LANGUAGE" /> beti</translation>
 <translation id="1104948393051856124">Onartu eta jarraitu</translation>
-<translation id="1105578556867525047">Aldatu pasahitza webgunean</translation>
 <translation id="1112015203684611006">Ezin izan da inprimatu.</translation>
 <translation id="1125564390852150847">Sortu beste fitxa bat.</translation>
 <translation id="1145536944570833626">Ezabatu lehendik dauden datuak.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Gorde irudia</translation>
 <translation id="3789841737615482174">Instalatu</translation>
 <translation id="3803696231112616155">Eskaini webgunea itzultzea</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ez dago pasahitzik arriskuan}=1{{COUNT} pasahitz arriskuan dago}other{{COUNT} pasahitz arriskuan daude}}</translation>
 <translation id="385051799172605136">Atzera</translation>
 <translation id="3892144330757387737">Historia aurkituko duzu hemen</translation>
 <translation id="3897092660631435901">Menua</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Gorde…</translation>
 <translation id="4904877109095351937">Markatu irakurritako gisa</translation>
 <translation id="4930268273022498155">Ezabatu lehendik dauden datuak. Haiek berreskuratzeko, aldatu berriro <ph name="USER_EMAIL1" /> kontura.</translation>
+<translation id="4930714375720679147">Aktibatu</translation>
 <translation id="4941089862236492464">Arazo bat izan da elementua partekatzean.</translation>
 <translation id="4944543191714094452">Bilatu orrian…</translation>
 <translation id="4945756290001680296">Atzitu pasahitzen ezarpenak</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Deskargatu da</translation>
 <translation id="8073872304774253879">Hobetu bilaketak eta arakatze-jarduerak</translation>
 <translation id="8076014560081431679">Ez dira ezabatuko webgunearen gordetako ezarpenak, eta baliteke arakatze-ohiturak islatzea. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desaktibatu</translation>
 <translation id="8114753159095730575">Fitxategi bat deskargatzeko prest dago. Pantailaren behealdean agertzen dira horretarako aukerak.</translation>
 <translation id="8131740175452115882">Berretsi</translation>
 <translation id="8197543752516192074">Itzuli orria</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index 694fb84..8e947143 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">‏پست Facebook ارسال شد.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> همیشه ترجمه شود</translation>
 <translation id="1104948393051856124">پذیرش و ادامه</translation>
-<translation id="1105578556867525047">تغییر گذرواژه در «وب‌سایت»</translation>
 <translation id="1112015203684611006">چاپ انجام نشد.</translation>
 <translation id="1125564390852150847">ایجاد برگه جدید</translation>
 <translation id="1145536944570833626">حذف داده‌های موجود.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">ذخیره تصویر</translation>
 <translation id="3789841737615482174">نصب</translation>
 <translation id="3803696231112616155">پیشنهاد ترجمه این سایت</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{هیچ گذرواژه‌ای لو نرفته است}=1{{COUNT} گذرواژه لو رفته است}one{{COUNT} گذرواژه لو رفته است}other{{COUNT} گذرواژه لو رفته است}}</translation>
 <translation id="385051799172605136">بازگشت</translation>
 <translation id="3892144330757387737">سابقه را اینجا خواهید دید</translation>
 <translation id="3897092660631435901">منو</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">ذخیره...</translation>
 <translation id="4904877109095351937">علامت‌گذاری به‌عنوان خوانده‌شده</translation>
 <translation id="4930268273022498155">حذف داده‌های موجود. می‌توانید با جابه‌جایی به <ph name="USER_EMAIL1" /> آن را بازیابی کنید.</translation>
+<translation id="4930714375720679147">روشن کردن</translation>
 <translation id="4941089862236492464">متأسفیم! مشكلی در اشتراک‌گذاری مورد شما وجود داشت.</translation>
 <translation id="4944543191714094452">یافتن در صفحه…</translation>
 <translation id="4945756290001680296">دسترسی به تنظیمات گذرواژه</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">بارگیری به پایان رسید</translation>
 <translation id="8073872304774253879">بهبود جستجوها و مرور</translation>
 <translation id="8076014560081431679">تنظیمات ذخیره‌شده سایت حذف نمی‌شوند و احتمالاً عادات مرور شما را نشان می‌دهند. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">خاموش کردن</translation>
 <translation id="8114753159095730575">بارگیری فایل دردسترس است. گزینه‌ها نزدیک انتهای صفحه دردسترس است.</translation>
 <translation id="8131740175452115882">تأیید</translation>
 <translation id="8197543752516192074">ترجمه صفحه</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 6682d133..ec3e340 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-viesti julkaistu.</translation>
 <translation id="1103523840287552314">Käännä <ph name="LANGUAGE" /> aina</translation>
 <translation id="1104948393051856124">Hyväksy ja jatka</translation>
-<translation id="1105578556867525047">Vaihda salasana verkkosivustolla</translation>
 <translation id="1112015203684611006">Tulostus epäonnistui</translation>
 <translation id="1125564390852150847">Luo uusi välilehti.</translation>
 <translation id="1145536944570833626">Poistaa olemassa olevat tiedot.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Tallenna kuva</translation>
 <translation id="3789841737615482174">Asenna</translation>
 <translation id="3803696231112616155">Tarjoa tämän sivuston kääntämistä</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ei vaarantuneita salasanoja}=1{{COUNT} vaarantunut salasana}other{{COUNT} vaarantunutta salasanaa}}</translation>
 <translation id="385051799172605136">Edellinen</translation>
 <translation id="3892144330757387737">Näet historiasi täällä</translation>
 <translation id="3897092660631435901">Valikko</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Tallenna…</translation>
 <translation id="4904877109095351937">Merkitse luetuksi</translation>
 <translation id="4930268273022498155">Poistaa olemassa olevat tiedot. Voit palauttaa nykyiset tiedot kirjautumalla takaisin tilille <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Ota käyttöön</translation>
 <translation id="4941089862236492464">Virhe jaettaessa kohdetta.</translation>
 <translation id="4944543191714094452">Hae sivulta…</translation>
 <translation id="4945756290001680296">Siirry salasana-asetuksiin</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Lataus valmis</translation>
 <translation id="8073872304774253879">Paranna hakuja ja selausta</translation>
 <translation id="8076014560081431679">Tallennettuja sivustoasetuksia ei poisteta, ja ne saattavat sisältää tietoa selaustavoistasi. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Poista käytöstä</translation>
 <translation id="8114753159095730575">Ladattava tiedosto on saatavilla. Ruudun alaosassa on käytettävissä valintoja.</translation>
 <translation id="8131740175452115882">Vahvista</translation>
 <translation id="8197543752516192074">Käännä sivu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 9f3944d..aaf602b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Kumpleto na ang pag-post sa Facebook.</translation>
 <translation id="1103523840287552314">Palaging i-translate ang <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Tanggapin at Magpatuloy</translation>
-<translation id="1105578556867525047">Palitan ang password sa Website</translation>
 <translation id="1112015203684611006">Hindi na-print.</translation>
 <translation id="1125564390852150847">Gumawa ng bagong tab.</translation>
 <translation id="1145536944570833626">I-delete ang kasalukuyang data.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Di Ma-save Larawan</translation>
 <translation id="1180526666083833456">Mag-sync at mag-personalize sa lahat ng device.</translation>
 <translation id="1181037720776840403">Alisin</translation>
+<translation id="1185569544548277362">Bago: Puwede mong itakda ang Chrome bilang iyong default. <ph name="BEGIN_LINK" />Buksan ang Mga Setting<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Bagong Paghahanap</translation>
 <translation id="1209206284964581585">Itago sa ngayon</translation>
 <translation id="1219674500290482172">Hindi makakonekta sa Internet.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">I-save ang Larawan</translation>
 <translation id="3789841737615482174">Mag-install</translation>
 <translation id="3803696231112616155">Mag-alok na isalin ang site na ito</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Walang nakompromisong password}=1{{COUNT} password ang nakompromiso}one{{COUNT} password ang nakompromiso}other{{COUNT} na password ang nakompromiso}}</translation>
 <translation id="385051799172605136">Bumalik</translation>
 <translation id="3892144330757387737">Makikita mo rito ang iyong history</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">I-save...</translation>
 <translation id="4904877109095351937">Markahan Bilang Nabasa Na</translation>
 <translation id="4930268273022498155">I-delete ang kasalukuyang data. Mababawi mo ito sa pamamagitan ng paglipat pabalik sa <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">I-on</translation>
 <translation id="4941089862236492464">Paumanhin, nagkaroon ng problema sa pagbabahagi ng item mo.</translation>
 <translation id="4944543191714094452">Hanapin sa Page…</translation>
 <translation id="4945756290001680296">I-access ang mga setting ng password</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Tapos na ang pag-download</translation>
 <translation id="8073872304774253879">Mas Pahusayin ang Mga Paghahanap at Pagba-browse</translation>
 <translation id="8076014560081431679">Hindi made-delete ang mga naka-save na setting ng site at maaari nitong ipakita ang iyong mga gawi sa pagba-browse. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">I-off</translation>
 <translation id="8114753159095730575">Available ang pag-download ng file. Available ang mga opsyon malapit sa ibaba ng screen.</translation>
 <translation id="8131740175452115882">Kumpirmahin</translation>
 <translation id="8197543752516192074">Isalin ang Page</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">Mga Tab na <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> hanggang <ph name="LAST_VISIBLE_TAB" /> ng <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Bago</translation>
 <translation id="8532105204136943229">Taon ng Pag-expire</translation>
+<translation id="8533166274275423134">Nakabukas sa Ibang Lugar</translation>
 <translation id="8534481786647257214">Kumpleto na ang pag-post sa Google+.</translation>
 <translation id="8548878600947630424">Hanapin sa page...</translation>
 <translation id="8574235780160508979">Magbabago ang Mga Tuntunin ng Serbisyo ng Chrome sa Marso 31. <ph name="BEGIN_LINK" />Pakisuri<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index ba2346e0..f99d321 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Message Facebook terminé.</translation>
 <translation id="1103523840287552314">Toujours traduire les pages rédigées en <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accepter et continuer</translation>
-<translation id="1105578556867525047">Modifier le mot de passe sur le site Web</translation>
 <translation id="1112015203684611006">Échec impr.</translation>
 <translation id="1125564390852150847">Créer un onglet.</translation>
 <translation id="1145536944570833626">Supprimer toutes les données existantes.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Enregistrer l'image</translation>
 <translation id="3789841737615482174">Installer</translation>
 <translation id="3803696231112616155">Offrir de traduire ce site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Aucun mot de passe compromis}=1{{COUNT} mot de passe compromis}one{{COUNT} mot de passe compromis}other{{COUNT} mots de passe compromis}}</translation>
 <translation id="385051799172605136">Retour</translation>
 <translation id="3892144330757387737">Vous trouverez votre historique ici</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Enregistrer…</translation>
 <translation id="4904877109095351937">Marquer comme lu</translation>
 <translation id="4930268273022498155">Supprimer les données existantes. Vous pouvez les récupérer en revenant à <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activer</translation>
 <translation id="4941089862236492464">Un problème s'est produit lors du partage de votre élément.</translation>
 <translation id="4944543191714094452">Rechercher dans la page…</translation>
 <translation id="4945756290001680296">Accéder aux paramètres des mots de passe</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Téléchargement terminé</translation>
 <translation id="8073872304774253879">Améliorer les recherches et de la navigation</translation>
 <translation id="8076014560081431679">Les paramètres de site sauvegardés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Désactiver</translation>
 <translation id="8114753159095730575">Le téléchargement du fichier est disponible. Options présentées vers le bas de l’écran.</translation>
 <translation id="8131740175452115882">Confirmer</translation>
 <translation id="8197543752516192074">Traduire la page</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index b05ed0cd..00f6fe2d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Post Facebook publié.</translation>
 <translation id="1103523840287552314">Toujours traduire les pages en <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accepter et continuer</translation>
-<translation id="1105578556867525047">Modifier le mot de passe sur le site Web</translation>
 <translation id="1112015203684611006">Échec impr.</translation>
 <translation id="1125564390852150847">Créer un onglet</translation>
 <translation id="1145536944570833626">Supprimer les données existantes.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Enregistrer l'image</translation>
 <translation id="3789841737615482174">Installer</translation>
 <translation id="3803696231112616155">Proposer de traduire ce site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Aucun mot de passe compromis}=1{{COUNT} mot de passe compromis}one{{COUNT} mot de passe compromis}other{{COUNT} mots de passe compromis}}</translation>
 <translation id="385051799172605136">Retour</translation>
 <translation id="3892144330757387737">Votre historique s'affichera ici</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Enregistrer…</translation>
 <translation id="4904877109095351937">Marquer comme lues</translation>
 <translation id="4930268273022498155">Supprimer les données actuelles. Vous pouvez les récupérer en repassant sur le compte <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activer</translation>
 <translation id="4941089862236492464">Désolé, un problème est survenu lors du partage de l'élément.</translation>
 <translation id="4944543191714094452">Rechercher sur la page…</translation>
 <translation id="4945756290001680296">Accéder aux paramètres des mots de passe</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Téléchargement terminé</translation>
 <translation id="8073872304774253879">Améliorer les recherches et la navigation</translation>
 <translation id="8076014560081431679">Les paramètres de site enregistrés ne seront pas supprimés et peuvent donner des indications sur vos habitudes de navigation. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Désactiver</translation>
 <translation id="8114753159095730575">Vous pouvez télécharger des fichiers. Différentes options sont disponibles au bas de l'écran.</translation>
 <translation id="8131740175452115882">Confirmer</translation>
 <translation id="8197543752516192074">Traduire la page</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index 3614ba8..dfb6d6c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Completouse a publicación de Facebook.</translation>
 <translation id="1103523840287552314">Traducir sempre o <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Aceptar e continuar</translation>
-<translation id="1105578556867525047">Cambiar contrasinal no sitio web</translation>
 <translation id="1112015203684611006">Erro impresión</translation>
 <translation id="1125564390852150847">Crear pestana nova</translation>
 <translation id="1145536944570833626">Elimina os datos existentes.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Gardar imaxe</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="3803696231112616155">Ofrecer traducir este sitio</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Non hai ningún contrasinal vulnerado}=1{Hai {COUNT} contrasinal vulnerado}other{Hai {COUNT} contrasinais vulnerados}}</translation>
 <translation id="385051799172605136">Atrás</translation>
 <translation id="3892144330757387737">Aquí atoparás o teu historial</translation>
 <translation id="3897092660631435901">Menú</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Gardar…</translation>
 <translation id="4904877109095351937">Marcar como lidos</translation>
 <translation id="4930268273022498155">Elimina os datos existentes. Podes recuperalos volvendo cambiar á conta <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activar</translation>
 <translation id="4941089862236492464">Produciuse un problema ao compartir o teu elemento.</translation>
 <translation id="4944543191714094452">Buscar o contido na páxina…</translation>
 <translation id="4945756290001680296">Acceder á configuración do contrasinal</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">A descarga finalizou</translation>
 <translation id="8073872304774253879">Mellorar as buscas e a navegación</translation>
 <translation id="8076014560081431679">As opcións de configuración dos sitios gardados non se eliminarán e quizais se reflictan os teus hábitos de navegación. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desactivar</translation>
 <translation id="8114753159095730575">Podes descargar ficheiros. Tes opcións dispoñibles na parte inferior da pantalla.</translation>
 <translation id="8131740175452115882">Confirmar</translation>
 <translation id="8197543752516192074">Traducir páxina</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index d4c3042..0a6a37e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook પોસ્ટ પૂર્ણ કરી છે.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> નો હંમેશાં અનુવાદ કરો</translation>
 <translation id="1104948393051856124">સ્વીકારો અને ચાલુ રાખો</translation>
-<translation id="1105578556867525047">વેબસાઇટ પર પાસવર્ડ બદલો</translation>
 <translation id="1112015203684611006">છાપવાનું નિષ્ફળ થયું.</translation>
 <translation id="1125564390852150847">નવું ટૅબ બનાવો.</translation>
 <translation id="1145536944570833626">અસ્તિત્વમાંના ડેટાને ડિલીટ કરો.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ફોટા સાચવો</translation>
 <translation id="3789841737615482174">ઇન્સ્ટોલ કરો</translation>
 <translation id="3803696231112616155">આ સાઇટનો અનુવાદ કરવાનું કહો</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{કોઈપણ પાસવર્ડ સાથે ચેડાં થયા નથી}=1{{COUNT} પાસવર્ડ સાથે ચેડાં થયા છે}one{{COUNT} પાસવર્ડ સાથે ચેડાં થયા છે}other{{COUNT} પાસવર્ડ સાથે ચેડાં થયા છે}}</translation>
 <translation id="385051799172605136">પાછળ</translation>
 <translation id="3892144330757387737">તમને તમારો ઇતિહાસ અહીં મળશે</translation>
 <translation id="3897092660631435901">મેનૂ</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">સાચવો...</translation>
 <translation id="4904877109095351937">વાંચેલ તરીકે ચિહ્નિત કરો</translation>
 <translation id="4930268273022498155">અસ્તિત્વમાંનો ડેટા ડિલીટ કરો. તમે <ph name="USER_EMAIL1" /> પર પાછા સ્વિચ કરીને એને પાછું મેળવી શકો છો.</translation>
+<translation id="4930714375720679147">ચાલુ કરો</translation>
 <translation id="4941089862236492464">માફ કરશો, તમારી આઇટમને શેર કરવામાં સમસ્યા આવી હતી.</translation>
 <translation id="4944543191714094452">પેજમાં શોધો…</translation>
 <translation id="4945756290001680296">પાસવર્ડના સેટિંગને ઍક્સેસ કરો</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ડાઉનલોડ સમાપ્ત</translation>
 <translation id="8073872304774253879">શોધ અને બ્રાઉઝિંગ વધુ સારું બનાવો</translation>
 <translation id="8076014560081431679">સાચવેલ સાઇટ સેટિંગ્સ કાઢી નાખવામાં આવશે નહીં અને તે તમારી બ્રાઉઝિંગ ટેવોને પ્રતિબિંબિત કરી શકે છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">બંધ કરો</translation>
 <translation id="8114753159095730575">ફાઇલ ડાઉનલોડ માટે ઉપલબ્ધ છે. સ્ક્રીનના તળિયે વિકલ્પો ઉપલબ્ધ છે.</translation>
 <translation id="8131740175452115882">પુષ્ટિ કરો</translation>
 <translation id="8197543752516192074">પેજનો અનુવાદ કરો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index b85e9804d..d4dafcc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook पोस्ट पूरी हुई.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> का हमेशा अनुवाद करें</translation>
 <translation id="1104948393051856124">स्‍वीकार करें और जारी रखें</translation>
-<translation id="1105578556867525047">वेबसाइट पर पासवर्ड बदलें</translation>
 <translation id="1112015203684611006">प्रिंट विफल रहा.</translation>
 <translation id="1125564390852150847">नया टैब बनाएं.</translation>
 <translation id="1145536944570833626">मौजूदा डेटा मिटाएं.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">इमेज नहीं सेव की जा सकती</translation>
 <translation id="1180526666083833456">सभी डिवाइस में सिंक करना और मनमुताबिक बनाना.</translation>
 <translation id="1181037720776840403">हटाएं</translation>
+<translation id="1185569544548277362">नई सुविधा: आप Chrome को अपना डिफ़ॉल्ट ब्राउज़र बना सकते हैं. <ph name="BEGIN_LINK" />सेटिंग खोलें<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">नई खोज</translation>
 <translation id="1209206284964581585">अभी छिपाएं</translation>
 <translation id="1219674500290482172">इंटरनेट से कनेक्‍ट होने में असमर्थ.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">इमेज सेव करें</translation>
 <translation id="3789841737615482174">इंस्‍टॉल करें</translation>
 <translation id="3803696231112616155">इस साइट का अनुवाद करने के लिए पूछें</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{कोई पासवर्ड हैक नहीं हुआ है}=1{{COUNT} पासवर्ड हैक हुआ है}one{{COUNT} पासवर्ड हैक हुआ है}other{{COUNT} पासवर्ड हैक हुए हैं}}</translation>
 <translation id="385051799172605136">वापस</translation>
 <translation id="3892144330757387737">आपको अपनी गतिविधि का इतिहास यहां मिलेगा</translation>
 <translation id="3897092660631435901">मेन्यू</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">सेव करें...</translation>
 <translation id="4904877109095351937">पढ़ी गईं चिह्नित करें</translation>
 <translation id="4930268273022498155">मौजूदा डेटा मिटाएं. आप <ph name="USER_EMAIL1" /> पर वापस जाकर उसे वापस ला सकते हैं.</translation>
+<translation id="4930714375720679147">चालू करें</translation>
 <translation id="4941089862236492464">क्षमा करें, आपके आइटम को शेयर करने में कोई समस्या हुई.</translation>
 <translation id="4944543191714094452">पेज में ढूंढें…</translation>
 <translation id="4945756290001680296">पासवर्ड की सेटिंग ऐक्सेस करें</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">डाउनलोड पूरा हो गया</translation>
 <translation id="8073872304774253879">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation>
 <translation id="8076014560081431679">सहेजी गई साइट सेटिंग नहीं हटाई जाएंगी और इससे आपका ब्राउज़िंग व्यवहार प्रदर्शित हो सकता है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">बंद करें</translation>
 <translation id="8114753159095730575">फ़ाइल डाउनलोड करने की सुविधा उपलब्ध है. विकल्प स्क्रीन के नीचे उपलब्ध हैं.</translation>
 <translation id="8131740175452115882">पुष्टि करें</translation>
 <translation id="8197543752516192074">पेज का अनुवाद करें</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" /> में से <ph name="FIRST_VISIBLE_TAB" /> से लेकर <ph name="LAST_VISIBLE_TAB" /> तक <ph name="INCOGNITO" /> टैब</translation>
 <translation id="8529767659511976195">नई</translation>
 <translation id="8532105204136943229">समाप्‍ति वर्ष</translation>
+<translation id="8533166274275423134">यह सेटिंग दूसरी विंडो में खुली है</translation>
 <translation id="8534481786647257214">Google+ पोस्ट पूरा हुआ.</translation>
 <translation id="8548878600947630424">पेज में ढूंढें...</translation>
 <translation id="8574235780160508979">Chrome की सेवा की शर्तें 31 मार्च से बदलने वाली हैं. <ph name="BEGIN_LINK" />कृपया ध्यान से पढ़ें<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index d76ed9d7..13484ab 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Dovršen je post za Facebook.</translation>
 <translation id="1103523840287552314">Uvijek prevedi <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Prihvati i nastavi</translation>
-<translation id="1105578556867525047">Promijenite zaporku na web-lokaciji</translation>
 <translation id="1112015203684611006">Ispis nije uspio.</translation>
 <translation id="1125564390852150847">Otvori novu karticu.</translation>
 <translation id="1145536944570833626">Brisanje postojećih podataka.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Spremi sliku</translation>
 <translation id="3789841737615482174">Instaliraj</translation>
 <translation id="3803696231112616155">Ponudi prevođenje ove web-lokacije</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nema ugroženih zaporki}=1{{COUNT} ugrožena zaporka}one{{COUNT} ugrožena zaporka}few{{COUNT} ugrožene zaporke}other{{COUNT} ugroženih zaporki}}</translation>
 <translation id="385051799172605136">Natrag</translation>
 <translation id="3892144330757387737">Ovdje ćete pronaći svoju povijest</translation>
 <translation id="3897092660631435901">Izbornik</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Spremi...</translation>
 <translation id="4904877109095351937">Označi kao pročitano</translation>
 <translation id="4930268273022498155">Postojeći će se podaci izbrisati. Dohvatiti ih možete tako da se vratite na <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Uključi</translation>
 <translation id="4941089862236492464">Došlo je do problema prilikom dijeljenja vaše stavke.</translation>
 <translation id="4944543191714094452">Traži na stranici…</translation>
 <translation id="4945756290001680296">Pristupite postavkama zaporke</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Preuzimanje je dovršeno</translation>
 <translation id="8073872304774253879">Poboljšajte pretraživanje i pregledavanje</translation>
 <translation id="8076014560081431679">Spremljene postavke web-lokacije neće se izbrisati i mogu odražavati vaše navike prilikom pregledavanja. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Isključi</translation>
 <translation id="8114753159095730575">Dostupno je preuzimanje datoteka. Opcije su dostupne pri dnu zaslona.</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
 <translation id="8197543752516192074">Prevedi stranicu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index da2e7608..ce9d0b2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">A Facebook-bejegyzés kész.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> - mindig legyen lefordítva</translation>
 <translation id="1104948393051856124">Elfogadás és folytatás</translation>
-<translation id="1105578556867525047">Jelszómódosítás a webhelyen</translation>
 <translation id="1112015203684611006">A nyomtatás sikertelen.</translation>
 <translation id="1125564390852150847">Új lap létrehozása.</translation>
 <translation id="1145536944570833626">Meglévő adatok törlése.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Kép mentése</translation>
 <translation id="3789841737615482174">Telepítés</translation>
 <translation id="3803696231112616155">A webhely lefordításának felajánlása</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nincsenek nyilvánosságra került jelszavak}=1{{COUNT} nyilvánosságra került jelszó}other{{COUNT} nyilvánosságra került jelszó}}</translation>
 <translation id="385051799172605136">Vissza</translation>
 <translation id="3892144330757387737">Itt láthatja majd az előzményeit</translation>
 <translation id="3897092660631435901">Menü</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Mentés…</translation>
 <translation id="4904877109095351937">Megjelölés olvasottként</translation>
 <translation id="4930268273022498155">Meglévő adatok törlése. Ezeket úgy hívhatja le, hogy visszavált a következő fiókra: <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Bekapcsolás</translation>
 <translation id="4941089862236492464">Sajnos hiba történt az elem megosztásakor.</translation>
 <translation id="4944543191714094452">Keresés az oldalon…</translation>
 <translation id="4945756290001680296">Hozzáférés a jelszóbeállításokhoz</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Sikeres letöltés</translation>
 <translation id="8073872304774253879">A keresések és a böngészés javítása</translation>
 <translation id="8076014560081431679">A mentett webhelybeállítások nem törlődnek, és tájékozódási alapul szolgálhatnak böngészési szokásait illetően. <ph name="BEGIN_LINK" />További információ.<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Kikapcsolás</translation>
 <translation id="8114753159095730575">A fájlletöltés megvalósítható. A beállításokat a képernyő alján nyithatja meg.</translation>
 <translation id="8131740175452115882">Megerősítés</translation>
 <translation id="8197543752516192074">Oldal lefordítása</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index c41455e3..aec575f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-ում փակցնումն ավարտվեց:</translation>
 <translation id="1103523840287552314">Միշտ թարգմանել <ph name="LANGUAGE" />-ից</translation>
 <translation id="1104948393051856124">Ընդունել և շարունակել</translation>
-<translation id="1105578556867525047">Փոխել գաղտնաբառը կայքում</translation>
 <translation id="1112015203684611006">Չհաջողվեց տպել:</translation>
 <translation id="1125564390852150847">Ստեղծել նոր ներդիր:</translation>
 <translation id="1145536944570833626">Առկա տվյալների ջնջում։</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Պահել պատկերը</translation>
 <translation id="3789841737615482174">Տեղադրել</translation>
 <translation id="3803696231112616155">Առաջարկել այս կայքի թագմանությունը</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Կոտրված գաղտնաբառեր չկան}=1{{COUNT} կոտրված գաղտնաբառ}one{{COUNT} կոտրված գաղտնաբառ}other{{COUNT} կոտրված գաղտնաբառ}}</translation>
 <translation id="385051799172605136">Հետ</translation>
 <translation id="3892144330757387737">Պատմությունը կգտնեք այստեղ</translation>
 <translation id="3897092660631435901">Ընտրացանկ</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Պահել…</translation>
 <translation id="4904877109095351937">Նշել որպես կարդացված</translation>
 <translation id="4930268273022498155">Առկա տվյալների ջնջում: Տվյալները կարող եք առբերել` անցնելով <ph name="USER_EMAIL1" /> հաշիվ:</translation>
+<translation id="4930714375720679147">Միացնել</translation>
 <translation id="4941089862236492464">Չհաջողվեց կիսվել տարրով։</translation>
 <translation id="4944543191714094452">Գտնել էջում…</translation>
 <translation id="4945756290001680296">Կաղտնաբառերի կարգավորման հասանելիություն</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Ներբեռնումն ավարտվեց</translation>
 <translation id="8073872304774253879">Բարելավել որոնումն ու էջերի դիտումը</translation>
 <translation id="8076014560081431679">Պահված կայքերի կարգավորումները չեն ջնջվի և կարող են արտացոլել համացանցում դիտարկման ձեր սովորությունները: <ph name="BEGIN_LINK" />Մանրամասն<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Անջատել</translation>
 <translation id="8114753159095730575">Ֆայլը հասանելի է ներբեռնման համար: Ընտրանքները հասանելի են էկրանի ներքևի հատվածում:</translation>
 <translation id="8131740175452115882">Հաստատել</translation>
 <translation id="8197543752516192074">Թարգմանել էջը</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index d3bba5a..feea27c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Kirim Facebook selesai.</translation>
 <translation id="1103523840287552314">Selalu terjemahkan <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Terima &amp; Lanjutkan</translation>
-<translation id="1105578556867525047">Ubah Sandi di Situs</translation>
 <translation id="1112015203684611006">Gagal mencetak.</translation>
 <translation id="1125564390852150847">Buat tab baru.</translation>
 <translation id="1145536944570833626">Hapus data yang sudah ada.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Simpan Gambar</translation>
 <translation id="3789841737615482174">Instal</translation>
 <translation id="3803696231112616155">Tawarkan untuk menerjemahkan situs ini</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Tidak ada sandi yang dibobol}=1{{COUNT} sandi telah dibobol}other{{COUNT} sandi telah dibobol}}</translation>
 <translation id="385051799172605136">Mundur</translation>
 <translation id="3892144330757387737">Histori Anda akan ditampilkan di sini</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Simpan...</translation>
 <translation id="4904877109095351937">Tandai Sudah Dibaca</translation>
 <translation id="4930268273022498155">Hapus data yang sudah ada. Anda dapat mengambilnya dengan beralih lagi ke <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Aktifkan</translation>
 <translation id="4941089862236492464">Maaf, terjadi masalah saat berbagi item Anda.</translation>
 <translation id="4944543191714094452">Cari di Halaman…</translation>
 <translation id="4945756290001680296">Akses setelan sandi</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Download selesai</translation>
 <translation id="8073872304774253879">Jadikan Penelusuran dan Penjelajahan Lebih Baik</translation>
 <translation id="8076014560081431679">Setelan situs yang disimpan tidak akan dihapus dan dapat mencerminkan kebiasaan penjelajahan Anda. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Nonaktifkan</translation>
 <translation id="8114753159095730575">Download file tersedia. Opsi tersedia di dekat bagian bawah layar.</translation>
 <translation id="8131740175452115882">Konfirmasi</translation>
 <translation id="8197543752516192074">Terjemahkan Halaman</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index 8d64569..5029345 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-færsla birt.</translation>
 <translation id="1103523840287552314">Þýða alltaf <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Samþykkja og halda áfram</translation>
-<translation id="1105578556867525047">Breyta aðgangsorði á vefsvæði</translation>
 <translation id="1112015203684611006">Prentun tókst ekki.</translation>
 <translation id="1125564390852150847">Búa til nýjan flipa.</translation>
 <translation id="1145536944570833626">Eyða fyrirliggjandi gögnum.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Vista mynd</translation>
 <translation id="3789841737615482174">Setja upp</translation>
 <translation id="3803696231112616155">Bjóðast til að þýða þetta vefsvæði</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Engin aðgangsorð í hættu}=1{{COUNT} aðgangsorð í hættu}one{{COUNT} aðgangsorð í hættu}other{{COUNT} aðgangsorð í hættu}}</translation>
 <translation id="385051799172605136">Til baka</translation>
 <translation id="3892144330757387737">Þú finnur ferilinn þinn hér</translation>
 <translation id="3897092660631435901">Valmynd</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Vista...</translation>
 <translation id="4904877109095351937">Merkja sem lesið</translation>
 <translation id="4930268273022498155">Eyða fyrirliggjandi gögnum. Þú getur sótt þau með því að skipta aftur yfir í <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Kveikja</translation>
 <translation id="4941089862236492464">Því miður kom upp vandamál við að deila atriðinu.</translation>
 <translation id="4944543191714094452">Finna á síðu…</translation>
 <translation id="4945756290001680296">Opna stillingar fyrir aðgangsorð</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Niðurhali lokið</translation>
 <translation id="8073872304774253879">Bæta leit og vefskoðun</translation>
 <translation id="8076014560081431679">Vistuðum stillingum vefsvæða verður ekki eytt og þær kunna að endurspegla vefnotkun þína. <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Slökkva</translation>
 <translation id="8114753159095730575">Hægt er að sækja skrá. Valkostir eru í boði neðarlega á skjánum.</translation>
 <translation id="8131740175452115882">Staðfesta</translation>
 <translation id="8197543752516192074">Þýða síðu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 7c3f2dd..000260a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Pubblicazione su Facebook completata.</translation>
 <translation id="1103523840287552314">Traduci sempre <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accetta e continua</translation>
-<translation id="1105578556867525047">Cambia la password sul sito web</translation>
 <translation id="1112015203684611006">Stampa non riuscita.</translation>
 <translation id="1125564390852150847">Crea una nuova scheda.</translation>
 <translation id="1145536944570833626">Elimina dati esistenti.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Salva immagine</translation>
 <translation id="3789841737615482174">Installa</translation>
 <translation id="3803696231112616155">Proponi di tradurre questo sito</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nessuna password compromessa}=1{{COUNT} password compromessa}other{{COUNT} password compromesse}}</translation>
 <translation id="385051799172605136">Indietro</translation>
 <translation id="3892144330757387737">Qui troverai la tua cronologia</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Salva…</translation>
 <translation id="4904877109095351937">Segna come già letti</translation>
 <translation id="4930268273022498155">Elimina i dati esistenti. Puoi recuperarli tornando all'account <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Attiva</translation>
 <translation id="4941089862236492464">Spiacenti, si è verificato un problema di condivisione.</translation>
 <translation id="4944543191714094452">Trova nella pagina…</translation>
 <translation id="4945756290001680296">Accedi alle impostazioni della password</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Download terminato</translation>
 <translation id="8073872304774253879">Migliora le ricerche e le attività di navigazione</translation>
 <translation id="8076014560081431679">Le impostazioni del sito salvate non verranno eliminate e potrebbero rispecchiare le tue abitudini di navigazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Disattiva</translation>
 <translation id="8114753159095730575">È possibile il download dei file. Le opzioni sono disponibili nella parte inferiore della schermata.</translation>
 <translation id="8131740175452115882">Conferma</translation>
 <translation id="8197543752516192074">Traduci la pagina</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index a1d693e..be8a0f6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">‏הפרסום ב-‏Facebook בוצע.</translation>
 <translation id="1103523840287552314">ברצוני לקבל תרגום מ<ph name="LANGUAGE" /> תמיד</translation>
 <translation id="1104948393051856124">בסדר, מקובל עליי</translation>
-<translation id="1105578556867525047">לשינוי הסיסמה באתר</translation>
 <translation id="1112015203684611006">ההדפסה נכשלה.</translation>
 <translation id="1125564390852150847">יצירת כרטיסייה חדשה.</translation>
 <translation id="1145536944570833626">מחק נתונים קיימים.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">שמור תמונה</translation>
 <translation id="3789841737615482174">התקן</translation>
 <translation id="3803696231112616155">הצגה של הצעה לתרגם את הדף הזה</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{אף סיסמה לא נחשפה}=1{סיסמה אחת ({COUNT}) נחשפה}two{{COUNT} סיסמאות נחשפו}many{{COUNT} סיסמאות נחשפו}other{{COUNT} סיסמאות נחשפו}}</translation>
 <translation id="385051799172605136">חזרה</translation>
 <translation id="3892144330757387737">ההיסטוריה זמינה כאן</translation>
 <translation id="3897092660631435901">תפריט</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">שמירה...</translation>
 <translation id="4904877109095351937">סמן כ'נקרא'</translation>
 <translation id="4930268273022498155">מחק נתונים קיימים. כדי לאחזר אותם, חזור אל <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">הפעלה</translation>
 <translation id="4941089862236492464">מצטערים, אירעה בעיה בשיתוף הפריט שלך.</translation>
 <translation id="4944543191714094452">חיפוש בדף…</translation>
 <translation id="4945756290001680296">גישה להגדרות הסיסמה</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ההורדה הסתיימה</translation>
 <translation id="8073872304774253879">שיפור החיפושים והגלישה</translation>
 <translation id="8076014560081431679">הגדרות אתרים שנשמרו לא יימחקו ועשויות לשקף את הרגלי הגלישה שלך. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">כבה</translation>
 <translation id="8114753159095730575">יש קובץ זמין להורדה. האפשרויות זמינות בחלק התחתון של המסך.</translation>
 <translation id="8131740175452115882">אישור</translation>
 <translation id="8197543752516192074">תרגום הדף</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index f3f90921..2ed9cfd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebookへの投稿が完了しました。</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" />を常に翻訳</translation>
 <translation id="1104948393051856124">同意して続行</translation>
-<translation id="1105578556867525047">ウェブサイトでパスワードを変更</translation>
 <translation id="1112015203684611006">印刷できませんでした。</translation>
 <translation id="1125564390852150847">新しいタブを作成。</translation>
 <translation id="1145536944570833626">既存のデータを削除します。</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">画像を保存</translation>
 <translation id="3789841737615482174">インストール</translation>
 <translation id="3803696231112616155">このサイトを翻訳するか尋ねる</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{漏洩した可能性のあるパスワードはありません}=1{漏洩した可能性のあるパスワードが {COUNT} 個あります}other{漏洩した可能性のあるパスワードが {COUNT} 個あります}}</translation>
 <translation id="385051799172605136">戻る</translation>
 <translation id="3892144330757387737">履歴はここに表示されます</translation>
 <translation id="3897092660631435901">メニュー</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">保存...</translation>
 <translation id="4904877109095351937">既読にする</translation>
 <translation id="4930268273022498155">既存のデータを削除します。<ph name="USER_EMAIL1" /> に切り替えると、削除したデータを取得できます。</translation>
+<translation id="4930714375720679147">ON にする</translation>
 <translation id="4941089862236492464">アイテムの共有中に問題が発生しました。</translation>
 <translation id="4944543191714094452">ページ内を検索…</translation>
 <translation id="4945756290001680296">パスワードの設定にアクセスします</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ダウンロードが完了しました</translation>
 <translation id="8073872304774253879">検索とブラウジングを改善する</translation>
 <translation id="8076014560081431679">保存済みのサイト設定は削除されず、普段の閲覧行動を反映した設定などが残る場合があります。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">オフにする</translation>
 <translation id="8114753159095730575">ファイルのダウンロードが利用可能です。画面の下の方にオプションがあります。</translation>
 <translation id="8131740175452115882">確認</translation>
 <translation id="8197543752516192074">ページを翻訳する</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index 24c4f1bf..b16a194a87 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-ის პოსტი დასრულებულია.</translation>
 <translation id="1103523840287552314">ყოველთვის თარგმნე ამ ენიდან: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">მიღება და გაგრძელება</translation>
-<translation id="1105578556867525047">პაროლის შეცვლა ვებსაიტზე</translation>
 <translation id="1112015203684611006">ბეჭდვა ვერ განხორციელდა.</translation>
 <translation id="1125564390852150847">ახალი ჩანართის შექმნა.</translation>
 <translation id="1145536944570833626">არსებული მონაცემების წაშლა.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">გამოსახულების შენახვა</translation>
 <translation id="3789841737615482174">ინსტალაცია</translation>
 <translation id="3803696231112616155">ამ საიტის თარგმნის შემოთავაზება</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{პაროლები არ გატეხილა}=1{გატეხილია {COUNT} პაროლი}other{გატეხილია {COUNT} პაროლი}}</translation>
 <translation id="385051799172605136">უკან</translation>
 <translation id="3892144330757387737">აქ იპოვით თქვენს ისტორიას</translation>
 <translation id="3897092660631435901">მენიუ</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">შენახვა...</translation>
 <translation id="4904877109095351937">წაკითხულად მონიშვნა</translation>
 <translation id="4930268273022498155">არსებული მონაცემები წაიშლება. მათ მიღებას კვლავ <ph name="USER_EMAIL1" />-ზე გადართვით შეძლებთ.</translation>
+<translation id="4930714375720679147">ჩართვა</translation>
 <translation id="4941089862236492464">სამწუხაროდ, ელემენტის გაზიარებისას პრობლემა წარმოიქმნა.</translation>
 <translation id="4944543191714094452">გვერდზე პოვნა…</translation>
 <translation id="4945756290001680296">პაროლების პარამეტრებზე წვდომა</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">ჩამოტვირთვა დასრულდა</translation>
 <translation id="8073872304774253879">გააუმჯობესეთ ძიებისა და ვებსაიტების დათვალიერების პროცესები</translation>
 <translation id="8076014560081431679">საიტის შენახული პარამეტრები არ წაიშლება და შეიძლება თქვენ მიერ ვების დათვალიერებაზე აისახოს. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">გამორთვა</translation>
 <translation id="8114753159095730575">შესაძლებელია ფაილის ჩამოტვირთვა. ვარიანტები ხელმისაწვდომია ეკრანის ქვედა ნაწილთან.</translation>
 <translation id="8131740175452115882">დაადასტურება</translation>
 <translation id="8197543752516192074">გვერდის თარგმნა</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index 885acfc..6e1ddd41 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook жариялау аяқталды.</translation>
 <translation id="1103523840287552314">Әрқашан <ph name="LANGUAGE" /> тіліне аудару</translation>
 <translation id="1104948393051856124">Қабылдау және жалғастыру</translation>
-<translation id="1105578556867525047">Құпия сөзді веб-сайтта өзгерту</translation>
 <translation id="1112015203684611006">Басып шығарылмады.</translation>
 <translation id="1125564390852150847">Жаңа қойынды жасау</translation>
 <translation id="1145536944570833626">Бар деректерді жойыңыз.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Кескінді сақтау мүмкін емес</translation>
 <translation id="1180526666083833456">Барлық құрылғыларда синхрондаңыз және жекелендіріңіз.</translation>
 <translation id="1181037720776840403">Өшіру</translation>
+<translation id="1185569544548277362">Жаңалық: Chrome браузерін әдепкі браузер ете аласыз. <ph name="BEGIN_LINK" />Параметрлерді ашу<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Жаңа іздеу</translation>
 <translation id="1209206284964581585">Әзірге жасыру</translation>
 <translation id="1219674500290482172">Интернетке қосылу мүмкін емес.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Кескінді сақтау</translation>
 <translation id="3789841737615482174">Орнату</translation>
 <translation id="3803696231112616155">Осы сайтты аудару ұсынысы</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ешқандай құпия сөз жария болмады}=1{{COUNT} құпия сөз жария болды}other{{COUNT} құпия сөз жария болды}}</translation>
 <translation id="385051799172605136">Артқа</translation>
 <translation id="3892144330757387737">Тарихты осы жерден табасыз</translation>
 <translation id="3897092660631435901">Мәзір</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Сақтау...</translation>
 <translation id="4904877109095351937">Оқылған етіп белгілеу</translation>
 <translation id="4930268273022498155">Бар деректерді жойыңыз. Оны алу үшін <ph name="USER_EMAIL1" /> электрондық поштасына қайта оралыңыз.</translation>
+<translation id="4930714375720679147">Қосу</translation>
 <translation id="4941089862236492464">Кешіріңіз, элементіңізді бөлісуде ақау пайда болды.</translation>
 <translation id="4944543191714094452">Беттен табу…</translation>
 <translation id="4945756290001680296">Құпия сөз параметрлеріне кіру</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Жүктеп алынды</translation>
 <translation id="8073872304774253879">Іздеу және сайттарды шолу жұмысын жақсарту</translation>
 <translation id="8076014560081431679">Сақталған сайт параметрлері жойылмайды және интернетті шарлау әдеттеріңізді көрсетуі мүмкін. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Өшіру</translation>
 <translation id="8114753159095730575">Файлды жүктеп алуға болады. Экранның төменгі жағынан басқа опцияларды таңдай аласыз.</translation>
 <translation id="8131740175452115882">Растау</translation>
 <translation id="8197543752516192074">Бетті аудару</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" />, <ph name="FIRST_VISIBLE_TAB" /> және <ph name="LAST_VISIBLE_TAB" /> арасындағы қойындылар, барлығы <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Жаңа</translation>
 <translation id="8532105204136943229">Жарамдылық мерзімі бітетін жыл</translation>
+<translation id="8533166274275423134">Басқа терезеде ашылған.</translation>
 <translation id="8534481786647257214">Google+ жариялау аяқталды.</translation>
 <translation id="8548878600947630424">Беттен табу…</translation>
 <translation id="8574235780160508979">Chrome-ның Қызмет көрсету шарттары 31 наурыздан бастап өзгереді. <ph name="BEGIN_LINK" />Қарап шығыңыз<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index 8428ce5..1feb735 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">ការបង្ហោះតាម Facebook បានបញ្ចប់។</translation>
 <translation id="1103523840287552314">បកប្រែ <ph name="LANGUAGE" /> ជានិច្ច</translation>
 <translation id="1104948393051856124">ព្រមទទួល និងបន្ត</translation>
-<translation id="1105578556867525047">ប្ដូរពាក្យសម្ងាត់នៅលើគេហទំព័រ</translation>
 <translation id="1112015203684611006">បានបរាជ័យក្នុងការបោះពុម្ព</translation>
 <translation id="1125564390852150847">បង្កើតផ្ទាំងថ្មី</translation>
 <translation id="1145536944570833626">លុបទិន្នន័យដែលមានស្រាប់។</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">មិនអាចរក្សាទុករូបភាព</translation>
 <translation id="1180526666083833456">ធ្វើសមកាលកម្ម និង​កំណត់​ផ្ទាល់​ខ្លួន​នៅលើ​ឧបករណ៍​នានា។</translation>
 <translation id="1181037720776840403">ដកចេញ</translation>
+<translation id="1185569544548277362">ថ្មី៖ អ្នកអាចកំណត់ Chrome ជាកម្មវិធី​រុករក​តាមអ៊ីនធឺណិតលំនាំដើម​របស់អ្នក។ <ph name="BEGIN_LINK" />បើកការកំណត់<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">ការស្វែងរក​ថ្មី</translation>
 <translation id="1209206284964581585">លាក់ឥឡូវនេះ</translation>
 <translation id="1219674500290482172">មិនអាចភ្ជាប់ទៅអ៊ីនធឺណិតទេ។</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">រក្សាទុករូបភាព</translation>
 <translation id="3789841737615482174">តំឡើង</translation>
 <translation id="3803696231112616155">ផ្ដល់ការបកប្រែ​គេហទំព័រនេះ</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{មិនមាន​ពាក្យសម្ងាត់​ដែលរងការលុកលុយ​ទេ}=1{ពាក្យសម្ងាត់​ដែលរងការលុកលុយ {COUNT}}other{ពាក្យសម្ងាត់​ដែលរងការលុកលុយ {COUNT}}}</translation>
 <translation id="385051799172605136">ថយក្រោយ</translation>
 <translation id="3892144330757387737">អ្នក​នឹងឃើញ​ប្រវត្តិ​របស់អ្នក​នៅទីនេះ</translation>
 <translation id="3897092660631435901">ម៉ឺនុយ</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">រក្សាទុក...</translation>
 <translation id="4904877109095351937">សម្គាល់​ថា​បាន​អាន</translation>
 <translation id="4930268273022498155">លុបទិន្នន័យដែលមានស្រាប់។ អ្នកអាចទាញយកវាបាន ដោយធ្វើការផ្លាស់ប្តូរទៅ <ph name="USER_EMAIL1" /> វិញ។</translation>
+<translation id="4930714375720679147">បើក</translation>
 <translation id="4941089862236492464">សូមទោស មានបញ្ហាក្នុងការចែករំលែកធាតុរបស់អ្នក។</translation>
 <translation id="4944543191714094452">ស្វែងរក​ក្នុង​ទំព័រ…</translation>
 <translation id="4945756290001680296">ចូលប្រើការកំណត់​ពាក្យសម្ងាត់</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">បានបញ្ចប់​ការទាញយក</translation>
 <translation id="8073872304774253879">ធ្វើឱ្យ​ការស្វែងរក និង​ការរុករក​ប្រសើរ​ជាងមុន</translation>
 <translation id="8076014560081431679">ការកំណត់គេហទំព័រដែលបានរក្សាទុកនឹងមិនត្រូវបានលុបនោះទេ ហើយវាអាចនឹងឆ្លុះបញ្ចាំងពីទម្លាប់រុករករបស់អ្នក។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែំម<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">បិទ</translation>
 <translation id="8114753159095730575">អាចទាញយកឯកសារ​បានហើយ។ មានជម្រើស​នៅ​ក្បែរ​ផ្នែកខាងក្រោមនៃ​អេក្រង់។</translation>
 <translation id="8131740175452115882">អះអាង</translation>
 <translation id="8197543752516192074">បកប្រែទំព័រ</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">ផ្ទាំង <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> តាមរយៈ <ph name="LAST_VISIBLE_TAB" /> នៃ <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">ថ្មី</translation>
 <translation id="8532105204136943229">ឆ្នាំផុតកំណត់</translation>
+<translation id="8533166274275423134">បានបើក​នៅកន្លែងផ្សេង</translation>
 <translation id="8534481786647257214">ការបង្ហោះតាម Google+ បានបញ្ចប់។</translation>
 <translation id="8548878600947630424">ស្វែងរកក្នុងទំព័រ...</translation>
 <translation id="8574235780160508979">លក្ខខណ្ឌប្រើប្រាស់​របស់ Chrome នឹងផ្លាស់ប្ដូរនៅថ្ងៃទី 31 ខែមីនា។ <ph name="BEGIN_LINK" />សូម​ពិនិត្យមើល<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 56ba93a..8d31a518 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook ಪೋಸ್ಟ್ ಪೂರ್ಣಗೊಂಡಿದೆ.</translation>
 <translation id="1103523840287552314">ಯಾವಾಗಲೂ ಅನುವಾದಿಸಿ <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">ಅಂಗೀಕರಿಸಿ ಮತ್ತು ಮುಂದುವರಿಯಿರಿ</translation>
-<translation id="1105578556867525047">ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್ ಬದಲಾಯಿಸಿ</translation>
 <translation id="1112015203684611006">ಮುದ್ರಿಸುವಿಕೆ ವಿಫಲಗೊಂಡಿದೆ.</translation>
 <translation id="1125564390852150847">ಹೊಸ ಟ್ಯಾಬ್ ರಚಿಸಿ.</translation>
 <translation id="1145536944570833626">ಪ್ರಸ್ತುತ ಡೇಟಾ ಅಳಿಸಿ.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ಚಿತ್ರವನ್ನು ಉಳಿಸಿ</translation>
 <translation id="3789841737615482174">ಇನ್‌ಸ್ಟಾಲ್</translation>
 <translation id="3803696231112616155">ಈ ಸೈಟ್ ಅನ್ನು ಅನುವಾದಿಸುವ ಕೊಡುಗೆ</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ಯಾವುದೇ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿಲ್ಲ}=1{{COUNT} ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}one{{COUNT} ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}other{{COUNT} ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}}</translation>
 <translation id="385051799172605136">ಹಿಂದೆ</translation>
 <translation id="3892144330757387737">ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು ನೀವು ಇಲ್ಲಿ ಕಾಣಬಹುದು</translation>
 <translation id="3897092660631435901">ಮೆನು</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">ಉಳಿಸಿ...</translation>
 <translation id="4904877109095351937">ಓದಿದೆ ಎಂಬಂತೆ ಗುರುತಿಸಿ</translation>
 <translation id="4930268273022498155">ಪ್ರಸ್ತುತ ಡೇಟಾ ಅಳಿಸಿ. ನೀವು ಮರಳಿ <ph name="USER_EMAIL1" /> ಗೆ ಬದಲಾಯಿಸುವ ಮೂಲಕ ಅದನ್ನು ಹಿಂಪಡೆಯಬಹುದು.</translation>
+<translation id="4930714375720679147">ಆನ್ ಮಾಡಿ</translation>
 <translation id="4941089862236492464">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಐಟಂ ಅನ್ನು ಹಂಚುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ.</translation>
 <translation id="4944543191714094452">ಪುಟದಲ್ಲಿ ಹುಡುಕಿ…</translation>
 <translation id="4945756290001680296">ಪಾಸ್‌ವರ್ಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ಡೌನ್‌ಲೋಡ್‌ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
 <translation id="8073872304774253879">ಹುಡುಕಾಟಗಳು ಮತ್ತು ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಿ</translation>
 <translation id="8076014560081431679">ಉಳಿಸಲಾದ ಸೈಟ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಹವ್ಯಾಸಗಳನ್ನು ಪ್ರತಿಬಿಂಬಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ಆಫ್ ಮಾಡು</translation>
 <translation id="8114753159095730575">ಫೈಲ್‌ ಅನ್ನು ಡೌನ್‌ಲೋಡ್‌ ಮಾಡುವ ಸೌಲಭ್ಯ ಲಭ್ಯವಿದೆ. ಪರದೆಯ ಕೆಳಗಿನ ಭಾಗದಲ್ಲಿ ಆಯ್ಕೆಗಳು ಲಭ್ಯವಿವೆ.</translation>
 <translation id="8131740175452115882">ದೃಢೀಕರಿಸು</translation>
 <translation id="8197543752516192074">ಪುಟವನ್ನು ಅನುವಾದಿಸಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 42a6b2f6..4735002 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook 게시가 완료되었습니다.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> 항상 번역</translation>
 <translation id="1104948393051856124">동의 및 계속</translation>
-<translation id="1105578556867525047">웹사이트에서 비밀번호 변경</translation>
 <translation id="1112015203684611006">인쇄 실패</translation>
 <translation id="1125564390852150847">새 탭 만들기</translation>
 <translation id="1145536944570833626">기존 데이터 삭제</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">이미지 저장</translation>
 <translation id="3789841737615482174">설치</translation>
 <translation id="3803696231112616155">이 사이트 번역 옵션 제공</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{유출된 비밀번호 없음}=1{유출된 비밀번호 {COUNT}개}other{유출된 비밀번호 {COUNT}개}}</translation>
 <translation id="385051799172605136">뒤로</translation>
 <translation id="3892144330757387737">여기에서 방문 기록을 확인할 수 있습니다</translation>
 <translation id="3897092660631435901">메뉴</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">저장...</translation>
 <translation id="4904877109095351937">읽음으로 표시</translation>
 <translation id="4930268273022498155">기존 데이터를 삭제합니다. <ph name="USER_EMAIL1" />(으)로 전환하여 기존 데이터를 가져올 수 있습니다.</translation>
+<translation id="4930714375720679147">사용 설정</translation>
 <translation id="4941089862236492464">죄송합니다. 항목을 공유하는 중에 문제가 발생했습니다.</translation>
 <translation id="4944543191714094452">페이지에서 찾기…</translation>
 <translation id="4945756290001680296">비밀번호 설정 액세스</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">다운로드가 완료되었습니다</translation>
 <translation id="8073872304774253879">검색 및 탐색 기능 개선</translation>
 <translation id="8076014560081431679">저장된 사이트 설정은 삭제되지 않으며 인터넷 사용 습관이 반영될 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">사용 중지</translation>
 <translation id="8114753159095730575">파일을 다운로드할 수 있습니다. 화면 하단에서 옵션을 선택할 수 있습니다.</translation>
 <translation id="8131740175452115882">확인</translation>
 <translation id="8197543752516192074">페이지 번역</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index 5aed5ab..8687464 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook'ка жайгаштырылды.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> тилин ар дайым которуу</translation>
 <translation id="1104948393051856124">Кабыл алуу жана улантуу</translation>
-<translation id="1105578556867525047">Вебсайттагы сырсөзүңүздү өзгөртүңүз</translation>
 <translation id="1112015203684611006">Басылып чыгарылбай калды.</translation>
 <translation id="1125564390852150847">Жаңы өтмөк түзүү.</translation>
 <translation id="1145536944570833626">Учурдагы дайындарды жок кылуу.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Сүрөт сакталбайт</translation>
 <translation id="1180526666083833456">Бардык түзмөктөрдө шайкештирүү жана жекечелештирүү.</translation>
 <translation id="1181037720776840403">Алып салуу</translation>
+<translation id="1185569544548277362">Жаңы: Chrome демейки серепчиңиз боло алат. <ph name="BEGIN_LINK" />Жөндөөлөрдү ачуу<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Жаңы издөө</translation>
 <translation id="1209206284964581585">Азырынча жашыруу</translation>
 <translation id="1219674500290482172">Интернетке туташуу мүмкүн болбой жатат.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Сүрөттү сактоо</translation>
 <translation id="3789841737615482174">Орнотуу</translation>
 <translation id="3803696231112616155">Бул сайтты которууну сунуштоо</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Бир да сырсөз уурдалган жок}=1{{COUNT} сырсөз уурдалды}other{{COUNT} сырсөз уурдалды}}</translation>
 <translation id="385051799172605136">Артка</translation>
 <translation id="3892144330757387737">Таржымалыңызды ушул жерден табасыз</translation>
 <translation id="3897092660631435901">Меню</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Сактоо…</translation>
 <translation id="4904877109095351937">Окулган деп белгилөө</translation>
 <translation id="4930268273022498155">Учурдагы дайындарды жок кылуу. Аларга кайра кирүү үчүн <ph name="USER_EMAIL1" /> аккаунтка которулуу керек болот.</translation>
+<translation id="4930714375720679147">Күйгүзүү</translation>
 <translation id="4941089862236492464">Кечиресиз, бул нерсени бөлүшүп жатканда көйгөй келип чыкты.</translation>
 <translation id="4944543191714094452">Барактан табуу…</translation>
 <translation id="4945756290001680296">Сырсөздүн жөндөөлөрүнө кирүү</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Жүктөп алуу аягына чыкты</translation>
 <translation id="8073872304774253879">Издөө жана серептөө аракеттериңизди жакшыртыңыз</translation>
 <translation id="8076014560081431679">Сакталган сайт жөндөөлөрү өзгөрүлбөйт, андыктан, сайттарды адаттагыдай карай бересиз. <ph name="BEGIN_LINK" />Көбүрөөк маалымат алуу<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Өчүрүү</translation>
 <translation id="8114753159095730575">Файлды жүктөп алууга болот. Параметрлер экрандын төмөн жагында берилген.</translation>
 <translation id="8131740175452115882">Ырастоо</translation>
 <translation id="8197543752516192074">Баракты которуу</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="FIRST_VISIBLE_TAB" /> аркылуу <ph name="NUMBER_OF_OPEN_TABS" /> ичинен <ph name="LAST_VISIBLE_TAB" /> <ph name="INCOGNITO" /> өтмөк</translation>
 <translation id="8529767659511976195">Жаңы</translation>
 <translation id="8532105204136943229">Мөөнт аяктг жыл</translation>
+<translation id="8533166274275423134">Башка терезеде ачык</translation>
 <translation id="8534481786647257214">Google+ жайгаштырылды.</translation>
 <translation id="8548878600947630424">Беттен табуу…</translation>
 <translation id="8574235780160508979">Chrome’дун Тейлөө шарттары 31-марттан кийин өзгөргөнү жатат. <ph name="BEGIN_LINK" />Карап чыгыңыз<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index 41c4e815..fe8be2b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">ການ​ໂພ​ສ​ທ໌ Facebook ສຳ​ເລັດ.</translation>
 <translation id="1103523840287552314">ແປ <ph name="LANGUAGE" /> ຢູ່ສະເໝີ</translation>
 <translation id="1104948393051856124">ຍອມ​ຮັບ​ ແລະ​ສືບ​ຕໍ່</translation>
-<translation id="1105578556867525047">ປ່ຽນລະຫັດຜ່ານໃນເວັບໄຊ</translation>
 <translation id="1112015203684611006">ການພິມບໍ່ສຳເລັດ.</translation>
 <translation id="1125564390852150847">ສ້າງ​ແຖບ​ໃໝ່.</translation>
 <translation id="1145536944570833626">ລຶບຂໍ້ມູນທີ່ມີຢູ່.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">ບັນທຶກຮູບ</translation>
 <translation id="3789841737615482174">​ຕິດ​ຕັ້ງ</translation>
 <translation id="3803696231112616155">ສະເໜີແປເວັບໄຊນີ້</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ບໍ່ມີລະຫັດຜ່ານໃດຮົ່ວໄຫຼ}=1{ມີ {COUNT} ລະຫັດຜ່ານຮົ່ວໄຫຼ}other{ມີ {COUNT} ລະຫັດຜ່ານຮົ່ວໄຫຼ}}</translation>
 <translation id="385051799172605136">ກັບ​ຄືນ​</translation>
 <translation id="3892144330757387737">ທ່ານຈະເຫັນປະຫວັດຂອງທ່ານຢູ່ບ່ອນນີ້</translation>
 <translation id="3897092660631435901">ເມ​ນູ</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">ບັນທຶກ...</translation>
 <translation id="4904877109095351937">ໝາຍວ່າອ່ານແລ້ວ</translation>
 <translation id="4930268273022498155">ລຶບຂໍ້ມູນທີ່ມີຢູ່. ທ່ານສາມາດກູ້ມັນຄືນໄດ້ ໂດຍການປ່ຽນກັບຄືນເປັນ <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">ເປີດ</translation>
 <translation id="4941089862236492464">ຂໍ​ອະ​ໄພ​ມີ​ບັນ​ຫາ​ການ​ແບ່ງ​ປັນ​ລາຍ​ການ​ຂອງ​ທ່ານ.</translation>
 <translation id="4944543191714094452">ຊອກຫາໃນໜ້າ…</translation>
 <translation id="4945756290001680296">ເຂົ້າເຖິງການຕັ້ງຄ່າລະຫັດຜ່ານ</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">ສຳເລັດການດາວໂຫຼດແລ້ວ</translation>
 <translation id="8073872304774253879">ເຮັດໃຫ້ການຊອກຫາ ແລະ ການທ່ອງເວັບດີຂຶ້ນ</translation>
 <translation id="8076014560081431679">ການຕັ້ງຄ່າເວັບໄຊທີ່ບັນທຶກໄວ້ຈະບໍ່ຖືກລຶບ ແລະ ອາດຈະສະທ້ອນເຖິງນິໄສການທ່ອງເວັບຂອງທ່ານ. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ປິດ</translation>
 <translation id="8114753159095730575">ການດາວໂຫຼດໄຟລ໌ບໍ່ສາມາດໃຊ້ໄດ້. ມີຕົວເລືອກຕ່າງໆຢູ່ໃກ້ສ່ວນລຸ່ມຂອງໜ້າຈໍ.</translation>
 <translation id="8131740175452115882">ຢືນ​ຢັນ</translation>
 <translation id="8197543752516192074">ແປໜ້າ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 82b58b4..bf1ef39 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">„Facebook“ įrašas paskelbtas.</translation>
 <translation id="1103523840287552314">Visada versti <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Sutikti ir tęsti</translation>
-<translation id="1105578556867525047">Pakeisti slaptažodį ange password on Website</translation>
 <translation id="1112015203684611006">Nepav. atsp.</translation>
 <translation id="1125564390852150847">Kurti naują skirtuką.</translation>
 <translation id="1145536944570833626">Ištrinti esamus duomenis.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Išsaugoti vaizdą</translation>
 <translation id="3789841737615482174">Įdiegti</translation>
 <translation id="3803696231112616155">Siūlyti versti šią svetainę</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nėra pažeistų slaptažodžių}=1{{COUNT} pažeistas slaptažodis}one{{COUNT} pažeistas slaptažodis}few{{COUNT} pažeisti slaptažodžiai}many{{COUNT} pažeisto slaptažodžio}other{{COUNT} pažeistų slaptažodžių}}</translation>
 <translation id="385051799172605136">Atgal</translation>
 <translation id="3892144330757387737">Čia rasite istoriją</translation>
 <translation id="3897092660631435901">Meniu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Išsaugoti...</translation>
 <translation id="4904877109095351937">Pažymėti kaip skaitytus</translation>
 <translation id="4930268273022498155">Ištrinti esamus duomenis. Juos galite gauti perjungę atgal į <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Įjungti</translation>
 <translation id="4941089862236492464">Apgailestaujame, bendrinant elementą kilo problema.</translation>
 <translation id="4944543191714094452">Rasti puslapyje…</translation>
 <translation id="4945756290001680296">Pasiekite slaptažodžio nustatymus</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Atsisiuntimas užbaigtas</translation>
 <translation id="8073872304774253879">Tobulinti paieškas ir naršymą</translation>
 <translation id="8076014560081431679">Išsaugoti svetainių nustatymai nebus ištrinti ir gali nurodyti naršymo įpročius. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Išjungti</translation>
 <translation id="8114753159095730575">Galima atsisiųsti failą. Parinktys pasiekiamos netoli ekrano apačios.</translation>
 <translation id="8131740175452115882">Patvirtinti</translation>
 <translation id="8197543752516192074">Versti puslapį</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index c94a389..c71aedd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook ziņa izveidota.</translation>
 <translation id="1103523840287552314">Vienmēr tulkot <ph name="LANGUAGE" /> valodas saturu</translation>
 <translation id="1104948393051856124">Pieņemt un turpināt</translation>
-<translation id="1105578556867525047">Mainīt paroli vietnē</translation>
 <translation id="1112015203684611006">Neizdevās drukāt.</translation>
 <translation id="1125564390852150847">Izveidot jaunu cilni.</translation>
 <translation id="1145536944570833626">Dzēst esošos datus.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Attēlu nevar sagl.</translation>
 <translation id="1180526666083833456">Sinhronizējiet datus un personalizējiet iespējas vairākās ierīcēs.</translation>
 <translation id="1181037720776840403">Noņemt</translation>
+<translation id="1185569544548277362">Jaunums: varat iestatīt Chrome kā noklusējuma pārlūku. <ph name="BEGIN_LINK" />Atveriet iestatījumus<ph name="END_LINK" />.</translation>
 <translation id="1207113853726624428">Jauns meklēšanas vaicājums</translation>
 <translation id="1209206284964581585">Pagaidām slēpt</translation>
 <translation id="1219674500290482172">Nevar izveidot savienojumu ar internetu.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Saglabāt attēlu</translation>
 <translation id="3789841737615482174">Instalēt</translation>
 <translation id="3803696231112616155">Piedāvāt tulkot šo vietni</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nav uzlauztu paroļu}=1{{COUNT} uzlauzta parole}zero{{COUNT} uzlauztas paroles}one{{COUNT} uzlauzta parole}other{{COUNT} uzlauztas paroles}}</translation>
 <translation id="385051799172605136">Atpakaļ</translation>
 <translation id="3892144330757387737">Šeit varēsiet skatīt savu vēsturi</translation>
 <translation id="3897092660631435901">Izvēlne</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Saglabāt...</translation>
 <translation id="4904877109095351937">Atzīmēt kā izlasītus</translation>
 <translation id="4930268273022498155">Dzēst esošos datus. Varat tos izgūt, pārslēdzoties atpakaļ uz kontu <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Ieslēgt</translation>
 <translation id="4941089862236492464">Diemžēl, kopīgojot jūsu vienumu, radās problēma.</translation>
 <translation id="4944543191714094452">Atrast lapā…</translation>
 <translation id="4945756290001680296">Piekļūt paroles iestatījumiem</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Lejupielāde ir pabeigta</translation>
 <translation id="8073872304774253879">Uzlabot meklēšanu un pārlūkošanu</translation>
 <translation id="8076014560081431679">Saglabātie vietņu iestatījumi netiks dzēsti, un tie var atspoguļot jūsu pārlūkošanas ieradumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
+<translation id="8105368624971345109">Izslēgt</translation>
 <translation id="8114753159095730575">Pieejama failu lejupielāde. Pieejamās opcijas redzamas ekrāna apakšdaļā.</translation>
 <translation id="8131740175452115882">Apstiprināt</translation>
 <translation id="8197543752516192074">Tulkot lapu</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" />.–<ph name="LAST_VISIBLE_TAB" />. cilne no <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Jaunums</translation>
 <translation id="8532105204136943229">Der. term. gads</translation>
+<translation id="8533166274275423134">Atvērts citā logā</translation>
 <translation id="8534481786647257214">Google+ ziņa izveidota.</translation>
 <translation id="8548878600947630424">Atrast lapā...</translation>
 <translation id="8574235780160508979">31. martā tiks mainīti Chrome pakalpojumu sniegšanas noteikumi. <ph name="BEGIN_LINK" />Lūdzu, pārskatiet tos<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index f11fbc9..316153e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Објавата на Facebook е завршена.</translation>
 <translation id="1103523840287552314">Секогаш преведувај <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Прифати и продолжи</translation>
-<translation id="1105578556867525047">Променете ја лозинката на веб-сајтот</translation>
 <translation id="1112015203684611006">Печатењето не успеа.</translation>
 <translation id="1125564390852150847">Создај нова картичка.</translation>
 <translation id="1145536944570833626">Избришете ги постоечките податоци.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Зачувај слика</translation>
 <translation id="3789841737615482174">Инсталирај</translation>
 <translation id="3803696231112616155">Понудувај да го преведеш сајтов</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Немате компромитирани лозинки}=1{{COUNT} компромитирана лозинка}one{{COUNT} компромитирана лозинка}other{{COUNT} компромитирани лозинки}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Вашата историја ќе ја најдете тука</translation>
 <translation id="3897092660631435901">Мени</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Зачувај…</translation>
 <translation id="4904877109095351937">Означи како прочитано</translation>
 <translation id="4930268273022498155">Избришете ги постоечките податоци. Може да ги вратите префрлајќи се назад на <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Вклучи</translation>
 <translation id="4941089862236492464">Се извинуваме, настана проблем при споделување на ставката.</translation>
 <translation id="4944543191714094452">Најди на страницата…</translation>
 <translation id="4945756290001680296">Пристапете до поставките за лозинка</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Преземањето заврши</translation>
 <translation id="8073872304774253879">Подобрете ги пребарувањата и прелистувањето</translation>
 <translation id="8076014560081431679">Поставките на зачуваните сајтови нема да се избришат и може да ги отсликуваат вашите навики за прелистување. <ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Исклучи</translation>
 <translation id="8114753159095730575">Достапна е датотека за преземање. Достапни се опции на дното на екранот.</translation>
 <translation id="8131740175452115882">Потврди</translation>
 <translation id="8197543752516192074">Преведи ја страницата</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index 5395279..7d85d19 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook പങ്കിടൽ പൂർത്തിയായി.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> എല്ലായ്പ്പോഴും വിവര്‍ത്തനം ചെയ്യുക </translation>
 <translation id="1104948393051856124">അംഗീകരിച്ച് തുടരുക</translation>
-<translation id="1105578556867525047">വെബ്‌സൈറ്റിൽ പാസ്‌വേഡ് മാറ്റുക</translation>
 <translation id="1112015203684611006">പ്രിന്റിംഗ് പരാജയപ്പെട്ടു.</translation>
 <translation id="1125564390852150847">പുതിയ ടാബ് സൃഷ്‌ടിക്കുക.</translation>
 <translation id="1145536944570833626">നിലവിലുള്ള വിവരങ്ങൾ ഇല്ലാതാക്കുക.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">ചിത്രം സംരക്ഷിക്കാൻ കഴിയില്ല.</translation>
 <translation id="1180526666083833456">ഉപകരണങ്ങളിലുടനീളം സമന്വയിപ്പിക്കുകയും വ്യക്തിപരമാക്കുകയും ചെയ്യുക.</translation>
 <translation id="1181037720776840403">നീക്കംചെയ്യൂ</translation>
+<translation id="1185569544548277362">ശ്രദ്ധിക്കുക: ഇപ്പോൾ Chrome നിങ്ങൾക്ക് ഡിഫോൾട്ടാക്കാം. <ph name="BEGIN_LINK" />ക്രമീകരണം തുറക്കുക<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">പുതിയ തിരയൽ</translation>
 <translation id="1209206284964581585">ഇപ്പോഴത്തേയ്‌ക്ക് മറയ്‌ക്കുക</translation>
 <translation id="1219674500290482172">ഇന്‍റര്‍നെറ്റിലേക്ക് കണക്റ്റുചെയ്യാൻ കഴിയില്ല.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">ചിത്രം സംരക്ഷിക്കുക</translation>
 <translation id="3789841737615482174">ഇന്‍സ്റ്റാൾ ചെയ്യുക</translation>
 <translation id="3803696231112616155">ഈ സൈറ്റ് വിവർത്തനം ചെയ്യാനുള്ള അനുമതി</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{പാസ്‌വേഡുകളൊന്നും അപഹരിച്ചിട്ടില്ല}=1{{COUNT} പാസ്‌വേഡ് അപഹരിക്കപ്പെട്ടു}other{{COUNT} പാസ്‍വേഡുകൾ അപഹരിക്കപ്പെട്ടു}}</translation>
 <translation id="385051799172605136">പിന്നോട്ട്</translation>
 <translation id="3892144330757387737">നിങ്ങളുടെ ചരിത്രം ഇവിടെ കാണാം</translation>
 <translation id="3897092660631435901">മെനു</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">സംരക്ഷിക്കുക...</translation>
 <translation id="4904877109095351937">വായിച്ചതായി അടയാളപ്പെടുത്തുക</translation>
 <translation id="4930268273022498155">നിലവിലുള്ള വിവരങ്ങൾ ഇല്ലാതാക്കുക. <ph name="USER_EMAIL1" /> എന്നതിലേക്ക് വീണ്ടും മാറുന്നതിലൂടെ നിങ്ങൾക്ക് ഇത് വീണ്ടെടുക്കാം.</translation>
+<translation id="4930714375720679147">ഓണാക്കുക</translation>
 <translation id="4941089862236492464">ക്ഷമിക്കണം, നിങ്ങളുടെ ഇനം പങ്കിടുന്നതിൽ ഒരു പ്രശ്‌നമുണ്ടായിരുന്നു.</translation>
 <translation id="4944543191714094452">പേജില്‍ കണ്ടെത്തുക…</translation>
 <translation id="4945756290001680296">പാസ്‌വേഡ് ക്രമീകരണം ആക്‌സസ് ചെയ്യുക</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">ഡൗൺലോഡ് പൂർത്തിയായി</translation>
 <translation id="8073872304774253879">തിരയലുകളും ബ്രൗസിംഗും മികച്ചതാക്കൂ</translation>
 <translation id="8076014560081431679">സംരക്ഷിച്ച സൈറ്റ് ക്രമീകരണം ഇല്ലാതാക്കപ്പെടില്ല, ഇത് നിങ്ങളുടെ ബ്രൗസിംഗ് രീതികളെ പ്രതിഫലിപ്പിക്കാനുമിടയുണ്ട്. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ഓഫാക്കുക</translation>
 <translation id="8114753159095730575">ഫയൽ ഡൗൺലോഡ് ചെയ്യൽ ലഭ്യമാണ്. സ്ക്രീനിന്റെ ചുവടെ ഓപ്ഷനുകളുണ്ട്.</translation>
 <translation id="8131740175452115882">സ്ഥിരീകരിക്കുക</translation>
 <translation id="8197543752516192074">പേജ് വിവർത്തനം ചെയ്യുക</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" />-ൽ <ph name="FIRST_VISIBLE_TAB" /> മുതൽ <ph name="LAST_VISIBLE_TAB" /> വരെയുള്ള <ph name="INCOGNITO" /> ആൾമാറാട്ട ടാബുകൾ</translation>
 <translation id="8529767659511976195">പുതിയത്</translation>
 <translation id="8532105204136943229">കാലഹരണപ്പെടുന്ന വർഷം</translation>
+<translation id="8533166274275423134">മറ്റൊരിടത്ത് തുറന്നിട്ടുണ്ട്</translation>
 <translation id="8534481786647257214">Google+ പങ്കിടൽ പൂർത്തിയായി.</translation>
 <translation id="8548878600947630424">പേജിൽ കണ്ടെത്തുക...</translation>
 <translation id="8574235780160508979">Chrome-ന്റെ സേവന നിബന്ധനകളിൽ മാർച്ച് 31-ന് മാറ്റം വരുന്നു. <ph name="BEGIN_LINK" />അവലോകനം ചെയ്യുക<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
index c814d17..ec8dcc5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook дээр постолж дууслаа.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" />-ийг үргэлж орчуулах</translation>
 <translation id="1104948393051856124">Хүлээн авах &amp; Үргэлжлүүлэх</translation>
-<translation id="1105578556867525047">Нууц үгээ вэб сайт дээр өөрчлөх</translation>
 <translation id="1112015203684611006">Хэвлэж чадсангүй.</translation>
 <translation id="1125564390852150847">Шинэ чихтэй хуудас үүсгэнэ үү.</translation>
 <translation id="1145536944570833626">Одоо байгаа өгөгдлийг устгана уу.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Зургийг хадгал</translation>
 <translation id="3789841737615482174">Суулгах</translation>
 <translation id="3803696231112616155">Энэ сайтыг орчуулахыг санал болгох</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Алдагдсан нууц үг алга}=1{{COUNT} нууц үг алдагдсан}other{{COUNT} нууц үг алдагдсан}}</translation>
 <translation id="385051799172605136">Буцах</translation>
 <translation id="3892144330757387737">Та түүхээ эндээс олох болно</translation>
 <translation id="3897092660631435901">Цэс</translation>
@@ -330,6 +328,7 @@
 <translation id="4901778704868714008">Хадгалах...</translation>
 <translation id="4904877109095351937">Уншсан гэж тэмдэглэх</translation>
 <translation id="4930268273022498155">Одоо байгаа өгөгдлийг устгана уу. Та үүнийг <ph name="USER_EMAIL1" />-д буцааж сольсноор сэргээх боломжтой.</translation>
+<translation id="4930714375720679147">Асаах</translation>
 <translation id="4941089862236492464">Уучлаарай, таны зүйлийг хуваалцах үед асуудал гарлаа.</translation>
 <translation id="4944543191714094452">Хуудаснаас олох…</translation>
 <translation id="4945756290001680296">Нууц үгний тохиргооны хэсэгт хандах</translation>
@@ -607,6 +606,7 @@
 <translation id="8073670137947914548">Татаж дууслаа</translation>
 <translation id="8073872304774253879">Хайлт болон хөтлөх явцыг сайжруулах</translation>
 <translation id="8076014560081431679">Сайтын хадгалсан тохиргоо устахгүй бөгөөд таны хайлтын тохиргоонд нөлөөлж болзошгүй. <ph name="BEGIN_LINK" />Дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Унтраах</translation>
 <translation id="8114753159095730575">Файл татаж авах боломжтой. Дэлгэцийн доод хэсгийн сонголтууд боломжтой.</translation>
 <translation id="8131740175452115882">Батлах</translation>
 <translation id="8197543752516192074">Хуудсыг орчуулах</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 87dd3a5..b835e54e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook पोस्ट पूर्ण केले.</translation>
 <translation id="1103523840287552314">नेहमी भाषांतर करा <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">स्वीकारा आणि सुरू ठेवा</translation>
-<translation id="1105578556867525047">वेबसाइट वर पासवर्ड बदला</translation>
 <translation id="1112015203684611006">प्रिंट अयशस्वी झाले.</translation>
 <translation id="1125564390852150847">नवीन टॅब तयार करा.</translation>
 <translation id="1145536944570833626">विद्यमान डेटा हटवा.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">इमेज सेव्ह करा</translation>
 <translation id="3789841737615482174">स्थापना करा</translation>
 <translation id="3803696231112616155">ही साइट भाषांतरित करण्यासाठी ऑफर</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{पासवर्ड धोक्यात आलेले नाहीत}=1{{COUNT} पासवर्ड धोक्यात आला आहे}other{{COUNT} पासवर्ड धोक्यात आले आहेत}}</translation>
 <translation id="385051799172605136">मागील</translation>
 <translation id="3892144330757387737">तुमचा इतिहास तुम्हाला येथे सापडेल</translation>
 <translation id="3897092660631435901">मेनू</translation>
@@ -334,6 +332,7 @@
 <translation id="4901778704868714008">सेव्ह करा…</translation>
 <translation id="4904877109095351937">वाचले चिन्हांकित करा</translation>
 <translation id="4930268273022498155">सद्य डेटा हटवा. <ph name="USER_EMAIL1" /> वर परत स्विच करून तुम्ही तो रिट्रीव्ह करू शकता.</translation>
+<translation id="4930714375720679147">सुरू करा</translation>
 <translation id="4941089862236492464">क्षमस्व, तुमचा आयटम शेअर करताना समस्या आली.</translation>
 <translation id="4944543191714094452">या पेजमध्ये शोधा…</translation>
 <translation id="4945756290001680296">पासवर्ड सेटिंग्ज अ‍ॅक्सेस करा</translation>
@@ -612,6 +611,7 @@
 <translation id="8073670137947914548">डाउनलोड पूर्ण झाले</translation>
 <translation id="8073872304774253879">शोध आणि ब्राउझ करणे उत्तम बनवा</translation>
 <translation id="8076014560081431679">सेव्ह केलेल्या साइट सेटिंग्ज हटविल्या जाणार नाहीत आणि कदाचित आपल्या ब्राउझिंग सवयी दर्शवेल. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">बंद करा</translation>
 <translation id="8114753159095730575">फाइल डाउनलोड उपलब्ध आहे. स्क्रीनच्या तळाशी पर्याय उपलब्ध आहेत.</translation>
 <translation id="8131740175452115882">पुष्टी करा</translation>
 <translation id="8197543752516192074">पेजचे भाषांतर करा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 4951c3a..9195cac 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Catatan Facebook selesai.</translation>
 <translation id="1103523840287552314">Sentiasa terjemahkan <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Terima &amp; Teruskan</translation>
-<translation id="1105578556867525047">Tukar kata laluan pada Tapak Web</translation>
 <translation id="1112015203684611006">Pencetakan gagal.</translation>
 <translation id="1125564390852150847">Buat tab baharu.</translation>
 <translation id="1145536944570833626">Padam data sedia ada.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Simpan Imej</translation>
 <translation id="3789841737615482174">Pasang</translation>
 <translation id="3803696231112616155">Tawarkan untuk menterjemahkan tapak ini</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Tiada kata laluan yang terjejas}=1{{COUNT} Kata laluan terjejas}other{{COUNT} Kata laluan terjejas}}</translation>
 <translation id="385051799172605136">Kembali</translation>
 <translation id="3892144330757387737">Anda dapat menemukan sejarah anda di sini</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Simpan...</translation>
 <translation id="4904877109095351937">Tandakan Dibaca</translation>
 <translation id="4930268273022498155">Padam data sedia ada. Anda boleh mendapatkannya semula dengan beralih semula kepada <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Hidupkan</translation>
 <translation id="4941089862236492464">Maaf, terdapat masalah mengongsi item anda.</translation>
 <translation id="4944543191714094452">Cari dalam Halaman…</translation>
 <translation id="4945756290001680296">Akses tetapan kata laluan</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Muat turun selesai</translation>
 <translation id="8073872304774253879">Perbaik Carian dan Penyemakan Imbas</translation>
 <translation id="8076014560081431679">Tetapan tapak yang disimpan tidak akan dipadamkan dan mungkin mencerminkan tabiat semak imbas anda. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Matikan</translation>
 <translation id="8114753159095730575">Muat turun fail tersedia. Pilihan tersedia di bahagian bawah skrin.</translation>
 <translation id="8131740175452115882">Sahkan</translation>
 <translation id="8197543752516192074">Terjemah Halaman</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index a29e11722..4443986d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">ဖေ့စ်ဘွတ်တွင် တင်ပြခြင်း ပြီးစီပါပြီ။</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" />ကို အမြဲတမ်း ဘာသာပြန်ရန်</translation>
 <translation id="1104948393051856124">လက်ခံရန် &amp; ဆက်လုပ်ရန်</translation>
-<translation id="1105578556867525047">ဝဘ်ဆိုက်ပေါ်ရှိ စကားဝှက်ပြောင်းရန်</translation>
 <translation id="1112015203684611006">ပုံနှိပ်ခြင်း မအောင်မြင်ပါ။</translation>
 <translation id="1125564390852150847">တဘ်အသစ်ဖန်တီးပါ</translation>
 <translation id="1145536944570833626">လက်ရှိဒေတာများကို ဖျက်ပါ</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">ရုပ်ပုံသိမ်းဆည်းမည်။</translation>
 <translation id="3789841737615482174">တပ်ဆင်ရန်</translation>
 <translation id="3803696231112616155">ဤဝဘ်ဆိုက်ကို ဘာသာပြန်ရန် ကမ်းလှမ်းချက်</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{စကားဝှက်များ မကျိုးပေါက်ပါ}=1{စကားဝှက် {COUNT} ခု ကျိုးပေါက်သွားသည်}other{စကားဝှက် {COUNT} ခု ကျိုးပေါက်သွားသည်}}</translation>
 <translation id="385051799172605136">နောက်သို့</translation>
 <translation id="3892144330757387737">သင့်မှတ်တမ်းကို ဤနေရာတွင် ပြပါမည်</translation>
 <translation id="3897092660631435901">မီနျူး</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">သိမ်းရန်...</translation>
 <translation id="4904877109095351937">ဖတ်ပြီးကြောင်း အမှတ်အသားလုပ်ရန်</translation>
 <translation id="4930268273022498155">လက်ရှိဒေတာများကို ဖျက်ပါ။ ၎င်းကို <ph name="USER_EMAIL1" /> သို့ ပြန်ပြောင်းခြင်းဖြင့် ပြန်လည်ရယူနိုင်ပါသည်။</translation>
+<translation id="4930714375720679147">ဖွင့်ရန်</translation>
 <translation id="4941089862236492464">ဝမ်းနည်းပါသည်၊ သင့်အကြောင်းအရာကို မျှဝေရာတွင် ပြဿနာတစ်ခုရှိနေသည်။</translation>
 <translation id="4944543191714094452">စာမျက်နှာတွင် ရှာရန်…</translation>
 <translation id="4945756290001680296">စကားဝှက် ဆက်တင်များသို့ ဝင်ခြင်း</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ</translation>
 <translation id="8073872304774253879">ရှာဖွေမှုနှင့် ဖွင့်ကြည့်မှု ပိုမိုကောင်းမွန်အောင် ပြုလုပ်ခြင်း</translation>
 <translation id="8076014560081431679">သိမ်းဆည်းထားသည့် ဆိုက်ဆက်တင်များကိုတော့ ဖျက်လိုက်မည် မဟုတ်ဘဲ သင်အင်တာနက် အသုံးပြုမှု အမူအကျင့်များကို ဖော်ပြပါလိမ့်မည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ပိတ်ပါ</translation>
 <translation id="8114753159095730575">ဖိုင်ကို ဒေါင်းလုဒ်လုပ်နိုင်ပါပြီ။ မျက်နှာပြင်အောက်ခြေနားတွင် ရွေးချယ်စရာများ ရှိပါသည်။</translation>
 <translation id="8131740175452115882">အတည်ပြုရန်</translation>
 <translation id="8197543752516192074">စာမျက်နှာကို ဘာသာပြန်ရန်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index eee88a3e..88ec746 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook पोस्ट पूरा भयो।</translation>
 <translation id="1103523840287552314">सँधै अनुवाद गर्नुहोस् <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">स्वीकार गर्नुहोस् र जारी राख्नुहोस्</translation>
-<translation id="1105578556867525047">वेबसाइटमा गई पासवर्ड बदल्नुहोस्</translation>
 <translation id="1112015203684611006">छाप्न सकिएन।</translation>
 <translation id="1125564390852150847">नयाँ ट्याब सिर्जना गर्नुहोस्।</translation>
 <translation id="1145536944570833626">विद्यमान डेटा मेट्नुहोस्।</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">छवि सुरक्षित गर्नुहोस्</translation>
 <translation id="3789841737615482174">स्थापना गर्नुहोस्</translation>
 <translation id="3803696231112616155">यो साइट अनुवाद गर्ने प्रस्ताव गर्नुहोस्</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{अरूले कुनै पनि पासवर्ड देखेका छैनन्}=1{अरूले {COUNT} वटा पासवर्ड देखेका छन्}other{अरूले {COUNT} वटा पासवर्ड देखेका छन्}}</translation>
 <translation id="385051799172605136">पछाडि जानुहोस्</translation>
 <translation id="3892144330757387737">तपाईंले गर्नुभएका क्रियाकलापको इतिहास यहाँ देखिने छ</translation>
 <translation id="3897092660631435901">मेनु</translation>
@@ -331,6 +329,7 @@
 <translation id="4901778704868714008">सुरक्षित गर्नुहोस्...</translation>
 <translation id="4904877109095351937">पढिसकिएको भनी चिन्ह लगाउनुहोस्</translation>
 <translation id="4930268273022498155">विद्यमान डेटा मेट्नुहोस्। तपाईं फेरि <ph name="USER_EMAIL1" /> मा बदलेर त्यो डेटा प्राप्त गर्न सक्नुहुन्छ।</translation>
+<translation id="4930714375720679147">सक्रिय गर्नुहोस्</translation>
 <translation id="4941089862236492464">माफ गर्नुहोस्, तपाईंको वस्तु साझेदारी गर्दा समस्या भयो।</translation>
 <translation id="4944543191714094452">पृष्ठमा फेला पार्नुहोस्…</translation>
 <translation id="4945756290001680296">पासवर्डका सेटिङहरूमाथि पहुँच राख्नुहोस्</translation>
@@ -608,6 +607,7 @@
 <translation id="8073670137947914548">डाउनलोड पूरा भयो</translation>
 <translation id="8073872304774253879">खोज तथा ब्राउजिङलाई अझ राम्रा बनाउनुहोस्</translation>
 <translation id="8076014560081431679">सुरक्षित गरिएका साइटका सेटिङहरूलाई मेटाइने छैन र त्यसले तपाईँको ब्राउज गर्ने बानीलाई झल्काउन सक्छ। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">निष्क्रिय पार्नुहोस्</translation>
 <translation id="8114753159095730575">डाउनलोड गर्न फाइल उपलब्ध छ। स्क्रिनको फेदनजिकै विकल्पहरू उपलब्ध छन्।</translation>
 <translation id="8131740175452115882">निश्चित</translation>
 <translation id="8197543752516192074">पृष्ठ अनुवाद गर्नुहोस्</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 172a82a7..ee5852b3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-bericht voltooid.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> altijd vertalen</translation>
 <translation id="1104948393051856124">Accepteren en doorgaan</translation>
-<translation id="1105578556867525047">Wachtwoord wijzigen op website</translation>
 <translation id="1112015203684611006">Afdrukken mislukt.</translation>
 <translation id="1125564390852150847">Nieuw tabblad maken.</translation>
 <translation id="1145536944570833626">Bestaande gegevens verwijderen.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Afbeelding opslaan</translation>
 <translation id="3789841737615482174">Installeren</translation>
 <translation id="3803696231112616155">Aanbieden om deze site te vertalen</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Geen gehackte wachtwoorden}=1{{COUNT} gehackt wachtwoord}other{{COUNT} gehackte wachtwoorden}}</translation>
 <translation id="385051799172605136">Vorige</translation>
 <translation id="3892144330757387737">Hier vind je je geschiedenis</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Opslaan…</translation>
 <translation id="4904877109095351937">Markeren als gelezen</translation>
 <translation id="4930268273022498155">Bestaande gegevens verwijderen. Je kunt ze terugkrijgen door weer over te schakelen naar <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Inschakelen</translation>
 <translation id="4941089862236492464">Er is een probleem opgetreden bij het delen van je item.</translation>
 <translation id="4944543191714094452">Zoeken op pagina…</translation>
 <translation id="4945756290001680296">Wachtwoordinstellingen openen</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Downloaden is voltooid</translation>
 <translation id="8073872304774253879">Zoekopdrachten en browsefunctionaliteit verbeteren</translation>
 <translation id="8076014560081431679">Opgeslagen site-instellingen worden niet verwijderd en kunnen je browsegedrag weerspiegelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Uitschakelen</translation>
 <translation id="8114753159095730575">Bestand downloaden is beschikbaar. Opties beschikbaar onderaan het scherm.</translation>
 <translation id="8131740175452115882">Bevestigen</translation>
 <translation id="8197543752516192074">Pagina vertalen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index b1343a965..815d6e3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook-innlegget er fullført.</translation>
 <translation id="1103523840287552314">Oversett alltid <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Godta og fortsett</translation>
-<translation id="1105578556867525047">Bytt passord på nettstedet</translation>
 <translation id="1112015203684611006">Utskriften mislyktes.</translation>
 <translation id="1125564390852150847">Åpne en ny fane.</translation>
 <translation id="1145536944570833626">Slett eksisterende data.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Kan ikke lagre bildet</translation>
 <translation id="1180526666083833456">Synkronisering og personlig tilpasning på alle enheter.</translation>
 <translation id="1181037720776840403">Fjern</translation>
+<translation id="1185569544548277362">Nyhet: Du kan velge Chrome som standardnettleser. <ph name="BEGIN_LINK" />Åpne Innstillinger<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Nytt søk</translation>
 <translation id="1209206284964581585">Skjul for øyeblikket</translation>
 <translation id="1219674500290482172">Kan ikke koble til Internett.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Lagre bildet</translation>
 <translation id="3789841737615482174">Installer</translation>
 <translation id="3803696231112616155">Tilby å oversette dette nettstedet</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ingen passord er utsatt for sikkerhetsbrudd}=1{{COUNT} passord er utsatt for sikkerhetsbrudd}other{{COUNT} passord er utsatt for sikkerhetsbrudd}}</translation>
 <translation id="385051799172605136">Tilbake</translation>
 <translation id="3892144330757387737">Her finner du loggen din</translation>
 <translation id="3897092660631435901">Meny</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Lagre</translation>
 <translation id="4904877109095351937">Merk som lest</translation>
 <translation id="4930268273022498155">Slett eksisterende data. Du kan hente ut dataene ved å bytte tilbake til <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Slå på</translation>
 <translation id="4941089862236492464">Det oppsto et problem under delingen av artikkelen.</translation>
 <translation id="4944543191714094452">Finn på siden</translation>
 <translation id="4945756290001680296">Åpne passordinnstillingene</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Nedlastingen er fullført</translation>
 <translation id="8073872304774253879">Gjør søking og surfing bedre</translation>
 <translation id="8076014560081431679">Lagrede nettstedsinnstillinger slettes ikke og kan gjenspeile nettleserbruken din. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Slå av</translation>
 <translation id="8114753159095730575">Filnedlasting er tilgjengelig. Du finner alternativer på nedre del av skjermen.</translation>
 <translation id="8131740175452115882">Bekreft</translation>
 <translation id="8197543752516192074">Oversett siden</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" />fane <ph name="FIRST_VISIBLE_TAB" /> til og med <ph name="LAST_VISIBLE_TAB" /> av <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Ny</translation>
 <translation id="8532105204136943229">Utløpsår</translation>
+<translation id="8533166274275423134">Åpnet et annet sted</translation>
 <translation id="8534481786647257214">Google+-innlegget er fullført.</translation>
 <translation id="8548878600947630424">Finn på siden</translation>
 <translation id="8574235780160508979">Vilkårene for bruk av Chrome endres 31. mars. <ph name="BEGIN_LINK" />Les gjennom dem<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index fc78f106..4eb429a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebookରେ ପୋଷ୍ଟ ଶେଷ ହୋଇଛି।</translation>
 <translation id="1103523840287552314">ସର୍ବଦା <ph name="LANGUAGE" /> ଅନୁବାଦ କରନ୍ତୁ</translation>
 <translation id="1104948393051856124">ସ୍ୱୀକାର କରନ୍ତୁ ଏବଂ ଜାରି ରଖନ୍ତୁ</translation>
-<translation id="1105578556867525047">ୱେବସାଇଟରେ ପାସୱାର୍ଡ ବଦଳାନ୍ତୁ</translation>
 <translation id="1112015203684611006">ପ୍ରିଣ୍ଟ ହେଲାନାହିଁ।</translation>
 <translation id="1125564390852150847">ନୂତନ ଟାବ୍ ତିଆରି କରନ୍ତୁ।</translation>
 <translation id="1145536944570833626">ବିଦ୍ୟମାନ ଥିବା ଡାଟାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ଛବି ସେଭ୍‌ କରନ୍ତୁ</translation>
 <translation id="3789841737615482174">ସଂସ୍ଥାପନ</translation>
 <translation id="3803696231112616155">ଏହି ସାଇଟ୍ ଅନୁବାଦ କରିବାକୁ ଅଫର୍ କରନ୍ତୁ</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{କୌଣସି ପାସୱାର୍ଡ ଚୋରି ହୋଇନାହିଁ}=1{{COUNT}ଟି ପାସୱାର୍ଡ ଚୋରି ହୋଇଯାଇଛି}other{{COUNT}ଟି ପାସୱାର୍ଡ ଚୋରି ହୋଇଯାଇଛି}}</translation>
 <translation id="385051799172605136">ପଛକୁ</translation>
 <translation id="3892144330757387737">ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ଇତିହାସ ପାଇବେ</translation>
 <translation id="3897092660631435901">ମେନୁ</translation>
@@ -330,6 +328,7 @@
 <translation id="4901778704868714008">ସେଭ୍ କରନ୍ତୁ...</translation>
 <translation id="4904877109095351937">"ପଢ଼ାଯାଇଛି" ଭାବରେ ଚିହ୍ନିତ କରନ୍ତୁ</translation>
 <translation id="4930268273022498155">ବିଦ୍ୟମାନ ଥିବା ଡାଟାକୁ ଡିଲିଟ୍ କରନ୍ତୁ <ph name="USER_EMAIL1" />କୁ ପୁଣି ସ୍ୱିଚ୍ କରି ଆପଣ ଏହାକୁ ପୁନଃପ୍ରାପ୍ତ କରିପାରିବେ।</translation>
+<translation id="4930714375720679147">ଚାଲୁ କରନ୍ତୁ</translation>
 <translation id="4941089862236492464">କ୍ଷମା କରିବେ, ଆପଣଙ୍କର ଆଇଟମ୍ ସେୟାର୍ କରିବାରେ ଏକ ସମସ୍ୟା ଅଛି।</translation>
 <translation id="4944543191714094452">ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ…</translation>
 <translation id="4945756290001680296">ପାସ୍‌ୱାର୍ଡ ସେଟିଂସ୍ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation>
@@ -608,6 +607,7 @@
 <translation id="8073670137947914548">ଡାଉନ୍‍‍ଲୋଡ୍ ଶେଷ ହୋଇଛି</translation>
 <translation id="8073872304774253879">ସନ୍ଧାନ ଓ ବ୍ରାଉଜିଂକୁ ଉନ୍ନତ କରନ୍ତୁ</translation>
 <translation id="8076014560081431679">ସେଭ୍ ଥିବା ସାଇଟ୍ ସେଟିଂସ୍ ଡିଲିଟ୍ କରାଯିବ ନାହିଁ ଏବଂ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଅଭ୍ୟାସ ପ୍ରତିଫଳିତ ହୋଇପାରେ। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="8114753159095730575">ଫାଇଲ୍‍ ଡାଉନ୍‌ଲୋଡ୍‌ କରିବା ଉପଲବ୍ଧ ଅଛି। ସ୍କ୍ରିନ୍‌ର ତଳ ପାର୍ଶ୍ୱରେ ବିକଳ୍ପ ଉପଲବ୍ଧ ଅଛି।</translation>
 <translation id="8131740175452115882">ନିଶ୍ଚିତ କରନ୍ତୁ</translation>
 <translation id="8197543752516192074">ପୃଷ୍ଠାକୁ ଅନୁବାଦ କରନ୍ତୁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index 6a45d60..2403557 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">ਫੇਸਬੁੱਕ ਪੋਸਟ ਪੂਰੀ ਕੀਤੀ।</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> ਦਾ ਹਮੇਸ਼ਾਂ ਅਨੁਵਾਦ ਕਰੋ</translation>
 <translation id="1104948393051856124">ਸਵੀਕਾਰ ਕਰੋ &amp; ਜਾਰੀ ਰੱਖੋ</translation>
-<translation id="1105578556867525047">ਵੈੱਬਸਾਈਟ 'ਤੇ ਪਾਸਵਰਡ ਬਦਲੋ</translation>
 <translation id="1112015203684611006">ਪ੍ਰਿੰਟ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।</translation>
 <translation id="1125564390852150847">ਨਵੀਂ ਟੈਬ ਬਣਾਓ।</translation>
 <translation id="1145536944570833626">ਮੌਜੂਦਾ ਡਾਟਾ ਮਿਟਾਓ।</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">ਚਿੱਤਰ ਰੱਖਿਅਤ ਕਰੋ</translation>
 <translation id="3789841737615482174">ਸਥਾਪਤ ਕਰੋ</translation>
 <translation id="3803696231112616155">ਇਸ ਸਾਈਟ ਨੂੰ ਅਨੁਵਾਦ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ਕਿਸੇ ਵੀ ਪਾਸਵਰਡ ਨਾਲ ਛੇੜਛਾੜ ਨਹੀਂ ਹੋਈ}=1{{COUNT} ਪਾਸਵਰਡ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ}other{{COUNT} ਪਾਸਵਰਡਾਂ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ}}</translation>
 <translation id="385051799172605136">ਪਿੱਛੇ</translation>
 <translation id="3892144330757387737">ਤੁਹਾਨੂੰ ਆਪਣਾ ਇਤਿਹਾਸ ਇੱਥੇ ਮਿਲੇਗਾ</translation>
 <translation id="3897092660631435901">ਮੀਨੂ</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">ਰੱਖਿਅਤ ਕਰੋ...</translation>
 <translation id="4904877109095351937">ਪੜ੍ਹੇ ਇੰਦਰਾਜ਼ਾਂ ਨੂੰ ਨਿਸ਼ਾਨਦੇਹ ਕਰੋ</translation>
 <translation id="4930268273022498155">ਮੌਜੂਦਾ ਡਾਟਾ ਮਿਟਾਓ। ਤੁਸੀਂ <ph name="USER_EMAIL1" /> 'ਤੇ ਵਾਪਸ ਜਾਣ 'ਤੇ ਇਸ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੇ ਹੋ।</translation>
+<translation id="4930714375720679147">ਚਾਲੂ ਕਰੋ</translation>
 <translation id="4941089862236492464">ਮਾਫ਼ ਕਰਨਾ, ਤੁਹਾਡੀ ਆਈਟਮ ਸ਼ੇਅਰ ਕਰਨ ਵੇਲੇ ਇੱਕ ਸਮੱਸਿਆ ਹੋਈ ਸੀ।</translation>
 <translation id="4944543191714094452">ਪੰਨੇ ਵਿੱਚ ਲੱਭੋ…</translation>
 <translation id="4945756290001680296">ਪਾਸਵਰਡ ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ</translation>
 <translation id="8073872304774253879">ਖੋਜਾਂ ਅਤੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਬਿਹਤਰ ਬਣਾਓ</translation>
 <translation id="8076014560081431679">ਰੱਖਿਅਤ ਕੀਤੀਆਂ ਸਾਈਟ ਸੈਟਿੰਗਾਂ ਮਿਟਾਈਆਂ ਨਹੀਂ ਜਾਣਗੀਆਂ ਅਤੇ ਇਹ ਤੁਹਾਡੀਆਂ ਬ੍ਰਾਊਜ਼ਿੰਗ ਆਦਤਾਂ ਨੂੰ ਵੀ ਸਮਰਣ ਕਰ ਸਕਦੀਆਂ ਹਨ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ਬੰਦ ਕਰੋ</translation>
 <translation id="8114753159095730575">ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰਨਾ ਉਪਲਬਧ ਹੈ। ਵਿਕਲਪ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਪਾਸੇ ਕੋਲ ਉਪਲਬਧ ਹਨ।</translation>
 <translation id="8131740175452115882">ਪੁਸ਼ਟੀ ਕਰੋ</translation>
 <translation id="8197543752516192074">ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕਰੋ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 9b8df30d..57d64add6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Post na Facebooku dodany.</translation>
 <translation id="1103523840287552314">Zawsze tłumacz z języka: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Zaakceptuj i kontynuuj</translation>
-<translation id="1105578556867525047">Zmień hasło na stronie</translation>
 <translation id="1112015203684611006">Drukowanie nie udało się.</translation>
 <translation id="1125564390852150847">Utwórz nową kartę.</translation>
 <translation id="1145536944570833626">Usuń istniejące dane.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Zapisz obraz</translation>
 <translation id="3789841737615482174">Zainstaluj</translation>
 <translation id="3803696231112616155">Proponuj tłumaczenie tej strony</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Brak przejętych haseł}=1{Zostało przejęte {COUNT} hasło}few{Zostały przejęte {COUNT} hasła}many{Zostało przejętych {COUNT} haseł}other{Zostało przejęte {COUNT} hasła}}</translation>
 <translation id="385051799172605136">Wstecz</translation>
 <translation id="3892144330757387737">Tu znajdziesz swoją historię</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Zapisz...</translation>
 <translation id="4904877109095351937">Oznacz jako przeczytane</translation>
 <translation id="4930268273022498155">Usuń istniejące dane. Aby je pobrać, przełącz się z powrotem na konto <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Włącz</translation>
 <translation id="4941089862236492464">Niestety, wystąpił problem z udostępnieniem tej rzeczy.</translation>
 <translation id="4944543191714094452">Znajdź na stronie…</translation>
 <translation id="4945756290001680296">Otwórz ustawienia haseł</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Pobieranie zakończone</translation>
 <translation id="8073872304774253879">Ulepsz wyszukiwanie i przeglądanie</translation>
 <translation id="8076014560081431679">Zapisane ustawienia witryn nie zostaną usunięte i mogą zawierać informacje o Twoim korzystaniu z przeglądarki. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Wyłącz</translation>
 <translation id="8114753159095730575">Pobrany plik jest dostępny. Opcje są dostępne u dołu ekranu.</translation>
 <translation id="8131740175452115882">Potwierdź</translation>
 <translation id="8197543752516192074">Przetłumacz stronę</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index 1f5b5c9..f7ad03a1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">A postagem no Facebook foi concluída.</translation>
 <translation id="1103523840287552314">Sempre traduzir do <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Aceitar e continuar</translation>
-<translation id="1105578556867525047">Mudar a senha no site</translation>
 <translation id="1112015203684611006">Falha na impressão.</translation>
 <translation id="1125564390852150847">Criar nova guia</translation>
 <translation id="1145536944570833626">Excluir dados já existentes.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Salvar imagem</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="3803696231112616155">Oferecer a opção de traduzir esse site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nenhuma senha comprometida}=1{{COUNT} senha comprometida}one{{COUNT} senha comprometida}other{{COUNT} senhas comprometidas}}</translation>
 <translation id="385051799172605136">Voltar</translation>
 <translation id="3892144330757387737">Você verá seu histórico aqui</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Salvar…</translation>
 <translation id="4904877109095351937">Marcar como lidas</translation>
 <translation id="4930268273022498155">Excluir dados já existentes. É possível recuperá-los voltando para a conta <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Ativar</translation>
 <translation id="4941089862236492464">Ocorreu um problema ao compartilhar seu item.</translation>
 <translation id="4944543191714094452">Localizar na página…</translation>
 <translation id="4945756290001680296">Acessar configurações de senha</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Download concluído</translation>
 <translation id="8073872304774253879">Melhorar as pesquisas e a navegação</translation>
 <translation id="8076014560081431679">As configurações salvas em sites não são excluídas e podem refletir seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desativar</translation>
 <translation id="8114753159095730575">O download de arquivo está disponível. Opções disponíveis perto da parte inferior da tela.</translation>
 <translation id="8131740175452115882">Confirmar</translation>
 <translation id="8197543752516192074">Traduzir página</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 7236283..eded7af 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Publicação no Facebook concluída.</translation>
 <translation id="1103523840287552314">Traduzir sempre <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Aceitar e Continuar</translation>
-<translation id="1105578556867525047">Alterar palavra-passe no Website</translation>
 <translation id="1112015203684611006">Falha ao imprimir.</translation>
 <translation id="1125564390852150847">Criar novo separador</translation>
 <translation id="1145536944570833626">Eliminar dados existentes.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Guardar Imagem</translation>
 <translation id="3789841737615482174">Instalar</translation>
 <translation id="3803696231112616155">Propor tradução deste site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Não existem palavras-passe comprometidas.}=1{{COUNT} palavra-passe comprometida.}other{{COUNT} palavras-passe comprometidas.}}</translation>
 <translation id="385051799172605136">Anterior</translation>
 <translation id="3892144330757387737">O seu histórico será apresentado aqui</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Guardar…</translation>
 <translation id="4904877109095351937">Marcar como lidas</translation>
 <translation id="4930268273022498155">Eliminar os dados existentes. Pode obtê-los ao mudar novamente para <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Ativar</translation>
 <translation id="4941089862236492464">Lamentamos, mas ocorreu um erro ao partilhar o seu item.</translation>
 <translation id="4944543191714094452">Localizar na página…</translation>
 <translation id="4945756290001680296">Aceder às definições de palavras-passe</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Transferência concluída</translation>
 <translation id="8073872304774253879">Melhorar as pesquisas e a navegação</translation>
 <translation id="8076014560081431679">As definições de sites guardadas não são eliminadas e podem refletir os seus hábitos de navegação. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Desativar</translation>
 <translation id="8114753159095730575">A transferência de ficheiros está disponível. Opções disponíveis junto à parte inferior do ecrã.</translation>
 <translation id="8131740175452115882">Confirmar</translation>
 <translation id="8197543752516192074">Traduzir página</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index a4c4f7d..c36a839 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Postare pe Facebook finalizată.</translation>
 <translation id="1103523840287552314">Tradu întotdeauna din <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Acceptă și continuă</translation>
-<translation id="1105578556867525047">Schimbă parola pentru site</translation>
 <translation id="1112015203684611006">Printarea nu a reușit.</translation>
 <translation id="1125564390852150847">Creează o filă nouă.</translation>
 <translation id="1145536944570833626">Șterge datele existente.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Imaginea nu s-a salvat</translation>
 <translation id="1180526666083833456">Sincronizează și personalizează pe toate dispozitivele.</translation>
 <translation id="1181037720776840403">Elimină</translation>
+<translation id="1185569544548277362">Nou: poți seta Chrome ca browser prestabilit. <ph name="BEGIN_LINK" />Deschide Setările<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Căutare nouă</translation>
 <translation id="1209206284964581585">Ascunde momentan</translation>
 <translation id="1219674500290482172">Nu se poate realiza conexiunea la internet.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Salvează imaginea</translation>
 <translation id="3789841737615482174">Instalează</translation>
 <translation id="3803696231112616155">Oferă traducerea acestui site</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nu există parole compromise}=1{{COUNT} parolă compromisă}few{{COUNT} parole compromise}other{{COUNT} de parole compromise}}</translation>
 <translation id="385051799172605136">Înapoi</translation>
 <translation id="3892144330757387737">Aici vei vedea istoricul</translation>
 <translation id="3897092660631435901">Meniu</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Salvează...</translation>
 <translation id="4904877109095351937">Marchează ca citite</translation>
 <translation id="4930268273022498155">Șterge datele existente. Le poți recupera comutând înapoi la <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Activează</translation>
 <translation id="4941089862236492464">A apărut o problemă la trimiterea articolului.</translation>
 <translation id="4944543191714094452">Caută în pagină…</translation>
 <translation id="4945756290001680296">Accesează setările pentru parole</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Descărcarea s-a finalizat</translation>
 <translation id="8073872304774253879">Îmbunătățește căutările și navigarea</translation>
 <translation id="8076014560081431679">Setările salvate pentru site-uri nu vor fi șterse și pot reflecta obiceiurile de navigare. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Dezactivează</translation>
 <translation id="8114753159095730575">Descărcarea fișierelor este disponibilă. Opțiunile sunt disponibile în partea de jos a ecranului.</translation>
 <translation id="8131740175452115882">Confirmați</translation>
 <translation id="8197543752516192074">Tradu pagina</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">Filele <ph name="INCOGNITO" /> de la <ph name="FIRST_VISIBLE_TAB" /> la <ph name="LAST_VISIBLE_TAB" /> din <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Nou</translation>
 <translation id="8532105204136943229">An expirare</translation>
+<translation id="8533166274275423134">Deschisă în altă parte</translation>
 <translation id="8534481786647257214">S-a postat pe Google+.</translation>
 <translation id="8548878600947630424">Găsește în pagină...</translation>
 <translation id="8574235780160508979">Termenii și condițiile Chrome se modifică la 31 martie. <ph name="BEGIN_LINK" />Consultați<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 8e47aaf4..87662dd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Опубликовано в Facebook.</translation>
 <translation id="1103523840287552314">Всегда переводить <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Продолжить</translation>
-<translation id="1105578556867525047">Сменить пароль на сайте</translation>
 <translation id="1112015203684611006">Ошибка печати</translation>
 <translation id="1125564390852150847">Создать вкладку</translation>
 <translation id="1145536944570833626">Удалить сохраненные данные.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Сохранить изображение</translation>
 <translation id="3789841737615482174">Установить</translation>
 <translation id="3803696231112616155">Предлагать переводить этот сайт</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Нет раскрытых паролей}=1{{COUNT} пароль раскрыт}one{{COUNT} пароль раскрыт}few{{COUNT} пароля раскрыты}many{{COUNT} паролей раскрыты}other{{COUNT} пароля раскрыто}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Здесь вы найдете свою историю</translation>
 <translation id="3897092660631435901">Меню</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Сохранить</translation>
 <translation id="4904877109095351937">Отметить как прочитанное</translation>
 <translation id="4930268273022498155">Удалить сохраненные данные. Чтобы снова получить к ним доступ, переключитесь на аккаунт <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Включить</translation>
 <translation id="4941089862236492464">Не удалось опубликовать запись.</translation>
 <translation id="4944543191714094452">Найти на странице…</translation>
 <translation id="4945756290001680296">Доступ к настройкам паролей</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Скачивание завершено</translation>
 <translation id="8073872304774253879">Улучшить функции поиска и просмотра страниц</translation>
 <translation id="8076014560081431679">Настройки сайтов не изменятся, поэтому данные о вашей работе в Интернете сохранятся. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Отключить</translation>
 <translation id="8114753159095730575">Файл доступен для скачивания. Параметры указаны в нижней части экрана.</translation>
 <translation id="8131740175452115882">Подтвердить</translation>
 <translation id="8197543752516192074">Перевести страницу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index 935f0962..f6a7aa4e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook පළ කිරීම සම්පූර්ණයි.</translation>
 <translation id="1103523840287552314">සැමවිටම <ph name="LANGUAGE" /> පරිවර්තනය කරන්න</translation>
 <translation id="1104948393051856124">පිළිගෙන කරගෙන යන්න</translation>
-<translation id="1105578556867525047">වෙබ් අඩවිය මත මුරපදය වෙනස් කරන්න</translation>
 <translation id="1112015203684611006">මුද්‍රණය කිරීම අසාර්ථක විය.</translation>
 <translation id="1125564390852150847">නව පටිත්තක් තනන්න.</translation>
 <translation id="1145536944570833626">පවතින දත්ත මකන්න.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">රූපය සුරකින්න</translation>
 <translation id="3789841737615482174">ස්ථාපනය</translation>
 <translation id="3803696231112616155">මෙම වෙබ් අඩවිය පරිවර්තන කිරීමට පිරිනමන්න</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{කිසිදු මුරපදයක් අවදානමේ නැත}=1{මුරපද {COUNT}ක් අවදානමකට පත් විය}one{මුරපද {COUNT}ක් අවදානමකට පත් විය}other{මුරපද {COUNT}ක් අවදානමකට පත් විය}}</translation>
 <translation id="385051799172605136">ආපසු</translation>
 <translation id="3892144330757387737">ඔබට ඔබේ ඉතිහාසය මෙහි හමුවනු ඇත</translation>
 <translation id="3897092660631435901">මෙනුව</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">සුරකින්න...</translation>
 <translation id="4904877109095351937">කියවූ ලෙස ලකුණු කරන්න</translation>
 <translation id="4930268273022498155">පවතින දත්ත මකන්න. ඔබට <ph name="USER_EMAIL1" /> වෙත ආපසු මාරු වීම මඟින් එය ඔබට යළි ලබා ගත හැකිය.</translation>
+<translation id="4930714375720679147">ක්‍රියාත්මක කරන්න</translation>
 <translation id="4941089862236492464">කනගාටුයි, ඔබේ අයිතමය බෙදා ගැනීමේ ගැටලුවක් විය.</translation>
 <translation id="4944543191714094452">පිටුව තුළ සොයන්න…</translation>
 <translation id="4945756290001680296">මුරපද සැකසීම් වෙත ප්‍රවේශ වන්න</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">බාගැනීම අවසන් වී ඇත</translation>
 <translation id="8073872304774253879">සෙවීම් සහ බ්‍රවුස් කිරීම තවත් හොඳ කරන්න</translation>
 <translation id="8076014560081431679">සුරැකි අඩවි සැකසීම් නොමැකෙනු ඇති අතර එයින් ඔබගේ බ්‍රවුස් කිරීමේ පුරුදු පිළිබිඹු විය හැක. <ph name="BEGIN_LINK" />තවත් දැන ගන්න<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ක්‍රියා විරහිත කරන්න</translation>
 <translation id="8114753159095730575">ගොනුව බාගත හැකි වේ. තිරයේ පහළට ආසන්නව විකල්ප තිබේ.</translation>
 <translation id="8131740175452115882">තහවුරු කරන්න</translation>
 <translation id="8197543752516192074">පිටුව පරිවර්තන කරන්න</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index cdd07fb..2d501eb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Príspevok bol uverejnený na Facebook.</translation>
 <translation id="1103523840287552314">Vždy preložiť nasledujúci jazyk: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Prijať a pokračovať</translation>
-<translation id="1105578556867525047">Zmeniť heslo na webe</translation>
 <translation id="1112015203684611006">Tlač zlyhala.</translation>
 <translation id="1125564390852150847">Vytvoriť novú kartu.</translation>
 <translation id="1145536944570833626">Odstrániť existujúce dáta.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Uložiť obrázok</translation>
 <translation id="3789841737615482174">Inštalovať</translation>
 <translation id="3803696231112616155">Ponúkať preklad tohto webu</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Neboli prelomené žiadne heslá}=1{Bolo prelomené {COUNT} heslo}few{Boli prelomené {COUNT} heslá}many{{COUNT} Passwords compromised}other{Bolo prelomených {COUNT} hesiel}}</translation>
 <translation id="385051799172605136">Naspäť</translation>
 <translation id="3892144330757387737">Tu nájdete svoju históriu</translation>
 <translation id="3897092660631435901">Ponuka</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Uložiť...</translation>
 <translation id="4904877109095351937">Označiť ako prečítané</translation>
 <translation id="4930268273022498155">Odstrániť existujúce údaje. Načítate ich prepnutím späť na účet <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Zapnúť</translation>
 <translation id="4941089862236492464">Je nám ľúto, pri zdieľaní položky sa vyskytol problém.</translation>
 <translation id="4944543191714094452">Nájsť na stránke…</translation>
 <translation id="4945756290001680296">Prejdite do nastavení hesla</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Sťahovanie bolo dokončené</translation>
 <translation id="8073872304774253879">Zlepšovať vyhľadávanie a prehliadanie</translation>
 <translation id="8076014560081431679">Uložené nastavenia webov sa neodstránia a môžu odrážať vaše návyky prehliadania. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Vypnúť</translation>
 <translation id="8114753159095730575">Súbor je k dispozícii na stiahnutie. Možnosti sú k dispozícii v dolnej časti obrazovky.</translation>
 <translation id="8131740175452115882">Potvrdiť</translation>
 <translation id="8197543752516192074">Preložiť stránku</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index d298a750..c2b77a7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Objava v Facebooku je dokončana.</translation>
 <translation id="1103523840287552314">Vedno prevedi ta jezik: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Sprejmi in nadaljuj</translation>
-<translation id="1105578556867525047">Spremeni geslo na spletnem mestu</translation>
 <translation id="1112015203684611006">Printing failed.</translation>
 <translation id="1125564390852150847">Create new tab.</translation>
 <translation id="1145536944570833626">Izbris obstoječih podatkov.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Slike ni mog. shran.</translation>
 <translation id="1180526666083833456">Sinhronizacija in prilagajanje med napravami.</translation>
 <translation id="1181037720776840403">Odstrani</translation>
+<translation id="1185569544548277362">Novo: Chrome lahko določite kot privzeti brskalnik. <ph name="BEGIN_LINK" />Odpri nastavitve<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Novo iskanje</translation>
 <translation id="1209206284964581585">Zaenkrat skrij</translation>
 <translation id="1219674500290482172">Internetne povezave ni mogoče vzpostaviti.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Shrani sliko</translation>
 <translation id="3789841737615482174">Namesti</translation>
 <translation id="3803696231112616155">Ponudi prevod tega spletnega mesta</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Ni ogroženih gesel}=1{{COUNT} ogroženo geslo}one{{COUNT} ogroženo geslo}two{{COUNT} ogroženi gesli}few{{COUNT} ogrožena gesla}other{{COUNT} ogroženih gesel}}</translation>
 <translation id="385051799172605136">Nazaj</translation>
 <translation id="3892144330757387737">Tukaj bo prikazana zgodovina</translation>
 <translation id="3897092660631435901">Meni</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Shrani ...</translation>
 <translation id="4904877109095351937">Označi kot prebrano</translation>
 <translation id="4930268273022498155">Izbris obstoječih podatkov. Pridobite jih lahko tako, da preklopite nazaj na račun <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Vklop</translation>
 <translation id="4941089862236492464">Težava pri deljenju elementa z drugimi.</translation>
 <translation id="4944543191714094452">Najdi na strani …</translation>
 <translation id="4945756290001680296">Dostop do nastavitev gesel</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Prenos končan</translation>
 <translation id="8073872304774253879">Izboljšanje iskanja in brskanja</translation>
 <translation id="8076014560081431679">Shranjene nastavitve spletnih mest ne bodo izbrisane in morda odražajo vaše brskalne navade. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Izklop</translation>
 <translation id="8114753159095730575">Prenos datotek je na voljo. Možnosti so na voljo pri dnu zaslona.</translation>
 <translation id="8131740175452115882">Potrdi</translation>
 <translation id="8197543752516192074">Prevedi stran</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" /> Tabs <ph name="FIRST_VISIBLE_TAB" /> through <ph name="LAST_VISIBLE_TAB" /> of <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Novo</translation>
 <translation id="8532105204136943229">Expiration Year</translation>
+<translation id="8533166274275423134">Odprto drugje</translation>
 <translation id="8534481786647257214">Objava v Googlu+ je dokončana.</translation>
 <translation id="8548878600947630424">Najdi na strani ...</translation>
 <translation id="8574235780160508979">Pogoji storitve za Chrome se bodo spremenili 31. marca. <ph name="BEGIN_LINK" />Preglejte<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index 38e03710..4d4e0705 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Postimi në Facebook u krye.</translation>
 <translation id="1103523840287552314">Përkthe gjithmonë nga <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Prano dhe vazhdo</translation>
-<translation id="1105578556867525047">Ndryshoje fjalëkalimin në faqen e internetit</translation>
 <translation id="1112015203684611006">Printimi dështoi.</translation>
 <translation id="1125564390852150847">Krijo një skedë të re</translation>
 <translation id="1145536944570833626">Fshi të dhënat ekzistuese.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Imazhi nuk mund të ruhet</translation>
 <translation id="1180526666083833456">Sinkronizo e personalizo përmes pajisjeve.</translation>
 <translation id="1181037720776840403">Hiq</translation>
+<translation id="1185569544548277362">E re: Mund ta bësh Chrome shfletuesin tënd të parazgjedhur. <ph name="BEGIN_LINK" />Hap "Cilësimet"<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Kërkim i ri</translation>
 <translation id="1209206284964581585">Fshih për momentin</translation>
 <translation id="1219674500290482172">Është e pamundur lidhja me internetin.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Ruaj imazhin</translation>
 <translation id="3789841737615482174">Instalo</translation>
 <translation id="3803696231112616155">Ofro përkthimin për këtë sajt</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Asnjë fjalëkalim i komprometuar}=1{{COUNT} fjalëkalim i komprometuar}other{{COUNT} fjalëkalime të komprometuara}}</translation>
 <translation id="385051799172605136">Prapa</translation>
 <translation id="3892144330757387737">Këtu do të gjesh historikun tënd</translation>
 <translation id="3897092660631435901">Menyja</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Ruaj...</translation>
 <translation id="4904877109095351937">Shëno si të lexuara</translation>
 <translation id="4930268273022498155">Fshi të dhënat ekzistuese. Mund t'i marrësh ato duke u kthyer përsëri te <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Aktivizo</translation>
 <translation id="4941089862236492464">Na vjen keq, kishte një problem në ndarjen e artikullit tënd.</translation>
 <translation id="4944543191714094452">Gjej në faqe…</translation>
 <translation id="4945756290001680296">Qasu te cilësimet e fjalëkalimit</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Shkarkimi përfundoi</translation>
 <translation id="8073872304774253879">Përmirëson kërkimet dhe shfletimin</translation>
 <translation id="8076014560081431679">Cilësimet e ruajtura të sajteve nuk do të fshihen dhe mund të pasqyrojnë zakonet e tua të shfletimit. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Çaktivizo</translation>
 <translation id="8114753159095730575">Ofrohet shkarkimi i skedarit. Opsionet ofrohen pranë fundit të ekranit.</translation>
 <translation id="8131740175452115882">Konfirmo</translation>
 <translation id="8197543752516192074">Përkthe faqen</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" /> Skeda <ph name="FIRST_VISIBLE_TAB" /> deri <ph name="LAST_VISIBLE_TAB" /> nga <ph name="NUMBER_OF_OPEN_TABS" /></translation>
 <translation id="8529767659511976195">Risi</translation>
 <translation id="8532105204136943229">Viti i skadimit</translation>
+<translation id="8533166274275423134">Hapur diku tjetër</translation>
 <translation id="8534481786647257214">Postimi i Google+ përfundoi.</translation>
 <translation id="8548878600947630424">Gjej në faqe...</translation>
 <translation id="8574235780160508979">Kushtet e shërbimit të Chrome ndryshojnë më 31 mars. <ph name="BEGIN_LINK" />Shqyrtoji<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 48d5508..b474460 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook post je dovršen.</translation>
 <translation id="1103523840287552314">Uvek prevodi <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Prihvati i nastavi</translation>
-<translation id="1105578556867525047">Promenite lozinku na veb-sajtu</translation>
 <translation id="1112015203684611006">Štampanje nije uspelo.</translation>
 <translation id="1125564390852150847">Napravi novu karticu.</translation>
 <translation id="1145536944570833626">Izbrišite postojeće podatke</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Sačuvaj sliku</translation>
 <translation id="3789841737615482174">Instaliraj</translation>
 <translation id="3803696231112616155">Ponudi prevod ovog sajta</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Nije ugrožena nijedna lozinka}=1{{COUNT} lozinka je ugrožena}one{{COUNT} lozinka je ugrožena}few{{COUNT} lozinke su ugrožene}other{{COUNT} lozinki je ugroženo}}</translation>
 <translation id="385051799172605136">Nazad</translation>
 <translation id="3892144330757387737">Ovde ćete pronaći istoriju</translation>
 <translation id="3897092660631435901">Meni</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Sačuvaj...</translation>
 <translation id="4904877109095351937">Označi kao pročitano</translation>
 <translation id="4930268273022498155">Izbrišite postojeće podatke. Možete da ih vratite ako se vratite na <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Uključi</translation>
 <translation id="4941089862236492464">Žao nam je, došlo je do problema pri deljenju stavke.</translation>
 <translation id="4944543191714094452">Pronađi na stranici…</translation>
 <translation id="4945756290001680296">Pristupite podešavanjima lozinki</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Preuzimanje je završeno</translation>
 <translation id="8073872304774253879">Poboljšaj pretrage i pregledanje</translation>
 <translation id="8076014560081431679">Nećemo izbrisati sačuvana podešavanja sajtova i ona mogu da odražavaju vaše navike pri pregledanju. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Isključi</translation>
 <translation id="8114753159095730575">Preuzimanje datoteke nije dostupno. Opcije su navedene u dnu ekrana.</translation>
 <translation id="8131740175452115882">Potvrdi</translation>
 <translation id="8197543752516192074">Prevedi stranicu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index 58a67ae..50b36423 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook пост је довршен.</translation>
 <translation id="1103523840287552314">Увек преводи <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Прихвати и настави</translation>
-<translation id="1105578556867525047">Промените лозинку на веб-сајту</translation>
 <translation id="1112015203684611006">Штампање није успело.</translation>
 <translation id="1125564390852150847">Направи нову картицу.</translation>
 <translation id="1145536944570833626">Избришите постојеће податке</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Сачувај слику</translation>
 <translation id="3789841737615482174">Инсталирај</translation>
 <translation id="3803696231112616155">Понуди превод овог сајта</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Није угрожена ниједна лозинка}=1{{COUNT} лозинка је угрожена}one{{COUNT} лозинка је угрожена}few{{COUNT} лозинке су угрожене}other{{COUNT} лозинки је угрожено}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Овде ћете пронаћи историју</translation>
 <translation id="3897092660631435901">Мени</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Сачувај...</translation>
 <translation id="4904877109095351937">Означи као прочитано</translation>
 <translation id="4930268273022498155">Избришите постојеће податке. Можете да их вратите ако се вратите на <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Укључи</translation>
 <translation id="4941089862236492464">Жао нам је, дошло је до проблема при дељењу ставке.</translation>
 <translation id="4944543191714094452">Пронађи на страници…</translation>
 <translation id="4945756290001680296">Приступите подешавањима лозинки</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Преузимање је завршено</translation>
 <translation id="8073872304774253879">Побољшај претраге и прегледање</translation>
 <translation id="8076014560081431679">Нећемо избрисати сачувана подешавања сајтова и она могу да одражавају ваше навике при прегледању. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Искључи</translation>
 <translation id="8114753159095730575">Преузимање датотеке није доступно. Опције су наведене у дну екрана.</translation>
 <translation id="8131740175452115882">Потврди</translation>
 <translation id="8197543752516192074">Преведи страницу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 295dbd6..e064c86 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Inlägg på Facebook klart.</translation>
 <translation id="1103523840287552314">Översätt alltid <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Godkänn och fortsätt</translation>
-<translation id="1105578556867525047">Ändra lösenordet på webbplatsen</translation>
 <translation id="1112015203684611006">Utskriftsfel.</translation>
 <translation id="1125564390852150847">Skapa en ny flik.</translation>
 <translation id="1145536944570833626">Radera befintlig data.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Spara bild</translation>
 <translation id="3789841737615482174">Installera</translation>
 <translation id="3803696231112616155">Erbjud översättning av webbplatsen</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Inga utsatta lösenord}=1{{COUNT} utsatt lösenord}other{{COUNT} utsatta lösenord}}</translation>
 <translation id="385051799172605136">Bakåt</translation>
 <translation id="3892144330757387737">Du hittar historiken här</translation>
 <translation id="3897092660631435901">Meny</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Spara …</translation>
 <translation id="4904877109095351937">Markera som läst</translation>
 <translation id="4930268273022498155">Radera befintlig data. Om du byter tillbaka till <ph name="USER_EMAIL1" /> finns den kvar där.</translation>
+<translation id="4930714375720679147">Aktivera</translation>
 <translation id="4941089862236492464">Det gick inte att dela objektet.</translation>
 <translation id="4944543191714094452">Hitta på sida …</translation>
 <translation id="4945756290001680296">Åtkomst till lösenordsinställningar</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Nedladdningen är klar</translation>
 <translation id="8073872304774253879">Förbättra sökningar och surfande</translation>
 <translation id="8076014560081431679">Sparade webbplatsinställningar raderas inte och kan visa dina surfvanor. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Inaktivera</translation>
 <translation id="8114753159095730575">En filnedladdning är tillgänglig. Alternativ visas nära skärmens nederkant.</translation>
 <translation id="8131740175452115882">Bekräfta</translation>
 <translation id="8197543752516192074">Översätt sidan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index d4d9e19..3af5c55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Chapisho la Facebook limekamilika.</translation>
 <translation id="1103523840287552314">Tafsiri <ph name="LANGUAGE" /> kila wakati</translation>
 <translation id="1104948393051856124">Kubali na Uendelee</translation>
-<translation id="1105578556867525047">Badilisha nenosiri kwenye Tovuti</translation>
 <translation id="1112015203684611006">Imeshindwa kuchapisha.</translation>
 <translation id="1125564390852150847">Unda kichupo kipya</translation>
 <translation id="1145536944570833626">Futa data iliyopo.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Hifadhi Picha</translation>
 <translation id="3789841737615482174">Sakinisha</translation>
 <translation id="3803696231112616155">Jitolee kutafsiri tovuti hii</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Hakuna manenosiri yaliyoathiriwa}=1{Nenosiri {COUNT} limeathiriwa}other{Manenosiri {COUNT} yameathiriwa}}</translation>
 <translation id="385051799172605136">Rudi nyuma</translation>
 <translation id="3892144330757387737">Utapata historia yako hapa</translation>
 <translation id="3897092660631435901">Menyu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Hifadhi...</translation>
 <translation id="4904877109095351937">Tia Alama Kuwa Umesoma</translation>
 <translation id="4930268273022498155">Futa data iliyopo. Unaweza kuirejesha kwa kurudi kwenye <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Washa</translation>
 <translation id="4941089862236492464">Samahani, kulikuwa na tatizo wakati wa kushiriki kipengee chako.</translation>
 <translation id="4944543191714094452">Pata katika Ukurasa…</translation>
 <translation id="4945756290001680296">Fikia mipangilio ya nenosiri</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Imemaliza kupakua</translation>
 <translation id="8073872304774253879">Boresha Utafutaji na Kuvinjari</translation>
 <translation id="8076014560081431679">Mipangilio ya tovuti iliyohifadhiwa haitafutwa na inaweza kuonyesha mtindo wako wa kuvinjari. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Zima</translation>
 <translation id="8114753159095730575">Unaweza kupakua faili. Chaguo zinapatikana karibu na sehemu ya chini ya skrini.</translation>
 <translation id="8131740175452115882">Thibitisha</translation>
 <translation id="8197543752516192074">Tafsiri Ukurasa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index f141cb27..c967185 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook இடுகை நிறைவுபெற்றது.</translation>
 <translation id="1103523840287552314">எப்போதும் இந்த மொழியை மொழிபெயர் <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">ஏற்று தொடரவும்</translation>
-<translation id="1105578556867525047">இணையதளத்தில் கடவுச்சொல்லை மாற்றுங்கள்</translation>
 <translation id="1112015203684611006">அச்சிட முடியவில்லை.</translation>
 <translation id="1125564390852150847">புதிய தாவலை உருவாக்கு</translation>
 <translation id="1145536944570833626">ஏற்கனவே உள்ள தரவை நீக்கு.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">படத்தைச் சேமி</translation>
 <translation id="3789841737615482174">நிறுவுக</translation>
 <translation id="3803696231112616155">இந்தத் தளத்தை மொழிபெயர்</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{கடவுச்சொற்கள் எதுவும் களவாடப்படவில்லை}=1{{COUNT} கடவுச்சொல் களவாடப்பட்டது}other{{COUNT} கடவுச்சொற்கள் களவாடப்பட்டன}}</translation>
 <translation id="385051799172605136">முந்தைய பக்கம்</translation>
 <translation id="3892144330757387737">உங்கள் வரலாற்றை இங்கே பார்ப்பீர்கள்</translation>
 <translation id="3897092660631435901">மெனு</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">சேமி...</translation>
 <translation id="4904877109095351937">படித்ததாகக் குறி</translation>
 <translation id="4930268273022498155">ஏற்கனவே உள்ள தரவை நீக்கவும். மீண்டும் <ph name="USER_EMAIL1" />க்கு மாற்றுவதன் மூலம் அதை மீட்டெடுக்கலாம்.</translation>
+<translation id="4930714375720679147">இயக்கு</translation>
 <translation id="4941089862236492464">மன்னிக்கவும், உங்கள் உருப்படியைப் பகிர்வதில் ஒரு பிரச்சனை ஏற்பட்டது.</translation>
 <translation id="4944543191714094452">பக்கத்தில் கண்டறிக…</translation>
 <translation id="4945756290001680296">கடவுச்சொல் அமைப்புகளைப் பயன்படுத்தும்</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">பதிவிறக்கம் முடிவடைந்தது</translation>
 <translation id="8073872304774253879">தேடல்களையும் உலாவுதலையும் மேம்படுத்துங்கள்</translation>
 <translation id="8076014560081431679">சேமித்த தள அமைப்புகள் நீக்கப்படாது, அவை உங்கள் உலாவல் தகவல்களைப் பிரதிபலிக்கக்கூடும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">முடக்கு</translation>
 <translation id="8114753159095730575">கோப்பைப் பதிவிறக்கிக்கொள்ளலாம். திரையின் அடிப்பகுதிக்கு அருகில், விருப்பங்கள் உள்ளன.</translation>
 <translation id="8131740175452115882">உறுதிப்படுத்து</translation>
 <translation id="8197543752516192074">பக்கத்தை மொழிபெயர்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 136481da..5bfe686 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook పోస్ట్ పూర్తయింది.</translation>
 <translation id="1103523840287552314">ఎల్లప్పుడూ <ph name="LANGUAGE" />ను అనువదించు</translation>
 <translation id="1104948393051856124">అంగీకరించు &amp; కొనసాగు</translation>
-<translation id="1105578556867525047">వెబ్‌సైట్‌లో పాస్‌వర్డ్‌ను మార్చండి</translation>
 <translation id="1112015203684611006">ముద్రణ విఫలమైంది.</translation>
 <translation id="1125564390852150847">కొత్త ట్యాబ్‌ను సృష్టించండి.</translation>
 <translation id="1145536944570833626">ఇప్పటికే ఉన్న డేటాను తొలగించండి.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">చిత్రాన్ని సేవ్ చేయి</translation>
 <translation id="3789841737615482174">ఇన్‌స్టాల్ చేయి</translation>
 <translation id="3803696231112616155">ఈ సైట్‌కు అనువాదం అందించే సూచన</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{బహిర్గతం అయిన పాస్‌వర్డ్‌లు లేవు}=1{{COUNT} పాస్‌వర్డ్ బహిర్గతం అయ్యింది}other{{COUNT} పాస్‌వర్డ్‌లు బహిర్గతం అయ్యాయి}}</translation>
 <translation id="385051799172605136">వెనుకకు</translation>
 <translation id="3892144330757387737">మీ హిస్టరీని ఇక్కడ చూడగలరు</translation>
 <translation id="3897092660631435901">మెను</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">సేవ్ చేయి...</translation>
 <translation id="4904877109095351937">చదివినట్లు గుర్తు పెట్టు</translation>
 <translation id="4930268273022498155">ఇప్పటికే ఉన్న డేటాను తొలగించండి. మీరు <ph name="USER_EMAIL1" />కు వెన‌క్కు వెళ్లడం ద్వారా దాన్ని తిరిగి పొందవచ్చు.</translation>
+<translation id="4930714375720679147">ఆన్ చేయి</translation>
 <translation id="4941089862236492464">క్షమించండి, మీ అంశాన్ని భాగస్వామ్యం చేయడంలో సమస్య ఉంది.</translation>
 <translation id="4944543191714094452">పేజీలో కనుగొను…</translation>
 <translation id="4945756290001680296">పాస్‌వర్డ్ సెట్టింగ్‌లను యాక్సెస్ చేయండి</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">డౌన్‌లోడ్ పూర్తయింది</translation>
 <translation id="8073872304774253879">శోధనలు మరియు బ్రౌజింగ్‌ను మరింత మెరుగుపరచండి</translation>
 <translation id="8076014560081431679">సేవ్ చేసిన సైట్ సెట్టింగ్‌లు తొలగించబడవు, ఇవి మీ బ్రౌజింగ్ అలవాట్లను ప్రదర్శించవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ఆఫ్ చేయి</translation>
 <translation id="8114753159095730575">ఫైల్ డౌన్‌లోడ్ అందుబాటులో ఉంది. ఎంపికలు స్క్రీన్ దిగువ భాగంలో అందుబాటులో ఉంటాయి.</translation>
 <translation id="8131740175452115882">నిర్ధారించు</translation>
 <translation id="8197543752516192074">పేజీని అనువదించు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index a9f116c..1aa93e9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">โพสต์ใน Facebook แล้ว</translation>
 <translation id="1103523840287552314">แปลภาษา<ph name="LANGUAGE" />ทุกครั้ง</translation>
 <translation id="1104948393051856124">ยอมรับและดำเนินการต่อ</translation>
-<translation id="1105578556867525047">เปลี่ยนรหัสผ่านในเว็บไซต์</translation>
 <translation id="1112015203684611006">การพิมพ์ล้มเหลว</translation>
 <translation id="1125564390852150847">สร้างแท็บใหม่</translation>
 <translation id="1145536944570833626">ลบข้อมูลที่มีอยู่</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">บันทึกภาพ</translation>
 <translation id="3789841737615482174">ติดตั้ง</translation>
 <translation id="3803696231112616155">เสนอให้แปลเว็บไซต์นี้</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{ไม่มีรหัสผ่านที่ถูกละเมิด}=1{มีรหัสผ่านที่ถูกละเมิด {COUNT} รายการ}other{มีรหัสผ่านที่ถูกละเมิด {COUNT} รายการ}}</translation>
 <translation id="385051799172605136">กลับ</translation>
 <translation id="3892144330757387737">คุณจะเห็นประวัติการเข้าชมที่นี่</translation>
 <translation id="3897092660631435901">เมนู</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">บันทึก...</translation>
 <translation id="4904877109095351937">ทำเครื่องหมายว่าอ่านแล้ว</translation>
 <translation id="4930268273022498155">ลบข้อมูลที่มีอยู่ คุณสามารถดึงข้อมูลได้ด้วยการเปลี่ยนกลับเป็น <ph name="USER_EMAIL1" /></translation>
+<translation id="4930714375720679147">เปิด</translation>
 <translation id="4941089862236492464">ขออภัย เกิดปัญหาในการแชร์รายการของคุณ</translation>
 <translation id="4944543191714094452">ค้นหาในหน้าเว็บ…</translation>
 <translation id="4945756290001680296">เข้าถึงการตั้งค่ารหัสผ่าน</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ดาวน์โหลดเสร็จแล้ว</translation>
 <translation id="8073872304774253879">ปรับปรุงการค้นหาและการท่องเว็บให้ดียิ่งขึ้น</translation>
 <translation id="8076014560081431679">การตั้งค่าเว็บไซต์ที่บันทึกไว้จะไม่ถูกลบและอาจส่งผลกับลักษณะการท่องเว็บของคุณ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">ปิด</translation>
 <translation id="8114753159095730575">การดาวน์โหลดไฟล์พร้อมใช้งาน มีตัวเลือกอยู่ทางด้านล่างของหน้าจอ</translation>
 <translation id="8131740175452115882">ยืนยัน</translation>
 <translation id="8197543752516192074">แปลหน้าเว็บ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 48a2505..ec9b0e7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook yayını tamamlandı.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> dilini daima çevir</translation>
 <translation id="1104948393051856124">Kabul Et ve Devam Et</translation>
-<translation id="1105578556867525047">Web sitesindeki şifreyi değiştir</translation>
 <translation id="1112015203684611006">Yazdırılamadı.</translation>
 <translation id="1125564390852150847">Yeni sekme oluştur.</translation>
 <translation id="1145536944570833626">Mevcut verileri silin.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Resmi Kaydet</translation>
 <translation id="3789841737615482174">Yükle</translation>
 <translation id="3803696231112616155">Bu siteyi çevirmeyi öner</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Güvenliği ihlal edilmiş şifre yok}=1{{COUNT} Şifrenin güvenliği ihlal edilmiş}other{{COUNT} Şifrenin güvenliği ihlal edilmiş}}</translation>
 <translation id="385051799172605136">Geri</translation>
 <translation id="3892144330757387737">Geçmişiniz burada gösterilir</translation>
 <translation id="3897092660631435901">Menü</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Kaydet...</translation>
 <translation id="4904877109095351937">Okundu Olarak İşaretle</translation>
 <translation id="4930268273022498155">Mevcut verileri silin. İlgili verileri tekrar <ph name="USER_EMAIL1" /> hesabına geçerek alabilirsiniz.</translation>
+<translation id="4930714375720679147">Etkinleştir</translation>
 <translation id="4941089862236492464">Maalesef öğeniz paylaşılırken bir sorun oluştu.</translation>
 <translation id="4944543191714094452">Sayfada Bul…</translation>
 <translation id="4945756290001680296">Şifre ayarlarına erişin</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">İndirme tamamlandı</translation>
 <translation id="8073872304774253879">Aramaları ve Göz Atmayı Daha İyi Yap</translation>
 <translation id="8076014560081431679">Kayıtlı site ayarları silinmez ve web'e göz atma alışkanlıklarınızı yansıtabilir. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Kapat</translation>
 <translation id="8114753159095730575">Dosya indirme işlevi kullanılabilir. Seçenekler ekranın alt tarafındadır.</translation>
 <translation id="8131740175452115882">Onayla</translation>
 <translation id="8197543752516192074">Sayfayı Çevir</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index d31bd894..2d68fea 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Опубліковано у Facebook</translation>
 <translation id="1103523840287552314">Завжди перекладати з такої мови: <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Прийняти та продовжити</translation>
-<translation id="1105578556867525047">Змінити пароль на веб-сайті</translation>
 <translation id="1112015203684611006">Не надруковано.</translation>
 <translation id="1125564390852150847">Створити вкладку.</translation>
 <translation id="1145536944570833626">Видалити наявні дані.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Зберегти зображення</translation>
 <translation id="3789841737615482174">Встановити</translation>
 <translation id="3803696231112616155">Пропонувати переклад для цього сайту</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Немає зламаних паролів}=1{{COUNT} зламаний пароль}one{{COUNT} зламаний пароль}few{{COUNT} зламані паролі}many{{COUNT} зламаних паролів}other{{COUNT} зламаного пароля}}</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3892144330757387737">Тут відображатиметься ваша історія</translation>
 <translation id="3897092660631435901">Меню</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Зберегти…</translation>
 <translation id="4904877109095351937">Позначити як прочитані</translation>
 <translation id="4930268273022498155">Видалити наявні дані. Щоб відновити їх, поверніться в обліковий запис <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Увімкнути</translation>
 <translation id="4941089862236492464">Під час спроби поділитися елементом виникла проблема.</translation>
 <translation id="4944543191714094452">Знайти на сторінці…</translation>
 <translation id="4945756290001680296">Доступ до налаштувань паролів</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Завантаження завершено</translation>
 <translation id="8073872304774253879">Покращувати пошук і веб-перегляд</translation>
 <translation id="8076014560081431679">Збережені налаштування, які можуть стосуватися ваших зацікавлень в Інтернеті, не буде видалено. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Вимкнути</translation>
 <translation id="8114753159095730575">Доступне завантаження файлу. Параметри можна знайти внизу екрана.</translation>
 <translation id="8131740175452115882">Підтвердити</translation>
 <translation id="8197543752516192074">Перекласти сторінку</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
index 79074f2..21a8073 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">‏Facebook کی اشاعت مکمل ہوگئی۔</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> کو ہمیشہ ترجمہ کریں</translation>
 <translation id="1104948393051856124">قبول کریں اور جاری رکھیں</translation>
-<translation id="1105578556867525047">ویب سائٹ پر پاس ورڈ تبدیل کریں</translation>
 <translation id="1112015203684611006">پرنٹنگ ناکام۔</translation>
 <translation id="1125564390852150847">نیا ٹیب بنائیں۔</translation>
 <translation id="1145536944570833626">موجودہ ڈیٹا کو حذف کریں۔</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">تصویر محفوظ کریں</translation>
 <translation id="3789841737615482174">انسٹال کریں</translation>
 <translation id="3803696231112616155">اس سائٹ کا ترجمہ کرنے کی پیشکش کریں</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{کوئی متاثرہ پاس ورڈ نہیں}=1{{COUNT} متاثرہ پاس ورڈ}other{{COUNT} متاثرہ پاس ورڈز}}</translation>
 <translation id="385051799172605136">پیچھے</translation>
 <translation id="3892144330757387737">آپ کو اپنی سرگزشت یہاں ملے گی</translation>
 <translation id="3897092660631435901">مینو</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">محفوظ کریں...</translation>
 <translation id="4904877109095351937">پڑھے ہوئے کے بطور نشان زد کریں</translation>
 <translation id="4930268273022498155">موجودہ ڈیٹا حذف کریں۔ آپ <ph name="USER_EMAIL1" /> پر واپس سوئچ کر کے اس کی بازیابی کر سکتے ہیں۔</translation>
+<translation id="4930714375720679147">آن کریں</translation>
 <translation id="4941089862236492464">معذرت، آپ کے آئٹم کا اشتراک کرتے ہوئے ایک مسئلہ پیش آگیا۔</translation>
 <translation id="4944543191714094452">صفحہ میں تلاش کریں…</translation>
 <translation id="4945756290001680296">پاس ورڈ کی ترتیبات تک رسائی حاصل کریں</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">ڈاؤن لوڈ کا عمل مکمل ہو گیا</translation>
 <translation id="8073872304774253879">تلاشوں اور براؤزنگ کو بہتر بنائیں</translation>
 <translation id="8076014560081431679">محفوظ کردہ سائٹ کی ترتیبات حذف نہیں کی جائیں گی اور یہ آپ کے براؤزنگ کی عادات کی عکاسی کر سکتی ہے۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">آف کریں</translation>
 <translation id="8114753159095730575">فائل ڈاؤن لوڈ دستیاب ہے۔ اختیارات اسکرین کے نچلے حصے کے قریب دستیاب ہیں۔</translation>
 <translation id="8131740175452115882">تصدیق کریں</translation>
 <translation id="8197543752516192074">صفحہ کا ترجمہ کریں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index 2b3b769..96dbecbf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook’ka joylandi.</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> tilidan har doim tarjima qilinsin</translation>
 <translation id="1104948393051856124">Davom etish</translation>
-<translation id="1105578556867525047">Saytdagi parolni yangilash</translation>
 <translation id="1112015203684611006">Chop etilmadi.</translation>
 <translation id="1125564390852150847">Yangi sahifa ochish</translation>
 <translation id="1145536944570833626">Mavjud ma’lumotlarni o‘chirish.</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">Tasvir saqlanmadi</translation>
 <translation id="1180526666083833456">Barcha qurilmalardagi sinxronizatsiya va shaxsiy sozlamalar.</translation>
 <translation id="1181037720776840403">Olib tashlash</translation>
+<translation id="1185569544548277362">Yangi: Siz endi Chrome brauzerini asosiy sifatida sozlashingiz mumkin. <ph name="BEGIN_LINK" />Sozlamalarni ochish<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">Yangi qidiruv</translation>
 <translation id="1209206284964581585">Berkitish</translation>
 <translation id="1219674500290482172">Internetga ulanib bo‘lmadi.</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">Tasvirni saqlash</translation>
 <translation id="3789841737615482174">O‘rnatish</translation>
 <translation id="3803696231112616155">Bu saytda tarjima taklif qilinsin</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Hech qanday parol oshkor qilinmagan}=1{{COUNT} ta parol oshkor boʻlgan}other{{COUNT} ta parol oshkor boʻlgan}}</translation>
 <translation id="385051799172605136">Orqaga</translation>
 <translation id="3892144330757387737">Brauzer tarixi shu yerda chiqadi</translation>
 <translation id="3897092660631435901">Menyu</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">Saqlash...</translation>
 <translation id="4904877109095351937">O‘qildi deb belgilash</translation>
 <translation id="4930268273022498155">Mavjud ma’lumotlarni o‘chirish. <ph name="USER_EMAIL1" /> hisobiga o‘tib. bu ma’lumotlardan foydalanishingiz mumkin.</translation>
+<translation id="4930714375720679147">Yoqish</translation>
 <translation id="4941089862236492464">Yozuvni joylab bo‘lmadi.</translation>
 <translation id="4944543191714094452">Sahifa ichidan qidirish…</translation>
 <translation id="4945756290001680296">Parol sozlamalariga kirish</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">Yuklab olindi</translation>
 <translation id="8073872304774253879">Sahifalarni kezish va qidiruvni yaxshilash</translation>
 <translation id="8076014560081431679">Saytlarda saqlangan ma’lumotlar tozalanmaydi va brauzer faoliyatiga ta’sir qilmaydi. <ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">O‘chirib qo‘yish</translation>
 <translation id="8114753159095730575">Faylni yuklab olish mumkin. Qo‘shimcha amallar ekranning pastki qismida.</translation>
 <translation id="8131740175452115882">Tasdiqlash</translation>
 <translation id="8197543752516192074">Sahifani tarjima qilish</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884"><ph name="INCOGNITO" /> tablar soni <ph name="FIRST_VISIBLE_TAB" /> va <ph name="LAST_VISIBLE_TAB" /> orasida, jami <ph name="NUMBER_OF_OPEN_TABS" /> ta</translation>
 <translation id="8529767659511976195">Yangi</translation>
 <translation id="8532105204136943229">Yil (muddat)</translation>
+<translation id="8533166274275423134">Boshqa oynada ochilgan</translation>
 <translation id="8534481786647257214">Google+’ga joylandi.</translation>
 <translation id="8548878600947630424">Sahifadan qidirish...</translation>
 <translation id="8574235780160508979">Chrome xizmat shartlari 31-mart kuni yangilanadi. <ph name="BEGIN_LINK" />Tanishib chiqing<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 8f2e428..05e101c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Đã đăng lên Facebook.</translation>
 <translation id="1103523840287552314">Luôn dịch <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Chấp nhận và tiếp tục</translation>
-<translation id="1105578556867525047">Thay đổi mật khẩu trên Trang web</translation>
 <translation id="1112015203684611006">In không thành công.</translation>
 <translation id="1125564390852150847">Tạo thẻ mới.</translation>
 <translation id="1145536944570833626">Xóa dữ liệu hiện có.</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">Lưu hình ảnh</translation>
 <translation id="3789841737615482174">Cài đặt</translation>
 <translation id="3803696231112616155">Đề xuất dịch trang web này</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Không mật khẩu nào bị lộ}=1{{COUNT} mật khẩu bị lộ}other{{COUNT} mật khẩu bị lộ}}</translation>
 <translation id="385051799172605136">Quay lại</translation>
 <translation id="3892144330757387737">Bạn sẽ thấy lịch sử hoạt động ở đây</translation>
 <translation id="3897092660631435901">Menu</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">Lưu...</translation>
 <translation id="4904877109095351937">Đánh dấu là đã đọc</translation>
 <translation id="4930268273022498155">Xóa dữ liệu hiện có. Bạn có thể truy xuất dữ liệu bằng cách chuyển về <ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Bật</translation>
 <translation id="4941089862236492464">Rất tiếc, đã xảy ra sự cố khi chia sẻ mục của bạn.</translation>
 <translation id="4944543191714094452">Tìm trong trang…</translation>
 <translation id="4945756290001680296">Truy cập vào phần cài đặt mật khẩu</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">Đã hoàn tất tải xuống</translation>
 <translation id="8073872304774253879">Cải thiện tính năng tìm kiếm và duyệt web</translation>
 <translation id="8076014560081431679">Cài đặt trang web đã lưu sẽ không bị xóa và có thể phản ánh thói quen duyệt web của bạn. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Tắt</translation>
 <translation id="8114753159095730575">Hiện đã có tệp tải xuống. Bạn có thể sử dụng các tùy chọn ở gần cuối màn hình.</translation>
 <translation id="8131740175452115882">Xác nhận</translation>
 <translation id="8197543752516192074">Dịch trang</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 0de46f70..991ed91 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Facebook 信息发布已完成。</translation>
 <translation id="1103523840287552314">一律翻译<ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">接受并继续</translation>
-<translation id="1105578556867525047">在网站上更改密码</translation>
 <translation id="1112015203684611006">打印操作失败。</translation>
 <translation id="1125564390852150847">创建新的标签页。</translation>
 <translation id="1145536944570833626">删除现有数据。</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">保存图片</translation>
 <translation id="3789841737615482174">安装</translation>
 <translation id="3803696231112616155">主动询问是否翻译此网站</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{没有密码已遭泄露}=1{有 {COUNT} 个密码已遭泄露}other{有 {COUNT} 个密码已遭泄露}}</translation>
 <translation id="385051799172605136">后退</translation>
 <translation id="3892144330757387737">您的历史记录会显示在此处</translation>
 <translation id="3897092660631435901">菜单</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">保存…</translation>
 <translation id="4904877109095351937">标记为已读</translation>
 <translation id="4930268273022498155">删除现有数据。您可通过切换回 <ph name="USER_EMAIL1" /> 来获取现有数据。</translation>
+<translation id="4930714375720679147">开启</translation>
 <translation id="4941089862236492464">很抱歉,分享您的信息时出现问题。</translation>
 <translation id="4944543191714094452">在网页中查找…</translation>
 <translation id="4945756290001680296">访问密码设置</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">已下载完毕</translation>
 <translation id="8073872304774253879">改善搜索和浏览体验</translation>
 <translation id="8076014560081431679">已保存的网站设置将不会遭到删除,并且可能会反映您的浏览习惯。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">关闭</translation>
 <translation id="8114753159095730575">已可下载文件。选项位于屏幕底部附近。</translation>
 <translation id="8131740175452115882">确认</translation>
 <translation id="8197543752516192074">翻译网页</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 2f510e5..d9286d20 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">已順利發布到 Facebook。</translation>
 <translation id="1103523840287552314">永遠翻譯<ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">接受並繼續</translation>
-<translation id="1105578556867525047">變更網站上的密碼</translation>
 <translation id="1112015203684611006">無法列印。</translation>
 <translation id="1125564390852150847">新增分頁。</translation>
 <translation id="1145536944570833626">刪除現有資料。</translation>
@@ -23,6 +22,7 @@
 <translation id="1176932207622159128">無法儲存圖片</translation>
 <translation id="1180526666083833456">在所有裝置上保持同步,並享受個人化體驗。</translation>
 <translation id="1181037720776840403">移除</translation>
+<translation id="1185569544548277362">新功能:您可將 Chrome 設定為預設瀏覽器。<ph name="BEGIN_LINK" />開啟設定<ph name="END_LINK" /></translation>
 <translation id="1207113853726624428">新搜尋</translation>
 <translation id="1209206284964581585">暫時隱藏</translation>
 <translation id="1219674500290482172">無法連線至網際網路。</translation>
@@ -245,7 +245,6 @@
 <translation id="3783017676699494206">儲存圖片</translation>
 <translation id="3789841737615482174">安裝</translation>
 <translation id="3803696231112616155">為此網站提供翻譯選項</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{沒有密碼被盜用}=1{{COUNT} 個密碼已被盜用}other{{COUNT} 個密碼已被盜用}}</translation>
 <translation id="385051799172605136">返回</translation>
 <translation id="3892144330757387737">您可在此查看記錄</translation>
 <translation id="3897092660631435901">選單</translation>
@@ -332,6 +331,7 @@
 <translation id="4901778704868714008">儲存…</translation>
 <translation id="4904877109095351937">標示為已閱讀</translation>
 <translation id="4930268273022498155">刪除現有資料。您可以切換回 <ph name="USER_EMAIL1" /> 以擷取現有資料。</translation>
+<translation id="4930714375720679147">開啟</translation>
 <translation id="4941089862236492464">很抱歉,分享您的項目時發生問題。</translation>
 <translation id="4944543191714094452">從網頁中尋找…</translation>
 <translation id="4945756290001680296">存取密碼設定</translation>
@@ -610,6 +610,7 @@
 <translation id="8073670137947914548">已經下載完成</translation>
 <translation id="8073872304774253879">改善搜尋和瀏覽體驗</translation>
 <translation id="8076014560081431679">系統不會刪除已儲存的網站設定,這可能會反映您的瀏覽習慣。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">關閉</translation>
 <translation id="8114753159095730575">您可以下載檔案。可用選項喺螢幕底部附近。</translation>
 <translation id="8131740175452115882">確定</translation>
 <translation id="8197543752516192074">翻譯網頁</translation>
@@ -639,6 +640,7 @@
 <translation id="8524799873541103884">第 <ph name="FIRST_VISIBLE_TAB" /> 至 <ph name="LAST_VISIBLE_TAB" /> 個<ph name="INCOGNITO" />分頁,共 <ph name="NUMBER_OF_OPEN_TABS" /> 個</translation>
 <translation id="8529767659511976195">新功能</translation>
 <translation id="8532105204136943229">到期年份</translation>
+<translation id="8533166274275423134">已在其他視窗開啟</translation>
 <translation id="8534481786647257214">已順利發布到 Google+。</translation>
 <translation id="8548878600947630424">從網頁中尋找…</translation>
 <translation id="8574235780160508979">Chrome 的《服務條款》將於 3 月 31 日變更。<ph name="BEGIN_LINK" />請查看詳情<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 0e5071b6..fd89812 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">已順利發布到 Facebook。</translation>
 <translation id="1103523840287552314">一律翻譯<ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">接受並繼續</translation>
-<translation id="1105578556867525047">變更網站上的密碼</translation>
 <translation id="1112015203684611006">列印失敗。</translation>
 <translation id="1125564390852150847">新增分頁。</translation>
 <translation id="1145536944570833626">刪除現有資料。</translation>
@@ -245,7 +244,6 @@
 <translation id="3783017676699494206">儲存圖片</translation>
 <translation id="3789841737615482174">安裝</translation>
 <translation id="3803696231112616155">針對這個網站提供翻譯選項</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{沒有任何密碼遭外洩}=1{有 {COUNT} 組密碼遭外洩}other{有 {COUNT} 組密碼遭外洩}}</translation>
 <translation id="385051799172605136">返回</translation>
 <translation id="3892144330757387737">這裡會顯示你的歷史記錄</translation>
 <translation id="3897092660631435901">選單</translation>
@@ -332,6 +330,7 @@
 <translation id="4901778704868714008">儲存...</translation>
 <translation id="4904877109095351937">標示為已讀取</translation>
 <translation id="4930268273022498155">刪除現有資料。你可以切換回 <ph name="USER_EMAIL1" />,重新取得現有資料。</translation>
+<translation id="4930714375720679147">開啟</translation>
 <translation id="4941089862236492464">很抱歉,分享您的項目時發生問題。</translation>
 <translation id="4944543191714094452">在網頁中尋找…</translation>
 <translation id="4945756290001680296">存取密碼設定</translation>
@@ -610,6 +609,7 @@
 <translation id="8073670137947914548">下載完成</translation>
 <translation id="8073872304774253879">改善搜尋和瀏覽體驗</translation>
 <translation id="8076014560081431679">已儲存的網站設定不會遭到刪除,而且可能會反映您的瀏覽習慣。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">關閉</translation>
 <translation id="8114753159095730575">可下載檔案,相關選項位於畫面底部。</translation>
 <translation id="8131740175452115882">確認</translation>
 <translation id="8197543752516192074">翻譯網頁</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 107b1ca..90f8d178 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -14,7 +14,6 @@
 <translation id="1084365883616172403">Okuthunyelwe kwe-Facebook kuqedile.</translation>
 <translation id="1103523840287552314">Humusha njalo i-<ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Yamukela futhi uqhubeke</translation>
-<translation id="1105578556867525047">Shintsha iphasiwedi Kuwebhusayithi</translation>
 <translation id="1112015203684611006">Ukuphrinta kwehlulekile.</translation>
 <translation id="1125564390852150847">Dala ithebhu entsha</translation>
 <translation id="1145536944570833626">Susa idatha ekhona.</translation>
@@ -246,7 +245,6 @@
 <translation id="3783017676699494206">Londoloza isithombe</translation>
 <translation id="3789841737615482174">Faka</translation>
 <translation id="3803696231112616155">Nikeza ukuhumusha leli sayithi</translation>
-<translation id="3836313059960742452">{COUNT,plural, =0{Awekho amaphasiwedi onakalisiwe}=1{Amaphasiwedi onakalisiwe angu-{COUNT}}one{Amaphasiwedi onakalisiwe angu-{COUNT}}other{Amaphasiwedi onakalisiwe angu-{COUNT}}}</translation>
 <translation id="385051799172605136">Emuva</translation>
 <translation id="3892144330757387737">Uzothola umlando wakho lapha</translation>
 <translation id="3897092660631435901">Imenyu</translation>
@@ -333,6 +331,7 @@
 <translation id="4901778704868714008">Londoloza...</translation>
 <translation id="4904877109095351937">Maka njengokufundiwe</translation>
 <translation id="4930268273022498155">Susa idatha ekhona. Ungayithola ngokubuyela emuva ku-<ph name="USER_EMAIL1" />.</translation>
+<translation id="4930714375720679147">Vula</translation>
 <translation id="4941089862236492464">Uxolo, kube nephutha ukwabelana ngento yakho.</translation>
 <translation id="4944543191714094452">Thola kukhasi…</translation>
 <translation id="4945756290001680296">Finyelela kuzilungiselelo zephasiwedi</translation>
@@ -611,6 +610,7 @@
 <translation id="8073670137947914548">Ukulanda kuqedile</translation>
 <translation id="8073872304774253879">Yenza usesho nokuphequlula kube ngcono</translation>
 <translation id="8076014560081431679">Izilungiselelo ezilondoloziwe zesayithi ngeke zize zisuswe futhi zingabonisa imikhuba yakho yokuphequlula. <ph name="BEGIN_LINK" />Funda kabanzi<ph name="END_LINK" /></translation>
+<translation id="8105368624971345109">Vala</translation>
 <translation id="8114753159095730575">Ukulanda ifayela kuyatholakala. Izinketho zitholakala eduze kwangaphansi kwesikrini.</translation>
 <translation id="8131740175452115882">Qinisekisa</translation>
 <translation id="8197543752516192074">Humusha ikhasi</translation>
diff --git a/ios/chrome/browser/DEPS b/ios/chrome/browser/DEPS
index a470eb7..b9655929 100644
--- a/ios/chrome/browser/DEPS
+++ b/ios/chrome/browser/DEPS
@@ -15,6 +15,7 @@
   "+components/crash/core/common",
   "+components/dom_distiller/core",
   "+components/dom_distiller/ios",
+  "+components/enterprise",
   "+components/error_page/common",
   "+components/favicon/core",
   "+components/favicon/ios",
diff --git a/ios/chrome/browser/policy/BUILD.gn b/ios/chrome/browser/policy/BUILD.gn
index 1a286618..05bc222 100644
--- a/ios/chrome/browser/policy/BUILD.gn
+++ b/ios/chrome/browser/policy/BUILD.gn
@@ -23,6 +23,7 @@
     "//components/autofill/core/browser",
     "//components/bookmarks/common",
     "//components/bookmarks/managed",
+    "//components/enterprise",
     "//components/password_manager/core/common",
     "//components/policy:generated",
     "//components/policy/core/common",
diff --git a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
index 9f56db2..f09fba6 100644
--- a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
+++ b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
@@ -11,6 +11,7 @@
 #include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/bookmarks/managed/managed_bookmarks_policy_handler.h"
 #include "components/content_settings/core/common/pref_names.h"
+#include "components/enterprise/browser/reporting/common_pref_names.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/policy/core/browser/configuration_policy_handler.h"
 #include "components/policy/core/browser/configuration_policy_handler_list.h"
@@ -43,6 +44,9 @@
   { policy::key::kChromeVariations,
     variations::prefs::kVariationsRestrictionsByPolicy,
     base::Value::Type::INTEGER },
+  { policy::key::kCloudReportingEnabled,
+    enterprise_reporting::kCloudReportingEnabled,
+    base::Value::Type::BOOLEAN },
   { policy::key::kDisableSafeBrowsingProceedAnyway,
     prefs::kSafeBrowsingProceedAnywayDisabled,
     base::Value::Type::BOOLEAN },
diff --git a/ios/chrome/browser/prefs/BUILD.gn b/ios/chrome/browser/prefs/BUILD.gn
index 5946cfa..a9b264d4 100644
--- a/ios/chrome/browser/prefs/BUILD.gn
+++ b/ios/chrome/browser/prefs/BUILD.gn
@@ -35,6 +35,7 @@
     "//components/browsing_data/core",
     "//components/content_settings/core/browser",
     "//components/dom_distiller/core",
+    "//components/enterprise",
     "//components/feed/core/shared_prefs:feed_shared_prefs",
     "//components/flags_ui",
     "//components/gcm_driver",
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm
index ecb9ec866..4343b71 100644
--- a/ios/chrome/browser/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -8,6 +8,7 @@
 #include "components/browsing_data/core/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/dom_distiller/core/distilled_page_prefs.h"
+#include "components/enterprise/browser/reporting/common_pref_names.h"
 #include "components/feed/core/shared_prefs/pref_names.h"
 #include "components/flags_ui/pref_service_flags_storage.h"
 #import "components/handoff/handoff_manager.h"
@@ -136,6 +137,9 @@
   registry->RegisterListPref(kInvalidatorSavedInvalidations);
   registry->RegisterStringPref(kInvalidatorInvalidationState, std::string());
   registry->RegisterStringPref(kInvalidatorClientId, std::string());
+
+  registry->RegisterBooleanPref(enterprise_reporting::kCloudReportingEnabled,
+                                false);
 }
 
 void RegisterBrowserStatePrefs(user_prefs::PrefRegistrySyncable* registry) {
diff --git a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn
index c88b6d5..98d534b5 100644
--- a/ios/chrome/browser/ui/settings/safety_check/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/safety_check/BUILD.gn
@@ -5,7 +5,9 @@
 source_set("safety_check_ui") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "safety_check_consumer.h",
     "safety_check_navigation_commands.h",
+    "safety_check_service_delegate.h",
     "safety_check_table_view_controller.h",
     "safety_check_table_view_controller.mm",
   ]
@@ -14,6 +16,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/settings:settings_root",
+    "//ios/chrome/browser/ui/settings/utils",
     "//ios/chrome/browser/ui/table_view",
     "//ui/base",
   ]
@@ -24,13 +27,31 @@
   sources = [
     "safety_check_coordinator.h",
     "safety_check_coordinator.mm",
+    "safety_check_mediator.h",
+    "safety_check_mediator.mm",
   ]
   deps = [
     ":safety_check_ui",
+    "//components/password_manager/core/common",
+    "//components/prefs",
+    "//components/safe_browsing/core:features",
+    "//components/safe_browsing/core/common:safe_browsing_prefs",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/content_settings",
     "//ios/chrome/browser/main:public",
+    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/settings:settings_root",
+    "//ios/chrome/browser/ui/settings/cells",
+    "//ios/chrome/browser/ui/settings/cells:public",
+    "//ios/chrome/browser/ui/settings/utils",
+    "//ios/chrome/browser/ui/table_view",
+    "//ios/chrome/browser/ui/table_view/cells:cells_constants",
+    "//ios/chrome/browser/ui/util",
+    "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_consumer.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_consumer.h
new file mode 100644
index 0000000..a855ad7
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_consumer.h
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_CONSUMER_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_CONSUMER_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/ui/table_view/table_view_model.h"
+
+// Consumer protocol for safety check.
+@protocol SafetyCheckConsumer <NSObject>
+
+// Initializes the check types section with |items|.
+- (void)setCheckItems:(NSArray<TableViewItem*>*)items;
+
+// Initializes the check start section with |item|.
+- (void)setCheckStartItem:(TableViewItem*)item;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.h
index ed8bb34..5001ff94 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.h
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.h
@@ -5,8 +5,6 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_COORDINATOR_H_
 
-#import <Foundation/Foundation.h>
-
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
 @class SafetyCheckCoordinator;
@@ -15,8 +13,7 @@
 @protocol SafetyCheckCoordinatorDelegate
 
 // Called when the view controller is removed from navigation controller.
-- (void)safetyCheckCoordinatorViewControllerWasRemoved:
-    (SafetyCheckCoordinator*)coordinator;
+- (void)safetyCheckCoordinatorDidRemove:(SafetyCheckCoordinator*)coordinator;
 
 @end
 
@@ -28,6 +25,8 @@
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
                                    browser:(Browser*)browser NS_UNAVAILABLE;
 
+// |navigationController|: Handles user movement to check subpages.
+// |browser|: browser state for preferences and password check.
 - (instancetype)initWithBaseNavigationController:
                     (UINavigationController*)navigationController
                                          browser:(Browser*)browser
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
index b6b20be..ca76dfc0 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
@@ -4,7 +4,10 @@
 
 #import "ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.h"
 
+#include "base/mac/foundation_util.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/main/browser.h"
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.h"
 #import "ios/chrome/browser/ui/settings/safety_check/safety_check_navigation_commands.h"
 #import "ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
@@ -17,7 +20,10 @@
     SafetyCheckNavigationCommands,
     SafetyCheckTableViewControllerPresentationDelegate>
 
-// View controller for displaying the safety check screen.
+// Safety check mediator.
+@property(nonatomic, strong) SafetyCheckMediator* mediator;
+
+// The container view controller.
 @property(nonatomic, strong) SafetyCheckTableViewController* viewController;
 
 @end
@@ -40,22 +46,28 @@
 #pragma mark - ChromeCoordinator
 
 - (void)start {
-  self.viewController = [[SafetyCheckTableViewController alloc]
-      initWithStyle:UITableViewStylePlain];
+  SafetyCheckTableViewController* viewController =
+      [[SafetyCheckTableViewController alloc]
+          initWithStyle:UITableViewStylePlain];
+  self.viewController = viewController;
+
+  self.mediator = [[SafetyCheckMediator alloc]
+      initWithUserPrefService:self.browser->GetBrowserState()->GetPrefs()];
+  self.mediator.consumer = self.viewController;
+  [self.mediator updateConsumerCheckState];
+  viewController.serviceDelegate = self.mediator.delegate;
 
   DCHECK(self.baseNavigationController);
-  self.viewController.handler = self;
   [self.baseNavigationController pushViewController:self.viewController
                                            animated:YES];
-  self.viewController.presentationDelegate = self;
 }
 
 #pragma mark - SafetyCheckTableViewControllerPresentationDelegate
 
-- (void)safetyCheckTableViewControllerWasRemoved:
+- (void)safetyCheckTableViewControllerDidRemove:
     (SafetyCheckTableViewController*)controller {
   DCHECK_EQ(self.viewController, controller);
-  [self.delegate safetyCheckCoordinatorViewControllerWasRemoved:self];
+  [self.delegate safetyCheckCoordinatorDidRemove:self];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.h
new file mode 100644
index 0000000..3d3684e
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_MEDIATOR_H_
+
+#import <UIKit/UIKit.h>
+
+class PrefService;
+@protocol SafetyCheckConsumer;
+@protocol SafetyCheckServiceDelegate;
+@class SafetyCheckTableViewController;
+
+// The mediator is pushing the data for the safety check to the consumer.
+@interface SafetyCheckMediator : NSObject
+
+// The consumer for the Safety Check mediator.
+@property(nonatomic, weak) id<SafetyCheckConsumer> consumer;
+
+// The delegate for the Safety Check mediator, handles row taps.
+@property(nonatomic, weak) id<SafetyCheckServiceDelegate> delegate;
+
+// Designated initializer. All the parameters should not be null.
+// |userPrefService|: preference service from the browser state.
+- (instancetype)initWithUserPrefService:(PrefService*)userPrefService
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+// Updates the consumer with the current check state.
+- (void)updateConsumerCheckState;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
new file mode 100644
index 0000000..02321f2
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
@@ -0,0 +1,228 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.h"
+
+#include "base/mac/foundation_util.h"
+#include "components/password_manager/core/common/password_manager_features.h"
+#include "components/prefs/pref_service.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+#include "components/safe_browsing/core/features.h"
+#include "ios/chrome/browser/pref_names.h"
+#import "ios/chrome/browser/ui/settings/cells/settings_check_item.h"
+#import "ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.h"
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_consumer.h"
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h"
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h"
+#import "ios/chrome/browser/ui/settings/utils/observable_boolean.h"
+#import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
+#import "ios/chrome/browser/ui/ui_feature_flags.h"
+#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
+#include "ios/chrome/grit/ios_chromium_strings.h"
+#include "ios/chrome/grit/ios_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using l10n_util::GetNSString;
+using safe_browsing::kSafeBrowsingAvailableOnIOS;
+
+namespace {
+
+typedef NSArray<TableViewItem*>* ItemArray;
+
+typedef NS_ENUM(NSInteger, SectionIdentifier) {
+  SectionIdentifierCheckTypes = kSectionIdentifierEnumZero,
+  SectionIdentifierCheckStart,
+};
+
+typedef NS_ENUM(NSInteger, ItemType) {
+  // CheckTypes section.
+  UpdateItemType = kItemTypeEnumZero,
+  PasswordItemType,
+  SafeBrowsingItemType,
+  // CheckStart section.
+  CheckStartItemType,
+};
+
+// Enum with all possible states of the update check.
+typedef NS_ENUM(NSInteger, UpdateCheckStates) {
+  // When the user is up to date.
+  UpdateCheckStateUpToDate,
+  // When the check has not been run yet.
+  UpdateCheckStateDefault,
+  // When the user is out of date.
+  UpdateCheckStateOutOfDate,
+  // When the user is managed.
+  UpdateCheckStateManaged,
+};
+
+// Enum with all possible states of the password check.
+typedef NS_ENUM(NSInteger, PasswordCheckStates) {
+  // When no compromised passwords were detected.
+  PasswordCheckStateSafe,
+  // When user has compromised passwords.
+  PasswordCheckStateUnSafe,
+  // When check has not been run yet.
+  PasswordCheckStateDefault,
+  // When password check is running.
+  PasswordCheckStateRunning,
+  // When user has no passwords and check can't be performed.
+  PasswordCheckStateDisabled,
+  // When password check failed due to network issues, quota limit or others.
+  PasswordCheckStateError,
+};
+
+// Enum with all possible states of the Safe Browsing check.
+typedef NS_ENUM(NSInteger, SafeBrowsingCheckStates) {
+  // When check was not run yet.
+  SafeBrowsingCheckStateDefault,
+  // When Safe Browsing is managed by admin.
+  SafeBrowsingCheckStateManged,
+  // When the Safe Browsing check is running.
+  SafeBrowsingCheckStateRunning,
+  // When Safe Browsing is enabled.
+  SafeBrowsingCheckStateSafe,
+  // When Safe Browsing is disabled.
+  SafeBrowsingCheckStateUnsafe,
+};
+
+// Enum with all possible states of the button to start the check.
+typedef NS_ENUM(NSInteger, CheckStartStates) {
+  // When the check is not running.
+  CheckStartStateDefault,
+  // When the check is running.
+  CheckStartStateCancel,
+};
+
+}  // namespace
+
+@interface SafetyCheckMediator () <BooleanObserver>
+
+// SettingsCheckItem used to display the state of the Safe Browsing check.
+@property(nonatomic, strong) SettingsCheckItem* safeBrowsingCheckItem;
+
+// Current state of the Safe Browsing check.
+@property(nonatomic, assign) SafeBrowsingCheckStates safeBrowsingCheckState;
+
+// SettingsCheckItem used to display the state of the update check.
+@property(nonatomic, strong) SettingsCheckItem* updateCheckItem;
+
+// Current state of the update check.
+@property(nonatomic, assign) UpdateCheckStates updateCheckState;
+
+// SettingsCheckItem used to display the state of the password check.
+@property(nonatomic, strong) SettingsCheckItem* passwordCheckItem;
+
+// Current state of the password check.
+@property(nonatomic, assign) PasswordCheckStates passwordCheckState;
+
+// Row button to start the safety check.
+@property(nonatomic, strong) SettingsMultilineDetailItem* startCheckItem;
+
+// Current state of the start safety check row button.
+@property(nonatomic, assign) CheckStartStates startCheckState;
+
+// Preference value for the "Safe Browsing" feature.
+@property(nonatomic, strong, readonly)
+    PrefBackedBoolean* safeBrowsingPreference;
+
+@end
+
+@implementation SafetyCheckMediator
+
+- (instancetype)initWithUserPrefService:(PrefService*)userPrefService {
+  self = [super init];
+  if (self) {
+    DCHECK(userPrefService);
+    _safeBrowsingPreference = [[PrefBackedBoolean alloc]
+        initWithPrefService:userPrefService
+                   prefName:prefs::kSafeBrowsingEnabled];
+    _safeBrowsingPreference.observer = self;
+
+    _updateCheckState = UpdateCheckStateDefault;
+    _updateCheckItem = [[SettingsCheckItem alloc] initWithType:UpdateItemType];
+
+    _passwordCheckState = PasswordCheckStateDefault;
+    _passwordCheckItem =
+        [[SettingsCheckItem alloc] initWithType:PasswordItemType];
+
+    _safeBrowsingCheckState = SafeBrowsingCheckStateDefault;
+    _safeBrowsingCheckItem =
+        [[SettingsCheckItem alloc] initWithType:SafeBrowsingItemType];
+
+    _startCheckState = CheckStartStateDefault;
+    _startCheckItem =
+        [[SettingsMultilineDetailItem alloc] initWithType:CheckStartItemType];
+  }
+  return self;
+}
+
+#pragma mark - Private
+
+// Loads SectionIdentifierCheckTypes section.
+- (void)loadCheckTypesSection {
+  NSMutableArray* items = [NSMutableArray array];
+
+  self.updateCheckItem.text =
+      l10n_util::GetNSString(IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_TITLE);
+  self.updateCheckItem.enabled = NO;
+  [items addObject:self.updateCheckItem];
+
+  self.passwordCheckItem.text =
+      l10n_util::GetNSString(IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_TITLE);
+  self.passwordCheckItem.enabled = NO;
+  [items addObject:self.passwordCheckItem];
+
+  self.safeBrowsingCheckItem.text =
+      l10n_util::GetNSString(IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_TITLE);
+  self.safeBrowsingCheckItem.enabled = NO;
+  [items addObject:self.safeBrowsingCheckItem];
+
+  [self.consumer setCheckItems:items];
+}
+
+// Loads SectionIdentifierCheckStart section.
+- (void)loadCheckStartSection {
+  self.startCheckItem.text = GetNSString(IDS_IOS_CHECK_PASSWORDS_NOW_BUTTON);
+  [self.consumer setCheckStartItem:self.startCheckItem];
+}
+
+#pragma mark - SafetyCheckServiceDelegate
+
+- (void)didSelectItem:(TableViewItem*)item {
+  ItemType type = static_cast<ItemType>(item.type);
+  switch (type) {
+    // TODO(crbug.com/1078782): Handle row taps.
+    case UpdateItemType:
+      break;
+    case SafeBrowsingItemType:
+      break;
+    case PasswordItemType:
+      break;
+    case CheckStartItemType:
+      break;
+  }
+}
+
+#pragma mark - Public
+
+// Update the consumer with the current state of the safety check.
+// TODO(crbug.com/1078782): Have this handle more than the initial loading.
+- (void)updateConsumerCheckState {
+  [self loadCheckTypesSection];
+  [self loadCheckStartSection];
+}
+
+#pragma mark - BooleanObserver
+
+- (void)booleanDidChange:(id<ObservableBoolean>)observableBoolean {
+  // TODO(crbug.com/1078782): Handle safe browsing state changes.
+  return;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h
new file mode 100644
index 0000000..64cad8ea
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h
@@ -0,0 +1,18 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_SERVICE_DELEGATE_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_SERVICE_DELEGATE_H_
+
+@class TableViewItem;
+
+// Protocol to handle user actions from the safety check view.
+@protocol SafetyCheckServiceDelegate <NSObject>
+
+// Called when item is tapped.
+- (void)didSelectItem:(TableViewItem*)item;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_SERVICE_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h
index d8b9530e..1c2c925 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.h
@@ -5,9 +5,12 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_TABLE_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_SAFETY_CHECK_SAFETY_CHECK_TABLE_VIEW_CONTROLLER_H_
 
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_consumer.h"
 #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
 
+@protocol SafetyCheckServiceDelegate;
 @class SafetyCheckTableViewController;
+@protocol SafetyCheckTableViewControllerModelDelegate;
 
 // The accessibility identifier of the privacy settings collection view.
 extern NSString* const kSafetyCheckTableViewId;
@@ -19,20 +22,24 @@
 @protocol SafetyCheckTableViewControllerPresentationDelegate
 
 // Called when the view controller is removed from its parent.
-- (void)safetyCheckTableViewControllerWasRemoved:
+- (void)safetyCheckTableViewControllerDidRemove:
     (SafetyCheckTableViewController*)controller;
 
 @end
 
 // Controller for the UI that allows the user to perform a safety check and
 // take action using the results (if needed).
-@interface SafetyCheckTableViewController : SettingsRootTableViewController
+@interface SafetyCheckTableViewController
+    : SettingsRootTableViewController <SafetyCheckConsumer>
 
 // Presentation delegate.
 @property(nonatomic, weak)
     id<SafetyCheckTableViewControllerPresentationDelegate>
         presentationDelegate;
 
+// Handler for taps on items on the safety check page.
+@property(nonatomic, weak) id<SafetyCheckServiceDelegate> serviceDelegate;
+
 // Handler used to navigate inside the safety check.
 @property(nonatomic, weak) id<SafetyCheckNavigationCommands> handler;
 
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm
index 26a9d23e..0aef5fa 100644
--- a/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_table_view_controller.mm
@@ -6,8 +6,8 @@
 
 #import "base/mac/foundation_util.h"
 #include "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/ui/settings/safety_check/safety_check_service_delegate.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
-#import "ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
@@ -22,27 +22,40 @@
 
 typedef NS_ENUM(NSInteger, SectionIdentifier) {
   SectionIdentifierCheckTypes = kSectionIdentifierEnumZero,
-};
-
-typedef NS_ENUM(NSInteger, ItemType) {
-  ItemTypeUpdates = kItemTypeEnumZero,
-  ItemTypePasswords,
-  ItemTypeSafeBrowsing,
+  SectionIdentifierCheckStart,
 };
 
 }  // namespace
 
-@implementation SafetyCheckTableViewController
+@interface SafetyCheckTableViewController ()
 
-#pragma mark - UIViewController
+// Current state of array of items that form the safety check.
+@property(nonatomic, strong) NSArray<TableViewItem*>* checkTypesItems;
+
+// Current display state of the check start item.
+@property(nonatomic, strong) TableViewItem* checkStartItem;
+
+@end
+
+@implementation SafetyCheckTableViewController
 
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.tableView.accessibilityIdentifier = kSafetyCheckTableViewId;
   self.title =
       l10n_util::GetNSString(IDS_OPTIONS_ADVANCED_SECTION_TITLE_SAFETY_CHECK);
+}
 
-  [self loadModel];
+#pragma mark - SafetyCheckConsumer
+
+- (void)setCheckItems:(NSArray<TableViewItem*>*)items {
+  _checkTypesItems = items;
+  [self reloadData];
+}
+
+- (void)setCheckStartItem:(TableViewItem*)item {
+  _checkStartItem = item;
+  [self reloadData];
 }
 
 #pragma mark - ChromeTableViewController
@@ -50,66 +63,28 @@
 - (void)loadModel {
   [super loadModel];
 
-  TableViewModel* model = self.tableViewModel;
+  if (self.checkTypesItems.count) {
+    [self.tableViewModel addSectionWithIdentifier:SectionIdentifierCheckTypes];
+    for (TableViewItem* item in self.checkTypesItems) {
+      [self.tableViewModel addItem:item
+           toSectionWithIdentifier:SectionIdentifierCheckTypes];
+    }
+  }
 
-  // Checks performed section.
-  [model addSectionWithIdentifier:SectionIdentifierCheckTypes];
-  [model addItem:[self updatesItem]
-      toSectionWithIdentifier:SectionIdentifierCheckTypes];
-  [model addItem:[self passwordsItem]
-      toSectionWithIdentifier:SectionIdentifierCheckTypes];
-  [model addItem:[self safeBrowsingItem]
-      toSectionWithIdentifier:SectionIdentifierCheckTypes];
-}
-
-#pragma mark - Model Objects
-
-- (TableViewItem*)updatesItem {
-  return [self iconItemWithType:ItemTypeUpdates
-                        titleID:IDS_IOS_SETTINGS_SAFETY_CHECK_UPDATES_TITLE
-                  iconImageName:nil];
-}
-
-- (TableViewItem*)passwordsItem {
-  return [self iconItemWithType:ItemTypePasswords
-                        titleID:IDS_IOS_SETTINGS_SAFETY_CHECK_PASSWORDS_TITLE
-                  iconImageName:nil];
-}
-
-- (TableViewItem*)safeBrowsingItem {
-  return
-      [self iconItemWithType:ItemTypeSafeBrowsing
-                     titleID:IDS_IOS_SETTINGS_SAFETY_CHECK_SAFE_BROWSING_TITLE
-               iconImageName:nil];
-}
-
-#pragma mark - Item Constructor
-
-// TODO(crbug.com/1078782): Change to custom item to handle safety check
-// behavior.
-// Construct a safety check item row with icon and title.
-- (TableViewDetailIconItem*)iconItemWithType:(NSInteger)type
-                                     titleID:(NSInteger)titleID
-                               iconImageName:(NSString*)iconImageName {
-  TableViewDetailIconItem* iconItem =
-      [[TableViewDetailIconItem alloc] initWithType:type];
-  iconItem.text = l10n_util::GetNSString(titleID);
-  iconItem.iconImageName = iconImageName;
-
-  return iconItem;
+  if (self.checkStartItem) {
+    [self.tableViewModel addSectionWithIdentifier:SectionIdentifierCheckStart];
+    [self.tableViewModel addItem:self.checkStartItem
+         toSectionWithIdentifier:SectionIdentifierCheckStart];
+  }
 }
 
 #pragma mark - UITableViewDelegate
 
-// TODO(crbug.com/1078782): Add cases for updates, passwords, and safe browsing.
 - (void)tableView:(UITableView*)tableView
     didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
   [super tableView:tableView didSelectRowAtIndexPath:indexPath];
-  NSInteger itemType = [self.tableViewModel itemTypeForIndexPath:indexPath];
-  switch (itemType) {
-    case ItemTypeUpdates:
-      break;
-  }
+  TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
+  [self.serviceDelegate didSelectItem:item];
   [tableView deselectRowAtIndexPath:indexPath animated:YES];
 }
 
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index be46049..c196a5b 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -1428,10 +1428,10 @@
 
 #pragma mark - SafetyCheckCoordinatorDelegate
 
-- (void)safetyCheckCoordinatorViewControllerWasRemoved:
-    (SafetyCheckCoordinator*)coordinator {
+- (void)safetyCheckCoordinatorDidRemove:(SafetyCheckCoordinator*)coordinator {
   DCHECK_EQ(_safetyCheckCoordinator, coordinator);
   [_safetyCheckCoordinator stop];
+  _safetyCheckCoordinator.delegate = nil;
   _safetyCheckCoordinator = nil;
 }
 
diff --git a/ios/chrome/test/data/policy/policy_test_cases.json b/ios/chrome/test/data/policy/policy_test_cases.json
index 61439f9..a57ea3c 100644
--- a/ios/chrome/test/data/policy/policy_test_cases.json
+++ b/ios/chrome/test/data/policy/policy_test_cases.json
@@ -46,6 +46,16 @@
     ]
   },
 
+  "CloudReportingEnabled": {
+    "os": [ "ios" ],
+    "policy_pref_mapping_test": [
+      {
+        "policies": { "CloudReportingEnabled": true },
+        "prefs": { "enterprise_reporting.chrome_cloud_reporting": { "local_state": true } }
+      }
+    ]
+  },
+
  "ChromeVariations": {
     "os": [ "ios" ],
     "policy_pref_mapping_test": [
diff --git a/ios/third_party/material_components_ios/BUILD.gn b/ios/third_party/material_components_ios/BUILD.gn
index 1923c07..74d3461 100644
--- a/ios/third_party/material_components_ios/BUILD.gn
+++ b/ios/third_party/material_components_ios/BUILD.gn
@@ -381,6 +381,7 @@
   "src/components/TextControls/src/BaseTextAreas/private/MDCBaseTextAreaLayout.h",
   "src/components/TextControls/src/BaseTextAreas/private/MDCBaseTextAreaTextView.h",
   "src/components/TextControls/src/BaseTextFields/MDCBaseTextField.h",
+  "src/components/TextControls/src/BaseTextFields/MDCBaseTextFieldDelegate.h",
   "src/components/TextControls/src/BaseTextFields/MaterialTextControls+BaseTextFields.h",
   "src/components/TextControls/src/Enums/MDCTextControlLabelBehavior.h",
   "src/components/TextControls/src/Enums/MDCTextControlState.h",
@@ -1262,6 +1263,7 @@
   "src/components/TextControls/src/BaseTextAreas/private/MDCBaseTextAreaTextView.m",
   "src/components/TextControls/src/BaseTextFields/MDCBaseTextField.h",
   "src/components/TextControls/src/BaseTextFields/MDCBaseTextField.m",
+  "src/components/TextControls/src/BaseTextFields/MDCBaseTextFieldDelegate.h",
   "src/components/TextControls/src/BaseTextFields/MaterialTextControls+BaseTextFields.h",
   "src/components/TextControls/src/Enums/MDCTextControlLabelBehavior.h",
   "src/components/TextControls/src/Enums/MDCTextControlState.h",
diff --git a/ios/web/crw_navigation_item_storage.mm b/ios/web/crw_navigation_item_storage.mm
index a3f3ab72..6f58854d 100644
--- a/ios/web/crw_navigation_item_storage.mm
+++ b/ios/web/crw_navigation_item_storage.mm
@@ -25,7 +25,6 @@
 NSString* const kNavigationItemStorageTimestampKey = @"timestamp";
 NSString* const kNavigationItemStorageTitleKey = @"title";
 NSString* const kNavigationItemStoragePageDisplayStateKey = @"state";
-NSString* const kNavigationItemStoragePOSTDataKey = @"POSTData";
 NSString* const kNavigationItemStorageHTTPRequestHeadersKey = @"httpHeaders";
 NSString* const kNavigationItemStorageSkipRepostFormConfirmationKey =
     @"skipResubmitDataConfirmation";
@@ -43,8 +42,6 @@
     "Session.WebStates.NavigationItem.SerializedTitleSize";
 const char kNavigationItemSerializedDisplayStateSizeHistogram[] =
     "Session.WebStates.NavigationItem.SerializedDisplayStateSize";
-const char kNavigationItemSerializedPostDataSizeHistogram[] =
-    "Session.WebStates.NavigationItem.SerializedPostDataSize";
 const char kNavigationItemSerializedRequestHeadersSizeHistogram[] =
     "Session.WebStates.NavigationItem.SerializedRequestHeadersSize";
 
@@ -69,7 +66,6 @@
   [description
       appendFormat:@"userAgentType : %s, ",
                    web::GetUserAgentTypeDescription(_userAgentType).c_str()];
-  [description appendFormat:@"POSTData : %@, ", _POSTData];
   [description appendFormat:@"HTTPRequestHeaders : %@", _HTTPRequestHeaders];
   return description;
 }
@@ -145,8 +141,6 @@
     _shouldSkipRepostFormConfirmation =
         [aDecoder decodeBoolForKey:
                       web::kNavigationItemStorageSkipRepostFormConfirmationKey];
-    _POSTData =
-        [aDecoder decodeObjectForKey:web::kNavigationItemStoragePOSTDataKey];
     _HTTPRequestHeaders = [aDecoder
         decodeObjectForKey:web::kNavigationItemStorageHTTPRequestHeadersKey];
   }
@@ -223,13 +217,6 @@
   serializedSizeInBytes += userAgent.size();
   // No need to log the user agent type size, because it's a set of constants.
 
-  [aCoder encodeObject:_POSTData forKey:web::kNavigationItemStoragePOSTDataKey];
-  int serializedPostDataSizeInBytes = _POSTData.length;
-  serializedSizeInBytes += serializedPostDataSizeInBytes;
-  base::UmaHistogramMemoryKB(
-      web::kNavigationItemSerializedPostDataSizeHistogram,
-      serializedPostDataSizeInBytes / 1024);
-
   [aCoder encodeObject:_HTTPRequestHeaders
                 forKey:web::kNavigationItemStorageHTTPRequestHeadersKey];
   int serializedRequestHeadersSizeInBytes =
diff --git a/ios/web/crw_navigation_item_storage_unittest.mm b/ios/web/crw_navigation_item_storage_unittest.mm
index 549e4517..b4363238 100644
--- a/ios/web/crw_navigation_item_storage_unittest.mm
+++ b/ios/web/crw_navigation_item_storage_unittest.mm
@@ -40,8 +40,6 @@
     [item_storage_
         setDisplayState:web::PageDisplayState(CGPointZero, UIEdgeInsetsZero,
                                               0.0, 0.0, 0.0)];
-    [item_storage_
-        setPOSTData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding]];
     [item_storage_ setHTTPRequestHeaders:@{@"HeaderKey" : @"HeaderValue"}];
     [item_storage_ setUserAgentType:web::UserAgentType::DESKTOP];
   }
@@ -79,8 +77,6 @@
   [storage setTitle:base::UTF8ToUTF16(std::string(5120, 'd'))];
   [storage setDisplayState:web::PageDisplayState(CGPointZero, UIEdgeInsetsZero,
                                                  0.0, 0.0, 0.0)];
-  [storage setPOSTData:[NSData dataWithBytes:std::string(1024, 'd').c_str()
-                                      length:1024]];
   [storage setHTTPRequestHeaders:@{
     @"HeaderKey1" : @"HeaderValue1",
     @"HeaderKey2" : @"HeaderValue2",
@@ -105,8 +101,6 @@
   histogram_tester.ExpectBucketCount(
       web::kNavigationItemSerializedDisplayStateSizeHistogram, 0 /*KB*/, 1);
   histogram_tester.ExpectBucketCount(
-      web::kNavigationItemSerializedPostDataSizeHistogram, 1 /*KB*/, 1);
-  histogram_tester.ExpectBucketCount(
       web::kNavigationItemSerializedRequestHeadersSizeHistogram, 1 /*KB*/, 1);
 }
 
diff --git a/ios/web/navigation/crw_session_storage_unittest.mm b/ios/web/navigation/crw_session_storage_unittest.mm
index 8f0c8793..0d6d13f6 100644
--- a/ios/web/navigation/crw_session_storage_unittest.mm
+++ b/ios/web/navigation/crw_session_storage_unittest.mm
@@ -79,8 +79,6 @@
     [item_storage
         setDisplayState:web::PageDisplayState(CGPointZero, UIEdgeInsetsZero,
                                               0.0, 0.0, 0.0)];
-    [item_storage
-        setPOSTData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding]];
     [item_storage setHTTPRequestHeaders:@{ @"HeaderKey" : @"HeaderValue" }];
     [session_storage_ setItemStorages:@[ item_storage ]];
     // Create serializable user data.
diff --git a/ios/web/navigation/navigation_item_storage_builder.mm b/ios/web/navigation/navigation_item_storage_builder.mm
index 5a81be4b..e9ffca7 100644
--- a/ios/web/navigation/navigation_item_storage_builder.mm
+++ b/ios/web/navigation/navigation_item_storage_builder.mm
@@ -33,7 +33,6 @@
   storage.shouldSkipRepostFormConfirmation =
       navigation_item->ShouldSkipRepostFormConfirmation();
   storage.userAgentType = navigation_item->GetUserAgentType();
-  storage.POSTData = navigation_item->GetPostData();
   storage.HTTPRequestHeaders = navigation_item->GetHttpRequestHeaders();
   return storage;
 }
@@ -71,7 +70,6 @@
   // Use reload transition type to avoid incorrect increase for typed count.
   item->transition_type_ = ui::PAGE_TRANSITION_RELOAD;
   item->user_agent_type_ = navigation_item_storage.userAgentType;
-  item->post_data_ = navigation_item_storage.POSTData;
   item->http_request_headers_ =
       [navigation_item_storage.HTTPRequestHeaders mutableCopy];
   return item;
diff --git a/ios/web/navigation/navigation_item_storage_test_util.mm b/ios/web/navigation/navigation_item_storage_test_util.mm
index c4d6dd2..1ddc116 100644
--- a/ios/web/navigation/navigation_item_storage_test_util.mm
+++ b/ios/web/navigation/navigation_item_storage_test_util.mm
@@ -22,7 +22,6 @@
          item1.shouldSkipRepostFormConfirmation ==
              item2.shouldSkipRepostFormConfirmation &&
          item1.userAgentType == item2.userAgentType &&
-         [item1.POSTData isEqualToData:item2.POSTData] &&
          [item1.HTTPRequestHeaders
              isEqualToDictionary:item2.HTTPRequestHeaders];
 }
diff --git a/ios/web/public/session/crw_navigation_item_storage.h b/ios/web/public/session/crw_navigation_item_storage.h
index ff1af4f..6dff5aa 100644
--- a/ios/web/public/session/crw_navigation_item_storage.h
+++ b/ios/web/public/session/crw_navigation_item_storage.h
@@ -36,8 +36,6 @@
 extern NSString* const kNavigationItemStorageTitleKey;
 // The PageDisplayState (NSDictionary).
 extern NSString* const kNavigationItemStoragePageDisplayStateKey;
-// POST request data (NSData).
-extern NSString* const kNavigationItemStoragePOSTDataKey;
 // HTTP request headers (NSDictionary).
 extern NSString* const kNavigationItemStorageHTTPRequestHeadersKey;
 // Whether or not to bypass showing the resubmit data confirmation when loading
@@ -53,7 +51,6 @@
 extern const char kNavigationItemSerializedReferrerURLSizeHistogram[];
 extern const char kNavigationItemSerializedTitleSizeHistogram[];
 extern const char kNavigationItemSerializedDisplayStateSizeHistogram[];
-extern const char kNavigationItemSerializedPostDataSizeHistogram[];
 extern const char kNavigationItemSerializedRequestHeadersSizeHistogram[];
 
 }  // namespace web
@@ -70,7 +67,6 @@
 @property(nonatomic, assign) web::PageDisplayState displayState;
 @property(nonatomic, assign) BOOL shouldSkipRepostFormConfirmation;
 @property(nonatomic, assign) web::UserAgentType userAgentType;
-@property(nonatomic, copy) NSData* POSTData;
 @property(nonatomic, copy) NSDictionary* HTTPRequestHeaders;
 
 @end
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 18c5bb9e..980649a8 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -2226,6 +2226,7 @@
         !seeking_) {
       underflow_timer_ = std::make_unique<base::ElapsedTimer>();
       watch_time_reporter_->OnUnderflow();
+      delegate_->DidBufferUnderflow(delegate_id_);
 
       if (playback_events_recorder_)
         playback_events_recorder_->OnBuffering();
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index bd82e6f5..8f1e29a 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -244,6 +244,10 @@
     DCHECK_EQ(player_id_, player_id);
   }
 
+  void DidBufferUnderflow(int player_id) override {
+    DCHECK_EQ(player_id_, player_id);
+  }
+
   bool IsFrameHidden() override { return is_hidden_; }
 
   bool IsFrameClosed() override { return is_closed_; }
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
index 9c1dcb6..4ea4f2ea 100644
--- a/media/filters/vpx_video_decoder.cc
+++ b/media/filters/vpx_video_decoder.cc
@@ -44,11 +44,11 @@
   // maximum number of tiles possible for higher resolution streams.
   if (config.codec() == kCodecVP9) {
     const int width = config.coded_size().width();
-    if (width >= 4096)
+    if (width >= 3840)
       desired_threads = 16;
-    else if (width >= 2048)
+    else if (width >= 2560)
       desired_threads = 8;
-    else if (width >= 1024)
+    else if (width >= 1280)
       desired_threads = 4;
   }
 
diff --git a/media/gpu/android/frame_info_helper.cc b/media/gpu/android/frame_info_helper.cc
index e0f8a47..f46ee94 100644
--- a/media/gpu/android/frame_info_helper.cc
+++ b/media/gpu/android/frame_info_helper.cc
@@ -81,11 +81,15 @@
 
       if (buffer_renderer->RenderToTextureOwnerFrontBuffer(
               CodecOutputBufferRenderer::BindingsMode::kDontRestoreIfBound)) {
-        info.emplace();
-        texture_owner->GetCodedSizeAndVisibleRect(
-            buffer_renderer->size(), &info->coded_size, &info->visible_rect);
-
-        info->ycbcr_info = GetYCbCrInfo(texture_owner.get());
+        gfx::Size coded_size;
+        gfx::Rect visible_rect;
+        if (texture_owner->GetCodedSizeAndVisibleRect(
+                buffer_renderer->size(), &coded_size, &visible_rect)) {
+          info.emplace();
+          info->coded_size = coded_size;
+          info->visible_rect = visible_rect;
+          info->ycbcr_info = GetYCbCrInfo(texture_owner.get());
+        }
       }
 
       std::move(cb).Run(std::move(buffer_renderer), info);
diff --git a/media/gpu/android/frame_info_helper_unittest.cc b/media/gpu/android/frame_info_helper_unittest.cc
index bfcb13c..ce167cb 100644
--- a/media/gpu/android/frame_info_helper_unittest.cc
+++ b/media/gpu/android/frame_info_helper_unittest.cc
@@ -11,7 +11,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
+using testing::DoAll;
 using testing::Mock;
+using testing::Return;
 using testing::SetArgPointee;
 
 namespace media {
@@ -90,7 +92,7 @@
 
   // Return CodedSize when GetCodedSizeAndVisibleRect is called.
   ON_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _))
-      .WillByDefault(SetArgPointee<1>(kTestCodedSize));
+      .WillByDefault(DoAll(SetArgPointee<1>(kTestCodedSize), Return(true)));
 
   // Fail rendering buffer.
   auto buffer1 = CreateBufferRenderer(kTestVisibleSize, texture_owner);
@@ -134,7 +136,7 @@
 
   // Return CodedSize when GetCodedSizeAndVisibleRect is called.
   ON_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _))
-      .WillByDefault(SetArgPointee<1>(kTestCodedSize));
+      .WillByDefault(DoAll(SetArgPointee<1>(kTestCodedSize), Return(true)));
 
   // In overlay case we always use visible size.
   GetFrameInfo(CreateBufferRenderer(kTestVisibleSize, nullptr));
@@ -179,7 +181,7 @@
 
   // Return CodedSize when GetCodedSizeAndVisibleRect is called.
   ON_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _))
-      .WillByDefault(SetArgPointee<1>(kTestCodedSize));
+      .WillByDefault(DoAll(SetArgPointee<1>(kTestCodedSize), Return(true)));
 
   auto buffer_renderer = CreateBufferRenderer(kTestVisibleSize, texture_owner);
 
@@ -211,4 +213,36 @@
   ASSERT_TRUE(called);
   ASSERT_TRUE(run_after_called);
 }
+
+TEST_F(FrameInfoHelperTest, FailedGetCodedSize) {
+  auto texture_owner = base::MakeRefCounted<NiceMock<gpu::MockTextureOwner>>(
+      0, nullptr, nullptr, true);
+
+  // Return CodedSize when GetCodedSizeAndVisibleRect is called.
+  ON_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _))
+      .WillByDefault(DoAll(SetArgPointee<1>(kTestCodedSize), Return(true)));
+
+  // Fail next GetCodedSizeAndVisibleRect. GetFrameInfo should fallback to
+  // visible size in this case, but mark request as failed.
+  EXPECT_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _))
+      .WillOnce(DoAll(SetArgPointee<1>(gfx::Size()), Return(false)));
+  GetFrameInfo(CreateBufferRenderer(kTestVisibleSize, texture_owner));
+  EXPECT_EQ(last_frame_info_.coded_size, kTestVisibleSize);
+  Mock::VerifyAndClearExpectations(texture_owner.get());
+
+  // This time GetCodedSizeAndVisibleRect will succeed and be called and result
+  // should be kTestCodedSize instead of kTestVisibleSize.
+  EXPECT_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _)).Times(1);
+  GetFrameInfo(CreateBufferRenderer(kTestVisibleSize, texture_owner));
+  EXPECT_EQ(last_frame_info_.coded_size, kTestCodedSize);
+  Mock::VerifyAndClearExpectations(texture_owner.get());
+
+  // Verify that we don't render frame on subsequent calls with the same visible
+  // size. GetCodedSizeAndVisibleRect should not be called.
+  EXPECT_CALL(*texture_owner, GetCodedSizeAndVisibleRect(_, _, _)).Times(0);
+  GetFrameInfo(CreateBufferRenderer(kTestVisibleSize, texture_owner));
+  EXPECT_EQ(last_frame_info_.coded_size, kTestCodedSize);
+  Mock::VerifyAndClearExpectations(texture_owner.get());
+}
+
 }  // namespace media
diff --git a/media/test/data/multi_frame_mse_player.html b/media/test/data/multi_frame_mse_player.html
new file mode 100644
index 0000000..725b1baf
--- /dev/null
+++ b/media/test/data/multi_frame_mse_player.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>MSE Player</title>
+  </head>
+  <body onload="runTest();">
+    <video controls></video>
+    <script src='eme_player_js/app_loader.js' type='text/javascript'></script>
+    <script type="text/javascript">
+      var video = document.querySelector('video');
+
+      // The test completes after media finishes playing all the segments.
+      // The test stops when an error occurs unexpectedly.
+      function runTest() {
+        var testConfig = new TestConfig();
+        testConfig.loadQueryParams();
+        if (typeof(testConfig.mediaFile) == "string") {
+          // Multiple media segments can be passed down separated by ';'
+          testConfig.mediaFile = testConfig.mediaFile.split(';')
+        }
+
+        Utils.installTitleEventHandler(video, 'error');
+        Utils.installTitleEventHandler(video, 'ended');
+        MSEPlayerUtils.loadMediaSegmentsFromTestConfig(testConfig);
+        video.play();
+        
+        // Configure the iframe to be an MSE video that plays the same file and params. 
+        var loc = window.location.toString();
+        var params = loc.split('?')[1];
+        document.getElementById("subframe-mse").src = "mse_player.html?" + params;
+      }
+    </script>
+    <iframe id="subframe-mse" title="Subframe with MSE Player">
+    </iframe>
+  </body>
+</html>
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 45688e85..5c45fd1 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -4153,6 +4153,7 @@
     "base/prioritized_dispatcher_unittest.cc",
     "base/prioritized_task_runner_unittest.cc",
     "base/priority_queue_unittest.cc",
+    "base/proxy_server_unittest.cc",
     "base/registry_controlled_domains/registry_controlled_domain_unittest.cc",
     "base/scheme_host_port_matcher_rule_unittest.cc",
     "base/scheme_host_port_matcher_unittest.cc",
@@ -4330,7 +4331,6 @@
     "proxy_resolution/proxy_config_unittest.cc",
     "proxy_resolution/proxy_info_unittest.cc",
     "proxy_resolution/proxy_list_unittest.cc",
-    "proxy_resolution/proxy_server_unittest.cc",
     "quic/bidirectional_stream_quic_impl_unittest.cc",
     "quic/crypto/proof_test_chromium.cc",
     "quic/crypto/proof_verifier_chromium_test.cc",
diff --git a/net/proxy_resolution/proxy_server_unittest.cc b/net/base/proxy_server_unittest.cc
similarity index 100%
rename from net/proxy_resolution/proxy_server_unittest.cc
rename to net/base/proxy_server_unittest.cc
diff --git a/net/log/net_log_source.cc b/net/log/net_log_source.cc
index 404572d..549f6d07 100644
--- a/net/log/net_log_source.cc
+++ b/net/log/net_log_source.cc
@@ -57,39 +57,4 @@
   return SourceEventParametersCallback(*this);
 }
 
-// static
-bool NetLogSource::FromEventParameters(const base::Value* event_params,
-                                       NetLogSource* source) {
-  const base::Value* source_dict = nullptr;
-  int source_id = -1;
-  int source_type = static_cast<int>(NetLogSourceType::COUNT);
-  if (!event_params) {
-    *source = NetLogSource();
-    return false;
-  }
-  source_dict = event_params->FindDictKey("source_dependency");
-  if (!source_dict) {
-    *source = NetLogSource();
-    return false;
-  }
-  base::Optional<int> opt_int;
-  opt_int = source_dict->FindIntKey("id");
-  if (!opt_int) {
-    *source = NetLogSource();
-    return false;
-  }
-  source_id = opt_int.value();
-  opt_int = source_dict->FindIntKey("type");
-  if (!opt_int) {
-    *source = NetLogSource();
-    return false;
-  }
-  source_type = opt_int.value();
-
-  DCHECK_GE(source_id, 0);
-  DCHECK_LT(source_type, static_cast<int>(NetLogSourceType::COUNT));
-  *source = NetLogSource(static_cast<NetLogSourceType>(source_type), source_id);
-  return true;
-}
-
 }  // namespace net
diff --git a/net/log/net_log_source.h b/net/log/net_log_source.h
index 046f371..32aaf51 100644
--- a/net/log/net_log_source.h
+++ b/net/log/net_log_source.h
@@ -36,13 +36,6 @@
   // describes |this|.
   base::Value ToEventParameters() const;
 
-  // Attempts to extract a NetLogSource from a set of event parameters.  Returns
-  // true and writes the result to |source| on success.  Returns false and
-  // makes |source| an invalid source on failure.
-  // TODO(mmenke):  Long term, we want to remove this.
-  static bool FromEventParameters(const base::Value* event_params,
-                                  NetLogSource* source);
-
   NetLogSourceType type;
   uint32_t id;
   base::TimeTicks start_time;
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index c889aa1..cf4e52b 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -818,10 +818,6 @@
 
   SSL_set_early_data_enabled(ssl_.get(), ssl_config_.early_data_enabled);
 
-  if (!context_->config().tls13_hardening_for_local_anchors_enabled) {
-    SSL_set_ignore_tls13_downgrade(ssl_.get(), 1);
-  }
-
   // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
   // set everything we care about to an absolute value.
   SslSetClearMask options;
@@ -1026,65 +1022,6 @@
     }
   }
 
-  if (!context_->config().tls13_hardening_for_local_anchors_enabled) {
-    // Record metrics on the TLS 1.3 anti-downgrade mechanism. This is only
-    // recorded when enforcement is disabled. (When enforcement is enabled,
-    // the connection will fail with ERR_TLS13_DOWNGRADE_DETECTED.) See
-    // https://crbug.com/boringssl/226.
-    //
-    // Record metrics for both servers overall and the TLS 1.3 experiment
-    // set. These metrics are only useful on TLS 1.3 servers, so the latter
-    // is more precise, but there is a large enough TLS 1.3 deployment that
-    // the overall numbers may be more robust. In particular, the
-    // DowngradeType metrics do not need to be filtered.
-    bool is_downgrade = !!SSL_is_tls13_downgrade(ssl_.get());
-    UMA_HISTOGRAM_BOOLEAN("Net.SSLTLS13Downgrade", is_downgrade);
-    bool is_tls13_experiment_host =
-        IsTLS13ExperimentHost(host_and_port_.host());
-    if (is_tls13_experiment_host) {
-      UMA_HISTOGRAM_BOOLEAN("Net.SSLTLS13DowngradeTLS13Experiment",
-                            is_downgrade);
-    }
-
-    if (is_downgrade) {
-      // Record whether connections which hit the downgrade used known vs
-      // unknown roots and which key exchange type.
-
-      // This enum is persisted into histograms. Values may not be
-      // renumbered.
-      enum class DowngradeType {
-        kKnownRootRSA = 0,
-        kKnownRootECDHE = 1,
-        kUnknownRootRSA = 2,
-        kUnknownRootECDHE = 3,
-        kMaxValue = kUnknownRootECDHE,
-      };
-
-      DowngradeType type;
-      int kx_nid = SSL_CIPHER_get_kx_nid(SSL_get_current_cipher(ssl_.get()));
-      DCHECK(kx_nid == NID_kx_rsa || kx_nid == NID_kx_ecdhe);
-      if (server_cert_verify_result_.is_issued_by_known_root) {
-        type = kx_nid == NID_kx_rsa ? DowngradeType::kKnownRootRSA
-                                    : DowngradeType::kKnownRootECDHE;
-      } else {
-        type = kx_nid == NID_kx_rsa ? DowngradeType::kUnknownRootRSA
-                                    : DowngradeType::kUnknownRootECDHE;
-      }
-      UMA_HISTOGRAM_ENUMERATION("Net.SSLTLS13DowngradeType", type);
-      if (is_tls13_experiment_host) {
-        UMA_HISTOGRAM_ENUMERATION("Net.SSLTLS13DowngradeTypeTLS13Experiment",
-                                  type);
-      }
-
-      if (server_cert_verify_result_.is_issued_by_known_root) {
-        // Exit DoHandshakeLoop and return the result to the caller to
-        // Connect.
-        DCHECK_EQ(STATE_NONE, next_handshake_state_);
-        return ERR_TLS13_DOWNGRADE_DETECTED;
-      }
-    }
-  }
-
   SSLHandshakeDetails details;
   if (SSL_version(ssl_.get()) < TLS1_3_VERSION) {
     if (SSL_session_reused(ssl_.get())) {
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 190b16f8..67fe1435 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -5519,7 +5519,6 @@
       public ::testing::WithParamInterface<
           std::tuple<SpawnedTestServer::SSLOptions::TLSMaxVersion,
                      /* simulate_tls13_downgrade */ bool,
-                     /* enable_for_local_anchors */ bool,
                      /* known_root */ bool>> {
  public:
   TLS13DowngradeTest() {}
@@ -5530,8 +5529,7 @@
   }
 
   bool simulate_tls13_downgrade() const { return std::get<1>(GetParam()); }
-  bool enable_for_local_anchors() const { return std::get<2>(GetParam()); }
-  bool known_root() const { return std::get<3>(GetParam()); }
+  bool known_root() const { return std::get<2>(GetParam()); }
 };
 
 INSTANTIATE_TEST_SUITE_P(
@@ -5543,7 +5541,6 @@
             SpawnedTestServer::SSLOptions::TLS_MAX_VERSION_TLS1_1,
             SpawnedTestServer::SSLOptions::TLS_MAX_VERSION_TLS1_2),
         ::testing::Values(false, true),
-        ::testing::Values(false, true),
         ::testing::Values(false, true)));
 
 TEST_P(TLS13DowngradeTest, DowngradeEnforced) {
@@ -5556,7 +5553,6 @@
 
   SSLContextConfig config;
   config.version_max = SSL_PROTOCOL_VERSION_TLS1_3;
-  config.tls13_hardening_for_local_anchors_enabled = enable_for_local_anchors();
   ssl_config_service_->UpdateSSLConfigAndNotify(config);
 
   CertVerifyResult verify_result;
@@ -5565,12 +5561,10 @@
   cert_verifier_->ClearRules();
   cert_verifier_->AddResultForCert(server_cert.get(), verify_result, OK);
 
-  bool should_enforce = known_root() || enable_for_local_anchors();
-
   ssl_client_session_cache_->Flush();
   int rv;
   ASSERT_TRUE(CreateAndConnectSSLClientSocket(SSLConfig(), &rv));
-  if (should_enforce && simulate_tls13_downgrade()) {
+  if (simulate_tls13_downgrade()) {
     EXPECT_THAT(rv, IsError(ERR_TLS13_DOWNGRADE_DETECTED));
     EXPECT_FALSE(sock_->IsConnected());
   } else {
@@ -5579,132 +5573,6 @@
   }
 }
 
-struct TLS13DowngradeMetricsParams {
-  bool downgrade;
-  bool known_root;
-  SpawnedTestServer::SSLOptions::KeyExchange key_exchanges;
-  bool tls13_experiment_host;
-  int expect_downgrade_type;
-};
-
-const TLS13DowngradeMetricsParams kTLS13DowngradeMetricsParams[] = {
-    // Not a downgrade.
-    {false, true, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ANY,
-     false, -1},
-    {false, true, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ANY,
-     true, -1},
-    // Downgrades with a known root.
-    {true, true, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_RSA,
-     false, 0},
-    {true, true, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_RSA,
-     true, 0},
-    {true, true,
-     SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ECDHE_RSA, false,
-     1},
-    {true, true,
-     SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ECDHE_RSA, true,
-     1},
-    // Downgrades with an unknown root.
-    {true, false, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_RSA,
-     false, 2},
-    {true, false, SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_RSA,
-     true, 2},
-    {true, false,
-     SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ECDHE_RSA, false,
-     3},
-    {true, false,
-     SpawnedTestServer::SSLOptions::KeyExchange::KEY_EXCHANGE_ECDHE_RSA, true,
-     3},
-};
-
-namespace {
-namespace test_default {
-#include "net/http/transport_security_state_static_unittest_default.h"
-}  // namespace test_default
-}  // namespace
-
-class TLS13DowngradeMetricsTest
-    : public SSLClientSocketTest,
-      public ::testing::WithParamInterface<TLS13DowngradeMetricsParams> {
- public:
-  TLS13DowngradeMetricsTest() {
-    // Switch the static preload list, so the tests using mail.google.com below
-    // do not trip the usual pins.
-    SetTransportSecurityStateSourceForTesting(&test_default::kHSTSSource);
-  }
-  ~TLS13DowngradeMetricsTest() {
-    SetTransportSecurityStateSourceForTesting(nullptr);
-  }
-};
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         TLS13DowngradeMetricsTest,
-                         ::testing::ValuesIn(kTLS13DowngradeMetricsParams));
-
-TEST_P(TLS13DowngradeMetricsTest, Metrics) {
-  const TLS13DowngradeMetricsParams& params = GetParam();
-  base::HistogramTester histograms;
-
-  SpawnedTestServer::SSLOptions ssl_options;
-  ssl_options.simulate_tls13_downgrade = params.downgrade;
-  ssl_options.key_exchanges = params.key_exchanges;
-  ASSERT_TRUE(StartTestServer(ssl_options));
-
-  HostPortPair host_port_pair = spawned_test_server()->host_port_pair();
-  if (params.tls13_experiment_host) {
-    host_port_pair.set_host("mail.google.com");
-  }
-
-  if (params.known_root) {
-    scoped_refptr<X509Certificate> server_cert =
-        spawned_test_server()->GetCertificate();
-
-    // Certificate is trusted and chains to a public root.
-    CertVerifyResult verify_result;
-    verify_result.is_issued_by_known_root = true;
-    verify_result.verified_cert = server_cert;
-    cert_verifier_->AddResultForCert(server_cert.get(), verify_result, OK);
-  }
-
-  auto transport =
-      std::make_unique<TCPClientSocket>(addr(), nullptr, &log_, NetLogSource());
-  TestCompletionCallback callback;
-  int rv = callback.GetResult(transport->Connect(callback.callback()));
-  ASSERT_THAT(rv, IsOk());
-
-  SSLContextConfig config;
-  config.version_max = SSL_PROTOCOL_VERSION_TLS1_3;
-  config.tls13_hardening_for_local_anchors_enabled = false;
-  ssl_config_service_->UpdateSSLConfigAndNotify(config);
-
-  std::unique_ptr<SSLClientSocket> ssl_socket =
-      CreateSSLClientSocket(std::move(transport), host_port_pair, SSLConfig());
-  rv = callback.GetResult(ssl_socket->Connect(callback.callback()));
-  EXPECT_THAT(rv, AnyOf(IsOk(), IsError(ERR_TLS13_DOWNGRADE_DETECTED)));
-
-  histograms.ExpectUniqueSample("Net.SSLTLS13Downgrade", params.downgrade, 1);
-  if (params.tls13_experiment_host) {
-    histograms.ExpectUniqueSample("Net.SSLTLS13DowngradeTLS13Experiment",
-                                  params.downgrade, 1);
-  } else {
-    histograms.ExpectTotalCount("Net.SSLTLS13DowngradeTLS13Experiment", 0);
-  }
-
-  if (params.downgrade) {
-    histograms.ExpectUniqueSample("Net.SSLTLS13DowngradeType",
-                                  params.expect_downgrade_type, 1);
-  } else {
-    histograms.ExpectTotalCount("Net.SSLTLS13DowngradeType", 0);
-  }
-
-  if (params.tls13_experiment_host && params.downgrade) {
-    histograms.ExpectUniqueSample("Net.SSLTLS13DowngradeTypeTLS13Experiment",
-                                  params.expect_downgrade_type, 1);
-  } else {
-    histograms.ExpectTotalCount("Net.SSLTLS13DowngradeTypeTLS13Experiment", 0);
-  }
-}
-
 struct SSLHandshakeDetailsParams {
   bool alpn;
   bool early_data;
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index 65c23fa..3b8a20b3 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -2130,6 +2130,43 @@
   ASSERT_EQ(HIGHEST, stream1->priority());
 }
 
+// Attempts to extract a NetLogSource from a set of event parameters.  Returns
+// true and writes the result to |source| on success.  Returns false and
+// makes |source| an invalid source on failure.
+bool NetLogSourceFromEventParameters(const base::Value* event_params,
+                                     NetLogSource* source) {
+  const base::Value* source_dict = nullptr;
+  int source_id = -1;
+  int source_type = static_cast<int>(NetLogSourceType::COUNT);
+  if (!event_params) {
+    *source = NetLogSource();
+    return false;
+  }
+  source_dict = event_params->FindDictKey("source_dependency");
+  if (!source_dict) {
+    *source = NetLogSource();
+    return false;
+  }
+  base::Optional<int> opt_int;
+  opt_int = source_dict->FindIntKey("id");
+  if (!opt_int) {
+    *source = NetLogSource();
+    return false;
+  }
+  source_id = opt_int.value();
+  opt_int = source_dict->FindIntKey("type");
+  if (!opt_int) {
+    *source = NetLogSource();
+    return false;
+  }
+  source_type = opt_int.value();
+
+  DCHECK_GE(source_id, 0);
+  DCHECK_LT(source_type, static_cast<int>(NetLogSourceType::COUNT));
+  *source = NetLogSource(static_cast<NetLogSourceType>(source_type), source_id);
+  return true;
+}
+
 TEST_F(SpdySessionTest, Initialize) {
   MockRead reads[] = {
     MockRead(ASYNC, 0, 0)  // EOF
@@ -2158,7 +2195,7 @@
 
   NetLogSource socket_source;
   EXPECT_TRUE(
-      NetLogSource::FromEventParameters(&entries[pos].params, &socket_source));
+      NetLogSourceFromEventParameters(&entries[pos].params, &socket_source));
   EXPECT_TRUE(socket_source.IsValid());
   EXPECT_NE(log_.bound().source().id, socket_source.id);
 }
diff --git a/net/ssl/ssl_config_service.cc b/net/ssl/ssl_config_service.cc
index ff949eb..c45f70d3 100644
--- a/net/ssl/ssl_config_service.cc
+++ b/net/ssl/ssl_config_service.cc
@@ -17,11 +17,9 @@
 bool SSLContextConfigsAreEqual(const net::SSLContextConfig& config1,
                                const net::SSLContextConfig& config2) {
   return std::tie(config1.version_min, config1.version_min_warn,
-                  config1.version_max, config1.disabled_cipher_suites,
-                  config1.tls13_hardening_for_local_anchors_enabled) ==
+                  config1.version_max, config1.disabled_cipher_suites) ==
          std::tie(config2.version_min, config2.version_min_warn,
-                  config2.version_max, config2.disabled_cipher_suites,
-                  config2.tls13_hardening_for_local_anchors_enabled);
+                  config2.version_max, config2.disabled_cipher_suites);
 }
 
 }  // namespace
diff --git a/net/ssl/ssl_config_service.h b/net/ssl/ssl_config_service.h
index 0b2b947..acf7126 100644
--- a/net/ssl/ssl_config_service.h
+++ b/net/ssl/ssl_config_service.h
@@ -43,10 +43,6 @@
   // Ex: To disable TLS_RSA_WITH_RC4_128_MD5, specify 0x0004, while to
   // disable TLS_ECDH_ECDSA_WITH_RC4_128_SHA, specify 0xC002.
   std::vector<uint16_t> disabled_cipher_suites;
-
-  // If true, enables TLS 1.3 downgrade hardening for connections using
-  // local trust anchors. (Hardening for known roots is always enabled.)
-  bool tls13_hardening_for_local_anchors_enabled = true;
 };
 
 // The interface for retrieving global SSL configuration.  This interface
diff --git a/net/ssl/ssl_config_service_unittest.cc b/net/ssl/ssl_config_service_unittest.cc
index 73b622c..712e070b 100644
--- a/net/ssl/ssl_config_service_unittest.cc
+++ b/net/ssl/ssl_config_service_unittest.cc
@@ -126,12 +126,6 @@
   EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
   mock_service.SetSSLContextConfig(initial_config);
 
-  // Ensure that toggling TLS 1.3 hardening triggers an update.
-  initial_config.tls13_hardening_for_local_anchors_enabled =
-      !initial_config.tls13_hardening_for_local_anchors_enabled;
-  EXPECT_CALL(observer, OnSSLContextConfigChanged()).Times(1);
-  mock_service.SetSSLContextConfig(initial_config);
-
   mock_service.RemoveObserver(&observer);
 }
 
diff --git a/net/url_request/url_request_quic_perftest.cc b/net/url_request/url_request_quic_perftest.cc
index 649f6b3..d3ef606f 100644
--- a/net/url_request/url_request_quic_perftest.cc
+++ b/net/url_request/url_request_quic_perftest.cc
@@ -81,10 +81,10 @@
     const test_server::HttpRequest& request) {
   std::unique_ptr<test_server::BasicHttpResponse> http_response(
       new test_server::BasicHttpResponse());
+  std::string alpn = quic::AlpnForVersion(kDefaultSupportedQuicVersion);
   http_response->AddCustomHeader(
-      "Alt-Svc",
-      base::StringPrintf("quic=\"%s:%d\"; v=\"%u\"", kAltSvcHost, kAltSvcPort,
-                         kDefaultSupportedQuicVersion.transport_version));
+      "Alt-Svc", base::StringPrintf("%s=\"%s:%d\"", alpn.c_str(), kAltSvcHost,
+                                    kAltSvcPort));
   http_response->set_code(HTTP_OK);
   http_response->set_content(kHelloOriginResponse);
   http_response->set_content_type("text/plain");
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc
index 9b61318..d63d942c 100644
--- a/sandbox/policy/win/sandbox_win.cc
+++ b/sandbox/policy/win/sandbox_win.cc
@@ -941,8 +941,11 @@
 
   // Post-startup mitigations.
   mitigations = MITIGATION_DLL_SEARCH_ORDER;
-  if (!cmd_line->HasSwitch(switches::kAllowThirdPartyModules))
+  if (!cmd_line->HasSwitch(switches::kAllowThirdPartyModules) &&
+      sandbox_type != SandboxType::kSpeechRecognition) {
     mitigations |= MITIGATION_FORCE_MS_SIGNED_BINS;
+  }
+
   if (sandbox_type == SandboxType::kNetwork ||
       sandbox_type == SandboxType::kAudio ||
       sandbox_type == SandboxType::kIconReader) {
diff --git a/services/network/public/mojom/ssl_config.mojom b/services/network/public/mojom/ssl_config.mojom
index 765d732..c2b636e9 100644
--- a/services/network/public/mojom/ssl_config.mojom
+++ b/services/network/public/mojom/ssl_config.mojom
@@ -20,10 +20,6 @@
   bool sha1_local_anchors_enabled = false;
   bool symantec_enforcement_disabled = false;
 
-  // If true, enables TLS 1.3 downgrade hardening for connections using local
-  // trust anchors. (Hardening for known roots is always enabled.)
-  bool tls13_hardening_for_local_anchors_enabled = true;
-
   // SSL 2.0 and 3.0 are not supported. Note these lines must be kept in sync
   // with net/ssl/ssl_config.cc.
   SSLVersion version_min = kTLS1;
diff --git a/services/network/ssl_config_service_mojo_unittest.cc b/services/network/ssl_config_service_mojo_unittest.cc
index 86791845..2b85ba4 100644
--- a/services/network/ssl_config_service_mojo_unittest.cc
+++ b/services/network/ssl_config_service_mojo_unittest.cc
@@ -439,16 +439,6 @@
   RunConversionTests(*mojo_config, expected_net_config);
 }
 
-TEST_F(NetworkServiceSSLConfigServiceTest, InitialConfigTLS13Hardening) {
-  net::SSLContextConfig expected_net_config;
-  expected_net_config.tls13_hardening_for_local_anchors_enabled = false;
-
-  mojom::SSLConfigPtr mojo_config = mojom::SSLConfig::New();
-  mojo_config->tls13_hardening_for_local_anchors_enabled = false;
-
-  RunConversionTests(*mojo_config, expected_net_config);
-}
-
 TEST_F(NetworkServiceSSLConfigServiceTest, CanShareConnectionWithClientCerts) {
   // Create a default NetworkContext and test that
   // CanShareConnectionWithClientCerts returns false.
diff --git a/services/network/ssl_config_type_converter.cc b/services/network/ssl_config_type_converter.cc
index 3fc0c4d..7d09bb5 100644
--- a/services/network/ssl_config_type_converter.cc
+++ b/services/network/ssl_config_type_converter.cc
@@ -37,8 +37,6 @@
   DCHECK_LE(net_config.version_min, net_config.version_max);
 
   net_config.disabled_cipher_suites = mojo_config->disabled_cipher_suites;
-  net_config.tls13_hardening_for_local_anchors_enabled =
-      mojo_config->tls13_hardening_for_local_anchors_enabled;
   return net_config;
 }
 
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index 5e137d42..fb7632f 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -39,6 +39,7 @@
 #include "services/tracing/public/cpp/perfetto/macros.h"
 #include "services/tracing/public/cpp/perfetto/perfetto_producer.h"
 #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
+#include "services/tracing/public/cpp/perfetto/system_producer.h"
 #include "services/tracing/public/cpp/perfetto/trace_time.h"
 #include "services/tracing/public/cpp/perfetto/traced_value_proto_writer.h"
 #include "services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h"
@@ -1133,6 +1134,23 @@
     chrome_process->set_process_type(process_type);
   }
 
+#if defined(OS_ANDROID)
+  // Host app package name is only recorded if privacy filtering is disabled or
+  // this is a system trace.
+  if (!privacy_filtering_enabled_ ||
+      producer_ == PerfettoTracedProcess::Get()->system_producer()) {
+    // Host app package name is used to group information from different
+    // processes that "belong" to the same WebView app.
+    // TODO(b/161983088): only write this for WebView since this information is
+    // not useful in other cases.
+    if (process_type == ChromeProcessDescriptor::PROCESS_RENDERER ||
+        process_type == ChromeProcessDescriptor::PROCESS_BROWSER) {
+      chrome_process->set_host_app_package_name(
+          base::android::BuildInfo::GetInstance()->host_package_name());
+    }
+  }
+#endif  // defined(OS_ANDROID)
+
   // TODO(eseckler): Set other fields on |chrome_process|.
 
   trace_packet = TracePacketHandle();
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json
index f270e2e..20d646b 100644
--- a/testing/buildbot/chromium.ci.json
+++ b/testing/buildbot/chromium.ci.json
@@ -263471,38 +263471,6 @@
       }
     ]
   },
-  "mac10.13_retina-blink-rel-dummy": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "--num-retries=3"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac-10.13.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 20
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      }
-    ]
-  },
   "mac10.14-blink-rel-dummy": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index d81cfad..6098a87 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -64649,38 +64649,6 @@
       }
     ]
   },
-  "mac10.13_retina-blink-rel-dummy": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "--num-retries=3"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "hidpi": "1",
-              "os": "Mac-10.13.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 20
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      }
-    ]
-  },
   "mac10.14-blink-rel-dummy": {
     "isolated_scripts": [
       {
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 68098c5..9de56d1 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -1411,7 +1411,6 @@
       'mac10.10-blink-rel-dummy',
       'mac10.11-blink-rel-dummy',
       'mac10.12-blink-rel-dummy',
-      'mac10.13_retina-blink-rel-dummy',
       'mac10.13-blink-rel-dummy',
       'mac10.14-blink-rel-dummy',
       'mac10.15-blink-rel-dummy',
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index e7e24c8c..36474d8 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -384,11 +384,6 @@
           'shards': 20,
         },
       },
-      'mac10.13_retina-blink-rel-dummy': {
-        'swarming': {
-          'shards': 20,
-        },
-      },
       'mac10.14-blink-rel-dummy': {
         'swarming': {
           'shards': 20,
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 90dda73..95c7e2ec 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2416,21 +2416,6 @@
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
         },
       },
-      'mac10.13_retina-blink-rel-dummy': {
-        'test_suites': {
-          'isolated_scripts': 'chromium_webkit_isolated_scripts',
-        },
-        'swarming': {
-          'dimension_sets': [
-            {
-              'gpu': '1002:6821',
-              'hidpi': '1',
-              'os': 'Mac-10.13.6',
-              'pool': 'chromium.tests.gpu',
-            },
-          ],
-        },
-      },
       'mac10.14-blink-rel-dummy': {
         'mixins': [
           'mac_mini_7,1',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index e21867f..0437e51 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1444,6 +1444,24 @@
             ]
         }
     ],
+    "CertVerifierService": [
+        {
+            "platforms": [
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CertVerifierService"
+                    ]
+                }
+            ]
+        }
+    ],
     "ChromeCleanupDistribution": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/absl.gni b/third_party/abseil-cpp/absl.gni
index dc87e2a6..537bc88 100644
--- a/third_party/abseil-cpp/absl.gni
+++ b/third_party/abseil-cpp/absl.gni
@@ -53,6 +53,10 @@
           # Abseil itself.
           "//third_party/abseil-cpp/*",
 
+          # GTest.  It unconditionally #includes any.h if pretty-print support
+          # for absl types is enabled.
+          "//third_party/googletest/*",
+
           # WebRTC binary to run PSNR and SSIM video quality analysis. It
           # statically links absl and it is used by "browser_tests" when
           # is_component_build=false but it cannot depend on the absl
diff --git a/third_party/blink/public/mojom/loader/previews_resource_loading_hints.mojom b/third_party/blink/public/mojom/loader/previews_resource_loading_hints.mojom
index 3a3d8b26..bc4c768 100644
--- a/third_party/blink/public/mojom/loader/previews_resource_loading_hints.mojom
+++ b/third_party/blink/public/mojom/loader/previews_resource_loading_hints.mojom
@@ -57,4 +57,8 @@
   // Sends the hints for reducing the data-costs of streaming
   // media/videos from the browser to renderers.
   SetLiteVideoHint(LiteVideoHint lite_video_hint);
+
+  // Notifies the renderers that active media request throttles should be stopped
+  // and not allow any new throttles.
+  StopThrottlingMediaRequests();
 };
diff --git a/third_party/blink/public/mojom/renderer_preferences.mojom b/third_party/blink/public/mojom/renderer_preferences.mojom
index c5e7fa93..ee5a09d 100644
--- a/third_party/blink/public/mojom/renderer_preferences.mojom
+++ b/third_party/blink/public/mojom/renderer_preferences.mojom
@@ -104,6 +104,9 @@
   // Determines whether plugins are allowed to enter fullscreen mode.
   bool plugin_fullscreen_allowed = true;
 
+  // Whether or not caret browsing is enabled.
+  bool caret_browsing_enabled = false;
+
   [EnableIf=renderer_pref_system_font_family_name]
   string system_font_family_name;
 
diff --git a/third_party/blink/public/platform/media/webmediaplayer_delegate.h b/third_party/blink/public/platform/media/webmediaplayer_delegate.h
index 89ab8c2..3300bea4 100644
--- a/third_party/blink/public/platform/media/webmediaplayer_delegate.h
+++ b/third_party/blink/public/platform/media/webmediaplayer_delegate.h
@@ -130,6 +130,9 @@
   virtual void DidPictureInPictureAvailabilityChange(int delegate_id,
                                                      bool available) = 0;
 
+  // Notify that a buffer underflow event happened for the media player.
+  virtual void DidBufferUnderflow(int player_id) = 0;
+
   // Notify that playback is stopped. This will drop wake locks and remove any
   // external controls.
   //
diff --git a/third_party/blink/renderer/build/scripts/tests/runtime_enabled_features_trial_insecure_not_deprecation.json5 b/third_party/blink/renderer/build/scripts/tests/runtime_enabled_features_trial_insecure_not_deprecation.json5
index 1c6c4af0..ff3bd54 100644
--- a/third_party/blink/renderer/build/scripts/tests/runtime_enabled_features_trial_insecure_not_deprecation.json5
+++ b/third_party/blink/renderer/build/scripts/tests/runtime_enabled_features_trial_insecure_not_deprecation.json5
@@ -2,7 +2,7 @@
   parameters: {
     status: {
       valid_values: ["stable", "experimental", "test"],
-      valid_keys: ["Android", "Win", "ChromeOS", "MacOSX"]
+      valid_keys: ["Android", "Win", "ChromeOS", "Mac"]
     },
     implied_by: {
       default: [],
diff --git a/third_party/blink/renderer/core/execution_context/agent.cc b/third_party/blink/renderer/core/execution_context/agent.cc
index 117861e..69955bd 100644
--- a/third_party/blink/renderer/core/execution_context/agent.cc
+++ b/third_party/blink/renderer/core/execution_context/agent.cc
@@ -51,4 +51,19 @@
   is_cross_origin_isolated = value;
 }
 
+bool Agent::IsOriginIsolated() {
+#if DCHECK_IS_ON()
+  DCHECK(is_origin_isolated_set_);
+#endif
+  return is_origin_isolated_;
+}
+
+void Agent::SetIsOriginIsolated(bool value) {
+#if DCHECK_IS_ON()
+  DCHECK(!is_origin_isolated_set_ || value == is_origin_isolated_);
+  is_origin_isolated_set_ = true;
+#endif
+  is_origin_isolated_ = value;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/agent.h b/third_party/blink/renderer/core/execution_context/agent.h
index 5c09ad1..41b1929 100644
--- a/third_party/blink/renderer/core/execution_context/agent.h
+++ b/third_party/blink/renderer/core/execution_context/agent.h
@@ -62,9 +62,28 @@
   // Only called from blink::SetIsCrossOriginIsolated.
   static void SetIsCrossOriginIsolated(bool value);
 
+  // Representing agent cluster's "origin isolated" concept.
+  // https://github.com/whatwg/html/pull/5545
+  // TODO(domenic): update to final spec URL when that pull request is merged.
+  //
+  // Note that unlike IsCrossOriginIsolated(), this is not static/process-global
+  // because we do not guarantee that a given process only contains agents with
+  // the same origin-isolation status.
+  //
+  // For example, a page with no Origin-Isolation header, that uses a data: URL
+  // to create an iframe, would have an origin-isolated data: URL Agent, plus a
+  // non-origin-isolated outer page Agent, both in the same process.
+  bool IsOriginIsolated();
+  void SetIsOriginIsolated(bool value);
+
  private:
   scoped_refptr<scheduler::EventLoop> event_loop_;
   const base::UnguessableToken cluster_id_;
+  bool is_origin_isolated_ = false;
+
+#if DCHECK_IS_ON()
+  bool is_origin_isolated_set_ = false;
+#endif
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 615f648..4a673626 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1746,11 +1746,7 @@
 }
 
 bool LocalDOMWindow::originIsolationRestricted() const {
-  return origin_isolation_restricted_;
-}
-
-void LocalDOMWindow::SetOriginIsolationRestricted(bool value) {
-  origin_isolation_restricted_ = value;
+  return GetAgent()->IsOriginIsolated();
 }
 
 int LocalDOMWindow::requestIdleCallback(V8IdleRequestCallback* callback,
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h
index f2a5549..27af699 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.h
+++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -295,7 +295,6 @@
 
   // https://github.com/whatwg/html/pull/5545
   bool originIsolationRestricted() const;
-  void SetOriginIsolationRestricted(bool);
 
   // Idle callback extensions
   int requestIdleCallback(V8IdleRequestCallback*, const IdleRequestOptions*);
@@ -460,8 +459,6 @@
 
   Vector<String> origin_policy_ids_;
 
-  bool origin_isolation_restricted_ = false;
-
   mutable Member<ApplicationCache> application_cache_;
 
   scoped_refptr<SerializedScriptValue> pending_state_object_;
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
index c83279cf..a191b767 100644
--- a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
@@ -187,6 +187,14 @@
       main_frame_percentage_records_[static_cast<unsigned>(
                                          MetricId::kCompositing)]
           .interval_duration;
+  metrics_data->compositing_assignments =
+      main_frame_percentage_records_[static_cast<unsigned>(
+                                         MetricId::kCompositingAssignments)]
+          .interval_duration;
+  metrics_data->compositing_inputs =
+      main_frame_percentage_records_[static_cast<unsigned>(
+                                         MetricId::kCompositingInputs)]
+          .interval_duration;
   metrics_data->paint =
       main_frame_percentage_records_[static_cast<unsigned>(MetricId::kPaint)]
           .interval_duration;
@@ -412,7 +420,9 @@
 
     switch (static_cast<MetricId>(i)) {
       CASE_FOR_ID(Compositing);
+      CASE_FOR_ID(CompositingAssignments);
       CASE_FOR_ID(CompositingCommit);
+      CASE_FOR_ID(CompositingInputs);
       CASE_FOR_ID(ImplCompositorCommit);
       CASE_FOR_ID(IntersectionObservation);
       CASE_FOR_ID(Paint);
@@ -457,7 +467,9 @@
   for (unsigned i = 0; i < static_cast<unsigned>(kCount); ++i) {
     switch (static_cast<MetricId>(i)) {
       CASE_FOR_ID(Compositing, i);
+      CASE_FOR_ID(CompositingAssignments, i);
       CASE_FOR_ID(CompositingCommit, i);
+      CASE_FOR_ID(CompositingInputs, i);
       CASE_FOR_ID(ImplCompositorCommit, i);
       CASE_FOR_ID(IntersectionObservation, i);
       CASE_FOR_ID(Paint, i);
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
index 8d14308..35f2fa5 100644
--- a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
@@ -129,7 +129,9 @@
   // metric_strings_ array below.
   enum MetricId {
     kCompositing,
+    kCompositingAssignments,
     kCompositingCommit,
+    kCompositingInputs,
     kImplCompositorCommit,
     kIntersectionObservation,
     kPaint,
@@ -162,7 +164,9 @@
   static base::span<const MetricInitializationData> metrics_data() {
     static const MetricInitializationData data[] = {
         {"Compositing", true},
+        {"CompositingAssignments", true},
         {"CompositingCommit", true},
+        {"CompositingInputs", true},
         {"ImplCompositorCommit", true},
         {"IntersectionObservation", true},
         {"Paint", true},
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator_test.cc b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator_test.cc
index 0c2d126..514d07c 100644
--- a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator_test.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator_test.cc
@@ -100,8 +100,8 @@
                                unsigned expected_primary_metric,
                                unsigned expected_sub_metric) {
     auto entries = recorder().GetEntriesByName("Blink.PageLoad");
-    EXPECT_EQ(entries.size(), expected_num_entries);
 
+    EXPECT_EQ(entries.size(), expected_num_entries);
     for (auto* entry : entries) {
       EXPECT_TRUE(
           ukm::TestUkmRecorder::EntryHasMetric(entry, GetPrimaryMetricName()));
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index c0cb239..422e473 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2554,7 +2554,19 @@
   if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) {
     SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(),
                              LocalFrameUkmAggregator::kCompositing);
-    layout_view->Compositor()->UpdateIfNeededRecursive(target_state);
+    DCHECK_GE(target_state, DocumentLifecycle::kCompositingInputsClean);
+    {
+      SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(),
+                               LocalFrameUkmAggregator::kCompositingInputs);
+      layout_view->Compositor()->UpdateInputsIfNeededRecursive(target_state);
+    }
+    {
+      SCOPED_UMA_AND_UKM_TIMER(
+          EnsureUkmAggregator(),
+          LocalFrameUkmAggregator::kCompositingAssignments);
+      layout_view->Compositor()->UpdateAssignmentsIfNeededRecursive(
+          target_state);
+    }
   }
 
   return target_state > DocumentLifecycle::kCompositingClean;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 31c84f3..068728f1b 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -6760,6 +6760,22 @@
       GetLayoutBox().PhysicalSelfVisualOverflowRect();
 }
 
+void LayoutBox::MutableForPainting::SetPreviousSizeAndLayoutOverflowRect(
+    const LayoutSize& previous_size,
+    const PhysicalRect& previous_layout_overflow_rect) {
+  GetLayoutBox().previous_size_ = previous_size;
+  if (!previous_layout_overflow_rect.offset.IsZero() ||
+      previous_layout_overflow_rect.size !=
+          PhysicalSizeToBeNoop(previous_size)) {
+    auto& rare_data = GetLayoutBox().EnsureRareData();
+    rare_data.has_previous_content_box_and_overflow_rects_ = true;
+    rare_data.previous_physical_layout_overflow_rect_ =
+        previous_layout_overflow_rect;
+    // Other previous_* fields don't matter because they are used for paint
+    // invalidation and we always do full paint invalidation on reattachment.
+  }
+}
+
 RasterEffectOutset LayoutBox::VisualRectOutsetForRasterEffects() const {
   // If the box has subpixel visual effect outsets, as the visual effect may be
   // painted along the pixel-snapped border box, the pixels on the anti-aliased
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 7acd06c..10a69f21 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1619,6 +1619,13 @@
           false;
     }
 
+    // Called from LayoutShiftTracker when we attach this LayoutBox to a node
+    // for which we saved these values when the node was detached from its
+    // original LayoutBox.
+    void SetPreviousSizeAndLayoutOverflowRect(
+        const LayoutSize& previous_size,
+        const PhysicalRect& previous_layout_overflow_rect);
+
    protected:
     friend class LayoutBox;
     MutableForPainting(const LayoutBox& box)
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index fbb5a7b4..1d99fda 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -177,7 +177,6 @@
   Member<void*> members[1];
   // The following fields are in FragmentData.
   PhysicalOffset paint_offset_;
-  PhysicalRect visual_rect_for_layout_shift_tracking;
   std::unique_ptr<int> rare_data_;
 };
 
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
index c0a2f1d..bde56304 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -31,6 +31,9 @@
 
 using ReattachHook = LayoutShiftTracker::ReattachHook;
 
+using ContainingBlockScope = LayoutShiftTracker::ContainingBlockScope;
+ContainingBlockScope* ContainingBlockScope::top_ = nullptr;
+
 namespace {
 
 ReattachHook& GetReattachHook() {
@@ -42,33 +45,56 @@
 constexpr base::TimeDelta kTimerDelay = base::TimeDelta::FromMilliseconds(500);
 const float kMovementThreshold = 3.0;  // CSS pixels.
 
-FloatPoint LogicalStart(const FloatRect& rect, const LayoutObject& object) {
-  const ComputedStyle* style = object.Style();
-  DCHECK(style);
-  auto logical =
-      PhysicalToLogical<float>(style->GetWritingMode(), style->Direction(),
-                               rect.Y(), rect.MaxX(), rect.MaxY(), rect.X());
-  return FloatPoint(logical.InlineStart(), logical.BlockStart());
+// Calculates the physical coordinates of the starting point in the current
+// coordinate space. |paint_offset| is the physical offset of the top-left
+// corner. The starting point can be any of the four corners of the box,
+// depending on the writing mode and text direction. Note that the result is
+// still in physical coordinates, just may be of a different corner.
+// See https://wicg.github.io/layout-instability/#starting-point.
+FloatPoint StartingPoint(const PhysicalOffset& paint_offset,
+                         const LayoutBox& box,
+                         const LayoutSize& size) {
+  PhysicalOffset starting_point = paint_offset;
+  auto writing_direction = box.StyleRef().GetWritingDirection();
+  if (UNLIKELY(writing_direction.IsFlippedBlocks()))
+    starting_point.left += size.Width();
+  if (UNLIKELY(writing_direction.IsRtl())) {
+    if (writing_direction.IsHorizontal())
+      starting_point.left += size.Width();
+    else
+      starting_point.top += size.Height();
+  }
+  return FloatPoint(starting_point);
 }
 
-float GetMoveDistance(const FloatRect& old_rect,
-                      const FloatRect& new_rect,
-                      const LayoutObject& object) {
-  FloatSize location_delta =
-      LogicalStart(new_rect, object) - LogicalStart(old_rect, object);
+// Returns the part a rect logically below a starting point.
+PhysicalRect RectBelowStartingPoint(const PhysicalRect& rect,
+                                    const PhysicalOffset& starting_point,
+                                    WritingDirectionMode writing_direction) {
+  PhysicalRect result = rect;
+  if (writing_direction.IsHorizontal())
+    result.ShiftTopEdgeTo(starting_point.top);
+  else if (writing_direction.IsFlippedBlocks())
+    result.ShiftRightEdgeTo(starting_point.left);
+  else
+    result.ShiftLeftEdgeTo(starting_point.left);
+  return result;
+}
+
+float GetMoveDistance(const FloatPoint& old_starting_point,
+                      const FloatPoint& new_starting_point) {
+  FloatSize location_delta = new_starting_point - old_starting_point;
   return std::max(fabs(location_delta.Width()), fabs(location_delta.Height()));
 }
 
 bool EqualWithinMovementThreshold(const FloatPoint& a,
                                   const FloatPoint& b,
-                                  const LayoutObject& object) {
-  float threshold_physical_px =
-      kMovementThreshold * object.StyleRef().EffectiveZoom();
+                                  float threshold_physical_px) {
   return fabs(a.X() - b.X()) < threshold_physical_px &&
          fabs(a.Y() - b.Y()) < threshold_physical_px;
 }
 
-bool SmallerThanRegionGranularity(const FloatRect& rect) {
+bool SmallerThanRegionGranularity(const PhysicalRect& rect) {
   // The region uses integer coordinates, so the rects are snapped to
   // pixel boundaries. Ignore rects smaller than half a pixel.
   return rect.Width() < 0.5 || rect.Height() < 0.5;
@@ -110,6 +136,10 @@
 
 LayoutShiftTracker::LayoutShiftTracker(LocalFrameView* frame_view)
     : frame_view_(frame_view),
+      // This eliminates noise from the private Page object created by
+      // SVGImage::DataChanged.
+      is_active_(
+          !frame_view_->GetFrame().GetChromeClient().IsSVGImageChromeClient()),
       score_(0.0),
       weighted_score_(0.0),
       timer_(frame_view->GetFrame().GetTaskRunner(TaskType::kInternalDefault),
@@ -120,105 +150,138 @@
       observed_input_or_scroll_(false),
       most_recent_input_timestamp_initialized_(false) {}
 
-void LayoutShiftTracker::ObjectShifted(
-    const LayoutObject& source,
-    const PropertyTreeStateOrAlias& property_tree_state,
-    FloatRect old_rect,
-    FloatRect new_rect) {
-  if (old_rect.IsEmpty() || new_rect.IsEmpty())
-    return;
+bool LayoutShiftTracker::NeedsToTrack(const LayoutObject& object) const {
+  if (!is_active_)
+    return false;
 
-  if (EqualWithinMovementThreshold(LogicalStart(old_rect, source),
-                                   LogicalStart(new_rect, source), source))
+  // SVG elements don't participate in the normal layout algorithms and are
+  // more likely to be used for animations.
+  if (object.IsSVGChild())
+    return false;
+
+  if (object.IsText())
+    return ContainingBlockScope::top_;
+
+  if (!object.IsBox())
+    return false;
+
+  // Don't report shift of anonymous objects. Will report the children because
+  // we want report real DOM nodes.
+  if (object.IsAnonymous())
+    return true;
+
+  // Ignore layout objects that move (in the coordinate space of the paint
+  // invalidation container) on scroll.
+  // TODO(skobes): Find a way to detect when these objects shift.
+  if (object.IsFixedPositioned() || object.IsStickyPositioned())
+    return false;
+
+  if (object.IsLayoutView())
+    return false;
+
+  if (Element* element = DynamicTo<Element>(object.GetNode())) {
+    if (element->IsSliderThumbElement())
+      return false;
+  }
+
+  return true;
+}
+
+void LayoutShiftTracker::ObjectShifted(
+    const LayoutObject& object,
+    const PropertyTreeStateOrAlias& property_tree_state,
+    const PhysicalRect& old_rect,
+    const PhysicalRect& new_rect,
+    const FloatPoint& old_starting_point,
+    const FloatPoint& new_starting_point) {
+  // The caller should ensure these conditions.
+  DCHECK(!old_rect.IsEmpty());
+  DCHECK(!new_rect.IsEmpty());
+
+  float threshold_physical_px =
+      kMovementThreshold * object.StyleRef().EffectiveZoom();
+
+  if (EqualWithinMovementThreshold(old_starting_point, new_starting_point,
+                                   threshold_physical_px))
     return;
 
   if (SmallerThanRegionGranularity(old_rect) &&
       SmallerThanRegionGranularity(new_rect))
     return;
 
-  // Ignore layout objects that move (in the coordinate space of the paint
-  // invalidation container) on scroll.
-  // TODO(skobes): Find a way to detect when these objects shift.
-  if (source.IsFixedPositioned() || source.IsStickyPositioned())
-    return;
-
-  // SVG elements don't participate in the normal layout algorithms and are
-  // more likely to be used for animations.
-  if (source.IsSVG())
-    return;
-
-  if (Element* element = DynamicTo<Element>(source.GetNode())) {
-    if (element->IsSliderThumbElement())
-      return;
-  }
-
   const auto& root_state =
-      source.View()->FirstFragment().LocalBorderBoxProperties();
+      object.View()->FirstFragment().LocalBorderBoxProperties();
   FloatClipRect clip_rect =
       GeometryMapper::LocalToAncestorClipRect(property_tree_state, root_state);
+  clip_rect.Intersect(FloatClipRect(FloatRect(
+      FloatPoint(),
+      FloatSize(
+          frame_view_->GetScrollableArea()->VisibleContentRect().Size()))));
 
   // If the clip region is empty, then the resulting layout shift isn't visible
   // in the viewport so ignore it.
-  if (!clip_rect.IsInfinite() && clip_rect.Rect().IsEmpty())
+  if (clip_rect.Rect().IsEmpty())
     return;
 
-  GeometryMapper::SourceToDestinationRect(property_tree_state.Transform(),
-                                          root_state.Transform(), old_rect);
-  GeometryMapper::SourceToDestinationRect(property_tree_state.Transform(),
-                                          root_state.Transform(), new_rect);
+  auto transform = GeometryMapper::SourceToDestinationProjection(
+      property_tree_state.Transform(), root_state.Transform());
+  FloatPoint old_starting_point_in_root =
+      transform.MapPoint(old_starting_point);
+  FloatPoint new_starting_point_in_root =
+      transform.MapPoint(new_starting_point);
 
-  if (EqualWithinMovementThreshold(old_rect.Location(), new_rect.Location(),
-                                   source)) {
+  if (EqualWithinMovementThreshold(old_starting_point_in_root,
+                                   new_starting_point_in_root,
+                                   threshold_physical_px))
     return;
-  }
 
-  if (EqualWithinMovementThreshold(old_rect.Location() + frame_scroll_delta_,
-                                   new_rect.Location(), source)) {
+  if (EqualWithinMovementThreshold(
+          old_starting_point_in_root + frame_scroll_delta_,
+          new_starting_point_in_root, threshold_physical_px)) {
     // TODO(skobes): Checking frame_scroll_delta_ is an imperfect solution to
     // allowing counterscrolled layout shifts. Ideally, we would map old_rect
     // to viewport coordinates using the previous frame's scroll tree.
     return;
   }
 
-  FloatRect clipped_old_rect(old_rect), clipped_new_rect(new_rect);
-  if (!clip_rect.IsInfinite()) {
-    clipped_old_rect.Intersect(clip_rect.Rect());
-    clipped_new_rect.Intersect(clip_rect.Rect());
-  }
+  FloatRect old_rect_in_root(old_rect);
+  transform.MapRect(old_rect_in_root);
+  FloatRect new_rect_in_root(new_rect);
+  transform.MapRect(new_rect_in_root);
 
-  IntRect viewport =
-      IntRect(IntPoint(),
-              frame_view_->GetScrollableArea()->VisibleContentRect().Size());
-
-  IntRect visible_old_rect = RoundedIntRect(clipped_old_rect);
-  visible_old_rect.Intersect(viewport);
-  IntRect visible_new_rect = RoundedIntRect(clipped_new_rect);
-  visible_new_rect.Intersect(viewport);
-
+  IntRect visible_old_rect =
+      RoundedIntRect(Intersection(old_rect_in_root, clip_rect.Rect()));
+  IntRect visible_new_rect =
+      RoundedIntRect(Intersection(new_rect_in_root, clip_rect.Rect()));
   if (visible_old_rect.IsEmpty() && visible_new_rect.IsEmpty())
     return;
 
   // Compute move distance based on unclipped rects, to accurately determine how
   // much the element moved.
-  float move_distance = GetMoveDistance(old_rect, new_rect, source);
+  float move_distance =
+      GetMoveDistance(old_starting_point_in_root, new_starting_point_in_root);
   frame_max_distance_ = std::max(frame_max_distance_, move_distance);
 
 #if DCHECK_IS_ON()
   LocalFrame& frame = frame_view_->GetFrame();
   if (ShouldLog(frame)) {
     DVLOG(2) << "in " << (frame.IsMainFrame() ? "" : "subframe ")
-             << frame.GetDocument()->Url().GetString() << ", "
-             << source.DebugName() << " moved from " << old_rect.ToString()
-             << " to " << new_rect.ToString() << " (visible from "
-             << visible_old_rect.ToString() << " to "
-             << visible_new_rect.ToString() << ")";
+             << frame.GetDocument()->Url() << ", " << object << " moved from "
+             << old_rect_in_root << " to " << new_rect_in_root
+             << " (visible from " << visible_old_rect << " to "
+             << visible_new_rect << ")";
+    if (old_starting_point_in_root != old_rect_in_root.Location() ||
+        new_starting_point_in_root != new_rect_in_root.Location()) {
+      DVLOG(2) << " (starting point from " << old_starting_point_in_root
+               << " to " << new_starting_point_in_root << ")";
+    }
   }
 #endif
 
   region_.AddRect(visible_old_rect);
   region_.AddRect(visible_new_rect);
 
-  if (Node* node = source.GetNode()) {
+  if (Node* node = object.GetNode()) {
     MaybeRecordAttribution(
         {DOMNodeIds::IdForNode(node), visible_old_rect, visible_new_rect});
   }
@@ -273,16 +336,60 @@
     *smallest = attribution;
 }
 
-void LayoutShiftTracker::NotifyObjectPrePaint(
-    const LayoutObject& object,
+void LayoutShiftTracker::NotifyBoxPrePaint(
+    const LayoutBox& box,
     const PropertyTreeStateOrAlias& property_tree_state,
-    const PhysicalRect& old_visual_rect,
-    const PhysicalRect& new_visual_rect) {
-  if (!IsActive())
+    const PhysicalRect& old_rect,
+    const PhysicalRect& new_rect,
+    const PhysicalOffset& old_paint_offset,
+    const PhysicalOffset& new_paint_offset) {
+  DCHECK(NeedsToTrack(box));
+  ObjectShifted(box, property_tree_state, old_rect, new_rect,
+                StartingPoint(old_paint_offset, box, box.PreviousSize()),
+                StartingPoint(new_paint_offset, box, box.Size()));
+}
+
+void LayoutShiftTracker::NotifyTextPrePaint(
+    const LayoutText& text,
+    const PropertyTreeStateOrAlias& property_tree_state,
+    const LogicalOffset& old_starting_point,
+    const LogicalOffset& new_starting_point,
+    const PhysicalOffset& old_paint_offset,
+    const PhysicalOffset& new_paint_offset) {
+  DCHECK(NeedsToTrack(text));
+  auto* block = ContainingBlockScope::top_;
+  DCHECK(block);
+  LayoutUnit distance = std::max(
+      (new_starting_point.inline_offset - old_starting_point.inline_offset)
+          .Abs(),
+      (new_starting_point.block_offset - old_starting_point.block_offset)
+          .Abs());
+  if (distance <= block->max_text_shift_distance_)
     return;
 
-  ObjectShifted(object, property_tree_state, FloatRect(old_visual_rect),
-                FloatRect(new_visual_rect));
+  block->max_text_shift_distance_ = distance;
+  auto writing_direction = text.StyleRef().GetWritingDirection();
+  PhysicalOffset old_physical_starting_point =
+      old_paint_offset + old_starting_point.ConvertToPhysical(writing_direction,
+                                                              block->old_size_,
+                                                              PhysicalSize());
+  PhysicalOffset new_physical_starting_point =
+      new_paint_offset + new_starting_point.ConvertToPhysical(writing_direction,
+                                                              block->new_size_,
+                                                              PhysicalSize());
+
+  PhysicalRect old_rect = RectBelowStartingPoint(
+      block->old_rect_, old_physical_starting_point, writing_direction);
+  if (old_rect.IsEmpty())
+    return;
+  PhysicalRect new_rect = RectBelowStartingPoint(
+      block->new_rect_, new_physical_starting_point, writing_direction);
+  if (new_rect.IsEmpty())
+    return;
+
+  ObjectShifted(text, property_tree_state, old_rect, new_rect,
+                FloatPoint(old_physical_starting_point),
+                FloatPoint(new_physical_starting_point));
 }
 
 double LayoutShiftTracker::SubframeWeightingFactor() const {
@@ -311,7 +418,7 @@
 }
 
 void LayoutShiftTracker::NotifyPrePaintFinished() {
-  if (!IsActive())
+  if (!is_active_)
     return;
   if (region_.IsEmpty())
     return;
@@ -339,7 +446,7 @@
   LocalFrame& frame = frame_view_->GetFrame();
   if (ShouldLog(frame)) {
     DVLOG(1) << "in " << (frame.IsMainFrame() ? "" : "subframe ")
-             << frame.GetDocument()->Url().GetString() << ", viewport was "
+             << frame.GetDocument()->Url() << ", viewport was "
              << (impact_fraction * 100) << "% impacted with distance fraction "
              << move_distance_factor;
   }
@@ -492,14 +599,6 @@
   UpdateInputTimestamp(base::TimeTicks::Now());
 }
 
-bool LayoutShiftTracker::IsActive() {
-  // This eliminates noise from the private Page object created by
-  // SVGImage::DataChanged.
-  if (frame_view_->GetFrame().GetChromeClient().IsSVGImageChromeClient())
-    return false;
-  return true;
-}
-
 std::unique_ptr<TracedValue> LayoutShiftTracker::PerFrameTraceData(
     double score_delta,
     bool input_detected) const {
@@ -577,7 +676,7 @@
     auto& hook = GetReattachHook();
     hook.scope_ = outer_;
     if (!outer_)
-      hook.visual_rects_.clear();
+      hook.geometries_before_detach_.clear();
   }
 }
 
@@ -586,17 +685,19 @@
   if (!hook.scope_)
     return;
   auto* layout_object = node.GetLayoutObject();
-  if (!layout_object)
+  if (!layout_object || !layout_object->IsBox())
     return;
 
-  auto& map = hook.visual_rects_;
+  auto& map = hook.geometries_before_detach_;
   auto& fragment = layout_object->GetMutableForPainting().FirstFragment();
 
   // Save the visual rect for restoration on future reattachment.
-  PhysicalRect visual_rect = fragment.VisualRectForLayoutShiftTracking();
-  if (visual_rect.IsEmpty())
+  const auto& box = ToLayoutBox(*layout_object);
+  PhysicalRect layout_overflow_rect = box.PreviousPhysicalLayoutOverflowRect();
+  if (layout_overflow_rect.IsEmpty())
     return;
-  map.Set(&node, visual_rect);
+  map.Set(&node, Geometry{layout_overflow_rect, fragment.PaintOffset(),
+                          box.PreviousSize()});
 }
 
 void ReattachHook::NotifyAttach(const Node& node) {
@@ -604,20 +705,25 @@
   if (!hook.scope_)
     return;
   auto* layout_object = node.GetLayoutObject();
-  if (!layout_object)
+  if (!layout_object || !layout_object->IsBox())
     return;
-  auto& map = hook.visual_rects_;
+  auto& map = hook.geometries_before_detach_;
   auto& fragment = layout_object->GetMutableForPainting().FirstFragment();
 
-  // Restore the visual rect that was saved during detach.
+  // Restore geometries that was saved during detach. Note: this does not
+  // affect paint invalidation; we will fully invalidate the new layout object.
   auto iter = map.find(&node);
   if (iter == map.end())
     return;
-  fragment.SetVisualRectForLayoutShiftTracking(iter->value);
+  ToLayoutBox(layout_object)
+      ->GetMutableForPainting()
+      .SetPreviousSizeAndLayoutOverflowRect(iter->value.size,
+                                            iter->value.layout_overflow_rect);
+  fragment.SetPaintOffset(iter->value.paint_offset);
 }
 
 void ReattachHook::Trace(Visitor* visitor) const {
-  visitor->Trace(visual_rects_);
+  visitor->Trace(geometries_before_detach_);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.h b/third_party/blink/renderer/core/layout/layout_shift_tracker.h
index e855351..10d3cc0 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.h
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.h
@@ -18,12 +18,13 @@
 
 namespace blink {
 
+class LayoutBox;
 class LayoutObject;
+class LayoutText;
 class LocalFrameView;
 class PropertyTreeStateOrAlias;
 class TracedValue;
 class WebInputEvent;
-struct PhysicalRect;
 
 // Tracks "layout shifts" from layout objects changing their visual location
 // between animation frames. See https://github.com/WICG/layout-instability.
@@ -32,26 +33,38 @@
  public:
   explicit LayoutShiftTracker(LocalFrameView*);
   ~LayoutShiftTracker() = default;
-  // |old_visual_rect| and |new_visual_rect| are in the local transform space:
-  // |property_tree_state.Transform()|. As we don't save the old property tree
-  // state, the caller should adjust |old_visual_rect| as if the difference
-  // between the old and new additional offsets to the layout shift root[1]
-  // caused the difference between the locations of |old_visual_rect| and
-  // |new_visual_rect|, in addition to that caused by the difference between
-  // the old and new paint offsets in the local transform space, so that we can
-  // calculate the total shift from the layout shift root by comparing locations
-  // of |old_visual_rect| and |new_visual_rect|.
-  // [1] See PaintPropertyTreeBuilderFragmentContext::ContainingBlockContext
-  // ::additional_offset_to_layout_shift_root_delta.
-  void NotifyObjectPrePaint(const LayoutObject& object,
-                            const PropertyTreeStateOrAlias& property_tree_state,
-                            const PhysicalRect& old_visual_rect,
-                            const PhysicalRect& new_visual_rect);
+
+  bool NeedsToTrack(const LayoutObject&) const;
+
+  // |old_rect| and |new_rect| are layout overflow rects if the box has layout
+  // overflow and doesn't clip overflow, or border box rect, in the local
+  // transform space (property_tree_state.Transform()). |old_paint_offset| and
+  // |new_paint_offset| are the offsets of the border box rect in the local
+  // transform space, which are the same as |old_rect.offset| and
+  // |new_rect.offset| respectively if the rects are border box rects.
+  // As we don't save the old property tree state, the caller should adjust
+  // |old_rect| and |old_paint_offset| so that we can calculate the correct old
+  // visual representation and old starting point in the initial containing
+  // block and the viewport with the new property tree state in most cases.
+  void NotifyBoxPrePaint(const LayoutBox& box,
+                         const PropertyTreeStateOrAlias& property_tree_state,
+                         const PhysicalRect& old_rect,
+                         const PhysicalRect& new_rect,
+                         const PhysicalOffset& old_paint_offset,
+                         const PhysicalOffset& new_paint_offset);
+
+  void NotifyTextPrePaint(const LayoutText& text,
+                          const PropertyTreeStateOrAlias& property_tree_state,
+                          const LogicalOffset& old_starting_point,
+                          const LogicalOffset& new_starting_point,
+                          const PhysicalOffset& old_paint_offset,
+                          const PhysicalOffset& new_paint_offset);
+
   void NotifyPrePaintFinished();
   void NotifyInput(const WebInputEvent&);
   void NotifyScroll(mojom::blink::ScrollType, ScrollOffset delta);
   void NotifyViewportSizeChanged();
-  bool IsActive();
+  bool IsActive() const { return is_active_; }
   double Score() const { return score_; }
   double WeightedScore() const { return weighted_score_; }
   float OverallMaxDistance() const { return overall_max_distance_; }
@@ -83,14 +96,51 @@
 
    private:
     Scope* scope_ = nullptr;
-    HeapHashMap<Member<const Node>, PhysicalRect> visual_rects_;
+    struct Geometry {
+      PhysicalRect layout_overflow_rect;
+      PhysicalOffset paint_offset;
+      LayoutSize size;
+    };
+    HeapHashMap<Member<const Node>, Geometry> geometries_before_detach_;
+  };
+
+  class CORE_EXPORT ContainingBlockScope {
+   public:
+    // |old_size| and |new_size| are the border box sizes.
+    // |old_rect| and |new_rect| have the same definition as in
+    // NotifyBoxPrePaint().
+    explicit ContainingBlockScope(const PhysicalSize& old_size,
+                                  const PhysicalSize& new_size,
+                                  const PhysicalRect& old_rect,
+                                  const PhysicalRect& new_rect)
+        : outer_(top_),
+          old_size_(old_size),
+          new_size_(new_size),
+          old_rect_(old_rect),
+          new_rect_(new_rect) {
+      top_ = this;
+    }
+    ~ContainingBlockScope() { top_ = outer_; }
+
+   private:
+    friend class LayoutShiftTracker;
+    ContainingBlockScope* outer_;
+    static ContainingBlockScope* top_;
+    PhysicalSize old_size_;
+    PhysicalSize new_size_;
+    PhysicalRect old_rect_;
+    PhysicalRect new_rect_;
+    LayoutUnit max_text_shift_distance_;
   };
 
  private:
   void ObjectShifted(const LayoutObject&,
                      const PropertyTreeStateOrAlias&,
-                     FloatRect old_rect,
-                     FloatRect new_rect);
+                     const PhysicalRect& old_rect,
+                     const PhysicalRect& new_rect,
+                     const FloatPoint& old_starting_point,
+                     const FloatPoint& new_starting_point);
+
   void ReportShift(double score_delta, double weighted_score_delta);
   void TimerFired(TimerBase*) {}
   std::unique_ptr<TracedValue> PerFrameTraceData(double score_delta,
@@ -103,6 +153,7 @@
   void SubmitPerformanceEntry(double score_delta, bool input_detected) const;
 
   Member<LocalFrameView> frame_view_;
+  bool is_active_;
 
   // The document cumulative layout shift (DCLS) score for this LocalFrame,
   // unweighted, with move distance applied.
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc
index 6d286c25..ded42b7 100644
--- a/third_party/blink/renderer/core/layout/layout_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -84,10 +84,11 @@
 
 struct SameSizeAsLayoutText : public LayoutObject {
   uint32_t bitfields : 12;
+  DOMNodeId node_id;
   float widths[4];
   String text;
   void* pointers[2];
-  DOMNodeId node_id;
+  PhysicalOffset previous_starting_point;
 };
 
 ASSERT_SIZE(LayoutText, SameSizeAsLayoutText);
@@ -1690,6 +1691,25 @@
   return PhysicalOffset();
 }
 
+LogicalOffset LayoutText::LogicalStartingPoint() const {
+  if (IsInLayoutNGInlineFormattingContext()) {
+    NGInlineCursor cursor;
+    cursor.MoveTo(*this);
+    if (!cursor)
+      return LogicalOffset();
+    PhysicalOffset physical_offset = cursor.Current().OffsetInContainerBlock();
+    if (StyleRef().GetWritingDirection().IsHorizontalLtr())
+      return {physical_offset.left, physical_offset.top};
+    return physical_offset.ConvertToLogical(
+        StyleRef().GetWritingDirection(),
+        PhysicalSizeToBeNoop(ContainingBlock()->Size()),
+        cursor.Current().Size());
+  }
+  if (const auto* text_box = FirstTextBox())
+    return {text_box->LogicalLeft(), text_box->LogicalTop()};
+  return LogicalOffset();
+}
+
 bool LayoutText::CanOptimizeSetText() const {
   // If we have only one line of text and "contain: layout size" we can avoid
   // doing a layout and only paint in the SetText() operation.
diff --git a/third_party/blink/renderer/core/layout/layout_text.h b/third_party/blink/renderer/core/layout/layout_text.h
index 0ebfc63..989653f 100644
--- a/third_party/blink/renderer/core/layout/layout_text.h
+++ b/third_party/blink/renderer/core/layout/layout_text.h
@@ -332,6 +332,24 @@
 
   void DetachAbstractInlineTextBoxesIfNeeded();
 
+  // Returns the logical location of the first line box.
+  LogicalOffset LogicalStartingPoint() const;
+
+  // For LayoutShiftTracker. Saves the value of LogicalStartingPoint() value
+  // during the previous paint invalidation.
+  LogicalOffset PreviousLogicalStartingPoint() const {
+    return previous_logical_starting_point_;
+  }
+  // This is const because LayoutObjects are const for paint invalidation.
+  void SetPreviousLogicalStartingPoint(const LogicalOffset& point) const {
+    DCHECK_EQ(GetDocument().Lifecycle().GetState(),
+              DocumentLifecycle::kInPrePaint);
+    previous_logical_starting_point_ = point;
+  }
+  static LogicalOffset UninitializedLogicalStartingPoint() {
+    return {LayoutUnit::Max(), LayoutUnit::Max()};
+  }
+
  protected:
   void WillBeDestroyed() override;
 
@@ -448,6 +466,9 @@
   // Used for LayoutNG with accessibility. True if inline fragments are
   // associated to |NGAbstractInlineTextBox|.
   unsigned has_abstract_inline_text_box_ : 1;
+
+  DOMNodeId node_id_ = kInvalidDOMNodeId;
+
   float min_width_;
   float max_width_;
   float first_line_min_width_;
@@ -455,6 +476,10 @@
 
   String text_;
 
+  // This is mutable for paint invalidation.
+  mutable LogicalOffset previous_logical_starting_point_ =
+      UninitializedLogicalStartingPoint();
+
   union {
     // The line boxes associated with this object.
     // Read the LINE BOXES OWNERSHIP section in the class header comment.
@@ -468,7 +493,6 @@
     // Valid only when IsInLayoutNGInlineFormattingContext().
     wtf_size_t first_fragment_item_index_;
   };
-  DOMNodeId node_id_ = kInvalidDOMNodeId;
 };
 
 inline InlineTextBoxList& LayoutText::MutableTextBoxes() {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index 2d97cf6..3c912c2 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -65,14 +65,12 @@
           // lays out in visual order.
           TextDirection::kLtr,
           break_token),
-      line_box_(*context->LogicalLineItems()),
       box_states_(nullptr),
       context_(context),
       baseline_type_(container_builder_.Style().GetFontBaseline()),
       is_horizontal_writing_mode_(
           blink::IsHorizontalWritingMode(space.GetWritingMode())) {
   DCHECK(context);
-  DCHECK(&line_box_);
   quirks_mode_ = inline_node.InLineHeightQuirksMode();
 }
 
@@ -106,10 +104,11 @@
 NGInlineBoxState* NGInlineLayoutAlgorithm::HandleCloseTag(
     const NGInlineItem& item,
     const NGInlineItemResult& item_result,
+    NGLogicalLineItems* line_box,
     NGInlineBoxState* box) {
   if (UNLIKELY(quirks_mode_ && !item.IsEmptyItem()))
     box->EnsureTextMetrics(*item.Style(), baseline_type_);
-  box = box_states_->OnCloseTag(ConstraintSpace(), &line_box_, box,
+  box = box_states_->OnCloseTag(ConstraintSpace(), line_box, box,
                                 baseline_type_, item.HasEndEdge());
   // Just clear |NeedsLayout| flags. Culled inline boxes do not need paint
   // invalidations. If this object produces box fragments,
@@ -195,11 +194,12 @@
 void NGInlineLayoutAlgorithm::CreateLine(
     const NGLineLayoutOpportunity& opportunity,
     NGLineInfo* line_info,
+    NGLogicalLineItems* line_box,
     NGExclusionSpace* exclusion_space) {
   // Needs MutableResults to move ShapeResult out of the NGLineInfo.
   NGInlineItemResults* line_items = line_info->MutableResults();
   // Clear the current line without releasing the buffer.
-  line_box_.Shrink(0);
+  line_box->Shrink(0);
 
   // Apply justification before placing items, because it affects size/position
   // of items, which are needed to compute inline static positions.
@@ -210,7 +210,7 @@
   const ComputedStyle& line_style = line_info->LineStyle();
   box_states_->SetIsEmptyLine(line_info->IsEmptyLine());
   NGInlineBoxState* box = box_states_->OnBeginPlaceItems(
-      line_style, baseline_type_, quirks_mode_, &line_box_);
+      line_style, baseline_type_, quirks_mode_, line_box);
 #if DCHECK_IS_ON()
   if (is_box_states_from_context_)
     CheckBoxStates(*line_info, BreakToken());
@@ -250,13 +250,13 @@
              item.TextType() == NGTextType::kSymbolMarker);
       if (UNLIKELY(item_result.hyphen_shape_result)) {
         LayoutUnit hyphen_inline_size = item_result.HyphenInlineSize();
-        line_box_.AddChild(item, std::move(item_result.shape_result),
+        line_box->AddChild(item, std::move(item_result.shape_result),
                            item_result.TextOffset(), box->text_top,
                            item_result.inline_size - hyphen_inline_size,
                            box->text_height, item.BidiLevel());
-        PlaceHyphen(item_result, hyphen_inline_size, box);
+        PlaceHyphen(item_result, hyphen_inline_size, line_box, box);
       } else {
-        line_box_.AddChild(item, std::move(item_result.shape_result),
+        line_box->AddChild(item, std::move(item_result.shape_result),
                            item_result.TextOffset(), box->text_top,
                            item_result.inline_size, box->text_height,
                            item.BidiLevel());
@@ -267,14 +267,14 @@
       item.GetLayoutObject()->ClearNeedsLayoutWithFullPaintInvalidation();
 
     } else if (item.Type() == NGInlineItem::kControl) {
-      PlaceControlItem(item, *line_info, &item_result, box);
+      PlaceControlItem(item, *line_info, &item_result, line_box, box);
       has_logical_text_items = true;
     } else if (item.Type() == NGInlineItem::kOpenTag) {
-      box = HandleOpenTag(item, item_result, &line_box_, box_states_);
+      box = HandleOpenTag(item, item_result, line_box, box_states_);
     } else if (item.Type() == NGInlineItem::kCloseTag) {
-      box = HandleCloseTag(item, item_result, box);
+      box = HandleCloseTag(item, item_result, line_box, box);
     } else if (item.Type() == NGInlineItem::kAtomicInline) {
-      box = PlaceAtomicInline(item, *line_info, &item_result);
+      box = PlaceAtomicInline(item, *line_info, &item_result, line_box);
       has_relative_positioned_items |=
           item.Style()->GetPosition() == EPosition::kRelative;
     } else if (item.Type() == NGInlineItem::kListMarker) {
@@ -288,13 +288,13 @@
               ? item.Direction()
               : ConstraintSpace().Direction();
 
-      line_box_.AddChild(item.GetLayoutObject(), item.BidiLevel(), direction);
+      line_box->AddChild(item.GetLayoutObject(), item.BidiLevel(), direction);
       has_out_of_flow_positioned_items = true;
     } else if (item.Type() == NGInlineItem::kFloating) {
       if (item_result.positioned_float) {
         if (scoped_refptr<const NGLayoutResult> layout_result =
                 item_result.positioned_float->layout_result) {
-          line_box_.AddChild(std::move(layout_result),
+          line_box->AddChild(std::move(layout_result),
                              item_result.positioned_float->bfc_offset,
                              item.BidiLevel());
         } else {
@@ -303,31 +303,31 @@
           DCHECK(ConstraintSpace().HasBlockFragmentation());
         }
       } else {
-        line_box_.AddChild(item.GetLayoutObject(), item.BidiLevel());
+        line_box->AddChild(item.GetLayoutObject(), item.BidiLevel());
       }
       has_floating_items = true;
       has_relative_positioned_items |=
           item.Style()->GetPosition() == EPosition::kRelative;
     } else if (item.Type() == NGInlineItem::kBidiControl) {
-      line_box_.AddChild(item.BidiLevel());
+      line_box->AddChild(item.BidiLevel());
     }
   }
 
-  box_states_->OnEndPlaceItems(ConstraintSpace(), &line_box_, baseline_type_);
+  box_states_->OnEndPlaceItems(ConstraintSpace(), line_box, baseline_type_);
 
   if (UNLIKELY(Node().IsBidiEnabled())) {
-    box_states_->PrepareForReorder(&line_box_);
-    BidiReorder(line_info->BaseDirection());
-    box_states_->UpdateAfterReorder(&line_box_);
+    box_states_->PrepareForReorder(line_box);
+    BidiReorder(line_info->BaseDirection(), line_box);
+    box_states_->UpdateAfterReorder(line_box);
   } else {
     DCHECK(IsLtr(line_info->BaseDirection()));
   }
   const LayoutUnit hang_width = line_info->HangWidth();
   LayoutUnit inline_size;
   if (IsLtr(line_info->BaseDirection())) {
-    inline_size = box_states_->ComputeInlinePositions(&line_box_, LayoutUnit());
+    inline_size = box_states_->ComputeInlinePositions(line_box, LayoutUnit());
   } else {
-    inline_size = box_states_->ComputeInlinePositions(&line_box_, -hang_width);
+    inline_size = box_states_->ComputeInlinePositions(line_box, -hang_width);
     inline_size += hang_width;
   }
   if (UNLIKELY(hang_width)) {
@@ -344,17 +344,16 @@
     auto* input =
         DynamicTo<HTMLInputElement>(node_.GetLayoutBlockFlow()->GetNode());
     if (input && input->ShouldApplyMiddleEllipsis()) {
-      inline_size = truncator.TruncateLineInTheMiddle(inline_size, &line_box_,
-                                                      box_states_);
-    } else {
       inline_size =
-          truncator.TruncateLine(inline_size, &line_box_, box_states_);
+          truncator.TruncateLineInTheMiddle(inline_size, line_box, box_states_);
+    } else {
+      inline_size = truncator.TruncateLine(inline_size, line_box, box_states_);
     }
   }
 
   if (has_logical_text_items &&
       !RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
-    line_box_.CreateTextFragments(ConstraintSpace().GetWritingMode(),
+    line_box->CreateTextFragments(ConstraintSpace().GetWritingMode(),
                                   line_info->ItemsData().text_content);
   }
 
@@ -381,7 +380,7 @@
   // This adjusts the NGLogicalLineItem::offset member to contain
   // the static position of the OOF positioned children relative to the linebox.
   if (has_out_of_flow_positioned_items)
-    PlaceOutOfFlowObjects(*line_info, line_box_metrics);
+    PlaceOutOfFlowObjects(*line_info, line_box_metrics, line_box);
 
   // Place floating objects.
   // This adjusts the  NGLogicalLineItem::offset member to
@@ -389,7 +388,7 @@
   // Additionally it will perform layout on any unpositioned floats which
   // needed the line height to correctly determine their final position.
   if (has_floating_items) {
-    PlaceFloatingObjects(*line_info, line_box_metrics, opportunity,
+    PlaceFloatingObjects(*line_info, line_box_metrics, opportunity, line_box,
                          exclusion_space);
   }
 
@@ -397,26 +396,26 @@
   // positioning, (atomic-inlines, and floats). This will only move the
   // individual item.
   if (has_relative_positioned_items)
-    PlaceRelativePositionedItems();
+    PlaceRelativePositionedItems(line_box);
 
   // Apply any relative positioned offsets to any boxes (and their children).
-  box_states_->ApplyRelativePositioning(ConstraintSpace(), &line_box_);
+  box_states_->ApplyRelativePositioning(ConstraintSpace(), line_box);
 
   NGAnnotationMetrics annotation_metrics;
   if (Node().HasRuby() &&
       !RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
-    annotation_metrics = ComputeAnnotationOverflow(line_box_, line_box_metrics,
+    annotation_metrics = ComputeAnnotationOverflow(*line_box, line_box_metrics,
                                                    -line_box_metrics.ascent,
                                                    line_info->LineStyle());
   }
 
-  // Create box fragments if needed. After this point forward, |line_box_| is a
+  // Create box fragments if needed. After this point forward, |line_box| is a
   // tree structure.
-  // The individual children don't move position within the |line_box_|, rather
+  // The individual children don't move position within the |line_box|, rather
   // the children have their layout_result, fragment, (or similar) set to null,
   // creating a "hole" in the array.
   if (box_states_->HasBoxFragments())
-    box_states_->CreateBoxFragments(&line_box_);
+    box_states_->CreateBoxFragments(line_box);
 
   // Update item index of the box states in the context.
   context_->SetItemIndex(line_info->ItemsData().items,
@@ -436,12 +435,12 @@
   // Up until this point, children are placed so that the dominant baseline is
   // at 0. Move them to the final baseline position, and set the logical top of
   // the line box to the line top.
-  line_box_.MoveInBlockDirection(line_box_metrics.ascent);
+  line_box->MoveInBlockDirection(line_box_metrics.ascent);
 
   if (Node().HasRuby() &&
       RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled()) {
     annotation_metrics = ComputeAnnotationOverflow(
-        line_box_, line_box_metrics, LayoutUnit(), line_info->LineStyle());
+        *line_box, line_box_metrics, LayoutUnit(), line_info->LineStyle());
   }
   LayoutUnit annotation_overflow_block_start;
   LayoutUnit annotation_overflow_block_end;
@@ -494,6 +493,7 @@
 void NGInlineLayoutAlgorithm::PlaceControlItem(const NGInlineItem& item,
                                                const NGLineInfo& line_info,
                                                NGInlineItemResult* item_result,
+                                               NGLogicalLineItems* line_box,
                                                NGInlineBoxState* box) {
   DCHECK_EQ(item.Type(), NGInlineItem::kControl);
   DCHECK_GE(item.Length(), 1u);
@@ -530,7 +530,7 @@
   if (UNLIKELY(quirks_mode_ && !box->HasMetrics()))
     box->EnsureTextMetrics(*item.Style(), baseline_type_);
 
-  line_box_.AddChild(item, std::move(item_result->shape_result),
+  line_box->AddChild(item, std::move(item_result->shape_result),
                      item_result->TextOffset(), box->text_top,
                      item_result->inline_size, box->text_height,
                      item.BidiLevel());
@@ -538,13 +538,14 @@
 
 void NGInlineLayoutAlgorithm::PlaceHyphen(const NGInlineItemResult& item_result,
                                           LayoutUnit hyphen_inline_size,
+                                          NGLogicalLineItems* line_box,
                                           NGInlineBoxState* box) {
   DCHECK(item_result.item);
   DCHECK(item_result.hyphen_string);
   DCHECK(item_result.hyphen_shape_result);
   DCHECK_EQ(hyphen_inline_size, item_result.HyphenInlineSize());
   const NGInlineItem& item = *item_result.item;
-  line_box_.AddChild(
+  line_box->AddChild(
       item, ShapeResultView::Create(item_result.hyphen_shape_result.get()),
       item_result.hyphen_string, box->text_top, hyphen_inline_size,
       box->text_height, item.BidiLevel());
@@ -553,7 +554,8 @@
 NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
     const NGInlineItem& item,
     const NGLineInfo& line_info,
-    NGInlineItemResult* item_result) {
+    NGInlineItemResult* item_result,
+    NGLogicalLineItems* line_box) {
   DCHECK(item_result->layout_result);
 
   // The input |position| is the line-left edge of the margin box.
@@ -563,14 +565,15 @@
 
   item_result->has_edge = true;
   NGInlineBoxState* box =
-      box_states_->OnOpenTag(item, *item_result, baseline_type_, line_box_);
-  PlaceLayoutResult(item_result, box, box->margin_inline_start);
-  return box_states_->OnCloseTag(ConstraintSpace(), &line_box_, box,
+      box_states_->OnOpenTag(item, *item_result, baseline_type_, *line_box);
+  PlaceLayoutResult(item_result, line_box, box, box->margin_inline_start);
+  return box_states_->OnCloseTag(ConstraintSpace(), line_box, box,
                                  baseline_type_);
 }
 
 // Place a NGLayoutResult into the line box.
 void NGInlineLayoutAlgorithm::PlaceLayoutResult(NGInlineItemResult* item_result,
+                                                NGLogicalLineItems* line_box,
                                                 NGInlineBoxState* box,
                                                 LayoutUnit inline_offset) {
   DCHECK(item_result->layout_result);
@@ -587,7 +590,7 @@
     box->metrics.Unite(metrics);
 
   LayoutUnit line_top = item_result->margins.line_over - metrics.ascent;
-  line_box_.AddChild(std::move(item_result->layout_result),
+  line_box->AddChild(std::move(item_result->layout_result),
                      LogicalOffset{inline_offset, line_top},
                      item_result->inline_size, /* children_count */ 0,
                      item.BidiLevel());
@@ -596,7 +599,8 @@
 // Place all out-of-flow objects in |line_box_|.
 void NGInlineLayoutAlgorithm::PlaceOutOfFlowObjects(
     const NGLineInfo& line_info,
-    const NGLineHeightMetrics& line_box_metrics) {
+    const NGLineHeightMetrics& line_box_metrics,
+    NGLogicalLineItems* line_box) {
   DCHECK(line_info.IsEmptyLine() || !line_box_metrics.IsEmpty())
       << "Non-empty lines must have a valid set of linebox metrics.";
 
@@ -636,7 +640,7 @@
   bool has_rtl_block_level_out_of_flow_objects = false;
   bool is_ltr = IsLtr(line_info.BaseDirection());
 
-  for (NGLogicalLineItem& child : line_box_) {
+  for (NGLogicalLineItem& child : *line_box) {
     has_preceding_inline_level_content |= child.HasInFlowFragment();
 
     const LayoutObject* box = child.out_of_flow_positioned_box;
@@ -676,7 +680,7 @@
 
   if (UNLIKELY(has_rtl_block_level_out_of_flow_objects)) {
     has_preceding_inline_level_content = false;
-    for (NGLogicalLineItem& child : base::Reversed(line_box_)) {
+    for (NGLogicalLineItem& child : base::Reversed(*line_box)) {
       const LayoutObject* box = child.out_of_flow_positioned_box;
       if (!box) {
         has_preceding_inline_level_content |= child.HasInFlowFragment();
@@ -694,6 +698,7 @@
     const NGLineInfo& line_info,
     const NGLineHeightMetrics& line_box_metrics,
     const NGLineLayoutOpportunity& opportunity,
+    NGLogicalLineItems* line_box,
     NGExclusionSpace* exclusion_space) {
   DCHECK(line_info.IsEmptyLine() || !line_box_metrics.IsEmpty())
       << "Non-empty lines must have a valid set of linebox metrics.";
@@ -716,7 +721,7 @@
                                     ? ConstraintSpace().ExpectedBfcBlockOffset()
                                     : line_info.BfcOffset().block_offset;
 
-  for (NGLogicalLineItem& child : line_box_) {
+  for (NGLogicalLineItem& child : *line_box) {
     // We need to position any floats which should be on the "next" line now.
     // If this is an empty inline, all floats are positioned during the
     // PositionLeadingFloats step.
@@ -764,8 +769,9 @@
   }
 }
 
-void NGInlineLayoutAlgorithm::PlaceRelativePositionedItems() {
-  for (auto& child : line_box_) {
+void NGInlineLayoutAlgorithm::PlaceRelativePositionedItems(
+    NGLogicalLineItems* line_box) {
+  for (auto& child : *line_box) {
     const auto* physical_fragment = child.PhysicalFragment();
     if (!physical_fragment)
       continue;
@@ -991,6 +997,8 @@
   NGExclusionSpace exclusion_space;
   const NGInlineBreakToken* break_token = BreakToken();
 
+  NGLogicalLineItems* line_box = context_->LogicalLineItems();
+
   bool is_line_created = false;
   LayoutUnit line_block_size;
   LayoutUnit block_delta;
@@ -1062,7 +1070,7 @@
     }
 
     PrepareBoxStates(line_info, break_token);
-    CreateLine(line_opportunity, &line_info, &exclusion_space);
+    CreateLine(line_opportunity, &line_info, line_box, &exclusion_space);
     is_line_created = true;
 
     // We now can check the block-size of the fragment, and it fits within the
@@ -1137,17 +1145,17 @@
 
   if (NGFragmentItemsBuilder* items_builder = context_->ItemsBuilder()) {
     DCHECK(RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
-    container_builder_.PropagateChildrenData(line_box_);
+    container_builder_.PropagateChildrenData(*line_box);
     scoped_refptr<const NGLayoutResult> layout_result =
         container_builder_.ToLineBoxFragment();
     items_builder->SetCurrentLine(
         To<NGPhysicalLineBoxFragment>(layout_result->PhysicalFragment()),
-        &line_box_);
+        line_box);
     return layout_result;
   }
 
   DCHECK(!RuntimeEnabledFeatures::LayoutNGFragmentItemEnabled());
-  container_builder_.AddChildren(line_box_);
+  container_builder_.AddChildren(*line_box);
   container_builder_.MoveOutOfFlowDescendantCandidatesToDescendants();
   return container_builder_.ToLineBoxFragment();
 }
@@ -1228,8 +1236,9 @@
   return ::blink::PositionFloat(&unpositioned_float, exclusion_space);
 }
 
-void NGInlineLayoutAlgorithm::BidiReorder(TextDirection base_direction) {
-  if (line_box_.IsEmpty())
+void NGInlineLayoutAlgorithm::BidiReorder(TextDirection base_direction,
+                                          NGLogicalLineItems* line_box) {
+  if (line_box->IsEmpty())
     return;
 
   // TODO(kojii): UAX#9 L1 is not supported yet. Supporting L1 may change
@@ -1247,9 +1256,9 @@
   // handle the direction of each run, we use |ubidi_reorderVisual()| to reorder
   // runs instead of characters.
   Vector<UBiDiLevel, 32> levels;
-  levels.ReserveInitialCapacity(line_box_.size());
+  levels.ReserveInitialCapacity(line_box->size());
   bool has_opaque_items = false;
-  for (NGLogicalLineItem& item : line_box_) {
+  for (NGLogicalLineItem& item : *line_box) {
     if (item.IsOpaqueToBidiReordering()) {
       levels.push_back(kOpaqueBidiLevel);
       has_opaque_items = true;
@@ -1277,15 +1286,15 @@
 
   // Reorder to the visual order.
   NGLogicalLineItems visual_items;
-  visual_items.ReserveInitialCapacity(line_box_.size());
+  visual_items.ReserveInitialCapacity(line_box->size());
   for (unsigned logical_index : indices_in_visual_order) {
-    visual_items.AddChild(std::move(line_box_[logical_index]));
-    DCHECK(!line_box_[logical_index].HasInFlowFragment() ||
+    visual_items.AddChild(std::move((*line_box)[logical_index]));
+    DCHECK(!(*line_box)[logical_index].HasInFlowFragment() ||
            // |inline_item| will not be null by moving.
-           line_box_[logical_index].inline_item);
+           (*line_box)[logical_index].inline_item);
   }
-  DCHECK_EQ(line_box_.size(), visual_items.size());
-  line_box_ = std::move(visual_items);
+  DCHECK_EQ(line_box->size(), visual_items.size());
+  *line_box = std::move(visual_items);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h
index c15d729..7c603fd 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.h
@@ -47,6 +47,7 @@
 
   void CreateLine(const NGLineLayoutOpportunity&,
                   NGLineInfo*,
+                  NGLogicalLineItems* line_box,
                   NGExclusionSpace*);
 
   scoped_refptr<const NGLayoutResult> Layout() override;
@@ -78,29 +79,37 @@
                                   NGInlineLayoutStateStack*) const;
   NGInlineBoxState* HandleCloseTag(const NGInlineItem&,
                                    const NGInlineItemResult&,
+                                   NGLogicalLineItems* line_box,
                                    NGInlineBoxState*);
 
-  void BidiReorder(TextDirection base_direction);
+  void BidiReorder(TextDirection base_direction, NGLogicalLineItems* line_box);
 
   void PlaceControlItem(const NGInlineItem&,
                         const NGLineInfo&,
                         NGInlineItemResult*,
+                        NGLogicalLineItems* line_box,
                         NGInlineBoxState*);
   void PlaceHyphen(const NGInlineItemResult&,
                    LayoutUnit hyphen_inline_size,
+                   NGLogicalLineItems* line_box,
                    NGInlineBoxState*);
   NGInlineBoxState* PlaceAtomicInline(const NGInlineItem&,
                                       const NGLineInfo&,
-                                      NGInlineItemResult*);
+                                      NGInlineItemResult*,
+                                      NGLogicalLineItems* line_box);
   void PlaceLayoutResult(NGInlineItemResult*,
+                         NGLogicalLineItems* line_box,
                          NGInlineBoxState*,
                          LayoutUnit inline_offset = LayoutUnit());
-  void PlaceOutOfFlowObjects(const NGLineInfo&, const NGLineHeightMetrics&);
+  void PlaceOutOfFlowObjects(const NGLineInfo&,
+                             const NGLineHeightMetrics&,
+                             NGLogicalLineItems* line_box);
   void PlaceFloatingObjects(const NGLineInfo&,
                             const NGLineHeightMetrics&,
                             const NGLineLayoutOpportunity&,
+                            NGLogicalLineItems* line_box,
                             NGExclusionSpace*);
-  void PlaceRelativePositionedItems();
+  void PlaceRelativePositionedItems(NGLogicalLineItems* line_box);
   void PlaceListMarker(const NGInlineItem&,
                        NGInlineItemResult*,
                        const NGLineInfo&);
@@ -112,7 +121,6 @@
                                 const NGExclusionSpace&,
                                 LayoutUnit line_height);
 
-  NGLogicalLineItems& line_box_;
   NGInlineLayoutStateStack* box_states_;
   NGInlineChildLayoutContext* context_;
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
index aaa0460..461e2bc 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
@@ -2075,6 +2075,8 @@
     </div>
   )HTML");
 
+  // TODO(bebeaudr): The OOF positioned element should start in the second
+  // column rather than the first.
   String dump = DumpFragmentTree(GetElementById("container"));
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
   offset:unplaced size:1000x70
@@ -2083,12 +2085,13 @@
         offset:0,0 size:100x70
           offset:0,0 size:0x20
           offset:0,20 size:0x20
-        offset:0,40 size:33x33
+        offset:0,40 size:33x30
       offset:110,0 size:100x70
         offset:0,0 size:100x60
           offset:0,0 size:0x20
           offset:0,20 size:0x20
           offset:0,40 size:0x20
+        offset:0,0 size:33x3
 )DUMP";
   EXPECT_EQ(expectation, dump);
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc b/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc
index 3e9a1186..92cd91d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_child_iterator.cc
@@ -100,7 +100,8 @@
     if (layout_object &&
         layout_object !=
             current_.block_break_token_->InputNode().GetLayoutBox()) {
-      DCHECK(current_.link_.fragment->IsColumnSpanAll());
+      DCHECK(current_.link_.fragment->IsColumnSpanAll() ||
+             current_.block_break_token_->InputNode().IsOutOfFlowPositioned());
       current_.break_token_for_fragmentainer_only_ = true;
     } else {
       current_.break_token_for_fragmentainer_only_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index bf0a8e5..e171835 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -665,27 +665,39 @@
           .ConvertToLogical(descendant_writing_mode, descendant_direction,
                             container_physical_content_size);
 
+  // Need a constraint space to resolve offsets.
+  NGConstraintSpaceBuilder builder(default_writing_mode,
+                                   descendant_writing_mode,
+                                   /* is_new_fc */ true);
+  builder.SetTextDirection(descendant_direction);
+  builder.SetAvailableSize(container_content_size);
+  builder.SetPercentageResolutionSize(container_content_size);
+  NGConstraintSpace descendant_constraint_space = builder.ToConstraintSpace();
+
   // TODO(almaher): The index should be based on the fragmentainer that we will
   // start layout in (skipping any column spanner fragments) rather than 0 every
   // time.
   wtf_size_t fragmentainer_index = 0;
-  const NGConstraintSpace& fragmentainer_constraint_space =
-      GetFragmentainerConstraintSpace(fragmentainer_index);
+  const NGBlockBreakToken* break_token = nullptr;
+  do {
+    // TODO(almaher): Create proxy fragment(s) to add the result to if we
+    // surpass the number of child fragments of the fragmentation context.
+    if (break_token)
+      fragmentainer_index++;
 
-  // Need a constraint space to resolve offsets.
-  // TODO(almaher): The block offset should be based on the descendant rather
-  // than on the containing block.
-  NGConstraintSpace descendant_constraint_space =
-      CreateConstraintSpaceForFragmentainerDescendant(
-          node, container_content_size,
-          container_info.container_offset.block_offset,
-          fragmentainer_constraint_space, default_writing_mode);
+    const NGConstraintSpace& fragmentainer_constraint_space =
+        GetFragmentainerConstraintSpace(fragmentainer_index);
+    scoped_refptr<const NGLayoutResult> result =
+        Layout(node, descendant_constraint_space, descendant_static_position,
+               container_content_size, container_info, default_writing_mode,
+               default_direction, nullptr, break_token,
+               &fragmentainer_constraint_space);
+    AddOOFResultToFragmentainerResults(result, fragmentainer_index);
 
-  scoped_refptr<const NGLayoutResult> result =
-      Layout(node, descendant_constraint_space, descendant_static_position,
-             container_content_size, container_info, default_writing_mode,
-             default_direction, nullptr);
-  AddOOFResultToFragmentainerResults(result, fragmentainer_index);
+    const auto& physical_fragment =
+        To<NGPhysicalBoxFragment>(result->PhysicalFragment());
+    break_token = To<NGBlockBreakToken>(physical_fragment.BreakToken());
+  } while (break_token);
 }
 
 scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout(
@@ -696,7 +708,9 @@
     const ContainingBlockInfo& container_info,
     const WritingMode default_writing_mode,
     const TextDirection default_direction,
-    const LayoutBox* only_layout) {
+    const LayoutBox* only_layout,
+    const NGBlockBreakToken* break_token,
+    const NGConstraintSpace* fragmentainer_constraint_space) {
   const ComputedStyle& candidate_style = node.Style();
   const WritingMode candidate_writing_mode = candidate_style.GetWritingMode();
   const TextDirection candidate_direction = candidate_style.Direction();
@@ -805,11 +819,15 @@
         BlockSizeFromAspectRatio(border_padding, *aspect_ratio, sizing,
                                  node_dimensions.size.inline_size));
   }
+
+  // TODO(almaher): Handle fragmentation separately for the case where
+  // |absolute_needs_child_block_size| is true.
   if (absolute_needs_child_block_size) {
     DCHECK(!has_computed_block_dimensions);
-    layout_result =
-        GenerateFragment(node, container_content_size_in_candidate_writing_mode,
-                         block_estimate, node_dimensions);
+    layout_result = GenerateFragment(
+        node, container_content_size_in_candidate_writing_mode, block_estimate,
+        node_dimensions, /* block_offset */ LayoutUnit(), break_token,
+        /* fragmentainer_constraint_space */ nullptr);
 
     // TODO(layout-dev): Handle abortions caused by block fragmentation.
     DCHECK(layout_result->Status() != NGLayoutResult::kOutOfFragmentainerSpace);
@@ -891,6 +909,9 @@
     }
   }
 
+  if (break_token)
+    offset.block_offset = LayoutUnit();
+
   // We have calculated the offsets, and if we need to lay out, we can do so at
   // the correct block-start offset now.
 
@@ -901,7 +922,8 @@
     block_estimate = node_dimensions.size.block_size;
     layout_result =
         GenerateFragment(node, container_content_size_in_candidate_writing_mode,
-                         block_estimate, node_dimensions);
+                         block_estimate, node_dimensions, offset.block_offset,
+                         break_token, fragmentainer_constraint_space);
   }
 
   // TODO(layout-dev): Handle abortions caused by block fragmentation.
@@ -967,7 +989,10 @@
     NGBlockNode node,
     const LogicalSize& container_content_size_in_candidate_writing_mode,
     const base::Optional<LayoutUnit>& block_estimate,
-    const NGLogicalOutOfFlowDimensions& node_dimensions) {
+    const NGLogicalOutOfFlowDimensions& node_dimensions,
+    const LayoutUnit block_offset,
+    const NGBlockBreakToken* break_token,
+    const NGConstraintSpace* fragmentainer_constraint_space) {
   // As the |block_estimate| is always in the node's writing mode, we build the
   // constraint space in the node's writing mode.
   WritingMode writing_mode = node.Style().GetWritingMode();
@@ -988,9 +1013,14 @@
   builder.SetIsFixedInlineSize(true);
   if (block_estimate)
     builder.SetIsFixedBlockSize(true);
+  if (fragmentainer_constraint_space) {
+    SetupSpaceBuilderForFragmentation(*fragmentainer_constraint_space, node,
+                                      block_offset, &builder,
+                                      /* is_new_fc */ true);
+  }
   NGConstraintSpace space = builder.ToConstraintSpace();
 
-  return node.Layout(space);
+  return node.Layout(space, break_token);
 }
 
 void NGOutOfFlowLayoutPart::AddOOFResultsToFragmentainer(
@@ -1055,27 +1085,6 @@
       .stored_value->value;
 }
 
-NGConstraintSpace
-NGOutOfFlowLayoutPart::CreateConstraintSpaceForFragmentainerDescendant(
-    const NGBlockNode& descendant,
-    const LogicalSize& content_size,
-    const LayoutUnit block_offset,
-    const NGConstraintSpace& fragmentainer_constraint_space,
-    const WritingMode default_writing_mode) const {
-  const ComputedStyle& descendant_style = descendant.Style();
-  NGConstraintSpaceBuilder builder(default_writing_mode,
-                                   descendant_style.GetWritingMode(),
-                                   /* is_new_fc */ true);
-  builder.SetTextDirection(descendant_style.Direction());
-  builder.SetAvailableSize(content_size);
-  builder.SetPercentageResolutionSize(content_size);
-
-  SetupSpaceBuilderForFragmentation(fragmentainer_constraint_space, descendant,
-                                    block_offset, &builder,
-                                    /* is_new_fc */ true);
-  return builder.ToConstraintSpace();
-}
-
 void NGOutOfFlowLayoutPart::AddOOFResultToFragmentainerResults(
     const scoped_refptr<const NGLayoutResult> result,
     const wtf_size_t index) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
index 92ff2d2..c2768ff 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -20,6 +20,7 @@
 class ComputedStyle;
 class LayoutBox;
 class LayoutObject;
+class NGBlockBreakToken;
 class NGBlockNode;
 class NGBoxFragmentBuilder;
 class NGLayoutResult;
@@ -114,26 +115,23 @@
 
   void LayoutFragmentainerDescendant(const NGLogicalOutOfFlowPositionedNode&);
 
-  scoped_refptr<const NGLayoutResult> Layout(NGBlockNode,
-                                             const NGConstraintSpace&,
-                                             const NGLogicalStaticPosition&,
-                                             LogicalSize container_content_size,
-                                             const ContainingBlockInfo&,
-                                             const WritingMode,
-                                             const TextDirection,
-                                             const LayoutBox* only_layout);
+  scoped_refptr<const NGLayoutResult> Layout(
+      NGBlockNode,
+      const NGConstraintSpace&,
+      const NGLogicalStaticPosition&,
+      LogicalSize container_content_size,
+      const ContainingBlockInfo&,
+      const WritingMode,
+      const TextDirection,
+      const LayoutBox* only_layout,
+      const NGBlockBreakToken* break_token = nullptr,
+      const NGConstraintSpace* fragmentainer_constraint_space = nullptr);
 
   bool IsContainingBlockForCandidate(const NGLogicalOutOfFlowPositionedNode&);
 
   void AddOOFResultsToFragmentainer(
       const Vector<scoped_refptr<const NGLayoutResult>>& results,
       const wtf_size_t index);
-  NGConstraintSpace CreateConstraintSpaceForFragmentainerDescendant(
-      const NGBlockNode& descendant,
-      const LogicalSize& content_size,
-      const LayoutUnit block_offset,
-      const NGConstraintSpace& fragmentainer_constraint_space,
-      const WritingMode default_writing_mode) const;
   const NGConstraintSpace& GetFragmentainerConstraintSpace(
       const wtf_size_t index);
   void AddOOFResultToFragmentainerResults(
@@ -143,7 +141,10 @@
       NGBlockNode node,
       const LogicalSize& container_content_size_in_child_writing_mode,
       const base::Optional<LayoutUnit>& block_estimate,
-      const NGLogicalOutOfFlowDimensions& node_dimensions);
+      const NGLogicalOutOfFlowDimensions& node_dimensions,
+      const LayoutUnit block_offset,
+      const NGBlockBreakToken* break_token,
+      const NGConstraintSpace* fragmentainer_constraint_space);
 
   const NGConstraintSpace& container_space_;
   NGBoxFragmentBuilder* container_builder_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
index 72b09b9..8837eb8 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
@@ -103,8 +103,8 @@
   EXPECT_EQ(fixed_2->OffsetTop(), LayoutUnit(9));
 }
 
-// Tests that positioned nodes fragment correctly.
-TEST_F(NGOutOfFlowLayoutPartTest, PositionedFragmentation) {
+// Tests non-fragmented positioned nodes inside a multi-column.
+TEST_F(NGOutOfFlowLayoutPartTest, PositionedInMulticol) {
   SetBodyInnerHTML(
       R"HTML(
       <style>
@@ -149,5 +149,94 @@
   EXPECT_EQ(expectation, dump);
 }
 
+// Tests that positioned nodes fragment correctly.
+TEST_F(NGOutOfFlowLayoutPartTest, SimplePositionedFragmentation) {
+  SetBodyInnerHTML(
+      R"HTML(
+      <style>
+        #multicol {
+          column-count:2; column-fill:auto; column-gap:16px; height:40px;
+        }
+        .rel {
+          position: relative; width:30px;
+        }
+        .abs {
+          position:absolute; top:0px; width:5px; height:50px;
+          border:solid 2px; margin-top:5px; padding:5px;
+        }
+      </style>
+      <div id="container">
+        <div id="multicol">
+          <div style="width:100px; height:50px;"></div>
+          <div class="rel">
+            <div class="abs"></div>
+          </div>
+        </div>
+      </div>
+      )HTML");
+  String dump = DumpFragmentTree(GetElementById("container"));
+
+  // TODO(bebeaudr): The OOF positioned element should start in the second
+  // column rather than the first.
+  String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
+  offset:unplaced size:1000x40
+    offset:0,0 size:1000x40
+      offset:0,0 size:492x40
+        offset:0,0 size:100x40
+        offset:0,5 size:19x35
+      offset:508,0 size:492x40
+        offset:0,0 size:100x10
+        offset:0,10 size:30x0
+        offset:0,0 size:19x29
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
+// Tests fragmentation when a positioned node's child overflows.
+TEST_F(NGOutOfFlowLayoutPartTest, PositionedFragmentationWithOverflow) {
+  SetBodyInnerHTML(
+      R"HTML(
+      <style>
+        #multicol {
+          column-count:2; column-fill:auto; column-gap:16px; height:40px;
+        }
+        .rel {
+          position: relative; width:30px;
+        }
+        .abs {
+          position:absolute; top:10px; width:5px; height:10px;
+        }
+      </style>
+      <div id="container">
+        <div id="multicol">
+          <div class="rel">
+            <div class="abs">
+              <div style="width:100px; height:50px;"></div>
+            </div>
+          </div>
+          <div style="width:20px; height:100px;"></div>
+        </div>
+      </div>
+      )HTML");
+  String dump = DumpFragmentTree(GetElementById("container"));
+
+  String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
+  offset:unplaced size:1000x40
+    offset:0,0 size:1000x40
+      offset:0,0 size:492x40
+        offset:0,0 size:30x0
+        offset:0,0 size:20x40
+        offset:0,10 size:5x10
+          offset:0,0 size:100x30
+      offset:508,0 size:492x40
+        offset:0,0 size:20x40
+        offset:0,0 size:5x0
+          offset:0,0 size:100x20
+      offset:1016,0 size:492x40
+        offset:0,0 size:20x20
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 68432d4..eb4227d 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1683,8 +1683,10 @@
   if (global_object_reuse_policy != GlobalObjectReusePolicy::kUseExisting) {
     if (frame_->GetDocument())
       frame_->GetDocument()->RemoveAllEventListenersRecursively();
-    frame_->SetDOMWindow(MakeGarbageCollected<LocalDOMWindow>(
-        *frame_, GetWindowAgentForOrigin(frame_.Get(), security_origin.get())));
+
+    auto* agent = GetWindowAgentForOrigin(frame_.Get(), security_origin.get());
+    frame_->SetDOMWindow(MakeGarbageCollected<LocalDOMWindow>(*frame_, agent));
+
     if (origin_policy_.has_value()) {
       // Convert from WebVector<WebString> to WTF::Vector<WTF::String>
       Vector<String> ids;
@@ -1694,6 +1696,18 @@
 
       frame_->DomWindow()->SetOriginPolicyIds(ids);
     }
+
+    // Inheriting cases use their agent's origin-isolated value, which is set by
+    // whatever they're inheriting from.
+    //
+    // TODO(https://crbug.com/1111897): This call is likely to happen happen
+    // multiple times per agent, since navigations can happen multiple times per
+    // agent. This is subpar. Currently a DCHECK guards against it happening
+    // multiple times *with different values*, but ideally we would use a better
+    // architecture.
+    if (!Document::ShouldInheritSecurityOriginFromOwner(Url())) {
+      agent->SetIsOriginIsolated(origin_isolation_restricted_);
+    }
   } else {
     if (frame_->GetSettings()->GetShouldReuseGlobalForUnownedMainFrame() &&
         frame_->IsMainFrame()) {
@@ -1741,9 +1755,6 @@
       document_policy_,
       response_.HttpHeaderField(http_names::kDocumentPolicyReportOnly));
 
-  frame_->DomWindow()->SetOriginIsolationRestricted(
-      origin_isolation_restricted_);
-
   if (auto* parent = frame_->Tree().Parent()) {
     SecurityContext& this_context = frame_->DomWindow()->GetSecurityContext();
     const SecurityContext* parent_context = parent->GetSecurityContext();
diff --git a/third_party/blink/renderer/core/paint/box_paint_invalidator.cc b/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
index 77e399a..4207af62 100644
--- a/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
+++ b/third_party/blink/renderer/core/paint/box_paint_invalidator.cc
@@ -241,34 +241,40 @@
       layout_view.BackgroundNeedsFullPaintInvalidation())
     return BackgroundInvalidationType::kFull;
 
-  if (Element* document_element = box_.GetDocument().documentElement()) {
-    if (document_element) {
-      if (const auto* document_element_object =
-              document_element->GetLayoutObject()) {
+  if (Element* root_element = box_.GetDocument().documentElement()) {
+    if (const auto* root_object = root_element->GetLayoutObject()) {
+      if (root_object->IsBox()) {
+        const auto* root_box = ToLayoutBox(root_object);
         // LayoutView's non-fixed-attachment background is positioned in the
-        // document element and needs to invalidate if the size changes.
+        // root element and needs to invalidate if the size changes.
         // See: https://drafts.csswg.org/css-backgrounds-3/#root-background.
-        if (BackgroundGeometryDependsOnLayoutOverflowRect()) {
-          if (document_element_object->IsBox()) {
-            const auto* document_background_box =
-                ToLayoutBox(document_element_object);
-            if (ShouldFullyInvalidateBackgroundOnLayoutOverflowChange(
-                    document_background_box
-                        ->PreviousPhysicalLayoutOverflowRect(),
-                    document_background_box->PhysicalLayoutOverflowRect())) {
-              return BackgroundInvalidationType::kFull;
-            }
-          }
+        const auto& background_layers = box_.StyleRef().BackgroundLayers();
+        if (ShouldFullyInvalidateFillLayersOnSizeChange(
+                background_layers,
+                PhysicalSizeToBeNoop(root_box->PreviousSize()),
+                PhysicalSizeToBeNoop(root_box->Size()))) {
+          return BackgroundInvalidationType::kFull;
         }
-
-        // The document background paints with a transform but nevertheless
-        // extended onto an infinite canvas. In cases where it has a transform
-        // we cna't apply incremental invalidation, because the visual rect is
-        // no longer axis-aligned to the LayoutView.
-        if (document_element_object->StyleRef().HasTransform()) {
+        if (BackgroundGeometryDependsOnLayoutOverflowRect() &&
+            ShouldFullyInvalidateBackgroundOnLayoutOverflowChange(
+                root_box->PreviousPhysicalLayoutOverflowRect(),
+                root_box->PhysicalLayoutOverflowRect())) {
+          return BackgroundInvalidationType::kFull;
+        }
+        // It also uses the root element's content box in case the background
+        // comes from the root element and positioned in content box.
+        if (background_layers.AnyLayerUsesContentBox() &&
+            root_box->PreviousPhysicalContentBoxRect() !=
+                root_box->PhysicalContentBoxRect()) {
           return BackgroundInvalidationType::kFull;
         }
       }
+      // The view background paints with a transform but nevertheless extended
+      // onto an infinite canvas. In cases where it has a transform we can't
+      // apply incremental invalidation, because the visual rect is no longer
+      // axis-aligned to the LayoutView.
+      if (root_object->StyleRef().HasTransform())
+        return BackgroundInvalidationType::kFull;
     }
   }
 
@@ -394,8 +400,9 @@
       box_.ContentSize() != box_.Size())
     return true;
   if ((BackgroundGeometryDependsOnLayoutOverflowRect() ||
-       BackgroundPaintsOntoScrollingContentsLayer()) &&
-      box_.LayoutOverflowRect() != box_.BorderBoxRect())
+       BackgroundPaintsOntoScrollingContentsLayer() ||
+       !box_.HasOverflowClip()) &&
+      box_.HasLayoutOverflow())
     return true;
 
   return false;
diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
index 5f264c0..8b15a46 100644
--- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
+++ b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc
@@ -97,16 +97,15 @@
     root_layer->SetNeedsCompositingInputsUpdate();
 }
 
-void PaintLayerCompositor::UpdateCompositingInputsIfNeededRecursive(
+void PaintLayerCompositor::UpdateInputsIfNeededRecursive(
     DocumentLifecycle::LifecycleState target_state) {
   DCHECK_GE(target_state, DocumentLifecycle::kCompositingInputsClean);
-  TRACE_EVENT0(
-      "blink,benchmark",
-      "PaintLayerCompositor::UpdateCompositingInputsIfNeededRecursive");
-  UpdateCompositingInputsIfNeededRecursiveInternal(target_state);
+  TRACE_EVENT0("blink,benchmark",
+               "PaintLayerCompositor::UpdateInputsIfNeededRecursive");
+  UpdateInputsIfNeededRecursiveInternal(target_state);
 }
 
-void PaintLayerCompositor::UpdateCompositingInputsIfNeededRecursiveInternal(
+void PaintLayerCompositor::UpdateInputsIfNeededRecursiveInternal(
     DocumentLifecycle::LifecycleState target_state) {
   if (layout_view_->GetFrameView()->ShouldThrottleRendering())
     return;
@@ -125,7 +124,7 @@
         local_frame->ContentLayoutObject()) {
       local_frame->ContentLayoutObject()
           ->Compositor()
-          ->UpdateCompositingInputsIfNeededRecursiveInternal(target_state);
+          ->UpdateInputsIfNeededRecursiveInternal(target_state);
     }
   }
 
@@ -174,12 +173,11 @@
 #endif
 }
 
-void PaintLayerCompositor::UpdateIfNeededRecursive(
+void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive(
     DocumentLifecycle::LifecycleState target_state) {
-  DCHECK_GE(target_state, DocumentLifecycle::kCompositingInputsClean);
-  UpdateCompositingInputsIfNeededRecursiveInternal(target_state);
   CompositingReasonsStats compositing_reasons_stats;
-  UpdateIfNeededRecursiveInternal(target_state, compositing_reasons_stats);
+  UpdateAssignmentsIfNeededRecursiveInternal(target_state,
+                                             compositing_reasons_stats);
   UMA_HISTOGRAM_CUSTOM_COUNTS("Blink.Compositing.LayerPromotionCount.Overlap",
                               compositing_reasons_stats.overlap_layers, 1, 100,
                               5);
@@ -197,7 +195,7 @@
       compositing_reasons_stats.total_composited_layers, 1, 1000, 10);
 }
 
-void PaintLayerCompositor::UpdateIfNeededRecursiveInternal(
+void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursiveInternal(
     DocumentLifecycle::LifecycleState target_state,
     CompositingReasonsStats& compositing_reasons_stats) {
   if (layout_view_->GetFrameView()->ShouldThrottleRendering())
@@ -223,19 +221,19 @@
         local_frame->ContentLayoutObject()) {
       local_frame->ContentLayoutObject()
           ->Compositor()
-          ->UpdateIfNeededRecursiveInternal(target_state,
-                                            compositing_reasons_stats);
+          ->UpdateAssignmentsIfNeededRecursiveInternal(
+              target_state, compositing_reasons_stats);
     }
   }
 
   TRACE_EVENT0("blink,benchmark",
-               "PaintLayerCompositor::updateIfNeededRecursive");
+               "PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive");
 
   DCHECK(!layout_view_->NeedsLayout());
 
   ScriptForbiddenScope forbid_script;
 
-  UpdateIfNeeded(target_state, compositing_reasons_stats);
+  UpdateAssignmentsIfNeeded(target_state, compositing_reasons_stats);
 
 #if DCHECK_IS_ON()
   DCHECK_EQ(Lifecycle().GetState(), DocumentLifecycle::kCompositingClean);
@@ -285,7 +283,7 @@
 }
 #endif
 
-void PaintLayerCompositor::UpdateIfNeeded(
+void PaintLayerCompositor::UpdateAssignmentsIfNeeded(
     DocumentLifecycle::LifecycleState target_state,
     CompositingReasonsStats& compositing_reasons_stats) {
   DCHECK(target_state >= DocumentLifecycle::kCompositingClean);
diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h
index 3df6fb1..3a08814 100644
--- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h
+++ b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h
@@ -75,8 +75,9 @@
   // pointers out of this object become invalid.
   void CleanUp();
 
-  void UpdateIfNeededRecursive(DocumentLifecycle::LifecycleState target_state);
-  void UpdateCompositingInputsIfNeededRecursive(
+  void UpdateInputsIfNeededRecursive(
+      DocumentLifecycle::LifecycleState target_state);
+  void UpdateAssignmentsIfNeededRecursive(
       DocumentLifecycle::LifecycleState target_state);
 
   // Return true if this LayoutView is in "compositing mode" (i.e. has one or
@@ -152,14 +153,14 @@
   void AssertNoUnresolvedDirtyBits();
 #endif
 
-  void UpdateIfNeededRecursiveInternal(
+  void UpdateAssignmentsIfNeededRecursiveInternal(
       DocumentLifecycle::LifecycleState target_state,
       CompositingReasonsStats&);
-  void UpdateCompositingInputsIfNeededRecursiveInternal(
+  void UpdateInputsIfNeededRecursiveInternal(
       DocumentLifecycle::LifecycleState target_state);
 
-  void UpdateIfNeeded(DocumentLifecycle::LifecycleState target_state,
-                      CompositingReasonsStats&);
+  void UpdateAssignmentsIfNeeded(DocumentLifecycle::LifecycleState target_state,
+                                 CompositingReasonsStats&);
 
   void SetOwnerNeedsCompositingInputsUpdate();
 
diff --git a/third_party/blink/renderer/core/paint/fragment_data.h b/third_party/blink/renderer/core/paint/fragment_data.h
index f4a3ab0..a4fa933 100644
--- a/third_party/blink/renderer/core/paint/fragment_data.h
+++ b/third_party/blink/renderer/core/paint/fragment_data.h
@@ -35,14 +35,6 @@
     paint_offset_ = paint_offset;
   }
 
-  // Visual rect in the space of the the local transform space.
-  const PhysicalRect& VisualRectForLayoutShiftTracking() const {
-    return visual_rect_for_layout_shift_tracking_;
-  }
-  void SetVisualRectForLayoutShiftTracking(const PhysicalRect& rect) {
-    visual_rect_for_layout_shift_tracking_ = rect;
-  }
-
   // An id for this object that is unique for the lifetime of the WebView.
   UniqueObjectId UniqueId() const {
     DCHECK(rare_data_);
@@ -250,8 +242,6 @@
   RareData& EnsureRareData();
 
   PhysicalOffset paint_offset_;
-  PhysicalRect visual_rect_for_layout_shift_tracking_;
-
   std::unique_ptr<RareData> rare_data_;
 };
 
diff --git a/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc b/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
index 40e2ecc..8a5f1bd3 100644
--- a/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_and_raster_invalidation_test.cc
@@ -516,8 +516,8 @@
   // raster invalidation for the frame contents.
   EXPECT_THAT(GetRasterInvalidationTracking()->Invalidations(),
               UnorderedElementsAre(RasterInvalidationInfo{
-                  client, client->DebugName(), IntRect(0, 100, 100, 100),
-                  PaintInvalidationReason::kIncremental}));
+                  client, client->DebugName(), IntRect(0, 0, 100, 200),
+                  PaintInvalidationReason::kBackground}));
   GetDocument().View()->SetTracksRasterInvalidations(false);
 }
 
diff --git a/third_party/blink/renderer/core/paint/paint_invalidator.cc b/third_party/blink/renderer/core/paint/paint_invalidator.cc
index e92d928..bcb4ee56 100644
--- a/third_party/blink/renderer/core/paint/paint_invalidator.cc
+++ b/third_party/blink/renderer/core/paint/paint_invalidator.cc
@@ -149,30 +149,6 @@
   DCHECK(tree_context);
   DCHECK_EQ(tree_context->current.paint_offset, fragment_data.PaintOffset());
 
-  // LayoutShiftTracker doesn't track SVG children. Also the visual rect
-  // calculation below works for non-SVG-child objects only.
-  if (!object.IsSVGChild()) {
-    PhysicalRect new_visual_rect = object.LocalVisualRect();
-    new_visual_rect.Move(fragment_data.PaintOffset());
-    // If the layout shift root has changed, LayoutShiftTracker can't use the
-    // current paint property tree to map the old visual rect.
-    if (!tree_context->current.layout_shift_root_changed) {
-      // Adjust old_visual_rect so that LayoutShiftTracker can see the change of
-      // offset caused by change of transforms below the 2d translation root.
-      PhysicalRect old_visual_rect =
-          fragment_data.VisualRectForLayoutShiftTracking();
-      old_visual_rect.Move(
-          -tree_context->current.additional_offset_to_layout_shift_root_delta);
-      object.GetFrameView()->GetLayoutShiftTracker().NotifyObjectPrePaint(
-          object,
-          PropertyTreeStateOrAlias(*tree_context->current.transform,
-                                   *tree_context->current.clip,
-                                   *tree_context->current_effect),
-          old_visual_rect, new_visual_rect);
-    }
-    fragment_data.SetVisualRectForLayoutShiftTracking(new_visual_rect);
-  }
-
   // For performance, we ignore subpixel movement of composited layers for paint
   // invalidation. This will result in imperfect pixel-snapped painting.
   // See crbug.com/833083 for details.
@@ -182,6 +158,113 @@
     context.old_paint_offset = fragment_data.PaintOffset();
 }
 
+void PaintInvalidator::UpdateForLayoutShiftTracking(
+    const LayoutObject& object,
+    FragmentData& fragment_data,
+    PaintInvalidatorContext& context) {
+  const auto* tree_context = context.tree_builder_context_;
+  DCHECK(tree_context);
+
+  if (!object.ShouldCheckGeometryForPaintInvalidation())
+    return;
+
+  auto& layout_shift_tracker = object.GetFrameView()->GetLayoutShiftTracker();
+  if (!layout_shift_tracker.NeedsToTrack(object))
+    return;
+
+  PropertyTreeStateOrAlias property_tree_state(*tree_context->current.transform,
+                                               *tree_context->current.clip,
+                                               *tree_context->current_effect);
+
+  if (object.IsText()) {
+    const auto& text = ToLayoutText(object);
+    LogicalOffset new_starting_point = text.LogicalStartingPoint();
+    LogicalOffset old_starting_point = text.PreviousLogicalStartingPoint();
+    if (new_starting_point == old_starting_point)
+      return;
+    text.SetPreviousLogicalStartingPoint(new_starting_point);
+    if (old_starting_point == LayoutText::UninitializedLogicalStartingPoint())
+      return;
+    // If the layout shift root has changed, LayoutShiftTracker can't use the
+    // current paint property tree to map the old rect.
+    if (tree_context->current.layout_shift_root_changed)
+      return;
+
+    layout_shift_tracker.NotifyTextPrePaint(
+        text, property_tree_state, old_starting_point, new_starting_point,
+        // Similar to the adjustment of old_paint_offset for LayoutBox.
+        context.old_paint_offset -
+            tree_context->current.additional_offset_to_layout_shift_root_delta,
+        fragment_data.PaintOffset());
+    return;
+  }
+
+  DCHECK(object.IsBox());
+  const auto& box = ToLayoutBox(object);
+
+  PhysicalRect new_rect = box.HasOverflowClip()
+                              ? box.PhysicalBorderBoxRect()
+                              : box.PhysicalLayoutOverflowRect();
+  // If we didn't save the previous physical layout overflow rect, (e.g. if
+  // there was no layout overflow or we clipped overflow and there was no other
+  // reason for saving the value) this is the previous PhysicalBorderBoxRect(),
+  // so it is mostly the correct previous rect for layout shift tracking.
+  PhysicalRect old_rect = box.PreviousPhysicalLayoutOverflowRect();
+
+  bool should_report_layout_shift = [&]() -> bool {
+    // If the layout shift root has changed, LayoutShiftTracker can't use the
+    // current paint property tree to map the old rect.
+    if (tree_context->current.layout_shift_root_changed)
+      return false;
+    if (new_rect.IsEmpty() || old_rect.IsEmpty())
+      return false;
+    // The parent of out-of-flow-positioned object may not be its container.
+    if (object.IsOutOfFlowPositioned())
+      return true;
+    // We don't report shift for anonymous objects but report for the children.
+    if (object.Parent()->IsAnonymous())
+      return true;
+    // Report if the parent is in a different transform space.
+    const auto* parent_context = context.ParentContext();
+    if (!parent_context || !parent_context->tree_builder_context_ ||
+        parent_context->tree_builder_context_->current.transform !=
+            tree_context->current.transform)
+      return true;
+    // Report if this object has local movement (i.e. delta of paint offset is
+    // different from that of the parent).
+    return parent_context->fragment_data->PaintOffset() -
+               parent_context->old_paint_offset !=
+           fragment_data.PaintOffset() - context.old_paint_offset;
+  }();
+
+  if (!should_report_layout_shift && !box.ChildrenInline())
+    return;
+
+  new_rect.Move(fragment_data.PaintOffset());
+  old_rect.Move(context.old_paint_offset);
+  // Adjust old_visual_rect so that LayoutShiftTracker can see the change of
+  // offset caused by change of transforms below the 2d translation root.
+  old_rect.Move(
+      -tree_context->current.additional_offset_to_layout_shift_root_delta);
+
+  if (box.ChildrenInline()) {
+    // For layout shift tracking of contained LayoutTexts.
+    context.containing_block_scope_.emplace(
+        PhysicalSizeToBeNoop(box.PreviousSize()),
+        PhysicalSizeToBeNoop(box.Size()), old_rect, new_rect);
+    if (!should_report_layout_shift)
+      return;
+  }
+
+  // Adjust old_paint_offset similarly.
+  PhysicalOffset old_paint_offset =
+      context.old_paint_offset -
+      tree_context->current.additional_offset_to_layout_shift_root_delta;
+  layout_shift_tracker.NotifyBoxPrePaint(box, property_tree_state, old_rect,
+                                         new_rect, old_paint_offset,
+                                         fragment_data.PaintOffset());
+}
+
 bool PaintInvalidator::InvalidatePaint(
     const LayoutObject& object,
     const NGPrePaintInfo* pre_paint_info,
@@ -226,6 +309,7 @@
       context.old_paint_offset =
           context.tree_builder_context_->old_paint_offset;
       UpdateForPaintOffsetChange(object, fragment_data, context);
+      UpdateForLayoutShiftTracking(object, fragment_data, context);
     } else {
       context.tree_builder_context_ = nullptr;
       context.old_paint_offset = fragment_data.PaintOffset();
@@ -249,6 +333,7 @@
         context.old_paint_offset =
             context.tree_builder_context_->old_paint_offset;
         UpdateForPaintOffsetChange(object, *fragment_data, context);
+        UpdateForLayoutShiftTracking(object, *fragment_data, context);
       } else {
         context.tree_builder_context_ = nullptr;
         context.old_paint_offset = fragment_data->PaintOffset();
diff --git a/third_party/blink/renderer/core/paint/paint_invalidator.h b/third_party/blink/renderer/core/paint/paint_invalidator.h
index 3417989c..889e8b27 100644
--- a/third_party/blink/renderer/core/paint/paint_invalidator.h
+++ b/third_party/blink/renderer/core/paint/paint_invalidator.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_PAINT_INVALIDATOR_H_
 
 #include "third_party/blink/renderer/core/layout/layout_object.h"
+#include "third_party/blink/renderer/core/layout/layout_shift_tracker.h"
 #include "third_party/blink/renderer/core/paint/paint_property_tree_builder.h"
 #include "third_party/blink/renderer/platform/geometry/layout_rect.h"
 #include "third_party/blink/renderer/platform/graphics/paint_invalidation_reason.h"
@@ -103,6 +104,8 @@
  private:
   friend class PaintInvalidator;
 
+  base::Optional<LayoutShiftTracker::ContainingBlockScope>
+      containing_block_scope_;
   const PaintPropertyTreeBuilderFragmentContext* tree_builder_context_ =
       nullptr;
 };
@@ -137,6 +140,9 @@
   ALWAYS_INLINE void UpdateForPaintOffsetChange(const LayoutObject&,
                                                 FragmentData&,
                                                 PaintInvalidatorContext&);
+  ALWAYS_INLINE void UpdateForLayoutShiftTracking(const LayoutObject&,
+                                                  FragmentData&,
+                                                  PaintInvalidatorContext&);
 
   Vector<const LayoutObject*> pending_delayed_paint_invalidations_;
 };
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
index 3338581..2a516fab 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
@@ -143,8 +143,8 @@
 // should be destructed on the IO thread.
 class WebMediaPlayerMS::FrameDeliverer {
  public:
-  using RepaintCB =
-      WTF::CrossThreadRepeatingFunction<void(scoped_refptr<media::VideoFrame>)>;
+  using RepaintCB = WTF::CrossThreadRepeatingFunction<
+      void(scoped_refptr<media::VideoFrame> frame, bool is_copy)>;
   FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player,
                  RepaintCB enqueue_frame_cb,
                  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
@@ -182,7 +182,7 @@
 #endif  // defined(OS_ANDROID)
 
     if (!gpu_memory_buffer_pool_) {
-      EnqueueFrame(std::move(frame));
+      EnqueueFrame(frame, frame);
       return;
     }
 
@@ -201,7 +201,7 @@
     // frames is unnecessary, because the frames are not going to be shown for
     // the time period.
     if (render_frame_suspended_ || skip_creating_gpu_memory_buffer) {
-      EnqueueFrame(std::move(frame));
+      EnqueueFrame(frame, frame);
       // If there are any existing MaybeCreateHardwareFrame() calls, we do not
       // want those frames to be placed after the current one, so just drop
       // them.
@@ -219,10 +219,10 @@
         FROM_HERE,
         base::BindOnce(
             &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
-            base::Unretained(gpu_memory_buffer_pool_.get()), std::move(frame),
+            base::Unretained(gpu_memory_buffer_pool_.get()), frame,
             media::BindToCurrentLoop(
                 base::BindOnce(&FrameDeliverer::EnqueueFrame,
-                               weak_factory_for_pool_.GetWeakPtr()))));
+                               weak_factory_for_pool_.GetWeakPtr(), frame))));
   }
 
   void SetRenderFrameSuspended(bool render_frame_suspended) {
@@ -230,7 +230,9 @@
     render_frame_suspended_ = render_frame_suspended;
   }
 
-  RepaintCB GetRepaintCallback() {
+  WTF::CrossThreadRepeatingFunction<
+      void(scoped_refptr<media::VideoFrame> frame)>
+  GetRepaintCallback() {
     return CrossThreadBindRepeating(&FrameDeliverer::OnVideoFrame,
                                     weak_factory_.GetWeakPtr());
   }
@@ -238,7 +240,8 @@
  private:
   friend class WebMediaPlayerMS;
 
-  void EnqueueFrame(scoped_refptr<media::VideoFrame> frame) {
+  void EnqueueFrame(scoped_refptr<media::VideoFrame> original_frame,
+                    scoped_refptr<media::VideoFrame> frame) {
     DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_);
 
     {
@@ -254,7 +257,8 @@
       }
     }
 
-    enqueue_frame_cb_.Run(std::move(frame));
+    bool is_copy = original_frame != frame;
+    enqueue_frame_cb_.Run(std::move(frame), is_copy);
   }
 
   void DropCurrentPoolTasks() {
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc
index fa18da5..02fa58e 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.cc
@@ -328,7 +328,8 @@
 }
 
 void WebMediaPlayerMSCompositor::EnqueueFrame(
-    scoped_refptr<media::VideoFrame> frame) {
+    scoped_refptr<media::VideoFrame> frame,
+    bool is_copy) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
   base::AutoLock auto_lock(current_frame_lock_);
   TRACE_EVENT_INSTANT1("media", "WebMediaPlayerMSCompositor::EnqueueFrame",
@@ -338,14 +339,14 @@
 
   // With algorithm off, just let |current_frame_| hold the incoming |frame|.
   if (!rendering_frame_buffer_) {
-    RenderWithoutAlgorithm(std::move(frame));
+    RenderWithoutAlgorithm(std::move(frame), is_copy);
     return;
   }
 
   // This is a signal frame saying that the stream is stopped.
   if (frame->metadata()->end_of_stream) {
     rendering_frame_buffer_.reset();
-    RenderWithoutAlgorithm(std::move(frame));
+    RenderWithoutAlgorithm(std::move(frame), is_copy);
     return;
   }
 
@@ -357,7 +358,7 @@
         << "Incoming VideoFrames have no reference_time, switching off super "
            "sophisticated rendering algorithm";
     rendering_frame_buffer_.reset();
-    RenderWithoutAlgorithm(std::move(frame));
+    RenderWithoutAlgorithm(std::move(frame), is_copy);
     return;
   }
   base::TimeTicks render_time = *frame->metadata()->reference_time;
@@ -375,11 +376,12 @@
     // increase |dropped_frame_count_| by the count of all other frames.
     dropped_frame_count_ += rendering_frame_buffer_->frames_queued() - 1;
     rendering_frame_buffer_->Reset();
-    timestamps_to_clock_times_.clear();
-    RenderWithoutAlgorithm(frame);
+    pending_frames_info_.clear();
+    RenderWithoutAlgorithm(frame, is_copy);
   }
 
-  timestamps_to_clock_times_[frame->timestamp()] = render_time;
+  pending_frames_info_.push_back(PendingFrameInfo{
+      frame->unique_id(), frame->timestamp(), render_time, is_copy});
   rendering_frame_buffer_->EnqueueFrame(std::move(frame));
 }
 
@@ -503,8 +505,13 @@
          io_task_runner_->BelongsToCurrentThread());
 #endif
   for (const base::TimeDelta& timestamp : timestamps) {
-    DCHECK(timestamps_to_clock_times_.count(timestamp));
-    wall_clock_times->push_back(timestamps_to_clock_times_[timestamp]);
+    auto* it =
+        std::find_if(pending_frames_info_.begin(), pending_frames_info_.end(),
+                     [&timestamp](PendingFrameInfo& info) {
+                       return info.timestamp == timestamp;
+                     });
+    DCHECK(it != pending_frames_info_.end());
+    wall_clock_times->push_back(it->reference_time);
   }
   return true;
 }
@@ -529,35 +536,45 @@
   if (!frame || frame == current_frame_)
     return;
 
-  const base::TimeDelta timestamp = frame->timestamp();
-  SetCurrentFrame(std::move(frame), deadline_min);
+  // Walk |pending_frames_info_| to find |is_copy| value for the frame, while
+  // also erasing old elements.
+  bool is_copy = false;
+  for (auto* it = pending_frames_info_.begin();
+       it != pending_frames_info_.end();) {
+    if (it->unique_id == frame->unique_id())
+      is_copy = it->is_copy;
 
-  const auto& end = timestamps_to_clock_times_.end();
-  const auto& begin = timestamps_to_clock_times_.begin();
-  auto iterator = begin;
-  while (iterator != end && iterator->first < timestamp)
-    ++iterator;
-  timestamps_to_clock_times_.erase(begin, iterator);
+    // Erase info for the older frames.
+    if (it->timestamp < frame->timestamp()) {
+      it = pending_frames_info_.erase(it);
+    } else {
+      ++it;
+    }
+  }
+
+  SetCurrentFrame(std::move(frame), is_copy, deadline_min);
 }
 
 void WebMediaPlayerMSCompositor::RenderWithoutAlgorithm(
-    scoped_refptr<media::VideoFrame> frame) {
+    scoped_refptr<media::VideoFrame> frame,
+    bool is_copy) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
   PostCrossThreadTask(
       *video_frame_compositor_task_runner_, FROM_HERE,
       CrossThreadBindOnce(
           &WebMediaPlayerMSCompositor::RenderWithoutAlgorithmOnCompositor,
-          WrapRefCounted(this), std::move(frame)));
+          WrapRefCounted(this), std::move(frame), is_copy));
 }
 
 void WebMediaPlayerMSCompositor::RenderWithoutAlgorithmOnCompositor(
-    scoped_refptr<media::VideoFrame> frame) {
+    scoped_refptr<media::VideoFrame> frame,
+    bool is_copy) {
   DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread());
   {
     base::AutoLock auto_lock(current_frame_lock_);
     if (current_frame_)
       last_render_length_ = frame->timestamp() - current_frame_->timestamp();
-    SetCurrentFrame(std::move(frame), base::nullopt);
+    SetCurrentFrame(std::move(frame), is_copy, base::nullopt);
   }
   if (video_frame_provider_client_)
     video_frame_provider_client_->DidReceiveFrame();
@@ -565,6 +582,7 @@
 
 void WebMediaPlayerMSCompositor::SetCurrentFrame(
     scoped_refptr<media::VideoFrame> frame,
+    bool is_copy,
     base::Optional<base::TimeTicks> expected_display_time) {
   DCHECK(video_frame_compositor_task_runner_->BelongsToCurrentThread());
   current_frame_lock_.AssertAcquired();
@@ -608,6 +626,7 @@
   }
 
   current_frame_ = std::move(frame);
+  current_frame_is_copy_ = is_copy;
 
   // TODO(https://crbug.com/1050755): Improve the accuracy of these fields when
   // we only use RenderWithoutAlgorithm.
@@ -713,7 +732,7 @@
   scoped_refptr<media::VideoFrame> current_frame_ref;
   {
     base::AutoLock auto_lock(current_frame_lock_);
-    if (!current_frame_ || !player_)
+    if (!current_frame_ || !player_ || current_frame_is_copy_)
       return;
     current_frame_ref = current_frame_;
   }
@@ -727,8 +746,10 @@
   // |current_frame_| hasn't been changed.
   {
     base::AutoLock auto_lock(current_frame_lock_);
-    if (current_frame_ == current_frame_ref)
+    if (current_frame_ == current_frame_ref) {
       current_frame_ = std::move(copied_frame);
+      current_frame_is_copy_ = true;
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h
index 7ef0b61d..33b0c57 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h
@@ -74,7 +74,7 @@
     return update_submission_state_callback_;
   }
 
-  void EnqueueFrame(scoped_refptr<media::VideoFrame> frame);
+  void EnqueueFrame(scoped_refptr<media::VideoFrame> frame, bool is_copy);
 
   // Statistical data
   gfx::Size GetCurrentSize();
@@ -140,6 +140,15 @@
   friend class WebMediaPlayerMSTest;
   friend struct WebMediaPlayerMSCompositorTraits;
 
+  // Struct used to keep information about frames pending in
+  // |rendering_frame_buffer_|.
+  struct PendingFrameInfo {
+    int unique_id;
+    base::TimeDelta timestamp;
+    base::TimeTicks reference_time;
+    bool is_copy;
+  };
+
   ~WebMediaPlayerMSCompositor() override;
 
   // Ran on the |video_frame_compositor_task_runner_| to initialize
@@ -166,13 +175,16 @@
   // For algorithm disabled case only: call SetCurrentFrame() with the current
   // frame immediately. |video_frame_provider_client_| gets notified about the
   // new frame with a DidReceiveFrame() call.
-  void RenderWithoutAlgorithm(scoped_refptr<media::VideoFrame> frame);
+  void RenderWithoutAlgorithm(scoped_refptr<media::VideoFrame> frame,
+                              bool is_copy);
   void RenderWithoutAlgorithmOnCompositor(
-      scoped_refptr<media::VideoFrame> frame);
+      scoped_refptr<media::VideoFrame> frame,
+      bool is_copy);
 
   // Update |current_frame_| and |dropped_frame_count_|
   void SetCurrentFrame(
       scoped_refptr<media::VideoFrame> frame,
+      bool is_copy,
       base::Optional<base::TimeTicks> expected_presentation_time);
   // Following the update to |current_frame_|, this will check for changes that
   // require updating video layer.
@@ -239,6 +251,8 @@
   size_t total_frame_count_;
   size_t dropped_frame_count_;
 
+  bool current_frame_is_copy_ = false;
+
   // Used to complete video.requestAnimationFrame() calls. Reported up via
   // GetLastPresentedFrameMetadata().
   // TODO(https://crbug.com/1050755): Improve the accuracy of these fields for
@@ -264,8 +278,8 @@
 
   std::unique_ptr<WebVideoFrameSubmitter> submitter_;
 
-  // TODO(crbug.com/952716): Replace the use of std::map by WTF::HashMap.
-  std::map<base::TimeDelta, base::TimeTicks> timestamps_to_clock_times_;
+  // Extra information about the frames pending in |rendering_frame_buffer_|.
+  WTF::Vector<PendingFrameInfo> pending_frames_info_;
 
   cc::UpdateSubmissionStateCB update_submission_state_callback_;
 
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
index 3293650..e514cfc 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -131,6 +131,10 @@
     EXPECT_EQ(delegate_id_, delegate_id);
   }
 
+  void DidBufferUnderflow(int delegate_id) override {
+    EXPECT_EQ(delegate_id_, delegate_id);
+  }
+
   void PlayerGone(int delegate_id) override {
     EXPECT_EQ(delegate_id_, delegate_id);
     is_gone_ = true;
diff --git a/third_party/blink/renderer/modules/webcodecs/BUILD.gn b/third_party/blink/renderer/modules/webcodecs/BUILD.gn
index 79a062b..15f2bb12 100644
--- a/third_party/blink/renderer/modules/webcodecs/BUILD.gn
+++ b/third_party/blink/renderer/modules/webcodecs/BUILD.gn
@@ -49,6 +49,7 @@
     "audio_decoder_test.cc",
     "decoder_selector_test.cc",
     "encoded_video_chunk_test.cc",
+    "image_decoder_external_test.cc",
     "video_decoder_broker_test.cc",
     "video_frame_test.cc",
     "video_track_reader_writer_test.cc",
@@ -71,4 +72,6 @@
     "//third_party/blink/renderer/platform/wtf",
     "//third_party/libyuv",
   ]
+
+  data = [ "//third_party/blink/web_tests/images/resources/" ]
 }
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
index 8d25564e..25204ee7 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
@@ -45,6 +45,8 @@
 
 void ImageDecoderExternal::DecodeRequest::Trace(Visitor* visitor) const {
   visitor->Trace(resolver);
+  visitor->Trace(result);
+  visitor->Trace(exception);
 }
 
 // static
@@ -107,6 +109,12 @@
     return;
   }
 
+  if (!buffer.ByteLengthAsSizeT()) {
+    exception_state.ThrowDOMException(DOMExceptionCode::kConstraintError,
+                                      "No image data provided");
+    return;
+  }
+
   // TODO(crbug.com/1073995): Data is owned by the caller who may be free to
   // manipulate it. We will probably need to make a copy to our own internal
   // data or neuter the buffers as seen by JS.
@@ -301,19 +309,17 @@
       if (request->frame_index >= frame_count_)
         continue;
     } else if (request->frame_index >= frame_count_) {
-      request->complete = true;
       // TODO(crbug.com/1073995): Include frameIndex in rejection?
-      request->resolver->Reject(MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kConstraintError, "Frame index out of range"));
+      request->exception = MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kConstraintError, "Frame index out of range");
       continue;
     }
 
     auto* image = decoder_->DecodeFrameBufferAtIndex(request->frame_index);
     if (decoder_->Failed() || !image) {
-      request->complete = true;
       // TODO(crbug.com/1073995): Include frameIndex in rejection?
-      request->resolver->Reject(MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kConstraintError, "Failed to decode frame"));
+      request->exception = MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kConstraintError, "Failed to decode frame");
       continue;
     }
 
@@ -330,10 +336,9 @@
     auto sk_image = is_complete ? image->FinalizePixelsAndGetImage()
                                 : SkImage::MakeFromBitmap(image->Bitmap());
     if (!sk_image) {
-      request->complete = true;
       // TODO(crbug.com/1073995): Include frameIndex in rejection?
-      request->resolver->Reject(MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kOperationError, "Failed decode frame"));
+      request->exception = MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kOperationError, "Failed to decode frame");
       continue;
     }
 
@@ -362,19 +367,36 @@
         decoder_->FrameDurationAtIndex(request->frame_index).InMicroseconds());
     result->setOrientation(decoder_->Orientation().Orientation());
     result->setComplete(is_complete);
-    request->complete = true;
-    request->resolver->Resolve(result);
+    request->result = result;
   }
 
   auto* new_end =
       std::remove_if(pending_decodes_.begin(), pending_decodes_.end(),
-                     [](const auto& request) { return request->complete; });
+                     [](const auto& request) {
+                       return request->result || request->exception;
+                     });
+
+  // Copy completed requests to a new local vector to avoid reentrancy issues
+  // when resolving and rejecting the promises.
+  HeapVector<Member<DecodeRequest>> completed_decodes;
+  completed_decodes.AppendRange(new_end, pending_decodes_.end());
   pending_decodes_.Shrink(
       static_cast<wtf_size_t>(new_end - pending_decodes_.begin()));
+
+  // Note: Promise resolution may invoke calls into this class.
+  for (auto& request : completed_decodes) {
+    if (request->exception)
+      request->resolver->Reject(request->exception);
+    else
+      request->resolver->Resolve(request->result);
+  }
 }
 
 void ImageDecoderExternal::MaybeSatisfyPendingMetadataDecodes() {
   DCHECK(decoder_);
+  if (!decoder_->IsSizeAvailable() && !decoder_->Failed())
+    return;
+
   DCHECK(decoder_->Failed() || decoder_->IsDecodedSizeAvailable());
   for (auto& resolver : pending_metadata_decodes_)
     resolver->Resolve();
@@ -382,18 +404,20 @@
 }
 
 void ImageDecoderExternal::MaybeUpdateMetadata() {
+  // Since we always create the decoder at construction, we need to wait until
+  // at least the size is available before signaling that metadata has been
+  // retrieved.
+  if (!decoder_->IsSizeAvailable() || decoder_->Failed()) {
+    MaybeSatisfyPendingMetadataDecodes();
+    return;
+  }
+
   const size_t decoded_frame_count = decoder_->FrameCount();
   if (decoder_->Failed()) {
     MaybeSatisfyPendingMetadataDecodes();
     return;
   }
 
-  // Since we always create the decoder at construction, we need to wait until
-  // at least the size is available before signaling that metadata has been
-  // retrieved.
-  if (!decoder_->IsSizeAvailable())
-    return;
-
   frame_count_ = static_cast<uint32_t>(decoded_frame_count);
 
   // The internal value has some magic negative numbers; for external purposes
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.h b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.h
index 7636547..88fff55 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.h
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.h
@@ -20,6 +20,7 @@
 class ImageBitmapOptions;
 class ImageDecoder;
 class ImageDecoderInit;
+class ImageFrameExternal;
 class ImageTrackExternal;
 class ReadableStreamBytesConsumer;
 class ScriptPromiseResolver;
@@ -101,7 +102,8 @@
     Member<ScriptPromiseResolver> resolver;
     uint32_t frame_index;
     bool complete_frames_only;
-    bool complete = false;
+    Member<ImageFrameExternal> result;
+    Member<DOMException> exception;
   };
   HeapVector<Member<DecodeRequest>> pending_decodes_;
   HeapVector<Member<ScriptPromiseResolver>> pending_metadata_decodes_;
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc
new file mode 100644
index 0000000..75badca
--- /dev/null
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc
@@ -0,0 +1,174 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/webcodecs/image_decoder_external.h"
+
+#include "media/media_buildflags.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_image_decoder_init.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_image_frame.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_image_track.h"
+#include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+
+namespace blink {
+
+namespace {
+
+class ImageDecoderTest : public testing::Test {
+ protected:
+  ImageDecoderExternal* CreateDecoder(V8TestingScope* v8_scope,
+                                      const char* file_name,
+                                      const char* mime_type) {
+    auto* init = MakeGarbageCollected<ImageDecoderInit>();
+    init->setType(mime_type);
+
+    auto data = ReadFile(file_name);
+    DCHECK(!data->IsEmpty()) << "Missing file: " << file_name;
+    init->setData(ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer(
+        DOMArrayBuffer::Create(std::move(data))));
+    return ImageDecoderExternal::Create(v8_scope->GetScriptState(), init,
+                                        v8_scope->GetExceptionState());
+  }
+
+  ImageFrameExternal* ToImageFrame(V8TestingScope* v8_scope,
+                                   ScriptValue value) {
+    return NativeValueTraits<ImageFrameExternal>::NativeValue(
+        v8_scope->GetIsolate(), value.V8Value(), v8_scope->GetExceptionState());
+  }
+
+  scoped_refptr<SharedBuffer> ReadFile(StringView file_name) {
+    StringBuilder file_path;
+    file_path.Append(test::BlinkWebTestsDir());
+    file_path.Append('/');
+    file_path.Append(file_name);
+    return test::ReadFromFile(file_path.ToString());
+  }
+};
+
+TEST_F(ImageDecoderTest, CanDecodeType) {
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/jpeg"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/pjpeg"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/jpg"));
+
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/png"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/x-png"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/apng"));
+
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/gif"));
+
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/webp"));
+
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/x-icon"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/vnd.microsoft.icon"));
+
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/bmp"));
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/x-xbitmap"));
+
+#if BUILDFLAG(ENABLE_AV1_DECODER)
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType("image/avif"));
+#else
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType("image/avif"));
+#endif
+
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType("image/svg+xml"));
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType("image/heif"));
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType("image/pcx"));
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType("image/bpg"));
+}
+
+TEST_F(ImageDecoderTest, DecodeEmpty) {
+  V8TestingScope v8_scope;
+
+  auto* init = MakeGarbageCollected<ImageDecoderInit>();
+  init->setType("image/png");
+  init->setData(ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer(
+      DOMArrayBuffer::Create(SharedBuffer::Create())));
+  auto* decoder = ImageDecoderExternal::Create(v8_scope.GetScriptState(), init,
+                                               v8_scope.GetExceptionState());
+  EXPECT_TRUE(decoder);
+  EXPECT_TRUE(v8_scope.GetExceptionState().HadException());
+}
+
+TEST_F(ImageDecoderTest, DecodeUnsupported) {
+  V8TestingScope v8_scope;
+  constexpr char kImageType[] = "image/svg+xml";
+  EXPECT_FALSE(ImageDecoderExternal::canDecodeType(kImageType));
+  auto* decoder =
+      CreateDecoder(&v8_scope, "images/resources/test.svg", kImageType);
+  EXPECT_TRUE(decoder);
+  EXPECT_TRUE(v8_scope.GetExceptionState().HadException());
+}
+
+TEST_F(ImageDecoderTest, DecodeGif) {
+  V8TestingScope v8_scope;
+  constexpr char kImageType[] = "image/gif";
+  EXPECT_TRUE(ImageDecoderExternal::canDecodeType(kImageType));
+  auto* decoder =
+      CreateDecoder(&v8_scope, "images/resources/animated.gif", kImageType);
+  ASSERT_TRUE(decoder);
+  ASSERT_FALSE(v8_scope.GetExceptionState().HadException());
+
+  {
+    auto promise = decoder->decodeMetadata();
+    ScriptPromiseTester tester(v8_scope.GetScriptState(), promise);
+    tester.WaitUntilSettled();
+    ASSERT_TRUE(tester.IsFulfilled());
+  }
+
+  EXPECT_EQ(decoder->type(), kImageType);
+  EXPECT_EQ(decoder->frameCount(), 2u);
+  EXPECT_EQ(decoder->repetitionCount(), 0u);
+  EXPECT_EQ(decoder->complete(), true);
+
+  auto tracks = decoder->tracks();
+  EXPECT_EQ(tracks.size(), 1u);
+  EXPECT_EQ(tracks[0]->id(), 0u);
+  EXPECT_EQ(tracks[0]->animated(), true);
+
+  {
+    auto promise = decoder->decode(0, true);
+    ScriptPromiseTester tester(v8_scope.GetScriptState(), promise);
+    tester.WaitUntilSettled();
+    ASSERT_TRUE(tester.IsFulfilled());
+    auto* frame = ToImageFrame(&v8_scope, tester.Value());
+    EXPECT_TRUE(frame->complete());
+    EXPECT_EQ(frame->duration(), 0u);
+    EXPECT_EQ(frame->orientation(), 1u);
+
+    auto* bitmap = frame->image();
+    EXPECT_EQ(bitmap->Size(), IntSize(16, 16));
+  }
+
+  {
+    auto promise = decoder->decode(1, true);
+    ScriptPromiseTester tester(v8_scope.GetScriptState(), promise);
+    tester.WaitUntilSettled();
+    ASSERT_TRUE(tester.IsFulfilled());
+    auto* frame = ToImageFrame(&v8_scope, tester.Value());
+    EXPECT_TRUE(frame->complete());
+    EXPECT_EQ(frame->duration(), 0u);
+    EXPECT_EQ(frame->orientation(), 1u);
+
+    auto* bitmap = frame->image();
+    EXPECT_EQ(bitmap->Size(), IntSize(16, 16));
+  }
+
+  // Decoding past the end should result in a rejected promise.
+  auto promise = decoder->decode(3, true);
+  ScriptPromiseTester tester(v8_scope.GetScriptState(), promise);
+  tester.WaitUntilSettled();
+  ASSERT_TRUE(tester.IsRejected());
+}
+
+// TODO(crbug.com/1073995): Add tests for each format, selectTrack(), partial
+// decoding, and ImageBitmapOptions.
+
+}  // namespace
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
index d9e1caf..b0de242 100644
--- a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
+++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
@@ -294,9 +294,11 @@
     }
   };
 
-  using TraceImpl = typename std::conditional<EphemeronHelper::is_ephemeron,
-                                              TraceImplEphemerons,
-                                              TraceImplDefault>::type;
+  using TraceImpl = typename std::conditional<
+      EphemeronHelper::is_ephemeron &&
+          WTF::IsTraceable<typename EphemeronHelper::ValueType>::value,
+      TraceImplEphemerons,
+      TraceImplDefault>::type;
 };
 
 template <typename Key, typename Value, typename Traits>
diff --git a/third_party/blink/renderer/platform/image-decoders/gif/gif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/gif/gif_image_decoder.cc
index 620f21ca..2949005 100644
--- a/third_party/blink/renderer/platform/image-decoders/gif/gif_image_decoder.cc
+++ b/third_party/blink/renderer/platform/image-decoders/gif/gif_image_decoder.cc
@@ -79,6 +79,13 @@
     SkCodec::Result codec_creation_result;
     codec_ = SkCodec::MakeFromStream(std::move(segment_stream),
                                      &codec_creation_result, nullptr);
+
+    // SkCodec supports many codecs, but this class is only for GIF decoding.
+    if (codec_ && codec_->getEncodedFormat() != SkEncodedImageFormat::kGIF) {
+      SetFailed();
+      return;
+    }
+
     switch (codec_creation_result) {
       case SkCodec::kSuccess: {
         // SkCodec::MakeFromStream will read enough of the image to get the
@@ -89,6 +96,11 @@
         return;
       }
       case SkCodec::kIncompleteInput:
+        if (IsAllDataReceived()) {
+          SetFailed();
+          return;
+        }
+
         // |segment_stream_|'s ownership is passed into MakeFromStream.
         // It is deleted if MakeFromStream fails.
         // If MakeFromStream fails, we set |segment_stream_| to null so
diff --git a/third_party/blink/renderer/platform/image-decoders/image_decoder.h b/third_party/blink/renderer/platform/image-decoders/image_decoder.h
index 20f01027..261a7c9 100644
--- a/third_party/blink/renderer/platform/image-decoders/image_decoder.h
+++ b/third_party/blink/renderer/platform/image-decoders/image_decoder.h
@@ -66,6 +66,10 @@
 
  public:
   ImagePlanes();
+
+  // |color_type| is kGray_8_SkColorType if GetYUVBitDepth() == 8 and either
+  // kA16_float_SkColorType or kA16_unorm_SkColorType if GetYUVBitDepth() > 8.
+  //
   // TODO(crbug/910276): To support YUVA, ImagePlanes needs to support a
   // variable number of planes.
   ImagePlanes(void* planes[3],
@@ -285,6 +289,9 @@
   }
 
   // Image decoders that support high bit depth YUV decoding can override this.
+  //
+  // Note: If an implementation advertises a bit depth > 8 it must support both
+  // kA16_unorm_SkColorType and kA16_float_SkColorType ImagePlanes.
   virtual uint8_t GetYUVBitDepth() const { return 8; }
 
   // Returns the information required to decide whether or not hardware
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 336dbf3..7a53670 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -33,7 +33,7 @@
     // shipped stable can have its runtime flag removed soon after.
     status: {
       valid_values: ["stable", "experimental", "test"],
-      valid_keys: ["Android", "Win", "ChromeOS", "MacOSX"]
+      valid_keys: ["Android", "Win", "ChromeOS", "Mac"]
     },
 
     // "implied_by" or "depends_on" specifies relationship to other features:
@@ -663,7 +663,7 @@
     {
       name: "DocumentPolicy",
       origin_trial_feature_name: "DocumentPolicy",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "DocumentPolicyNegotiation",
@@ -780,7 +780,7 @@
       depends_on: ["NativeFileSystem"],
       status: {"Android": "test", "default": "experimental"},
       origin_trial_feature_name: "FileHandling",
-      origin_trial_os: ["win", "macosx", "linux", "chromeos"],
+      origin_trial_os: ["win", "mac", "linux", "chromeos"],
     },
     {
       name: "FileSystem",
@@ -1194,7 +1194,7 @@
       name: "NativeFileSystem",
       status: {"Android": "test", "default": "experimental"},
       origin_trial_feature_name: "NativeFileSystem2",
-      origin_trial_os: ["win", "macosx", "linux", "chromeos"],
+      origin_trial_os: ["win", "mac", "linux", "chromeos"],
     },
     {
       name: "NativeFileSystemDragAndDrop",
@@ -1247,7 +1247,7 @@
     // The Notification Center on Mac OS X does not support content images.
     {
       name: "NotificationContentImage",
-      status: {"MacOSX": "test", "default": "stable"},
+      status: {"Mac": "test", "default": "stable"},
     },
     {
       name: "Notifications",
@@ -1962,7 +1962,7 @@
       status: {
         "Android": "stable",
         "ChromeOS": "stable",
-        "MacOSX": "stable",
+        "Mac": "stable",
         "default": "experimental",
       },
     },
@@ -1975,7 +1975,7 @@
       status: {
         "Android": "stable",
         "ChromeOS": "stable",
-        "MacOSX": "stable",
+        "Mac": "stable",
         "default": "experimental",
       },
     },
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/memory_purge_manager.cc b/third_party/blink/renderer/platform/scheduler/main_thread/memory_purge_manager.cc
index 07afb6e..ca2d82e 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/memory_purge_manager.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/memory_purge_manager.cc
@@ -138,6 +138,7 @@
 }
 
 void MemoryPurgeManager::PerformMemoryPurge() {
+  TRACE_EVENT0("blink", "MemoryPurgeManager::PerformMemoryPurge()");
   DCHECK(CanPurge());
 
   base::MemoryPressureListener::NotifyMemoryPressure(
diff --git a/third_party/blink/web_tests/FlagExpectations/force-device-scale-factor=1.5 b/third_party/blink/web_tests/FlagExpectations/force-device-scale-factor=1.5
index 0fddab7..d0b5ffe 100644
--- a/third_party/blink/web_tests/FlagExpectations/force-device-scale-factor=1.5
+++ b/third_party/blink/web_tests/FlagExpectations/force-device-scale-factor=1.5
@@ -31,3 +31,21 @@
 crbug.com/1107570 tables/mozilla/bugs/bug12384.html [ Failure ]
 crbug.com/1107570 tables/mozilla/bugs/bug12910-2.html [ Failure ]
 crbug.com/1107570 tables/mozilla/bugs/bug157890.html [ Failure ]
+crbug.com/1107570 fast/writing-mode/english-lr-text.html [ Failure ]
+crbug.com/1107570 fast/block/crash-when-element-becomes-positioned-and-doesnt-clear-floating-objects.html [ Failure ]
+crbug.com/1107570 fast/block/float/floats-offset-image-strict.html [ Failure ]
+crbug.com/1107570 fast/block/float/logical-bottom-exceeds-layoutunit-max.html [ Failure ]
+crbug.com/1107570 fast/block/float/sub-pixel-precision-floats.html [ Failure ]
+crbug.com/1107570 fast/block/margin-collapse/030.html [ Failure ]
+crbug.com/1107570 fast/block/margin-collapse/031.html [ Failure ]
+crbug.com/1107570 fast/block/margin-collapse/038.html [ Failure ]
+crbug.com/1107570 fast/block/margin-collapse/block-inside-inline/006.html [ Failure ]
+crbug.com/1107570 fast/block/positioning/002.html [ Failure ]
+crbug.com/1107570 fast/deprecated-flexbox/009-horizontal.html [ Failure ]
+crbug.com/1107570 fast/deprecated-flexbox/009.html [ Failure ]
+crbug.com/1107570 fast/overflow/002.html [ Failure ]
+crbug.com/1107570 fast/overflow/006.html [ Failure ]
+crbug.com/1107570 fast/overflow/overflow-clamp-after-transform-related-content-size-change.html [ Failure ]
+crbug.com/1107570 fast/overflow/scroll-div-hide-show.html [ Failure ]
+crbug.com/1107570 fast/overflow/scrollbar-drag-origin.html [ Failure ]
+crbug.com/1107570 fast/overflow/unreachable-overflow-rtl-bug.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 8f48075..3169184 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1092,7 +1092,7 @@
 crbug.com/591099 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-small-001.xht [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/non-adjacent-spanners-000.html [ Pass ]
 crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/spanner-fragmentation-001.html [ Pass ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/abspos-after-break-after.html [ Crash Failure ]
 crbug.com/1066616 virtual/layout_ng_block_frag/fast/multicol/abspos-in-overflow-hidden-in-2nd-column.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/abspos-new-width-rebalance.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/balance-float-after-forced-break.html [ Failure ]
@@ -1126,7 +1126,7 @@
 crbug.com/1105758 virtual/layout_ng_block_frag/fast/multicol/dynamic/insert-spanner-pseudo-before.html [ Crash ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/relpos-becomes-static-has-abspos.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-column-content-next-to-abspos-between-spanners.html [ Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/static-becomes-relpos-has-abspos.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/dynamic/static-becomes-relpos-has-abspos.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/event-offset-in-nested.html [ Failure ]
 crbug.com/875235 virtual/layout_ng_block_frag/fast/multicol/fieldset-as-multicol.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/float-after-break-after.html [ Failure ]
@@ -1157,7 +1157,7 @@
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/many-lines-overflow-in-single-row-inner.html [ Failure ]
 crbug.com/1066626 virtual/layout_ng_block_frag/fast/multicol/mixed-opacity-fixed-test.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/mixed-opacity-test.html [ Crash Failure ]
-crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/mixed-positioning-stacking-order.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/mixed-positioning-stacking-order.html [ Crash Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-auto-height-short-first-row.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/nested-balanced-inner-column-count-1-with-forced-break.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_block_frag/fast/multicol/nested-columns.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WeblayerWPTExpectations b/third_party/blink/web_tests/android/WeblayerWPTExpectations
index c7af5e92..0fd8a017 100644
--- a/third_party/blink/web_tests/android/WeblayerWPTExpectations
+++ b/third_party/blink/web_tests/android/WeblayerWPTExpectations
@@ -16,6 +16,8 @@
 crbug.com/1050754 external/wpt/FileAPI/url/sandboxed-iframe.html [ Failure ]
 crbug.com/1050754 external/wpt/FileAPI/url/url-reload.window.html [ Failure ]
 crbug.com/1050754 external/wpt/IndexedDB/file_support.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/IndexedDB/idbobjectstore_putall.tentative.any.html [ Failure ]
+crbug.com/1050754 external/wpt/IndexedDB/idbobjectstore_putall.tentative.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/IndexedDB/idlharness.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/IndexedDB/key-generators/reading-autoincrement-indexes-cursors.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/IndexedDB/key-generators/reading-autoincrement-indexes.any.sharedworker.html [ Failure ]
@@ -359,16 +361,30 @@
 crbug.com/1050754 external/wpt/client-hints/accept-ch-stickiness/same-origin-subresource-redirect.https.html [ Failure ]
 crbug.com/1050754 external/wpt/client-hints/http-equiv-accept-ch-merge.https.html [ Failure ]
 crbug.com/1050754 external/wpt/client-hints/sec-ch-ua.https.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/async-html-script-removal.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/async-platform-specific-write-read.tentative.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/async-raw-write-read.tentative.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/async-write-blobs-read-blobs.https.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/async-write-html-read-html.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/async-write-image-read-image.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/clipboard-item.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/detached-iframe/read-on-detaching-iframe.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/detached-iframe/write-on-detaching-iframe.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/detached-iframe/write-read-on-detached-iframe.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/detached-iframe/writeText-readText-on-detached-iframe.https.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-disabled-by-feature-policy.tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-attribute-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy-cross-origin-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-by-feature-policy.tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-read/clipboard-read-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-disabled-by-feature-policy.tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-cross-origin-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-attribute-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy-cross-origin-tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-by-feature-policy.tentative.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/clipboard-apis/feature-policy/clipboard-write/clipboard-write-enabled-on-self-origin-by-feature-policy.tentative.https.sub.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/permissions/readText-denied.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/permissions/readText-granted.https.html [ Failure ]
 crbug.com/1050754 external/wpt/clipboard-apis/permissions/writeText-denied.https.html [ Failure ]
@@ -646,6 +662,7 @@
 crbug.com/1050754 external/wpt/css/css-font-loading/idlharness.https.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-fonts/animations/font-size-adjust-interpolation.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-fonts/animations/font-variation-settings-interpolation.html [ Failure ]
+crbug.com/1050754 external/wpt/css/css-fonts/fallback-url-to-local.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-fonts/font-face-range-order.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-fonts/font-variant-alternates-parsing.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-fonts/font-variation-settings-serialization-001.html [ Failure ]
@@ -933,6 +950,7 @@
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/basic.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/clamp-negative-overflow.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/clipped-scrollers-skipped.html [ Failure ]
+crbug.com/1050754 external/wpt/css/css-scroll-anchoring/contain-paint-offscreen-container.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/descend-into-container-with-float.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/descend-into-container-with-overflow.html [ Failure ]
 crbug.com/1050754 external/wpt/css/css-scroll-anchoring/device-pixel-adjustment.html [ Failure ]
@@ -1332,6 +1350,7 @@
 crbug.com/1050754 external/wpt/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html [ Failure ]
 crbug.com/1050754 external/wpt/css/cssom-view/MediaQueryList-extends-EventTarget.html [ Failure ]
 crbug.com/1050754 external/wpt/css/cssom-view/MediaQueryListEvent.html [ Failure ]
+crbug.com/1050754 external/wpt/css/cssom-view/client-props-root.html [ Failure ]
 crbug.com/1050754 external/wpt/css/cssom-view/cssom-getBoundingClientRect-003.html [ Failure ]
 crbug.com/1050754 external/wpt/css/cssom-view/cssom-getBoxQuads-001.html [ Failure ]
 crbug.com/1050754 external/wpt/css/cssom-view/cssom-view-img-attributes-001.html [ Failure ]
@@ -1399,6 +1418,7 @@
 crbug.com/1050754 external/wpt/css/mediaqueries/aspect-ratio-serialization.html [ Failure ]
 crbug.com/1050754 external/wpt/css/mediaqueries/forced-colors.html [ Failure ]
 crbug.com/1050754 external/wpt/css/mediaqueries/navigation-controls.tentative.html [ Failure ]
+crbug.com/1050754 external/wpt/css/mediaqueries/prefers-contrast.html [ Failure ]
 crbug.com/1050754 external/wpt/css/mediaqueries/prefers-reduced-data.html [ Failure ]
 crbug.com/1050754 external/wpt/css/mediaqueries/test_media_queries.html [ Failure ]
 crbug.com/1050754 external/wpt/css/motion/animation/offset-anchor-composition.html [ Failure ]
@@ -1787,14 +1807,14 @@
 crbug.com/1050754 external/wpt/feature-policy/reporting/document-write-reporting.html [ Failure ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/encrypted-media-report-only.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/encrypted-media-reporting.https.html [ Timeout ]
-crbug.com/1050754 external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure ]
+crbug.com/1050754 external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/fullscreen-reporting.html [ Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/generic-sensor-report-only.https.html [ Failure ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/generic-sensor-reporting.https.html [ Failure ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/geolocation-report-only.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/geolocation-reporting.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/microphone-report-only.https.html [ Timeout ]
-crbug.com/1050754 external/wpt/feature-policy/reporting/microphone-reporting.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/feature-policy/reporting/microphone-reporting.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/midi-report-only.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/midi-reporting.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/feature-policy/reporting/payment-report-only.https.html [ Timeout ]
@@ -1918,6 +1938,7 @@
 crbug.com/1050754 external/wpt/geolocation-API/getCurrentPosition_IDL.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/geolocation-API/getCurrentPosition_permission_allow.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/geolocation-API/getCurrentPosition_permission_deny.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/geolocation-API/non-secure-contexts.http.html [ Failure ]
 crbug.com/1050754 external/wpt/geolocation-API/watchPosition_permission_deny.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/geolocation-sensor/GeolocationSensor-disabled-by-feature-policy.https.html [ Failure ]
 crbug.com/1050754 external/wpt/geolocation-sensor/GeolocationSensor-enabled-by-feature-policy-attribute-redirect-on-load.https.html [ Failure ]
@@ -2245,11 +2266,17 @@
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html [ Failure ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html [ Failure ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/popup-with-structured-header.https.html [ Failure ]
-crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/openee-accessed_openee-coop-ro.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/openee-accessed_openee-coop-ro.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/openee-accessed_openee-coop.https.html [ Timeout ]
-crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/opener-accessed_openee-coop-ro.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/openee-accessed_opener-coop-ro.https.html [ Failure ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/opener-accessed_openee-coop-ro.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/opener-accessed_openee-coop.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/opener-accessed_opener-coop-ro.https.html [ Failure ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/report-only-four-reports.https.html [ Failure ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/report-only-from-unsafe-none.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/report-only-same-origin-report-to.https.html [ Timeout ]
+crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/report-only-same-origin.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-coop-navigated-popup.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-allow-popups-report-to.https.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-coep-report-to.https.html [ Failure Timeout ]
@@ -2452,6 +2479,7 @@
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_anchor_download_allow_downloads.sub.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_back.html [ Failure ]
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html [ Failure ]
+crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_block_downloads.sub.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html [ Timeout ]
 crbug.com/1050754 external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html [ Failure ]
@@ -2748,6 +2776,7 @@
 crbug.com/1050754 external/wpt/layout-instability/buffered-flag.html [ Failure ]
 crbug.com/1050754 external/wpt/layout-instability/clip-negative-bottom-margin.html [ Failure ]
 crbug.com/1050754 external/wpt/layout-instability/composited-element-movement.html [ Failure ]
+crbug.com/1050754 external/wpt/layout-instability/move-transformed.html [ Failure ]
 crbug.com/1050754 external/wpt/layout-instability/multi-clip-visual-rect.html [ Failure ]
 crbug.com/1050754 external/wpt/layout-instability/partially-clipped-visual-rect.html [ Failure ]
 crbug.com/1050754 external/wpt/layout-instability/pointerdown-becomes-scroll.html [ Failure ]
@@ -2843,6 +2872,7 @@
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/border-002.html [ Failure ]
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/margin-001.html [ Failure ]
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/margin-002.html [ Failure ]
+crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/margin-003.html [ Failure ]
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/padding-001.html [ Failure ]
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/padding-border-margin/padding-002.html [ Failure ]
 crbug.com/1050754 external/wpt/mathml/relations/css-styling/scriptlevel-001.html [ Failure ]
@@ -2938,6 +2968,7 @@
 crbug.com/1050754 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/mediacapture-streams/MediaStream-default-feature-policy.https.html [ Failure ]
 crbug.com/1050754 external/wpt/mediacapture-streams/idlharness.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/mediasession/setactionhandler.html [ Failure ]
 crbug.com/1050754 external/wpt/mimesniff/mime-types/charset-parameter.window.html [ Failure ]
 crbug.com/1050754 external/wpt/mimesniff/mime-types/parsing.any.html [ Failure ]
 crbug.com/1050754 external/wpt/mimesniff/mime-types/parsing.any.worker.html [ Failure ]
@@ -2994,11 +3025,54 @@
 crbug.com/1050754 external/wpt/native-file-system/idlharness.https.any.html [ Failure ]
 crbug.com/1050754 external/wpt/native-file-system/idlharness.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-file-system/opaque-origin.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-iteration.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-iteration.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/sandboxed_FileSystemWritableFileStream.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-file-system/showPicker-errors.https.window.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/close_async.tentative.https.any.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/close_async.tentative.https.any.serviceworker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/close_async.tentative.https.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/close_async.tentative.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/close_sync.tentative.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.serviceworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_getLength_async.tentative.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.serviceworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_read_async.tentative.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.serviceworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/concurrent_io/concurrent_io_write_async.tentative.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/delete_async_basic.tentative.https.any.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/delete_async_basic.tentative.https.any.serviceworker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/delete_async_basic.tentative.https.any.sharedworker.html [ Failure ]
@@ -3024,6 +3098,11 @@
 crbug.com/1050754 external/wpt/native-io/rename_async_failure_handling.tentative.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/rename_sync_basic.tentative.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/native-io/rename_sync_failure_handling.tentative.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/write_getLength_async_basic.tentative.https.any.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/write_getLength_async_basic.tentative.https.any.serviceworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/write_getLength_async_basic.tentative.https.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/write_getLength_async_basic.tentative.https.any.worker.html [ Failure ]
+crbug.com/1050754 external/wpt/native-io/write_getLength_sync_basic.tentative.https.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/navigation-timing/test_performance_attributes.sub.html [ Failure ]
 crbug.com/1050754 external/wpt/network-error-logging/sends-report-on-404.https.html [ Failure ]
 crbug.com/1050754 external/wpt/network-error-logging/sends-report-on-cache-validation.https.html [ Failure ]
@@ -3061,29 +3140,46 @@
 crbug.com/1050754 external/wpt/orientation-sensor/AbsoluteOrientationSensor.https.html [ Failure ]
 crbug.com/1050754 external/wpt/orientation-sensor/RelativeOrientationSensor-iframe-access.https.html [ Failure ]
 crbug.com/1050754 external/wpt/orientation-sensor/RelativeOrientationSensor.https.html [ Failure ]
-crbug.com/1050754 external/wpt/origin-isolation/about-blank.https.sub.html [ Failure ]
-crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/data-url.https.html [ Failure ]
-crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/removed-iframe.sub.https.html [ Failure ]
-crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/sandboxed-iframe.sub.https.html [ Failure ]
-crbug.com/1050754 external/wpt/origin-isolation/going-back.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-no-child-bad-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-no-child-yes-port.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-no-child-yes-same.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-no-child-yes-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-no-child-yeswithparams-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-no-port.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-no-same.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-no-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-yes-port.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-yes-same.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/1-iframe/parent-yes-child-yes-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-no-child1-no-subdomain-child2-yes-subdomainport.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-no-child1-no-subdomain1-child2-yes-subdomain2.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-no-child1-yes-subdomain-child2-no-port.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-no-child1-yes-subdomain-child2-no-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-no-subdomain-child2-no-subdomain2.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomain2.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-no-subdomain-child2-yes-subdomainport.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-yes-subdomain-child2-no-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomain2.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/2-iframes/parent-yes-child1-yes-subdomain-child2-yes-subdomainport.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/about-blank.https.sub.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/data-url.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/removed-iframe.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/getter-special-cases/sandboxed-iframe.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/going-back.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-no-same-2-yes-port.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-no-same-2-yes-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-no-subdomain-2-yes-subdomain2.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-subdomain-yes-2-subdomain2-no.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-no-1-yes-subdomain-2-no-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-yes-1-no-same-2-no-port.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/iframe-navigation/parent-yes-1-no-same-2-no-subdomain.sub.https.html [ Failure ]
+crbug.com/1050754 external/wpt/origin-isolation/insecure-http.sub.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-isolation/removing-iframes.sub.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-policy/bad-server/bad-headers.https.html [ Failure ]
 crbug.com/1050754 external/wpt/origin-policy/bad-server/manifest-404.https.html [ Failure ]
@@ -3204,6 +3300,7 @@
 crbug.com/1050754 external/wpt/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure ]
 crbug.com/1050754 external/wpt/pointerevents/pointerevent_coalesced_events_attributes.html [ Failure ]
 crbug.com/1050754 external/wpt/pointerevents/pointerevent_pointercapture_in_frame.html [ Timeout ]
+crbug.com/1050754 external/wpt/pointerevents/pointerevent_tiltX_tiltY_to_azimuth_altitude.html [ Failure ]
 crbug.com/1050754 external/wpt/pointerevents/pointerevent_touch-action-button-none-test_touch.html [ Timeout ]
 crbug.com/1050754 external/wpt/pointerevents/pointerevent_touch-action-pan-down-css_touch.html [ Timeout ]
 crbug.com/1050754 external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch.html [ Failure ]
@@ -3227,6 +3324,7 @@
 crbug.com/1050754 external/wpt/portals/history/history-manipulation-inside-portal.html [ Failure ]
 crbug.com/1050754 external/wpt/portals/htmlportalelement-event-handler-content-attributes.html [ Failure ]
 crbug.com/1050754 external/wpt/portals/portal-activate-data.html [ Failure ]
+crbug.com/1050754 external/wpt/portals/portal-activate-default.html [ Failure ]
 crbug.com/1050754 external/wpt/portals/portal-activate-event-constructor.html [ Failure ]
 crbug.com/1050754 external/wpt/portals/portal-activate-event.html [ Failure ]
 crbug.com/1050754 external/wpt/portals/portal-non-http-navigation.html [ Failure ]
@@ -3547,7 +3645,7 @@
 crbug.com/1050754 external/wpt/screen-capture/getdisplaymedia.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/screen-orientation/active-lock.html [ Failure ]
 crbug.com/1050754 external/wpt/screen-orientation/event-before-promise.html [ Failure ]
-crbug.com/1050754 external/wpt/screen-orientation/lock-basic.html [ Failure ]
+crbug.com/1050754 external/wpt/screen-orientation/lock-basic.html [ Failure Timeout ]
 crbug.com/1050754 external/wpt/screen-orientation/lock-sandboxed-iframe.html [ Failure ]
 crbug.com/1050754 external/wpt/screen-orientation/lock-unlock-check.html [ Failure ]
 crbug.com/1050754 external/wpt/screen-orientation/onchange-event-subframe.html [ Failure ]
@@ -3565,10 +3663,13 @@
 crbug.com/1050754 external/wpt/screen-wake-lock/wakelockpermissiondescriptor.https.html [ Failure ]
 crbug.com/1050754 external/wpt/screen_enumeration/getScreens.tentative.https.window.html [ Failure ]
 crbug.com/1050754 external/wpt/screen_enumeration/getScreens.values.https.html [ Failure ]
+crbug.com/1050754 external/wpt/screen_enumeration/isMultiScreen.tentative.https.window.html [ Failure ]
+crbug.com/1050754 external/wpt/screen_enumeration/isMultiScreen.values.https.html [ Failure ]
 crbug.com/1050754 external/wpt/screen_enumeration/screen_enumeration_permission.window.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/cancel-animation.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/constructor-no-document.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/constructor.html [ Failure ]
+crbug.com/1050754 external/wpt/scroll-animations/constructor.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/current-time-nan.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/current-time-root-scroller.html [ Failure ]
 crbug.com/1050754 external/wpt/scroll-animations/current-time-writing-modes.html [ Failure ]
@@ -3626,6 +3727,7 @@
 crbug.com/1050754 external/wpt/service-workers/cache-storage/worker/cache-matchAll.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/cache-storage/worker/cache-storage.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/service-workers/service-worker/ServiceWorkerGlobalScope/registration-attribute.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/about-blank-replacement.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/appcache-ordering-main.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/claim-fetch-with-appcache.https.html [ Timeout ]
@@ -3667,6 +3769,8 @@
 crbug.com/1050754 external/wpt/service-workers/service-worker/performance-timeline.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/postmessage.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/ready.https.window.html [ Timeout ]
+crbug.com/1050754 external/wpt/service-workers/service-worker/register-default-scope.https.html [ Failure ]
+crbug.com/1050754 external/wpt/service-workers/service-worker/register-same-scope-different-script-url.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/registration-mime-types.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/registration-schedule-job.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/registration-updateviacache.https.html [ Failure Timeout ]
@@ -3676,6 +3780,7 @@
 crbug.com/1050754 external/wpt/service-workers/service-worker/unregister-then-register.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/update-after-oneday.https.html [ Timeout ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/update-bytecheck.https.html [ Failure ]
+crbug.com/1050754 external/wpt/service-workers/service-worker/update-import-scripts.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/update-no-cache-request-headers.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/update-not-allowed.https.html [ Failure ]
 crbug.com/1050754 external/wpt/service-workers/service-worker/update-on-navigation.https.html [ Timeout ]
@@ -3753,6 +3858,7 @@
 crbug.com/1050754 external/wpt/signed-exchange/reporting/sxg-reporting-prefetch-signature_verification_error.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/signed-exchange/service-workers/sxg-sw-register-after-fallback.tentative.https.html [ Failure ]
 crbug.com/1050754 external/wpt/signed-exchange/service-workers/sxg-sw-register.tentative.https.html [ Failure ]
+crbug.com/1050754 external/wpt/signed-exchange/subresource/sxg-subresource-header-integrity-mismatch.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/signed-exchange/subresource/sxg-subresource.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/signed-exchange/sxg-data-cert-url.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/signed-exchange/sxg-double-prefetch.tentative.html [ Timeout ]
@@ -3783,6 +3889,7 @@
 crbug.com/1050754 external/wpt/storage-access-api/idlharness.window.html [ Failure ]
 crbug.com/1050754 external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure ]
 crbug.com/1050754 external/wpt/storage-access-api/sandboxAttribute.window.html [ Failure ]
+crbug.com/1050754 external/wpt/storage-access-api/storageAccess.testdriver.sub.html [ Failure ]
 crbug.com/1050754 external/wpt/storage/estimate-usage-details-application-cache.https.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/storage/permission-query.https.any.html [ Failure ]
 crbug.com/1050754 external/wpt/storage/permission-query.https.any.worker.html [ Failure ]
@@ -3843,7 +3950,9 @@
 crbug.com/1050754 external/wpt/streams/transform-streams/flush.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/general.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/lipfuzz.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/streams/transform-streams/patched-global.any.serviceworker.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/patched-global.any.sharedworker.html [ Failure ]
+crbug.com/1050754 external/wpt/streams/transform-streams/patched-global.any.worker.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/properties.any.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/properties.any.serviceworker.html [ Failure ]
 crbug.com/1050754 external/wpt/streams/transform-streams/properties.any.sharedworker.html [ Failure ]
@@ -3930,6 +4039,7 @@
 crbug.com/1050754 external/wpt/trust-tokens/end-to-end/has-trust-token-with-no-top-frame.tentative.https.html [ Failure ]
 crbug.com/1050754 external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html [ Failure ]
 crbug.com/1050754 external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html [ Failure ]
+crbug.com/1050754 external/wpt/trusted-types/TrustedTypePolicyFactory-blocking.html [ Failure ]
 crbug.com/1050754 external/wpt/trusted-types/WorkerGlobalScope-importScripts.html [ Failure ]
 crbug.com/1050754 external/wpt/trusted-types/block-string-assignment-to-DOMWindowTimers-setTimeout-setInterval.tentative.html [ Failure ]
 crbug.com/1050754 external/wpt/trusted-types/worker-constructor.https.html [ Failure ]
@@ -4064,10 +4174,12 @@
 crbug.com/1050754 external/wpt/web-animations/interfaces/KeyframeEffect/target.html [ Failure ]
 crbug.com/1050754 external/wpt/web-animations/timing-model/animations/pausing-an-animation.html [ Failure ]
 crbug.com/1050754 external/wpt/web-animations/timing-model/animations/setting-the-timeline-of-an-animation.html [ Failure ]
+crbug.com/1050754 external/wpt/web-animations/timing-model/timelines/document-timelines.html [ Failure ]
 crbug.com/1050754 external/wpt/web-animations/timing-model/timelines/timelines.html [ Failure ]
 crbug.com/1050754 external/wpt/web-animations/timing-model/timelines/update-and-send-events-replacement.html [ Failure ]
 crbug.com/1050754 external/wpt/web-animations/timing-model/timelines/update-and-send-events.html [ Failure ]
 crbug.com/1050754 external/wpt/web-bundle/subresource-loading/link-web-bundle.tentative.html [ Failure ]
+crbug.com/1050754 external/wpt/web-bundle/subresource-loading/subresource-loading-from-web-bundle.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/web-bundle/wbn-from-network/wbn-location.tentative.html [ Timeout ]
 crbug.com/1050754 external/wpt/web-locks/acquire.tentative.https.any.sharedworker.html [ Failure ]
 crbug.com/1050754 external/wpt/web-locks/clientids.tentative.https.html [ Failure ]
@@ -4257,6 +4369,7 @@
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-createAnswer.html [ Failure ]
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-createDataChannel.html [ Timeout ]
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-createOffer.html [ Failure ]
+crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-explicit-rollback-iceGatheringState.html [ Timeout ]
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-generateCertificate.html [ Failure ]
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-getDefaultIceServers.html [ Failure ]
 crbug.com/1050754 external/wpt/webrtc/RTCPeerConnection-getStats.https.html [ Timeout ]
@@ -4421,7 +4534,12 @@
 crbug.com/1050754 external/wpt/webvtt/parsing/file-parsing/tests/settings-line.html [ Failure ]
 crbug.com/1050754 external/wpt/webvtt/parsing/file-parsing/tests/settings-position.html [ Failure ]
 crbug.com/1050754 external/wpt/webvtt/parsing/file-parsing/tests/settings-region.html [ Failure ]
+crbug.com/1050754 external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html [ Failure ]
+crbug.com/1050754 external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html [ Failure ]
+crbug.com/1050754 external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html [ Failure ]
+crbug.com/1050754 external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html [ Failure ]
 crbug.com/1050754 external/wpt/webxr/anchors/ar_anchor_states.https.html [ Failure ]
+crbug.com/1050754 external/wpt/webxr/anchors/idlharness.https.window.html [ Failure ]
 crbug.com/1050754 external/wpt/webxr/ar-module/idlharness.https.window.html [ Failure ]
 crbug.com/1050754 external/wpt/webxr/ar-module/xrDevice_isSessionSupported_immersive-ar.https.html [ Failure ]
 crbug.com/1050754 external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html [ Failure ]
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 f726331f..df1dda86 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
@@ -177553,7 +177553,7 @@
        []
       ],
       "grid-inline-template-columns-rows-resolved-values-001.tentative-expected.txt": [
-       "c9eac7bd66ee5edb9fe7216958ed607313d0c4e5",
+       "0f92eef471cbf581117bba5ca7a42f0d7f573f6a",
        []
       ],
       "grid-limits-001-expected.txt": [
@@ -177573,7 +177573,7 @@
        []
       ],
       "grid-template-columns-rows-resolved-values-001.tentative-expected.txt": [
-       "c9eac7bd66ee5edb9fe7216958ed607313d0c4e5",
+       "0f92eef471cbf581117bba5ca7a42f0d7f573f6a",
        []
       ],
       "grid-template-rows-fit-content-001-ref.html": [
@@ -177582,7 +177582,7 @@
       ],
       "support": {
        "testing-utils.js": [
-        "217b620463624e2feb294b320e7787f6c91f1932",
+        "bfedc32b710136cf73706809d62bf19305be720b",
         []
        ]
       }
@@ -177737,11 +177737,11 @@
        []
       ],
       "grid-flex-track-intrinsic-sizes-001-expected.txt": [
-       "549da5a597dba9fcf40ae65da6b77f28412653dd",
+       "f9802810a8f8b66342a94c254dfc8b75536922c4",
        []
       ],
       "grid-flex-track-intrinsic-sizes-003-expected.txt": [
-       "549da5a597dba9fcf40ae65da6b77f28412653dd",
+       "b2c708ec3d43a2fafbc370ec5f7fec8bdc238527",
        []
       ],
       "references": {
@@ -246480,7 +246480,7 @@
      ]
     ],
     "idbobjectstore_putall.tentative.any.js": [
-     "8bdc765906d86504bcb344e1e579a97f8f602c6e",
+     "a312d71d03d59c5c9369afa1492aacd0e91e9a5d",
      [
       "IndexedDB/idbobjectstore_putall.tentative.any.html",
       {
@@ -275691,7 +275691,7 @@
        ]
       ],
       "grid-flex-track-intrinsic-sizes-003.html": [
-       "81a5d14131078c214b59f236838043870dda2512",
+       "13c968e9150674596088ac3e695fc81df3e951e7",
        [
         null,
         {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.tentative-expected.txt
index c9eac7b..0f92eef4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.tentative-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-inline-template-columns-rows-resolved-values-001.tentative-expected.txt
@@ -1,80 +1,80 @@
 This is a testharness.js-based test.
 Found 76 tests; 40 PASS, 36 FAIL, 0 TIMEOUT, 0 NOTRUN.
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ; assert_in_array: gridTemplateRows value "10px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ; assert_in_array: gridTemplateRows value "10px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: 50px;
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px 20px" not in array ["50px"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px 20px" not in array ["50px"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateRows value "50px 30px 20px" not in array ["50px 30px"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateRows value "50px 30px 20px" not in array ["50px 30px"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px;
-FAIL 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px" not in array ["50px"]
+FAIL undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px" not in array ["50px"]
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px;
-PASS 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
+PASS undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "60px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "60px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px;
-PASS 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
+PASS undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px;
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.tentative-expected.txt
index c9eac7b..0f92eef4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.tentative-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/grid-template-columns-rows-resolved-values-001.tentative-expected.txt
@@ -1,80 +1,80 @@
 This is a testharness.js-based test.
 Found 76 tests; 40 PASS, 36 FAIL, 0 TIMEOUT, 0 NOTRUN.
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ; assert_in_array: gridTemplateRows value "10px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ; assert_in_array: gridTemplateRows value "10px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: auto auto; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateRows value "20px 20px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: ;
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: 50px;
-FAIL 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
+FAIL undefined 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px" not in array ["none"]
 PASS Children of 'grid' with: grid-template-columns: ; and grid-template-rows: 50px 30px;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px 20px" not in array ["50px"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px 20px" not in array ["50px"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px;
-FAIL 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateRows value "50px 30px 20px" not in array ["50px 30px"]
+FAIL undefined 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateRows value "50px 30px 20px" not in array ["50px 30px"]
 PASS Children of 'grid' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px;
-FAIL 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px" not in array ["50px"]
+FAIL undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateRows value "50px 20px" not in array ["50px"]
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px;
-PASS 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
+PASS undefined 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
 PASS Children of 'grid' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: ;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "110px 0px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 50px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 0px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 50px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px;
-FAIL 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
+FAIL undefined 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px 50px"]
 PASS Children of 'gridItemsPositions' with: grid-template-columns: 60px 50px; and grid-template-rows: 60px 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: auto auto;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "110px 50px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: ; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "60px 110px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "60px 50px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px; assert_in_array: gridTemplateColumns value "60px 50px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
+FAIL undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px; assert_in_array: gridTemplateColumns value "100px 60px 50px" not in array ["100px 60px"]
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px;
-PASS 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
+PASS undefined 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
 PASS Children of 'gridAutoFlowColumn' with: grid-template-columns: 100px 60px; and grid-template-rows: 50px 30px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: ;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "110px 50px 0px 0px 100px" not in array ["none"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: ; and grid-template-rows: 60px 70px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 50px 0px 0px 100px" not in array ["60px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px; and grid-template-rows: 60px 70px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px;
-FAIL 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
+FAIL undefined 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px; assert_in_array: gridTemplateColumns value "60px 70px 0px 0px 100px" not in array ["60px 70px"]
 PASS Children of 'gridAutoFlowColumnItemsPositions' with: grid-template-columns: 60px 70px; and grid-template-rows: 60px 70px;
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/support/testing-utils.js b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/support/testing-utils.js
index 217b620..bfedc32b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/support/testing-utils.js
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/support/testing-utils.js
@@ -12,14 +12,14 @@
         assert_in_array(getComputedStyle(element).gridTemplateRows, value, "gridTemplateRows");
     }
 
-    function testGridTemplateColumnsRows(gridId, columnsStyle, rowsStyle, columnsComputedValue, rowsComputedValue) {
+    function testGridTemplateColumnsRows(gridId, columnsStyle, rowsStyle, columnsComputedValue, rowsComputedValue, label) {
         test(function() {
             var grid = document.getElementById(gridId);
             grid.style.gridTemplateColumns = columnsStyle;
             grid.style.gridTemplateRows = rowsStyle;
             checkGridTemplateColumns(grid, columnsComputedValue);
             checkGridTemplateRows(grid, rowsComputedValue);
-        }, "'" + gridId + "' with: grid-template-columns: " + columnsStyle  + "; and grid-template-rows: " + rowsStyle + ";");
+        }, (label + " " || "") + "'" + gridId + "' with: grid-template-columns: " + columnsStyle  + "; and grid-template-rows: " + rowsStyle + ";");
     }
 
     function checkGridTemplateAreas(element, value) {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
index 549da5a..f9802810 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
@@ -1,33 +1,33 @@
 This is a testharness.js-based test.
-PASS 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
-PASS 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
-PASS 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
-PASS 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
-PASS 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
-FAIL 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "12.5px 37.5px" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 50px" not in array ["50px 50px 0px"]
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr);
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["75px 25px"]
-FAIL 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["25px 75px"]
+PASS undefined 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
+PASS undefined 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
+PASS undefined 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
+PASS undefined 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
+FAIL undefined 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"]
+FAIL undefined 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["50px 50px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "12.5px 37.5px" not in array ["25px 75px"]
+FAIL undefined 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 50px" not in array ["50px 50px 0px"]
+PASS undefined 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
+PASS undefined 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr);
+FAIL undefined 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["75px 25px"]
+FAIL undefined 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL undefined 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
+FAIL undefined 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["0px 100px"]
+FAIL undefined 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["25px 75px"]
+FAIL undefined 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["25px 75px"]
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
index 549da5a..b2c708e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
@@ -1,33 +1,106 @@
 This is a testharness.js-based test.
-PASS 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
-PASS 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
-PASS 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
-PASS 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
-PASS 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
-FAIL 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "12.5px 37.5px" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 50px" not in array ["50px 50px 0px"]
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
-PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
-PASS 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr);
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["75px 25px"]
-FAIL 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["25px 75px"]
+Found 102 tests; 78 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS auto min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
+PASS auto min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
+PASS auto min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr;
+PASS auto min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr;
+PASS auto min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr;
+PASS auto min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr;
+PASS auto min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr;
+PASS auto min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr;
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr);
+PASS auto min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr);
+PASS auto min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content;
+PASS auto min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto;
+PASS auto min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto;
+PASS auto min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto;
+PASS auto min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content;
+PASS auto min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content;
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content;
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto;
+PASS auto min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto;
+PASS auto min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto;
+PASS auto min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto;
+PASS min-content min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
+PASS min-content min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
+PASS min-content min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["0px 100px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 50px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "15px 45px" not in array ["25px 75px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 60px" not in array ["50px 50px 0px"]
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
+PASS min-content min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr);
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 60px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["75px 25px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"]
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content;
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto;
+PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto;
+PASS min-content min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto;
+PASS min-content min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto;
+PASS 50px min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
+PASS 50px min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["25px 25px"]
+PASS 50px min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr;
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 60px" not in array ["25px 25px 10px"]
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
+PASS 50px min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr);
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 60px" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 10px"]
+PASS 50px min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr);
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 10px"]
+PASS 50px min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content;
+PASS 50px min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto;
+PASS 50px min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto;
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003.html
index 81a5d141..13c968e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003.html
@@ -3,14 +3,16 @@
 <title>CSS Grid Layout Test: Intrinsic contribution of an item with flex tracks</title>
 <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
 <link rel="author" title="Tab Atkins-Bittner" href="mailto:jackalmage@gmail.com">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-spanning-items" title="11.5.3 Increase sizes to accommodate spanning items crossing content-sized tracks">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-spanning-flex-items" title="11.5.4 Increase sizes to accommodate spanning items crossing flexible tracks">
+<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-spanning-items">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-spanning-flex-items">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#min-size-auto">
 <meta name="assert" content="This test checks that the intrinsic contribution of a single grid item is distributed correctly among the tracks it spans when flexible tracks are involved, and the item's size is determined by its children rather than explicitly.">
 <style>
 #grid {
   display: grid;
-  width: 50px;
-  height: 50px;
+  width: 60px;
+  height: 60px;
   border: solid;
 }
 #item {
@@ -35,24 +37,81 @@
 <script src="../grid-definition/support/testing-utils.js"></script>
 <script>
 const item = document.getElementById("item");
+let testset = "unlabeled";
 function checkTrackSizes(span, trackList, expected) {
   item.style.gridColumn = item.style.gridRow = `span ${span}`;
-  TestingUtils.testGridTemplateColumnsRows("grid", trackList, trackList, expected, expected);
+  TestingUtils.testGridTemplateColumnsRows("grid", trackList, trackList, expected, expected, testset);
 }
 
-// Item spanning an intrinsic flexible track
+// First check for distributing auto minimum ///////////////////////////////////
+testset = "auto min item";
+
+// Item spanning an auto flexible track
 checkTrackSizes(1, "0fr", "100px");
 checkTrackSizes(1, "1fr", "100px");
 checkTrackSizes(1, "2fr", "100px");
 
 // Item spanning a fixed flexible track
 checkTrackSizes(1, "minmax(0, 0fr)", "0px");
-checkTrackSizes(1, "minmax(0, .5fr)", "25px");
-checkTrackSizes(1, "minmax(0, 1fr)", "50px");
-checkTrackSizes(1, "minmax(0, 2fr)", "50px");
+checkTrackSizes(1, "minmax(0, .5fr)", "30px");
+checkTrackSizes(1, "minmax(0, 1fr)", "60px");
+checkTrackSizes(1, "minmax(0, 2fr)", "60px");
 checkTrackSizes(1, "minmax(75px, 1fr)", "75px");
 
-// Item spanning 2 intrinsic flexible tracks
+// Item spanning 2 auto flexible tracks
+checkTrackSizes(2, "0fr 0fr", "0px 0px");
+checkTrackSizes(2, "0fr 1fr", "0px 60px");
+checkTrackSizes(2, "1fr 0fr", "60px 0px");
+checkTrackSizes(2, "1fr 1fr", "30px 30px");
+checkTrackSizes(2, "1fr 3fr", "15px 45px");
+checkTrackSizes(2, "0fr 0fr 1fr", "0px 0px 60px");
+
+// Item spanning 2 fixed flexible tracks
+checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 0fr)", "0px 0px");
+checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 1fr)", "0px 60px");
+checkTrackSizes(2, "minmax(15px, 0fr) minmax(0, 1fr)", "15px 45px");
+checkTrackSizes(2, "minmax(20px, 1fr) minmax(0, 1fr)", "30px 30px");
+checkTrackSizes(2, "minmax(40px, 1fr) minmax(0, 1fr)", "40px 20px");
+
+// Item spanning an auto flexible track and a fixed flexible track
+checkTrackSizes(2, "0fr minmax(0, 0fr)", "0px 0px");
+checkTrackSizes(2, "0fr minmax(0, 1fr)", "0px 60px");
+checkTrackSizes(2, "1fr minmax(0, 1fr)", "30px 30px");
+checkTrackSizes(2, "1fr minmax(25px, 1fr)", "30px 30px");
+
+// Item spanning an auto flexible track and an intrinsic non-flexible track
+checkTrackSizes(2, "0fr min-content", "0px 0px");
+checkTrackSizes(2, "0fr auto", "0px 60px");
+checkTrackSizes(2, "0.5fr auto", "30px 30px");
+checkTrackSizes(2, "1fr auto", "60px 0px");
+checkTrackSizes(2, "1fr max-content", "60px 0px");
+checkTrackSizes(2, "1fr min-content", "60px 0px");
+
+// Item spanning a fixed flexible track and an intrinsic non-flexible track
+checkTrackSizes(2, "minmax(0, 0fr) min-content", "0px 0px");
+checkTrackSizes(2, "minmax(0, 0fr) auto", "0px 60px");
+checkTrackSizes(2, "minmax(0, 1fr) auto", "60px 0px");
+checkTrackSizes(2, "minmax(25px, 0fr) auto", "25px 35px");
+checkTrackSizes(2, "minmax(25px, 1fr) auto", "60px 0px");
+
+// Now check for distributing min content //////////////////////////////////////
+item.style.minWidth  = "min-content"; // min-content = 100px > grid
+item.style.minHeight = "100px"; // min-content doesn't resolve in block axis (yet?)
+testset = "min-content min item";
+
+// Item spanning an auto flexible track
+checkTrackSizes(1, "0fr", "100px");
+checkTrackSizes(1, "1fr", "100px");
+checkTrackSizes(1, "2fr", "100px");
+
+// Item spanning a fixed flexible track
+checkTrackSizes(1, "minmax(0, 0fr)", "0px");
+checkTrackSizes(1, "minmax(0, .5fr)", "30px");
+checkTrackSizes(1, "minmax(0, 1fr)", "60px");
+checkTrackSizes(1, "minmax(0, 2fr)", "60px");
+checkTrackSizes(1, "minmax(75px, 1fr)", "75px");
+
+// Item spanning 2 auto flexible tracks
 checkTrackSizes(2, "0fr 0fr", "50px 50px");
 checkTrackSizes(2, "0fr 1fr", "0px 100px");
 checkTrackSizes(2, "1fr 0fr", "100px 0px");
@@ -62,25 +121,82 @@
 
 // Item spanning 2 fixed flexible tracks
 checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 0fr)", "0px 0px");
-checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 1fr)", "0px 50px");
-checkTrackSizes(2, "minmax(15px, 0fr) minmax(0, 1fr)", "15px 35px");
-checkTrackSizes(2, "minmax(20px, 1fr) minmax(0, 1fr)", "25px 25px");
-checkTrackSizes(2, "minmax(30px, 1fr) minmax(0, 1fr)", "30px 20px");
+checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 1fr)", "0px 60px");
+checkTrackSizes(2, "minmax(15px, 0fr) minmax(0, 1fr)", "15px 45px");
+checkTrackSizes(2, "minmax(20px, 1fr) minmax(0, 1fr)", "30px 30px");
+checkTrackSizes(2, "minmax(40px, 1fr) minmax(0, 1fr)", "40px 20px");
 
-// Item spanning an intrinsic flexible track and a fixed flexible track
+// Item spanning an auto flexible track and a fixed flexible track
 checkTrackSizes(2, "0fr minmax(0, 0fr)", "100px 0px");
 checkTrackSizes(2, "0fr minmax(0, 1fr)", "100px 0px");
 checkTrackSizes(2, "1fr minmax(0, 1fr)", "100px 0px");
 checkTrackSizes(2, "1fr minmax(25px, 1fr)", "75px 25px");
 
-// Item spanning an intrinsic flexible track and an intrinsic non-flexible track
+// Item spanning an auto flexible track and an intrinsic non-flexible track
+checkTrackSizes(2, "0fr min-content", "100px 0px");
 checkTrackSizes(2, "0fr auto", "100px 0px");
+checkTrackSizes(2, "0.5fr auto", "100px 0px");
 checkTrackSizes(2, "1fr auto", "100px 0px");
 checkTrackSizes(2, "1fr max-content", "100px 0px");
+checkTrackSizes(2, "1fr min-content", "100px 0px");
 
 // Item spanning a fixed flexible track and an intrinsic non-flexible track
-checkTrackSizes(2, "minmax(0, 0fr) auto", "0px 100px");
-checkTrackSizes(2, "minmax(0, 1fr) auto", "0px 100px");
-checkTrackSizes(2, "minmax(25px, 0fr) auto", "25px 75px");
-checkTrackSizes(2, "minmax(25px, 1fr) auto", "25px 75px");
+checkTrackSizes(2, "minmax(0, 0fr) min-content", "0px 0px");
+checkTrackSizes(2, "minmax(0, 0fr) auto", "0px 60px");
+checkTrackSizes(2, "minmax(0, 1fr) auto", "60px 0px");
+checkTrackSizes(2, "minmax(25px, 0fr) auto", "25px 35px");
+checkTrackSizes(2, "minmax(25px, 1fr) auto", "60px 0px");
+
+// Now check for distributing fixed min ////////////////////////////////////////
+item.style.minWidth = "50px"; // minimum < grid < min-content
+item.style.minHeight = "50px"; // minimum < grid < min-content
+testset = "50px min item";
+
+// Item spanning an auto flexible track
+checkTrackSizes(1, "0fr", "50px");
+checkTrackSizes(1, "1fr", "60px");
+checkTrackSizes(1, "2fr", "60px");
+
+// Item spanning a fixed flexible track
+checkTrackSizes(1, "minmax(0, 0fr)", "0px");
+checkTrackSizes(1, "minmax(0, .5fr)", "30px");
+checkTrackSizes(1, "minmax(0, 1fr)", "60px");
+checkTrackSizes(1, "minmax(0, 2fr)", "60px");
+checkTrackSizes(1, "minmax(75px, 1fr)", "75px");
+
+// Item spanning 2 auto flexible tracks
+checkTrackSizes(2, "0fr 0fr", "25px 25px");
+checkTrackSizes(2, "0fr 1fr", "0px 60px");
+checkTrackSizes(2, "1fr 0fr", "60px 0px");
+checkTrackSizes(2, "1fr 1fr", "30px 30px");
+checkTrackSizes(2, "1fr 3fr", "15px 45px");
+checkTrackSizes(2, "0fr 0fr 1fr", "25px 25px 10px");
+
+// Item spanning 2 fixed flexible tracks
+checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 0fr)", "0px 0px");
+checkTrackSizes(2, "minmax(0, 0fr) minmax(0, 1fr)", "0px 60px");
+checkTrackSizes(2, "minmax(15px, 0fr) minmax(0, 1fr)", "15px 45px");
+checkTrackSizes(2, "minmax(20px, 1fr) minmax(0, 1fr)", "30px 30px");
+checkTrackSizes(2, "minmax(40px, 1fr) minmax(0, 1fr)", "40px 20px");
+
+// Item spanning an auto flexible track and a fixed flexible track
+checkTrackSizes(2, "0fr minmax(0, 0fr)", "50px 0px");
+checkTrackSizes(2, "0fr minmax(0, 1fr)", "50px 10px");
+checkTrackSizes(2, "1fr minmax(0, 1fr)", "50px 10px");
+checkTrackSizes(2, "1fr minmax(25px, 1fr)", "30px 30px");
+
+// Item spanning an auto flexible track and an intrinsic non-flexible track
+checkTrackSizes(2, "0fr min-content", "50px 0px");
+checkTrackSizes(2, "0fr auto", "50px 10px");
+checkTrackSizes(2, "0.5fr auto", "50px 10px");
+checkTrackSizes(2, "1fr auto", "60px 0px");
+checkTrackSizes(2, "1fr max-content", "60px 0px");
+checkTrackSizes(2, "1fr min-content", "60px 0px");
+
+// Item spanning a fixed flexible track and an intrinsic non-flexible track
+checkTrackSizes(2, "minmax(0, 0fr) min-content", "0px 0px");
+checkTrackSizes(2, "minmax(0, 0fr) auto", "0px 60px");
+checkTrackSizes(2, "minmax(0, 1fr) auto", "60px 0px");
+checkTrackSizes(2, "minmax(25px, 0fr) auto", "25px 35px");
+checkTrackSizes(2, "minmax(25px, 1fr) auto", "60px 0px");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift-vertical-rl.html b/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift-vertical-rl.html
new file mode 100644
index 0000000..06bc34c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift-vertical-rl.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>Layout Instability: simple block movement is detected</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
+<body style="writing-mode: vertical-rl">
+<div style="height: 200px; font-size: 20px; line-height: 25px">
+  1AAAAAAA<br>
+  2AAAAAAA<br>
+  3AAAAAAA<br>
+  <div id="inline-block" style="display: inline-block; width: 50px">4AAAAAAA</div><br>
+  5AAAAAAA<br>
+  6AAAAAAA<br>
+  7AAAAAAA<br>
+</div>
+<script>
+
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  // Modify the position of the div.
+  const inline_block = document.querySelector("#inline-block");
+  inline_block.style.width = '100px';
+
+  // The lines below the inline-block are shifted down by 50px.
+  // The implementation may measure the real width of the shifted text
+  // or use the available width (i.e. width of the containing block).
+  // Also tolerate extra 10% error.
+  const text_width = inline_block.offsetWidth;
+  const expectedScoreMin = computeExpectedScore(text_width * (30 * 3 + 50), 50) * 0.9;
+  const expectedScoreMax = computeExpectedScore(200 * (30 * 3 + 50), 50) * 1.1;
+
+  // Observer fires after the frame is painted.
+  assert_equals(watcher.score, 0);
+  await watcher.promise;
+  assert_between_exclusive(watcher.score, expectedScoreMin, expectedScoreMax);
+}, 'Inline flow movement.');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift.html b/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift.html
new file mode 100644
index 0000000..39550da
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/inline-flow-shift.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<title>Layout Instability: simple block movement is detected</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
+<div style="width: 200px; font-size: 20px; line-height: 25px">
+  1AAAAAAA<br>
+  2AAAAAAA<br>
+  3AAAAAAA<br>
+  <div id="inline-block" style="display: inline-block; height: 50px">4AAAAAAA</div><br>
+  5AAAAAAA<br>
+  6AAAAAAA<br>
+  7AAAAAAA<br>
+</div>
+<script>
+
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  // Modify the position of the div.
+  const inline_block = document.querySelector("#inline-block");
+  inline_block.style.height = '100px';
+
+  // The lines below the inline-block are shifted down by 50px.
+  // The implementation may measure the real width of the shifted text
+  // or use the available width (i.e. width of the containing block).
+  // Also tolerate extra 10% error.
+  const text_width = inline_block.offsetWidth;
+  const expectedScoreMin = computeExpectedScore(text_width * (30 * 3 + 50), 50) * 0.9;
+  const expectedScoreMax = computeExpectedScore(200 * (30 * 3 + 50), 50) * 1.1;
+
+  // Observer fires after the frame is painted.
+  assert_equals(watcher.score, 0);
+  await watcher.promise;
+  assert_between_exclusive(watcher.score, expectedScoreMin, expectedScoreMax);
+}, 'Inline flow movement.');
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/outline.html b/third_party/blink/web_tests/external/wpt/layout-instability/outline.html
new file mode 100644
index 0000000..1fed8e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/outline.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Layout Instability: outline doesn't contribute to layout shift</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/util.js"></script>
+<div id="target" style="width: 300px; height: 300px"></div>
+<script>
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  // Add outline for target. This should not generate a shift.
+  target.style.outline = "10px solid blue";
+
+  await waitForAnimationFrames(3);
+  assert_equals(watcher.score, 0);
+}, "Outline.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/origin-isolation/about-blank.https.sub.html b/third_party/blink/web_tests/external/wpt/origin-isolation/about-blank.https.sub.html
index 50a07ff..6af31dd 100644
--- a/third_party/blink/web_tests/external/wpt/origin-isolation/about-blank.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/origin-isolation/about-blank.https.sub.html
@@ -34,23 +34,20 @@
   const iframe = document.createElement("iframe");
   document.body.append(iframe);
 
-  // Now use document.write() to get the child frame script in there, without
-  // actually navigating anywhere.
+  // Now create and add the script, but don't navigate anywhere (since we want
+  // to stay on the initial about:blank).
   // We need to absolutize the URL to since about:blank doesn't have a base URL.
   const scriptURL = (new URL("./resources/child-frame-script.mjs", import.meta.url)).href;
-  iframe.contentDocument.write(`<script type="module" src="${scriptURL}"></scr` + `ipt>`);
-  iframe.contentDocument.close();
+  const script = iframe.contentDocument.createElement("script");
+  script.type = "module";
+  script.src = scriptURL;
 
   await new Promise((resolve, reject) => {
-    // Note that since this code runs during the same event loop turn as the
-    // contentDocument.write() above, we know that the load/error events will
-    // not have been fired at this time. (The spec guarantees they are fired
-    // from queued tasks.)
-    const script = iframe.contentDocument.querySelector("script");
     script.onload = resolve;
     script.onerror = () => reject(
       new Error("Could not load the child frame script into the about:blank page")
     );
+    iframe.contentDocument.body.append(script);
   });
 
   await setBothDocumentDomains(iframe.contentWindow);
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-change-size-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-change-size-expected.txt
new file mode 100644
index 0000000..51f97ecd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-change-size-expected.txt
@@ -0,0 +1,14 @@
+{
+  "layers": [
+    {
+      "name": "Scrolling background of LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "invalidations": [
+        [0, 0, 800, 600]
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-content-box-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-content-box-expected.txt
new file mode 100644
index 0000000..51f97ecd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/background/html-background-image-content-box-expected.txt
@@ -0,0 +1,14 @@
+{
+  "layers": [
+    {
+      "name": "Scrolling background of LayoutView #document",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "invalidations": [
+        [0, 0, 800, 600]
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-expected.png
new file mode 100644
index 0000000..44dca71
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-xhtml-expected.png
new file mode 100644
index 0000000..44dca71
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/001-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-xhtml-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/002-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-declarative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-declarative-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-declarative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-xhtml-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/003-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-declarative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-declarative-expected.png
new file mode 100644
index 0000000..de8e2da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-declarative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-expected.png
new file mode 100644
index 0000000..de8e2da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-xhtml-expected.png
new file mode 100644
index 0000000..de8e2da
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/004-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-declarative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-declarative-expected.png
new file mode 100644
index 0000000..6200e5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-declarative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-expected.png
new file mode 100644
index 0000000..6200e5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-xhtml-expected.png
new file mode 100644
index 0000000..6200e5e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/005-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-declarative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-declarative-expected.png
new file mode 100644
index 0000000..dfe9492
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-declarative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-expected.png
new file mode 100644
index 0000000..dfe9492
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-xhtml-expected.png
new file mode 100644
index 0000000..dfe9492
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/006-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-declarative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-declarative-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-declarative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-xhtml-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-xhtml-expected.png
new file mode 100644
index 0000000..06d8165
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/body-propagation/overflow/007-xhtml-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/001-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/001-expected.png
new file mode 100644
index 0000000..ee3fa6a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/002-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/002-expected.png
new file mode 100644
index 0000000..de91eba
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/002-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/003-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/003-expected.png
new file mode 100644
index 0000000..39fe354
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/004-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/004-expected.png
new file mode 100644
index 0000000..e7eb058
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/005-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/005-expected.png
new file mode 100644
index 0000000..6654f94f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/006-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/006-expected.png
new file mode 100644
index 0000000..6654f94f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/006-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/007-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/007-expected.png
new file mode 100644
index 0000000..0b504d4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/008-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/008-expected.png
new file mode 100644
index 0000000..edc588d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/008-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/010-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/010-expected.png
new file mode 100644
index 0000000..a1c0fac
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/010-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/011-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/011-expected.png
new file mode 100644
index 0000000..0fd5c3e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/011-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/012-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/012-expected.png
new file mode 100644
index 0000000..5558a2cb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/012-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/013-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/013-expected.png
new file mode 100644
index 0000000..f232979
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/013-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/014-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/014-expected.png
new file mode 100644
index 0000000..f232979
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/014-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/015-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/015-expected.png
new file mode 100644
index 0000000..f232979
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/015-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/016-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/016-expected.png
new file mode 100644
index 0000000..b1297b4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/016-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/017-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/017-expected.png
new file mode 100644
index 0000000..ae98922
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/017-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/018-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/018-expected.png
new file mode 100644
index 0000000..44278c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/018-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/019-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/019-expected.png
new file mode 100644
index 0000000..44278c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/019-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-expected.png
new file mode 100644
index 0000000..eeb6606c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-vertical-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-vertical-expected.png
new file mode 100644
index 0000000..6bafd88
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/021-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/022-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/022-expected.png
new file mode 100644
index 0000000..8c4e2ab
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/022-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/023-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/023-expected.png
new file mode 100644
index 0000000..3e238fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/023-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/024-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/024-expected.png
new file mode 100644
index 0000000..3e238fe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/024-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/025-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/025-expected.png
new file mode 100644
index 0000000..3f14be3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/025-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/026-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/026-expected.png
new file mode 100644
index 0000000..dc05588
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/026-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/block-axis-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/block-axis-expected.png
new file mode 100644
index 0000000..626a5c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/block-axis-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/flex-hang-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/flex-hang-expected.png
new file mode 100644
index 0000000..96dab57
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/flex-hang-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/overhanging-floats-removed-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/overhanging-floats-removed-expected.png
new file mode 100644
index 0000000..c3b3537
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/deprecated-flexbox/overhanging-floats-removed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/001-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/001-expected.png
new file mode 100644
index 0000000..a1e5bf1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/001-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/003-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/003-expected.png
new file mode 100644
index 0000000..391c75d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/003-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/004-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/004-expected.png
new file mode 100644
index 0000000..4bb0f5f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/005-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/005-expected.png
new file mode 100644
index 0000000..cf09763
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/005-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/007-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/007-expected.png
new file mode 100644
index 0000000..36035e3b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/007-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/008-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/008-expected.png
new file mode 100644
index 0000000..de69f32e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/008-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/border-radius-clipping-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/border-radius-clipping-expected.png
new file mode 100644
index 0000000..31eb6fbc
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/border-radius-clipping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/childFocusRingClip-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/childFocusRingClip-expected.png
new file mode 100644
index 0000000..64ba23c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/childFocusRingClip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/clip-rects-fixed-ancestor-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/clip-rects-fixed-ancestor-expected.png
new file mode 100644
index 0000000..4ce12edd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/clip-rects-fixed-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/dynamic-hidden-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/dynamic-hidden-expected.png
new file mode 100644
index 0000000..67696f4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/dynamic-hidden-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/float-in-relpositioned-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/float-in-relpositioned-expected.png
new file mode 100644
index 0000000..40f246b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/float-in-relpositioned-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hidden-scrollbar-resize-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hidden-scrollbar-resize-expected.png
new file mode 100644
index 0000000..76d465a0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hidden-scrollbar-resize-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hit-test-overflow-controls-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hit-test-overflow-controls-expected.png
new file mode 100644
index 0000000..0ecebcffc4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/hit-test-overflow-controls-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/image-selection-highlight-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/image-selection-highlight-expected.png
new file mode 100644
index 0000000..9c212e1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/image-selection-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursion-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursion-expected.png
new file mode 100644
index 0000000..20ddebd2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursionGuard-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursionGuard-expected.png
new file mode 100644
index 0000000..6c4289a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/infiniteRecursionGuard-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/line-clamp-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/line-clamp-expected.png
new file mode 100644
index 0000000..f3f4712b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/line-clamp-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-position-absolute-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-position-absolute-expected.png
new file mode 100644
index 0000000..edafcbe
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-position-absolute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-table-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-table-expected.png
new file mode 100644
index 0000000..0f918ff
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-auto-table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-float-stacking-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-float-stacking-expected.png
new file mode 100644
index 0000000..a6d8dc9b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-float-stacking-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-focus-ring-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-focus-ring-expected.png
new file mode 100644
index 0000000..800c66d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-of-video-outline-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-of-video-outline-expected.png
new file mode 100644
index 0000000..4cc46c4d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-of-video-outline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-expected.png
new file mode 100644
index 0000000..ca17cf4b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-inline-scrollbar-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-inline-scrollbar-expected.png
new file mode 100644
index 0000000..e4f5a82c
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-inline-scrollbar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-vertical-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-vertical-expected.png
new file mode 100644
index 0000000..44ec8dea
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-rtl-vertical-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-stacking-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-stacking-expected.png
new file mode 100644
index 0000000..7099c86
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-stacking-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-text-hit-testing-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-text-hit-testing-expected.png
new file mode 100644
index 0000000..57b491046
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-text-hit-testing-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-update-transform-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-update-transform-expected.png
new file mode 100644
index 0000000..c074d70
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-update-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-with-local-background-attachment-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-with-local-background-attachment-expected.png
new file mode 100644
index 0000000..81da4f0
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-with-local-background-attachment-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-x-y-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-x-y-expected.png
new file mode 100644
index 0000000..677bdc9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow-x-y-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow_hidden-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow_hidden-expected.png
new file mode 100644
index 0000000..07ee2fd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/overflow_hidden-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-fixed-transform-clipping-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-fixed-transform-clipping-expected.png
new file mode 100644
index 0000000..fb832a1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-fixed-transform-clipping-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-relative-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-relative-expected.png
new file mode 100644
index 0000000..626a5c7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/position-relative-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png
new file mode 100644
index 0000000..1292d3a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scroll-nested-positioned-layer-in-overflow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollRevealButton-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollRevealButton-expected.png
new file mode 100644
index 0000000..16ddb58
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollRevealButton-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollbar-position-update-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollbar-position-update-expected.png
new file mode 100644
index 0000000..2978a63
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/scrollbar-position-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/table-overflow-float-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/table-overflow-float-expected.png
new file mode 100644
index 0000000..a5e6a28a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/table-overflow-float-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/trailing-float-linebox-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/trailing-float-linebox-expected.png
new file mode 100644
index 0000000..f8c227bb7f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/trailing-float-linebox-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/transformed-frame-scrollIntoView-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/transformed-frame-scrollIntoView-expected.png
new file mode 100644
index 0000000..76c46029
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/transformed-frame-scrollIntoView-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/unreachable-content-test-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/unreachable-content-test-expected.png
new file mode 100644
index 0000000..0ad21d1d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/overflow/unreachable-content-test-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
new file mode 100644
index 0000000..ca39f83f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-lr-expected.png
new file mode 100644
index 0000000..4b280ef
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-rl-expected.png
new file mode 100644
index 0000000..e72a5e08
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/background-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/basic-vertical-line-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/basic-vertical-line-expected.png
new file mode 100644
index 0000000..30ffdc1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/basic-vertical-line-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/block-level-images-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/block-level-images-expected.png
new file mode 100644
index 0000000..90788b7d7
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/block-level-images-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-lr-expected.png
new file mode 100644
index 0000000..e253dcf
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-rl-expected.png
new file mode 100644
index 0000000..6501394674
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-image-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png
new file mode 100644
index 0000000..2910c64
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-radius-clipping-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-lr-expected.png
new file mode 100644
index 0000000..adafb0f1
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-rl-expected.png
new file mode 100644
index 0000000..c9b5b7f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-styles-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-vertical-lr-expected.png
new file mode 100644
index 0000000..93bbfcad
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/border-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/box-shadow-horizontal-tb-tile-edge-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/box-shadow-horizontal-tb-tile-edge-expected.png
new file mode 100644
index 0000000..a2b04fee
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/box-shadow-horizontal-tb-tile-edge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideograph-small-caps-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideograph-small-caps-expected.png
new file mode 100644
index 0000000..1325c46
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideograph-small-caps-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideographic-font-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideographic-font-expected.png
new file mode 100644
index 0000000..ae7a1f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/broken-ideographic-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/english-rl-text-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/english-rl-text-expected.png
new file mode 100644
index 0000000..d9d52d9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/english-rl-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fallback-orientation-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fallback-orientation-expected.png
new file mode 100644
index 0000000..68f8854b
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fallback-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fieldsets-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fieldsets-expected.png
new file mode 100644
index 0000000..496d655
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/fieldsets-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/floats-in-block-layout-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/floats-in-block-layout-expected.png
new file mode 100644
index 0000000..97f4f464
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/floats-in-block-layout-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/inline-direction-positioning-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/inline-direction-positioning-expected.png
new file mode 100644
index 0000000..8a48294e
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/inline-direction-positioning-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-lr-text-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-lr-text-expected.png
new file mode 100644
index 0000000..2efec71
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-lr-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-expected.png
new file mode 100644
index 0000000..2b3649f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-with-broken-font-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-with-broken-font-expected.png
new file mode 100644
index 0000000..99aa725
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-rl-text-with-broken-font-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
new file mode 100644
index 0000000..0dcdddc4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-rl-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
new file mode 100644
index 0000000..4896752
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/japanese-ruby-vertical-rl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/margin-collapse-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/margin-collapse-expected.png
new file mode 100644
index 0000000..4ccba1bb
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/margin-collapse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/root-lr-basic-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/root-lr-basic-expected.png
new file mode 100644
index 0000000..6eeb2e839
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/root-lr-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/self-collapsing-block-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/self-collapsing-block-expected.png
new file mode 100644
index 0000000..6ecf3d3
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/self-collapsing-block-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/table-percent-width-quirk-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/table-percent-width-quirk-expected.png
new file mode 100644
index 0000000..23954f2
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/table-percent-width-quirk-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-combine-various-fonts-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-combine-various-fonts-expected.png
new file mode 100644
index 0000000..04b9a4d
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-combine-various-fonts-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-orientation-basic-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-orientation-basic-expected.png
new file mode 100644
index 0000000..14446ce
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/text-orientation-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-align-table-baseline-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-align-table-baseline-expected.png
new file mode 100644
index 0000000..77283c9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-align-table-baseline-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-baseline-alignment-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-baseline-alignment-expected.png
new file mode 100644
index 0000000..c4398f8
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-baseline-alignment-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-font-fallback-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-font-fallback-expected.png
new file mode 100644
index 0000000..f7c3c8f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/fast/writing-mode/vertical-font-fallback-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/overflow/overflow-transform-perspective-expected.png b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/overflow/overflow-transform-perspective-expected.png
new file mode 100644
index 0000000..492f16bd
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/overflow/overflow-transform-perspective-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/resources/revalidated-script.html b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/resources/revalidated-script.html
new file mode 100644
index 0000000..bf919fc
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/resources/revalidated-script.html
@@ -0,0 +1 @@
+<script charset="UTF-8" src="/devtools/resources/v8-cache-revalidated-script.cgi"></script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test-expected.txt
new file mode 100644
index 0000000..64db2c5b
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test-expected.txt
@@ -0,0 +1,84 @@
+Tests V8 code cache for resources revalidated with 304.
+
+--- Begin trace events related to code cache. ------
+1st load. Produce timestamp. -->
+v8.compile Properties:
+{
+    data : {
+        columnNumber : 0
+        lineNumber : 0
+        notStreamedReason : "script too small"
+        streamed : <boolean>
+        url : .../devtools/resources/v8-cache-revalidated-script.cgi
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "v8.compile"
+}
+Text details for v8.compile: v8-cache-revalidated-script.cgi:1
+2nd load. Produce code cache. -->
+v8.compile Properties:
+{
+    data : {
+        columnNumber : 0
+        lineNumber : 0
+        notStreamedReason : "already used streamed data"
+        streamed : <boolean>
+        url : .../devtools/resources/v8-cache-revalidated-script.cgi
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "v8.compile"
+}
+Text details for v8.compile: v8-cache-revalidated-script.cgi:1
+v8.compile Properties:
+{
+    data : {
+        columnNumber : 0
+        lineNumber : 0
+        notStreamedReason : "already used streamed data"
+        producedCacheSize : <number>
+        streamed : <boolean>
+        url : .../devtools/resources/v8-cache-revalidated-script.cgi
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "v8.compile"
+}
+Text details for v8.compile: v8-cache-revalidated-script.cgi:1
+3rd load. Consume code cache. -->
+v8.compile Properties:
+{
+    data : {
+        cacheConsumeOptions : "code"
+        cacheRejected : false
+        columnNumber : 0
+        consumedCacheSize : <number>
+        lineNumber : 0
+        notStreamedReason : "already used streamed data"
+        streamed : <boolean>
+        url : .../devtools/resources/v8-cache-revalidated-script.cgi
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "v8.compile"
+}
+Text details for v8.compile: v8-cache-revalidated-script.cgi:1
+Clear the resource from the MemoryCache. -->
+Load the resource with revalidation. The code cache got dropped because its timestamp did not match the one of the request. -->
+v8.compile Properties:
+{
+    data : {
+        columnNumber : 0
+        lineNumber : 0
+        notStreamedReason : "script too small"
+        streamed : <boolean>
+        url : .../devtools/resources/v8-cache-revalidated-script.cgi
+    }
+    endTime : <number>
+    startTime : <number>
+    type : "v8.compile"
+}
+Text details for v8.compile: v8-cache-revalidated-script.cgi:1
+----- End trace events related to code cache. ------
+
diff --git a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test.js b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test.js
new file mode 100644
index 0000000..de5d61f
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/stale-revalidation-test.js
@@ -0,0 +1,67 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function() {
+  TestRunner.addResult('Tests V8 code cache for resources revalidated with 304.\n');
+  // The main purpose of the test is to demonstrate that after producing the
+  // code cache on the 2nd load, it gets cleared on disk by subsequent loads of
+  // the subresource, even if the response instructs to reuse the old resource.
+  await TestRunner.loadModule('performance_test_runner');
+  await TestRunner.showPanel('timeline');
+
+  // Clear browser cache to avoid any existing entries for the fetched scripts
+  // in the cache.
+  SDK.multitargetNetworkManager.clearBrowserCache();
+
+  // The script is executed as a parser-inserted script, to keep the
+  // ScriptResource in blink::MemoryCache and reduce flake. ScriptResource for
+  // a dynamically-inserted <script> can be garbage-collected and thus removed
+  // from MemoryCache after its execution.
+  const resource = 'resources/revalidated-script.html'
+
+  TestRunner.addResult('--- Begin trace events related to code cache. ------');
+  await PerformanceTestRunner.startTimeline();
+
+  async function stopAndPrintTimeline() {
+    await PerformanceTestRunner.stopTimeline();
+    await PerformanceTestRunner.printTimelineRecordsWithDetails(
+        TimelineModel.TimelineModel.RecordType.CompileScript);
+  }
+
+  async function expectationComment(msg) {
+    await stopAndPrintTimeline();
+    TestRunner.addResult(msg);
+    await PerformanceTestRunner.startTimeline();
+  }
+
+  // Load the resource a few times. With the current V8 heuristics
+  // we produce cache on second fetch and consume it in the
+  // third fetch. Note that addIframe() waits for
+  // iframe's load event, which waits for the <script> to load.
+  await expectationComment('1st load. Produce timestamp. -->');
+  await TestRunner.addIframe(resource);
+
+  await expectationComment('2nd load. Produce code cache. -->');
+  await TestRunner.addIframe(resource);
+
+  await expectationComment('3rd load. Consume code cache. -->');
+  await TestRunner.addIframe(resource);
+
+  await expectationComment('Clear the resource from the MemoryCache. -->');
+  // Blink evicts previous Resource when a new request to the same URL but with
+  // different resource type is started. We fetch() the URL, and thus
+  // evict the previous ScriptResource of the URL.
+  await TestRunner.evaluateInPageAsync(
+      `fetch('/devtools/resources/v8-cache-revalidated-script.cgi')`);
+
+  await expectationComment('Load the resource with revalidation. ' +
+      'The code cache got dropped because its timestamp did not ' +
+      'match the one of the request. -->');
+  // The timestamp is written in the next step because there was no cached code.
+  await TestRunner.addIframe(resource);
+
+  await stopAndPrintTimeline();
+  TestRunner.addResult('----- End trace events related to code cache. ------');
+  TestRunner.completeTest();
+})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/resources/v8-cache-revalidated-script.cgi b/third_party/blink/web_tests/http/tests/devtools/resources/v8-cache-revalidated-script.cgi
new file mode 100755
index 0000000..41f2c85
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/devtools/resources/v8-cache-revalidated-script.cgi
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -wT
+# Produces a text/javascript larger than 1K. On the first load responds with 200
+# with a validator. On subsequent requests with revalidation responds with 304.
+
+use strict;
+
+print <<EOM;
+Content-Type: text/javascript
+Access-Control-Allow-Origin: *
+Cache-Control: no-cache, must-revalidate
+Last-Modified: Mon, 16 Mar 2020 22:00:00 GMT
+
+// So sorry about this waste of bytes:
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+// Filler comment, to trigger code caching heuristic (script > 1K.)
+EOM
diff --git a/third_party/blink/web_tests/http/tests/webcodecs/basic_image_decoding.html b/third_party/blink/web_tests/http/tests/webcodecs/basic_image_decoding.html
new file mode 100644
index 0000000..556236e2
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/webcodecs/basic_image_decoding.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>basic image decoding</title>
+<canvas width="128" height="128"></canvas>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  fetch("/resources/square.png").then(t.step_func(response => {
+    response.arrayBuffer().then(t.step_func(buffer => {
+      let decoder = new ImageDecoder({data: buffer, type: "image/png"})
+      decoder.decode(0).then(t.step_func(frame => {
+        let ctx = document.querySelector('canvas').getContext('2d');
+        ctx.drawImage(frame.image, 0, 0);
+        t.done();
+      })).catch(t.unreached_func());
+    })).catch(t.unreached_func());
+  })).catch(t.unreached_func());
+});
+</script>
diff --git a/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_exact_mime_type.html b/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_exact_mime_type.html
new file mode 100644
index 0000000..3a9cae327
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_exact_mime_type.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>ImageDecoder requires exact mime types</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  fetch("/resources/square.png").then(t.step_func(response => {
+    response.arrayBuffer().then(t.step_func(buffer => {
+      try {
+        let decoder = new ImageDecoder({data: buffer, type: "image/gif"})
+        t.unreached_func()();
+      } catch {
+        t.done();
+      }
+    })).catch(t.unreached_func());
+  })).catch(t.unreached_func());
+});
+</script>
diff --git a/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_reentrant_decode.html b/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_reentrant_decode.html
new file mode 100644
index 0000000..313741d
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/webcodecs/image_decoder_reentrant_decode.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>basic image decoding</title>
+<canvas width="128" height="128"></canvas>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+  let TEST_FILE = "/misc/resources/animated-gif-with-offsets.gif";
+  fetch(TEST_FILE).then(t.step_func(response => {
+    let decoder = new ImageDecoder({data: response.body, type: "image/gif"})
+
+    let count = 0;
+    Object.defineProperty(Object.prototype, "then", { get() {
+      if (count++ == 0) {
+        for (var i = 0; i < 4; i++)
+          decoder.decode(2).then(() => {});
+        decoder.decode(3).then(t.step_func_done());
+      }
+    }});
+
+    decoder.decode(0).then(() => {});
+    decoder.decode(1).then(() => {});
+  })).catch(t.unreached_func());
+});
+</script>
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.html b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.html
new file mode 100644
index 0000000..69fb0d33
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 150px; left: 100px;
+            width: 100px; height: 100px; background: blue">
+</div>
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.txt b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.txt
new file mode 100644
index 0000000..196c637
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size-expected.txt
@@ -0,0 +1,14 @@
+{
+  "layers": [
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "invalidations": [
+        [0, 0, 800, 600]
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size.html b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size.html
new file mode 100644
index 0000000..b2b40d68
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-change-size.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<script src="../resources/text-based-repaint.js"></script>
+<style>
+html {
+  background-image: linear-gradient(blue, blue);
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 100px 100px;
+  width: 300px;
+  height: 300px;
+}
+</style>
+<div style="width: 600px; height: 500px"></div>
+<script>
+function repaintTest() {
+  document.documentElement.style.height = '400px';
+}
+runRepaintAndPixelTest();
+</script>
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.html b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.html
new file mode 100644
index 0000000..abf593d2
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 100px; left: 300px;
+            width: 100px; height: 100px; background: blue">
+</div>
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.txt b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.txt
new file mode 100644
index 0000000..196c637
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box-expected.txt
@@ -0,0 +1,14 @@
+{
+  "layers": [
+    {
+      "name": "Scrolling Contents Layer",
+      "bounds": [800, 600],
+      "contentsOpaque": true,
+      "backgroundColor": "#FFFFFF",
+      "invalidations": [
+        [0, 0, 800, 600]
+      ]
+    }
+  ]
+}
+
diff --git a/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box.html b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box.html
new file mode 100644
index 0000000..46d7101
--- /dev/null
+++ b/third_party/blink/web_tests/paint/invalidation/background/html-background-image-content-box.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<script src="../resources/text-based-repaint.js"></script>
+<style>
+html {
+  background-image: linear-gradient(blue, blue);
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 100px 100px;
+  background-clip: content-box;
+  width: 500px;
+  height: 300px;
+}
+</style>
+<script>
+function repaintTest() {
+  document.documentElement.style.paddingLeft = '200px';
+}
+runRepaintAndPixelTest();
+</script>
diff --git a/third_party/blink/web_tests/virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt b/third_party/blink/web_tests/virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
index 195120d..0cb1fc2 100644
--- a/third_party/blink/web_tests/virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
+++ b/third_party/blink/web_tests/virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
@@ -1,33 +1,106 @@
 This is a testharness.js-based test.
-FAIL 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr; assert_in_array: gridTemplateColumns value "0fr" not in array ["100px"]
-FAIL 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr; assert_in_array: gridTemplateColumns value "1fr" not in array ["100px"]
-FAIL 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr; assert_in_array: gridTemplateColumns value "2fr" not in array ["100px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr)" not in array ["0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0.5fr)" not in array ["25px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 1fr)" not in array ["50px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); assert_in_array: gridTemplateColumns value "minmax(0px, 2fr)" not in array ["50px"]
-FAIL 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); assert_in_array: gridTemplateColumns value "minmax(75px, 1fr)" not in array ["75px"]
-FAIL 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0fr 0fr" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 1fr" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "1fr 0fr" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "1fr 1fr" not in array ["50px 50px"]
-FAIL 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "1fr 3fr" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 0fr 1fr" not in array ["50px 50px 0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 0fr)" not in array ["0px 0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 1fr)" not in array ["0px 50px"]
-FAIL 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(15px, 0fr) minmax(0px, 1fr)" not in array ["15px 35px"]
-FAIL 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(20px, 1fr) minmax(0px, 1fr)" not in array ["25px 25px"]
-FAIL 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(30px, 1fr) minmax(0px, 1fr)" not in array ["30px 20px"]
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 0fr)" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 1fr)" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(0px, 1fr)" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(25px, 1fr)" not in array ["75px 25px"]
-FAIL 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0fr auto" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "1fr auto" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "1fr max-content" not in array ["100px 0px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) auto" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 1fr) auto" not in array ["0px 100px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 0fr) auto" not in array ["25px 75px"]
-FAIL 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 1fr) auto" not in array ["25px 75px"]
+Found 102 tests; 0 PASS, 102 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL auto min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr; assert_in_array: gridTemplateColumns value "0fr" not in array ["100px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr; assert_in_array: gridTemplateColumns value "1fr" not in array ["100px"]
+FAIL auto min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr; assert_in_array: gridTemplateColumns value "2fr" not in array ["100px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr)" not in array ["0px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0.5fr)" not in array ["30px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 1fr)" not in array ["60px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); assert_in_array: gridTemplateColumns value "minmax(0px, 2fr)" not in array ["60px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); assert_in_array: gridTemplateColumns value "minmax(75px, 1fr)" not in array ["75px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0fr 0fr" not in array ["0px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 1fr" not in array ["0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "1fr 0fr" not in array ["60px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "1fr 1fr" not in array ["30px 30px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "1fr 3fr" not in array ["15px 45px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 0fr 1fr" not in array ["0px 0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 0fr)" not in array ["0px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 1fr)" not in array ["0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(15px, 0fr) minmax(0px, 1fr)" not in array ["15px 45px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(20px, 1fr) minmax(0px, 1fr)" not in array ["30px 30px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(40px, 1fr) minmax(0px, 1fr)" not in array ["40px 20px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 0fr)" not in array ["0px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 1fr)" not in array ["0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(0px, 1fr)" not in array ["30px 30px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(25px, 1fr)" not in array ["30px 30px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0fr min-content" not in array ["0px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0fr auto" not in array ["0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "0.5fr auto" not in array ["30px 30px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "1fr auto" not in array ["60px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "1fr max-content" not in array ["60px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; assert_in_array: gridTemplateColumns value "1fr min-content" not in array ["60px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) min-content" not in array ["0px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) auto" not in array ["0px 60px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 1fr) auto" not in array ["60px 0px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 0fr) auto" not in array ["25px 35px"]
+FAIL auto min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 1fr) auto" not in array ["60px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr; assert_in_array: gridTemplateColumns value "0fr" not in array ["100px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr; assert_in_array: gridTemplateColumns value "1fr" not in array ["100px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr; assert_in_array: gridTemplateColumns value "2fr" not in array ["100px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr)" not in array ["0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0.5fr)" not in array ["30px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 1fr)" not in array ["60px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); assert_in_array: gridTemplateColumns value "minmax(0px, 2fr)" not in array ["60px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); assert_in_array: gridTemplateColumns value "minmax(75px, 1fr)" not in array ["75px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0fr 0fr" not in array ["50px 50px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 1fr" not in array ["0px 100px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "1fr 0fr" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "1fr 1fr" not in array ["50px 50px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "1fr 3fr" not in array ["25px 75px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 0fr 1fr" not in array ["50px 50px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 0fr)" not in array ["0px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 1fr)" not in array ["0px 60px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(15px, 0fr) minmax(0px, 1fr)" not in array ["15px 45px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(20px, 1fr) minmax(0px, 1fr)" not in array ["30px 30px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(40px, 1fr) minmax(0px, 1fr)" not in array ["40px 20px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 0fr)" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 1fr)" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(0px, 1fr)" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(25px, 1fr)" not in array ["75px 25px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0fr min-content" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0fr auto" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "0.5fr auto" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "1fr auto" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "1fr max-content" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; assert_in_array: gridTemplateColumns value "1fr min-content" not in array ["100px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) min-content" not in array ["0px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) auto" not in array ["0px 60px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 1fr) auto" not in array ["60px 0px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 0fr) auto" not in array ["25px 35px"]
+FAIL min-content min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 1fr) auto" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr; assert_in_array: gridTemplateColumns value "0fr" not in array ["50px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr; assert_in_array: gridTemplateColumns value "1fr" not in array ["60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr; assert_in_array: gridTemplateColumns value "2fr" not in array ["60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr)" not in array ["0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0.5fr)" not in array ["30px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 1fr)" not in array ["60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); assert_in_array: gridTemplateColumns value "minmax(0px, 2fr)" not in array ["60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); assert_in_array: gridTemplateColumns value "minmax(75px, 1fr)" not in array ["75px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0fr 0fr" not in array ["25px 25px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 1fr" not in array ["0px 60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "1fr 0fr" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "1fr 1fr" not in array ["30px 30px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "1fr 3fr" not in array ["15px 45px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0fr 0fr 1fr" not in array ["25px 25px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 0fr)" not in array ["0px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) minmax(0px, 1fr)" not in array ["0px 60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(15px, 0fr) minmax(0px, 1fr)" not in array ["15px 45px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(20px, 1fr) minmax(0px, 1fr)" not in array ["30px 30px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr); assert_in_array: gridTemplateColumns value "minmax(40px, 1fr) minmax(0px, 1fr)" not in array ["40px 20px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 0fr)" not in array ["50px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0fr minmax(0px, 1fr)" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(0px, 1fr)" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "1fr minmax(25px, 1fr)" not in array ["30px 30px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0fr min-content" not in array ["50px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0fr auto" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "0.5fr auto" not in array ["50px 10px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "1fr auto" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "1fr max-content" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; assert_in_array: gridTemplateColumns value "1fr min-content" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) min-content" not in array ["0px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 0fr) auto" not in array ["0px 60px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(0px, 1fr) auto" not in array ["60px 0px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 0fr) auto" not in array ["25px 35px"]
+FAIL 50px min item 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "minmax(25px, 1fr) auto" not in array ["60px 0px"]
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/virtual/no-auto-wpt-origin-isolation/external/wpt/origin-isolation/about-blank.https.sub-expected.txt b/third_party/blink/web_tests/virtual/no-auto-wpt-origin-isolation/external/wpt/origin-isolation/about-blank.https.sub-expected.txt
deleted file mode 100644
index 909286f..0000000
--- a/third_party/blink/web_tests/virtual/no-auto-wpt-origin-isolation/external/wpt/origin-isolation/about-blank.https.sub-expected.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This is a testharness.js-based test.
-PASS parent to about:blank: message event must occur
-PASS parent to about:blank: setting document.domain must give sync access
-PASS about:blank to child2: messageerror event must occur
-PASS about:blank to child2: setting document.domain must not give sync access
-PASS child2 to about:blank: messageerror event must occur
-PASS child2 to about:blank: setting document.domain must not give sync access
-PASS parent: originIsolationRestricted must equal true
-FAIL about:blank: originIsolationRestricted must equal true assert_equals: expected true but got false
-PASS child2: originIsolationRestricted must equal false
-Harness: the test ran to completion.
-
diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn
index cd2a60b..d5f3948 100644
--- a/third_party/breakpad/BUILD.gn
+++ b/third_party/breakpad/BUILD.gn
@@ -342,13 +342,7 @@
 
     executable("symupload") {
       sources = [
-        "breakpad/src/common/mac/HTTPGetRequest.m",
         "breakpad/src/common/mac/HTTPMultipartUpload.m",
-        "breakpad/src/common/mac/HTTPPutRequest.m",
-        "breakpad/src/common/mac/HTTPRequest.m",
-        "breakpad/src/common/mac/HTTPSimplePostRequest.m",
-        "breakpad/src/common/mac/SymbolCollectorClient.m",
-        "breakpad/src/common/mac/encoding_util.m",
         "breakpad/src/tools/mac/symupload/symupload.m",
       ]
 
@@ -1038,8 +1032,6 @@
       "breakpad/src/common/convert_UTF.h",
       "breakpad/src/common/long_string_dictionary.cc",
       "breakpad/src/common/mac/HTTPMultipartUpload.m",
-      "breakpad/src/common/mac/HTTPRequest.m",
-      "breakpad/src/common/mac/encoding_util.m",
       "breakpad/src/common/mac/file_id.cc",
       "breakpad/src/common/mac/file_id.h",
       "breakpad/src/common/mac/macho_id.cc",
diff --git a/third_party/googletest/BUILD.gn b/third_party/googletest/BUILD.gn
index 66cbafc8..eb6d0b3 100644
--- a/third_party/googletest/BUILD.gn
+++ b/third_party/googletest/BUILD.gn
@@ -34,7 +34,8 @@
     cflags = [ "/wd4800" ]  # Unused variable warning.
   }
 
-  if (!build_with_chromium && gtest_enable_absl_printers) {
+  if (gtest_enable_absl_printers) {
+    configs = [ "//third_party/abseil-cpp:absl_include_config" ]
     defines += [ "GTEST_HAS_ABSL=1" ]
   }
 }
@@ -111,9 +112,6 @@
   include_dirs = [ "src/googletest" ]
 
   public_configs = [ ":gtest_config" ]
-  if (!build_with_chromium && gtest_enable_absl_printers) {
-    public_configs += [ "//third_party/abseil-cpp:absl_include_config" ]
-  }
 
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -127,11 +125,6 @@
       "custom/gtest/internal/custom/stack_trace_getter.cc",
       "custom/gtest/internal/custom/stack_trace_getter.h",
     ]
-    if (gtest_enable_absl_printers) {
-      public_deps += [
-        "//third_party/abseil-cpp:absl",
-      ]
-    }
   } else {
     deps += [ "//base" ]
   }
@@ -142,6 +135,10 @@
       "//third_party/fuchsia-sdk/sdk/pkg/zx",
     ]
   }
+
+  if (gtest_enable_absl_printers) {
+    deps += [ "//third_party/abseil-cpp:absl" ]
+  }
 }
 
 # Do NOT depend on this directly. Use //testing/gtest:gtest_main instead.
diff --git a/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v1.xml b/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v1.xml
index 7190f47..626f1128 100644
--- a/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v1.xml
+++ b/third_party/wayland-protocols/unstable/remote-shell/remote-shell-unstable-v1.xml
@@ -252,7 +252,7 @@
       <description summary="sends the layout_mode">
 	Sends the layout_mode used by the server.
       </description>
-      <arg name="layout_mode" type="int" summary="layout_mode enum"/>
+      <arg name="layout_mode" type="uint" summary="layout_mode enum"/>
     </event>
 
     <request name="get_remote_output" since="29">
diff --git a/tools/android/avd/proto/generic_android23.textpb b/tools/android/avd/proto/generic_android23.textpb
index 93ee20d..3c7c6a0 100644
--- a/tools/android/avd/proto/generic_android23.textpb
+++ b/tools/android/avd/proto/generic_android23.textpb
@@ -19,7 +19,7 @@
 
 avd_package {
   package_name: "chromium/third_party/android_sdk/public/avds/android-23/google_apis/x86"
-  version: "N9HLTJhzqcjSHMLO6kIuYaN2Vuk8PPTiH58tfpe69GkC"
+  version: "xCANtnG4XemtJK2q8j-RTksfa82R3YDiJFKZYKNxJxMC"
   dest_path: ".android"
 }
 avd_name: "android_23_google_apis_x86"
diff --git a/tools/android/dependency_analysis/js/src/class_view.js b/tools/android/dependency_analysis/js/src/class_view.js
index 4a24bf6..4e5de7b 100644
--- a/tools/android/dependency_analysis/js/src/class_view.js
+++ b/tools/android/dependency_analysis/js/src/class_view.js
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// For ease of development, we serve our testing data on localhost:8888. This
-// should be changed as we find other ways to serve the assets (eg. user upload
-// or hosted externally).
-const LOCALHOST = 'http://localhost:8888';
-
 import Vue from 'vue';
 import ClassGraphPage from './vue_components/class_graph_page.vue';
+import {loadGraph} from './load_graph.js';
 import * as d3 from 'd3';
 
 document.addEventListener('DOMContentLoaded', () => {
-  d3.json(`${LOCALHOST}/json_graph.txt`).then(data => {
+  loadGraph().then(data => {
     new Vue({
       el: '#class-graph-page',
       render: createElement => createElement(
@@ -24,5 +20,7 @@
           },
       ),
     });
+  }).catch(e => {
+    document.write("Error loading graph.");
   });
 });
diff --git a/tools/android/dependency_analysis/js/src/display_settings_data.js b/tools/android/dependency_analysis/js/src/display_settings_data.js
new file mode 100644
index 0000000..e167bfb
--- /dev/null
+++ b/tools/android/dependency_analysis/js/src/display_settings_data.js
@@ -0,0 +1,155 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {HullDisplay} from './class_view_consts.js';
+import {UrlProcessor, URL_PARAM_KEYS} from './url_processor.js';
+
+/**
+ * Various different graph edge color schemes.
+ * @enum {string}
+ */
+const GraphEdgeColor = {
+  DEFAULT: 'default',
+  GREY_GRADIENT: 'grey-gradient',
+  BLUE_TO_RED: 'blue-to-red',
+};
+
+/**
+ * A container representing the visualization's node filter. Nodes included in
+ * the filter are allowed to be displayed on the graph.
+ */
+class NodeFilterData {
+  /**
+   * Vue does not currently support reactivity on ES6 Sets. (Planned addition
+   * for 3.0 https://github.com/vuejs/vue/issues/2410#issuecomment-434990853).
+   * For performance, we maintain a Set for lookups when filtering nodes/edges
+   * and expose an Array to the UI for reactivity. We sync the data in these
+   * two structures manually.
+   */
+  constructor() {
+    /** @public {!Set<string>} */
+    this.nodeSet = new Set();
+    /** @public {!Array<string>} */
+    this.nodeList = [];
+  }
+
+  /**
+   * Adds a node to the node set + array.
+   * @param {string} nodeName The name of the node to add.
+   */
+  addNode(nodeName) {
+    if (!this.nodeSet.has(nodeName)) {
+      this.nodeSet.add(nodeName);
+      this.nodeList.push(nodeName);
+    }
+  }
+
+  /**
+   * Removes a node from the node set + array.
+   * @param {string} nodeName The name of the node to remove.
+   */
+  removeNode(nodeName) {
+    const deleted = this.nodeSet.delete(nodeName);
+    if (deleted) {
+      const deleteIndex = this.nodeList.indexOf(nodeName);
+      // TODO(yjlong): If order turns out to be unimportant, just swap the
+      // last element and the deleted element, then pop.
+      this.nodeList.splice(deleteIndex, 1);
+    }
+  }
+}
+
+/** Data store containing graph display-related settings. */
+class DisplaySettingsData {
+  /** Sets up default values for display settings. */
+  constructor() {
+    /** @public {!NodeFilterData} */
+    this.nodeFilterData = new NodeFilterData();
+    /** @public {number} */
+    this.inboundDepth = 0;
+    /** @public {number} */
+    this.outboundDepth = 1;
+    /** @public {boolean} */
+    this.curveEdges = true;
+    /** @public {boolean} */
+    this.colorOnlyOnHover = false;
+    /** @public {string} */
+    this.graphEdgeColor = GraphEdgeColor.GREY_GRADIENT;
+  }
+
+  /**
+   * Updates a UrlProcessor with all contained data.
+   * @param {!UrlProcessor} urlProcessor The UrlProcessor to update.
+   */
+  updateUrlProcessor(urlProcessor) {
+    urlProcessor.append(URL_PARAM_KEYS.INBOUND_DEPTH, this.inboundDepth);
+    urlProcessor.append(URL_PARAM_KEYS.OUTBOUND_DEPTH, this.outboundDepth);
+    urlProcessor.append(URL_PARAM_KEYS.CURVE_EDGES, this.curveEdges);
+    urlProcessor.append(
+        URL_PARAM_KEYS.COLOR_ONLY_ON_HOVER, this.colorOnlyOnHover);
+    urlProcessor.append(URL_PARAM_KEYS.EDGE_COLOR, this.graphEdgeColor);
+    if (this.nodeFilterData.nodeList.length > 0) {
+      urlProcessor.appendArray(
+          URL_PARAM_KEYS.FILTER, this.nodeFilterData.nodeList);
+    }
+  }
+
+  /**
+   * Reads all contained data from a UrlProcessor.
+   * @param {!UrlProcessor} urlProcessor The UrlProcessor to read from.
+   */
+  readUrlProcessor(urlProcessor) {
+    this.inboundDepth = urlProcessor.getInt(
+        URL_PARAM_KEYS.INBOUND_DEPTH, this.inboundDepth);
+    this.outboundDepth = urlProcessor.getInt(
+        URL_PARAM_KEYS.OUTBOUND_DEPTH, this.outboundDepth);
+    this.curveEdges = urlProcessor.getBool(
+        URL_PARAM_KEYS.CURVE_EDGES, this.curveEdges);
+    this.colorOnlyOnHover = urlProcessor.getBool(
+        URL_PARAM_KEYS.COLOR_ONLY_ON_HOVER, this.colorOnlyOnHover);
+    this.graphEdgeColor = urlProcessor.getString(
+        URL_PARAM_KEYS.EDGE_COLOR, this.graphEdgeColor);
+    for (const filterItem of urlProcessor.getArray(URL_PARAM_KEYS.FILTER, [])) {
+      this.nodeFilterData.addNode(filterItem);
+    }
+  }
+}
+
+/** Data store containing class graph display-related settings. */
+class ClassDisplaySettingsData extends DisplaySettingsData {
+  /** Sets up default values for display settings. */
+  constructor() {
+    super();
+    /** @public {string} */
+    this.hullDisplay = HullDisplay.BUILD_TARGET;
+  }
+
+  /**
+   * Updates a UrlProcessor with all contained data.
+   * @param {!UrlProcessor} urlProcessor The UrlProcessor to update.
+   */
+  updateUrlProcessor(urlProcessor) {
+    super.updateUrlProcessor(urlProcessor);
+    urlProcessor.append(URL_PARAM_KEYS.HULL_DISPLAY, this.hullDisplay);
+  }
+
+  /**
+   * Reads all contained data from a UrlProcessor.
+   * @param {!UrlProcessor} urlProcessor The UrlProcessor to read from.
+   */
+  readUrlProcessor(urlProcessor) {
+    super.readUrlProcessor(urlProcessor);
+    this.hullDisplay = urlProcessor.getString(
+        URL_PARAM_KEYS.HULL_DISPLAY, this.hullDisplay);
+  }
+}
+
+/** Data store containing package graph display-related settings. */
+class PackageDisplaySettingsData extends DisplaySettingsData {}
+
+export {
+  GraphEdgeColor,
+  ClassDisplaySettingsData,
+  PackageDisplaySettingsData,
+};
diff --git a/tools/android/dependency_analysis/js/src/graph_view.js b/tools/android/dependency_analysis/js/src/graph_view.js
index 53cfe644..6d0c4ba 100644
--- a/tools/android/dependency_analysis/js/src/graph_view.js
+++ b/tools/android/dependency_analysis/js/src/graph_view.js
@@ -2,8 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {DisplaySettingsData} from './display_settings_data.js';
 import {GraphNode, D3GraphData} from './graph_model.js';
-import {DisplaySettingsData, GraphEdgeColor} from './page_model.js';
+import {GraphEdgeColor} from './display_settings_data.js';
 
 import * as d3 from 'd3';
 
diff --git a/tools/android/dependency_analysis/js/src/load_graph.js b/tools/android/dependency_analysis/js/src/load_graph.js
new file mode 100644
index 0000000..890a31f
--- /dev/null
+++ b/tools/android/dependency_analysis/js/src/load_graph.js
@@ -0,0 +1,39 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// For ease of development, we load the graph from this hardcoded location by
+// default. This should be changed when a snapshot picker is implemented.
+const LATEST_GRAPH = 'https://storage.googleapis.com/clank-dependency-graphs/latest.json';
+
+// We serve our testing data on localhost:8888 as a
+// fallback that will be triggered if CORS blocks the request. In production,
+// the request should go through as the domain is allowed. In localhost, CORS
+// will always block the request.
+const LOCALHOST_GRAPH = 'http://localhost:8888/json_graph.txt';
+
+import * as d3 from 'd3';
+
+/**
+ * Retrieve the graph to show.
+ * @return {Promise} Promise resolved with the graph data.
+ */
+async function loadGraph() {
+  try {
+    // First, try LATEST_GRAPH from Cloud, which should work from production but
+    // fail in local development.
+    const data = await d3.json(LATEST_GRAPH);
+    console.log(`Loaded graph from ${LATEST_GRAPH}`);
+    return data;
+  } catch (e) {
+    // Then try LOCALHOST_GRAPH from localhost, which should work in local
+    // development.
+    const data = await d3.json(LOCALHOST_GRAPH);
+    console.log(`Loaded graph from ${LOCALHOST_GRAPH}`);
+    return data;
+  }
+}
+
+export {
+  loadGraph,
+};
diff --git a/tools/android/dependency_analysis/js/src/package_view.js b/tools/android/dependency_analysis/js/src/package_view.js
index c66f9cb..f8929da 100644
--- a/tools/android/dependency_analysis/js/src/package_view.js
+++ b/tools/android/dependency_analysis/js/src/package_view.js
@@ -2,17 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// For ease of development, we serve our testing data on localhost:8888. This
-// should be changed as we find other ways to serve the assets (eg. user upload
-// or hosted externally).
-const LOCALHOST = 'http://localhost:8888';
-
 import Vue from 'vue';
 import PackageGraphPage from './vue_components/package_graph_page.vue';
+import {loadGraph} from './load_graph.js';
 import * as d3 from 'd3';
 
 document.addEventListener('DOMContentLoaded', () => {
-  d3.json(`${LOCALHOST}/json_graph.txt`).then(data => {
+  loadGraph().then(data => {
     new Vue({
       el: '#package-graph-page',
       render: createElement => createElement(
@@ -24,5 +20,7 @@
           },
       ),
     });
+  }).catch(e => {
+    document.write("Error loading graph.");
   });
 });
diff --git a/tools/android/dependency_analysis/js/src/page_model.js b/tools/android/dependency_analysis/js/src/page_model.js
index 447a159b8..c2f524d 100644
--- a/tools/android/dependency_analysis/js/src/page_model.js
+++ b/tools/android/dependency_analysis/js/src/page_model.js
@@ -2,72 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {GraphModel, D3GraphData} from './graph_model.js';
-
-/**
- * Various different graph edge color schemes.
- * @enum {string}
- */
-const GraphEdgeColor = {
-  DEFAULT: 'default',
-  GREY_GRADIENT: 'grey-gradient',
-  BLUE_TO_RED: 'blue-to-red',
-};
-
-/**
- * The data configuring the visualization's display.
- * @typedef {Object} DisplaySettingsData
- * @property {boolean} curveEdges Whether edges should be curved.
- * @property {boolean} colorOnlyOnHover Whether edge colors should only be shown
- *     when hovering on nodes touching those edges.
- * @property {GraphEdgeColor} graphEdgeColor The color of the edges.
- */
-let DisplaySettingsData;
-
-/**
- * A container representing the visualization's node filter. Nodes included in
- * the filter are allowed to be displayed on the graph.
- */
-class NodeFilterData {
-  /**
-   * Vue does not currently support reactivity on ES6 Sets. (Planned addition
-   * for 3.0 https://github.com/vuejs/vue/issues/2410#issuecomment-434990853).
-   * For performance, we maintain a Set for lookups when filtering nodes/edges
-   * and expose an Array to the UI for reactivity. We sync the data in these
-   * two structures manually.
-   */
-  constructor() {
-    /** @public {!Set<string>} */
-    this.nodeSet = new Set();
-    /** @public {!Array<string>} */
-    this.nodeList = [];
-  }
-
-  /**
-   * Adds a node to the node set + array.
-   * @param {string} nodeName The name of the node to add.
-   */
-  addNode(nodeName) {
-    if (!this.nodeSet.has(nodeName)) {
-      this.nodeSet.add(nodeName);
-      this.nodeList.push(nodeName);
-    }
-  }
-
-  /**
-   * Removes a node from the node set + array.
-   * @param {string} nodeName The name of the node to remove.
-   */
-  removeNode(nodeName) {
-    const deleted = this.nodeSet.delete(nodeName);
-    if (deleted) {
-      const deleteIndex = this.nodeList.indexOf(nodeName);
-      // TODO(yjlong): If order turns out to be unimportant, just swap the
-      // last element and the deleted element, then pop.
-      this.nodeList.splice(deleteIndex, 1);
-    }
-  }
-}
+import {GraphModel} from './graph_model.js';
 
 /**
  * A container containing the page-wide state. This is the single source of
@@ -78,11 +13,8 @@
    * @param {!GraphModel} graphModel The graph data to visualize.
    */
   constructor(graphModel) {
-    /** @private {!GraphModel} */
-    this.graphModel_ = graphModel;
-
-    /** @public {!NodeFilterData} */
-    this.nodeFilterData = new NodeFilterData();
+    /** @public {!GraphModel} */
+    this.graphModel = graphModel;
 
     /**
      * The data for the selected node details UI component.
@@ -93,44 +25,6 @@
     this.selectedNodeDetailsData = {
       selectedNode: null,
     };
-
-    /**
-     * The data for the inbound depth UI component.
-     * @typedef {Object} InboundDepthData
-     * @property {number} inboundDepth The inbound depth.
-     */
-    /** @public {!InboundDepthData} */
-    this.inboundDepthData = {
-      inboundDepth: 0,
-    };
-
-    /**
-     * The data for the outbound depth UI component.
-     * @typedef {Object} OutboundDepthData
-     * @property {number} outboundDepth The outbound depth.
-     */
-    /** @public {!OutboundDepthData} */
-    this.outboundDepthData = {
-      outboundDepth: 0,
-    };
-
-    /** @public {!DisplaySettingsData} */
-    this.displaySettingsData = {
-      curveEdges: true,
-      colorOnlyOnHover: true,
-      graphEdgeColor: GraphEdgeColor.DEFAULT,
-    };
-  }
-
-  /**
-   * @return {!D3GraphData} The nodes and edges to visualize.
-   */
-  getDataForD3() {
-    return this.graphModel_.getDataForD3(
-        this.nodeFilterData.nodeSet,
-        this.inboundDepthData.inboundDepth,
-        this.outboundDepthData.outboundDepth,
-    );
   }
 
   /**
@@ -138,13 +32,10 @@
    * @return {!Array<string>} An array with the all node ids.
    */
   getNodeIds() {
-    return [...this.graphModel_.nodes.keys()];
+    return [...this.graphModel.nodes.keys()];
   }
 }
 
 export {
-  DisplaySettingsData,
-  GraphEdgeColor,
-  NodeFilterData,
   PageModel,
 };
diff --git a/tools/android/dependency_analysis/js/src/url_processor.js b/tools/android/dependency_analysis/js/src/url_processor.js
index 5c83cbb..0a2e392 100644
--- a/tools/android/dependency_analysis/js/src/url_processor.js
+++ b/tools/android/dependency_analysis/js/src/url_processor.js
@@ -3,12 +3,6 @@
 // found in the LICENSE file.
 
 /**
- * @fileoverview Various utilities to (de)serialize the page model to and from
- * the URL. Currently assumes the page is hosted on localhost, will likely need
- * to be changed if the hosting changes.
- */
-
-/**
  * The different possible absolute pathnames for the visualization page.
  * @readonly @enum {string}
  */
@@ -19,40 +13,103 @@
 
 // Keys for identifying URL params.
 const URL_PARAM_KEYS = {
-  FILTER: 'filter',
+  // Common keys:
+  FILTER: 'f',
+  INBOUND_DEPTH: 'ibd',
+  OUTBOUND_DEPTH: 'obd',
+  CURVE_EDGES: 'ce',
+  COLOR_ONLY_ON_HOVER: 'cooh',
+  EDGE_COLOR: 'ec',
+  // Class page-specific keys:
+  HULL_DISPLAY: 'hd',
 };
 
-/**
- * Converts a URL to the node filter contained within its querystring.
- * @param {string} url The URL to convert.
- * @return {!Array<string>} The array of node names in the URL's filter, or an
- *     empty array if there was no filter in the URL.
- */
-function generateFilterFromUrl(url) {
-  const pageUrl = new URL(url);
-  const filterNodes = pageUrl.searchParams.get(URL_PARAM_KEYS.FILTER);
-  return (filterNodes === null) ? [] : filterNodes.split(',');
-}
-
-/**
- * Converts a node filter into a URL containing the filter information. The
- * filter information will be stored in the querystring of the supplied URL.
- * @param {string} originUrl The URL to use as the origin for the generated URL.
- * @param {PagePathName} pathName The pathname for the generated URL.
- * @param {!Array<string>} filter The node name filter to store in the URL.
- * @return {string} The new URL containing the filter information.
- */
-function generateUrlFromFilter(originUrl, pathName, filter) {
-  const pageUrl = new URL(originUrl);
-  const searchParams = new URLSearchParams();
-  if (filter.length > 0) {
-    searchParams.append(URL_PARAM_KEYS.FILTER, filter.join(','));
+/** Helper class for generating and parsing the page URL. */
+class UrlProcessor {
+  /** @param {*} searchParams The base URLSearchParams for the processor. */
+  constructor(searchParams) {
+    this.searchParams = searchParams;
   }
-  return `${pageUrl.origin}${pathName}?${searchParams.toString()}`;
+
+  /**
+   * Creates a new UrlProcessor with no existing search params.
+   * @return {!UrlProcessor}
+   */
+  static createForOutput() {
+    return new UrlProcessor(new URLSearchParams());
+  }
+
+  /**
+   * Creates a URL using the current search params.
+   * @param {string} originUrl The URL to use as the origin for the generated
+   *   URL.
+   * @param {PagePathName} pathName The pathname for the generated URL.
+   * @return {string} The new URL containing the search params.
+   */
+  getUrl(originUrl, pathName) {
+    const pageUrl = new URL(originUrl);
+    return `${pageUrl.origin}${pathName}?${this.searchParams.toString()}`;
+  }
+
+  /**
+   * @param {string} key
+   * @param {string|number|boolean} value
+   */
+  append(key, value) {
+    this.searchParams.append(key, value);
+  }
+
+  /**
+   * @param {string} key
+   * @param {!Array<string>} valueArr
+   */
+  appendArray(key, valueArr) {
+    this.searchParams.append(key, valueArr.join(','));
+  }
+
+  /**
+   * @param {string} key
+   * @param {!Array<string>} defaultVal
+   * @return {!Array<string>}
+   */
+  getArray(key, defaultVal) {
+    const arrayStr = this.searchParams.get(key);
+    return (arrayStr === null) ? defaultVal : arrayStr.split(',');
+  }
+
+  /**
+   * @param {string} key
+   * @param {string} defaultVal
+   * @return {string}
+   */
+  getString(key, defaultVal) {
+    const str = this.searchParams.get(key);
+    return (str === null) ? defaultVal : str;
+  }
+
+  /**
+   * @param {string} key
+   * @param {number} defaultVal
+   * @return {number}
+   */
+  getInt(key, defaultVal) {
+    const intStr = this.searchParams.get(key);
+    return (intStr === null) ? defaultVal : parseInt(intStr, 10);
+  }
+
+  /**
+   * @param {string} key
+   * @param {boolean} defaultVal
+   * @return {boolean}
+   */
+  getBool(key, defaultVal) {
+    const boolStr = this.searchParams.get(key);
+    return (boolStr === null) ? defaultVal : (boolStr === 'true');
+  }
 }
 
 export {
   PagePathName,
-  generateFilterFromUrl,
-  generateUrlFromFilter,
+  URL_PARAM_KEYS,
+  UrlProcessor,
 };
diff --git a/tools/android/dependency_analysis/js/src/vue_components/class_graph_hull_settings.vue b/tools/android/dependency_analysis/js/src/vue_components/class_graph_hull_settings.vue
index 9b28254..3478df5 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/class_graph_hull_settings.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/class_graph_hull_settings.vue
@@ -13,8 +13,7 @@
           v-model="internalSelectedHullDisplay"
           type="radio"
           name="hullDisplayRadioButtons"
-          :value="hullDisplay"
-          @change="updateSelectedHullDisplay">
+          :value="hullDisplay">
       <label :for="hullDisplay">
         {{ hullDisplay }}
       </label>
@@ -30,18 +29,15 @@
   props: {
     selectedHullDisplay: String,
   },
-  data: function() {
-    return {
-      internalSelectedHullDisplay: this.selectedHullDisplay,
-    };
-  },
   computed: {
     HullDisplay: () => HullDisplay,
-  },
-  methods: {
-    updateSelectedHullDisplay: function() {
-      this.$emit(
-          'update:selectedHullDisplay', this.internalSelectedHullDisplay);
+    internalSelectedHullDisplay: {
+      get: function() {
+        return this.selectedHullDisplay;
+      },
+      set: function(newValue) {
+        this.$emit('update:selectedHullDisplay', newValue);
+      },
     },
   },
 };
diff --git a/tools/android/dependency_analysis/js/src/vue_components/class_graph_page.vue b/tools/android/dependency_analysis/js/src/vue_components/class_graph_page.vue
index ad3237fc..71b8e1d 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/class_graph_page.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/class_graph_page.vue
@@ -9,24 +9,28 @@
           :node-ids="pageModel.getNodeIds()"
           @[CUSTOM_EVENTS.FILTER_SUBMITTED]="addNodeToFilter"/>
       <GraphFilterItems
-          :node-filter-data="pageModel.nodeFilterData"
+          :node-filter-data="displaySettingsData.nodeFilterData"
           @[CUSTOM_EVENTS.FILTER_ELEMENT_CLICKED]="removeNodeFromFilter"/>
       <GraphInboundInput
-          :inbound-depth-data="pageModel.inboundDepthData"/>
+          :inbound-depth-data="displaySettingsData"/>
       <GraphOutboundInput
-          :outbound-depth-data="pageModel.outboundDepthData"/>
+          :outbound-depth-data="displaySettingsData"/>
     </div>
     <div id="graph-and-node-details-container">
       <GraphVisualization
-          :graph-update-triggers="graphUpdateTriggers"
+          :graph-update-triggers="[
+            getNodeGroup,
+            displaySettingsData,
+          ]"
           :page-model="pageModel"
+          :display-settings-data="displaySettingsData"
           :get-node-group="getNodeGroup"
           @[CUSTOM_EVENTS.NODE_CLICKED]="graphNodeClicked"/>
       <div id="node-details-container">
         <GraphDisplaySettings
-            :display-settings-data="pageModel.displaySettingsData"/>
+            :display-settings-data="displaySettingsData"/>
         <ClassGraphHullSettings
-            :selected-hull-display.sync="hullDisplay"/>
+            :selected-hull-display.sync="displaySettingsData.hullDisplay"/>
         <GraphSelectedNodeDetails
             :selected-node-details-data="pageModel.selectedNodeDetailsData"
             @[CUSTOM_EVENTS.ADD_TO_FILTER_CLICKED]="addNodeToFilter"
@@ -35,19 +39,17 @@
             :selected-class="pageModel.selectedNodeDetailsData.selectedNode"/>
       </div>
     </div>
-    <PageUrlGenerator
-        :page-path-name="pagePathName"
-        :node-filter-data="pageModel.nodeFilterData"/>
   </div>
 </template>
 
 <script>
 import {CUSTOM_EVENTS} from '../vue_custom_events.js';
 import {HullDisplay} from '../class_view_consts.js';
-import {PagePathName, generateFilterFromUrl} from '../url_processor.js';
+import {PagePathName, UrlProcessor} from '../url_processor.js';
 
 import {ClassNode, GraphNode} from '../graph_model.js';
 import {PageModel} from '../page_model.js';
+import {ClassDisplaySettingsData} from '../display_settings_data.js';
 import {parseClassGraphModelFromJson} from '../process_graph_json.js';
 
 import ClassDetailsPanel from './class_details_panel.vue';
@@ -59,7 +61,6 @@
 import GraphOutboundInput from './graph_outbound_input.vue';
 import GraphSelectedNodeDetails from './graph_selected_node_details.vue';
 import GraphVisualization from './graph_visualization.vue';
-import PageUrlGenerator from './page_url_generator.vue';
 
 /**
  * @param {!ClassNode} node The node to get the build target of.
@@ -85,7 +86,6 @@
     GraphOutboundInput,
     GraphSelectedNodeDetails,
     GraphVisualization,
-    PageUrlGenerator,
   },
   props: {
     graphJson: Object,
@@ -95,8 +95,9 @@
    * Various references to objects used across the entire class page.
    * @typedef {Object} ClassPageData
    * @property {PageModel} pageModel The data store for the page.
+   * @property {!ClassDisplaySettingsData} displaySettingsData Additional data
+   *   store for the graph's display settings.
    * @property {PagePathName} pagePathName The pathname for the page.
-   * @property {!HullDisplay} hullDisplay The display mode of the graph's hulls.
    */
 
   /**
@@ -105,42 +106,42 @@
   data: function() {
     const graphModel = parseClassGraphModelFromJson(this.graphJson);
     const pageModel = new PageModel(graphModel);
+    const displaySettingsData = new ClassDisplaySettingsData();
 
     return {
       pageModel,
+      displaySettingsData,
       pagePathName: PagePathName.CLASS,
-      hullDisplay: HullDisplay.NONE,
     };
   },
   computed: {
     CUSTOM_EVENTS: () => CUSTOM_EVENTS,
     getNodeGroup: function() {
-      switch (this.hullDisplay) {
+      switch (this.displaySettingsData.hullDisplay) {
         case HullDisplay.BUILD_TARGET:
           return getNodeBuildTarget;
         default:
           return () => null;
       }
     },
-    graphUpdateTriggers: function() {
-      return [
-        this.getNodeGroup,
-        this.pageModel.displaySettingsData,
-        this.pageModel.nodeFilterData.nodeList,
-        this.pageModel.inboundDepthData.inboundDepth,
-        this.pageModel.outboundDepthData.outboundDepth,
-      ];
+  },
+  watch: {
+    displaySettingsData: {
+      handler: function() {
+        this.updateDocumentUrl();
+      },
+      deep: true,
     },
   },
   /**
    * Parses out data from the current URL to initialize the visualization with.
    */
   mounted: function() {
-    const includedNodesInUrl = generateFilterFromUrl(document.URL);
+    const pageUrl = new URL(document.URL);
+    const pageUrlProcessor = new UrlProcessor(pageUrl.searchParams);
+    this.displaySettingsData.readUrlProcessor(pageUrlProcessor);
 
-    if (includedNodesInUrl.length !== 0) {
-      this.addNodesToFilter(includedNodesInUrl);
-    } else {
+    if (this.displaySettingsData.nodeFilterData.nodeList.length === 0) {
       // TODO(yjlong): This is test data. Remove this when no longer needed.
       this.addNodesToFilter([
         'org.chromium.chrome.browser.tabmodel.AsyncTabParams',
@@ -148,43 +149,46 @@
         'org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver',
       ]);
     }
-
-    this.setOutboundDepth(1);
   },
   methods: {
+    updateDocumentUrl() {
+      const urlProcessor = UrlProcessor.createForOutput();
+      this.displaySettingsData.updateUrlProcessor(urlProcessor);
+
+      const pageUrl = urlProcessor.getUrl(document.URL, PagePathName.CLASS);
+      history.replaceState(null, '', pageUrl);
+    },
     /**
      * @param {string} nodeName The node to add.
      */
     addNodeToFilter: function(nodeName) {
-      this.pageModel.nodeFilterData.addNode(nodeName);
+      this.displaySettingsData.nodeFilterData.addNode(nodeName);
     },
     /**
-     * Adds all supplied nodes to the node filter, then increments
-     * `graphDataUpdateTicker` once at the end, even if `nodeNames` is empty.
      * @param {!Array<string>} nodeNames The nodes to add.
      */
     addNodesToFilter: function(nodeNames) {
       for (const nodeName of nodeNames) {
-        this.pageModel.nodeFilterData.addNode(nodeName);
+        this.displaySettingsData.nodeFilterData.addNode(nodeName);
       }
     },
     /**
      * @param {string} nodeName The node to remove.
      */
     removeNodeFromFilter: function(nodeName) {
-      this.pageModel.nodeFilterData.removeNode(nodeName);
+      this.displaySettingsData.nodeFilterData.removeNode(nodeName);
     },
     /**
      * @param {number} depth The new inbound depth.
      */
     setInboundDepth: function(depth) {
-      this.pageModel.inboundDepthData.inboundDepth = depth;
+      this.displaySettingsData.inboundDepth = depth;
     },
     /**
      * @param {number} depth The new outbound depth.
      */
     setOutboundDepth: function(depth) {
-      this.pageModel.outboundDepthData.outboundDepth = depth;
+      this.displaySettingsData.outboundDepth = depth;
     },
     /**
      * @param {?GraphNode} node The selected node. May be `null`, which will
diff --git a/tools/android/dependency_analysis/js/src/vue_components/graph_display_settings.vue b/tools/android/dependency_analysis/js/src/vue_components/graph_display_settings.vue
index 63f18606..3ca94aa 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/graph_display_settings.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/graph_display_settings.vue
@@ -33,7 +33,7 @@
 </template>
 
 <script>
-import {GraphEdgeColor} from '../page_model.js';
+import {GraphEdgeColor} from '../display_settings_data.js';
 
 // @vue/component
 const GraphDisplaySettings = {
diff --git a/tools/android/dependency_analysis/js/src/vue_components/graph_visualization.vue b/tools/android/dependency_analysis/js/src/vue_components/graph_visualization.vue
index 7fa78977..b4a6b1b 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/graph_visualization.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/graph_visualization.vue
@@ -31,6 +31,7 @@
      */
     graphUpdateTriggers: Array,
     pageModel: Object,
+    displaySettingsData: Object,
     getNodeGroup: {
       type: Function,
       default: () => null,
@@ -40,10 +41,14 @@
   watch: {
     graphUpdateTriggers: {
       handler: function() {
+        const d3Data = this.pageModel.graphModel.getDataForD3(
+            this.displaySettingsData.nodeFilterData.nodeSet,
+            this.displaySettingsData.inboundDepth,
+            this.displaySettingsData.outboundDepth,
+        );
         this.graphView.registerGetNodeGroup(this.getNodeGroup);
-        this.graphView.updateGraphData(this.pageModel.getDataForD3());
-        this.graphView.updateDisplaySettings(
-            this.pageModel.displaySettingsData);
+        this.graphView.updateGraphData(d3Data);
+        this.graphView.updateDisplaySettings(this.displaySettingsData);
       },
       deep: true,
     },
diff --git a/tools/android/dependency_analysis/js/src/vue_components/link_to_graph.vue b/tools/android/dependency_analysis/js/src/vue_components/link_to_graph.vue
index b5a8fcc9..a6410582 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/link_to_graph.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/link_to_graph.vue
@@ -7,7 +7,7 @@
 </template>
 
 <script>
-import {generateUrlFromFilter} from '../url_processor.js';
+import {UrlProcessor, URL_PARAM_KEYS} from '../url_processor.js';
 
 // @vue/component
 const LinkToGraph = {
@@ -18,7 +18,9 @@
   },
   computed: {
     url: function() {
-      return generateUrlFromFilter(document.URL, this.graphType, this.filter);
+      const urlProcessor = UrlProcessor.createForOutput();
+      urlProcessor.appendArray(URL_PARAM_KEYS.FILTER, this.filter);
+      return urlProcessor.getUrl(document.URL, this.graphType);
     },
   },
 };
diff --git a/tools/android/dependency_analysis/js/src/vue_components/package_details_panel.vue b/tools/android/dependency_analysis/js/src/vue_components/package_details_panel.vue
index c088e81..4a6d113 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/package_details_panel.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/package_details_panel.vue
@@ -7,12 +7,12 @@
       v-if="selectedPackage !== null"
       class="package-details-panel">
     <LinkToGraph
-        :filter="classesInSelectedPackage"
+        :filter="packageClassNames"
         :graph-type="PagePathName.CLASS"
         text="Class graph with all classes in this package"/>
     <ul>
       <li
-          v-for="classObj in classesWithShortNames"
+          v-for="classObj in packageClassObjects"
           :key="classObj.name">
         <LinkToGraph
             :filter="[classObj.name]"
@@ -39,14 +39,16 @@
   },
   computed: {
     PagePathName: () => PagePathName,
-    classesInSelectedPackage: function() {
+    packageClassNames: function() {
       return this.selectedPackage.classNames;
     },
-    classesWithShortNames: function() {
-      return this.classesInSelectedPackage.map(className => ({
-        name: className,
-        shortName: shortenClassName(className),
-      }));
+    packageClassObjects: function() {
+      return this.selectedPackage.classNames.map(className => {
+        return {
+          name: className,
+          shortName: shortenClassName(className),
+        };
+      });
     },
   },
 };
diff --git a/tools/android/dependency_analysis/js/src/vue_components/package_graph_page.vue b/tools/android/dependency_analysis/js/src/vue_components/package_graph_page.vue
index 8a132d7..d9b3d008 100644
--- a/tools/android/dependency_analysis/js/src/vue_components/package_graph_page.vue
+++ b/tools/android/dependency_analysis/js/src/vue_components/package_graph_page.vue
@@ -9,41 +9,45 @@
           :node-ids="pageModel.getNodeIds()"
           @[CUSTOM_EVENTS.FILTER_SUBMITTED]="addNodeToFilter"/>
       <GraphFilterItems
-          :node-filter-data="pageModel.nodeFilterData"
+          :node-filter-data="displaySettingsData.nodeFilterData"
           @[CUSTOM_EVENTS.FILTER_ELEMENT_CLICKED]="removeNodeFromFilter"/>
       <GraphInboundInput
-          :inbound-depth-data="pageModel.inboundDepthData"/>
+          :inbound-depth-data="displaySettingsData"/>
       <GraphOutboundInput
-          :outbound-depth-data="pageModel.outboundDepthData"/>
+          :outbound-depth-data="displaySettingsData"/>
     </div>
     <div id="graph-and-node-details-container">
       <GraphVisualization
-          :graph-update-triggers="graphUpdateTriggers"
+          :graph-update-triggers="[
+            displaySettingsData,
+            displaySettingsData.nodeFilterData.nodeList,
+          ]"
           :page-model="pageModel"
+          :display-settings-data="displaySettingsData"
           @[CUSTOM_EVENTS.NODE_CLICKED]="graphNodeClicked"/>
       <div id="node-details-container">
         <GraphDisplaySettings
-            :display-settings-data="pageModel.displaySettingsData"/>
+            :display-settings-data="displaySettingsData"/>
         <GraphSelectedNodeDetails
-            :selected-node-details-data="pageModel.selectedNodeDetailsData"
+            :selected-node-details-data="
+              pageModel.selectedNodeDetailsData"
             @[CUSTOM_EVENTS.ADD_TO_FILTER_CLICKED]="addNodeToFilter"
             @[CUSTOM_EVENTS.REMOVE_FROM_FILTER_CLICKED]="removeNodeFromFilter"/>
         <PackageDetailsPanel
-            :selected-package="pageModel.selectedNodeDetailsData.selectedNode"/>
+            :selected-package="
+              pageModel.selectedNodeDetailsData.selectedNode"/>
       </div>
     </div>
-    <PageUrlGenerator
-        :page-path-name="pagePathName"
-        :node-filter-data="pageModel.nodeFilterData"/>
   </div>
 </template>
 
 <script>
 import {CUSTOM_EVENTS} from '../vue_custom_events.js';
-import {PagePathName, generateFilterFromUrl} from '../url_processor.js';
+import {PagePathName, UrlProcessor} from '../url_processor.js';
 
 import {GraphNode} from '../graph_model.js';
 import {PageModel} from '../page_model.js';
+import {PackageDisplaySettingsData} from '../display_settings_data.js';
 import {parsePackageGraphModelFromJson} from '../process_graph_json.js';
 
 import GraphDisplaySettings from './graph_display_settings.vue';
@@ -54,7 +58,6 @@
 import GraphSelectedNodeDetails from './graph_selected_node_details.vue';
 import GraphVisualization from './graph_visualization.vue';
 import PackageDetailsPanel from './package_details_panel.vue';
-import PageUrlGenerator from './page_url_generator.vue';
 
 // @vue/component
 const PackageGraphPage = {
@@ -67,7 +70,6 @@
     GraphSelectedNodeDetails,
     GraphVisualization,
     PackageDetailsPanel,
-    PageUrlGenerator,
   },
   props: {
     graphJson: Object,
@@ -76,7 +78,9 @@
   /**
    * Various references to objects used across the entire package page.
    * @typedef {Object} PackagePageData
-   * @property {PageModel} pageModel The data store for the page.
+   * @property {!PageModel} pageModel The data store for the page.
+   * @property {!PackageDisplaySettingsData} displaySettingsData Additional data
+   *   store for the graph's display settings.
    * @property {PagePathName} pagePathName The pathname for the page.
    */
 
@@ -86,32 +90,34 @@
   data: function() {
     const graphModel = parsePackageGraphModelFromJson(this.graphJson);
     const pageModel = new PageModel(graphModel);
+    const displaySettingsData = new PackageDisplaySettingsData();
 
     return {
       pageModel,
+      displaySettingsData,
       pagePathName: PagePathName.PACKAGE,
     };
   },
   computed: {
     CUSTOM_EVENTS: () => CUSTOM_EVENTS,
-    graphUpdateTriggers: function() {
-      return [
-        this.pageModel.displaySettingsData,
-        this.pageModel.nodeFilterData.nodeList,
-        this.pageModel.inboundDepthData.inboundDepth,
-        this.pageModel.outboundDepthData.outboundDepth,
-      ];
+  },
+  watch: {
+    displaySettingsData: {
+      handler: function() {
+        this.updateDocumentUrl();
+      },
+      deep: true,
     },
   },
   /**
    * Parses out data from the current URL to initialize the visualization with.
    */
   mounted: function() {
-    const includedNodesInUrl = generateFilterFromUrl(document.URL);
+    const pageUrl = new URL(document.URL);
+    const pageUrlProcessor = new UrlProcessor(pageUrl.searchParams);
+    this.displaySettingsData.readUrlProcessor(pageUrlProcessor);
 
-    if (includedNodesInUrl.length !== 0) {
-      this.addNodesToFilter(includedNodesInUrl);
-    } else {
+    if (this.displaySettingsData.nodeFilterData.nodeList.length === 0) {
       // TODO(yjlong): This is test data. Remove this when no longer needed.
       this.addNodesToFilter([
         'org.chromium.base',
@@ -121,44 +127,46 @@
         'org.chromium.ui.base',
       ]);
     }
-
-    this.setOutboundDepth(1);
-    this.graphDataUpdateTicker++;
   },
   methods: {
+    updateDocumentUrl() {
+      const urlProcessor = UrlProcessor.createForOutput();
+      this.displaySettingsData.updateUrlProcessor(urlProcessor);
+
+      const pageUrl = urlProcessor.getUrl(document.URL, PagePathName.PACKAGE);
+      history.replaceState(null, '', pageUrl);
+    },
     /**
      * @param {string} nodeName The node to add.
      */
     addNodeToFilter: function(nodeName) {
-      this.pageModel.nodeFilterData.addNode(nodeName);
+      this.displaySettingsData.nodeFilterData.addNode(nodeName);
     },
     /**
-     * Adds all supplied nodes to the node filter, then increments
-     * `graphDataUpdateTicker` once at the end, even if `nodeNames` is empty.
      * @param {!Array<string>} nodeNames The nodes to add.
      */
     addNodesToFilter: function(nodeNames) {
       for (const nodeName of nodeNames) {
-        this.pageModel.nodeFilterData.addNode(nodeName);
+        this.displaySettingsData.nodeFilterData.addNode(nodeName);
       }
     },
     /**
      * @param {string} nodeName The node to remove.
      */
     removeNodeFromFilter: function(nodeName) {
-      this.pageModel.nodeFilterData.removeNode(nodeName);
+      this.displaySettingsData.nodeFilterData.removeNode(nodeName);
     },
     /**
      * @param {number} depth The new inbound depth.
      */
     setInboundDepth: function(depth) {
-      this.pageModel.inboundDepthData.inboundDepth = depth;
+      this.displaySettingsData.inboundDepth = depth;
     },
     /**
      * @param {number} depth The new outbound depth.
      */
     setOutboundDepth: function(depth) {
-      this.pageModel.outboundDepthData.outboundDepth = depth;
+      this.displaySettingsData.outboundDepth = depth;
     },
     /**
      * @param {?GraphNode} node The selected node. May be `null`, which will
diff --git a/tools/android/dependency_analysis/js/src/vue_components/page_url_generator.vue b/tools/android/dependency_analysis/js/src/vue_components/page_url_generator.vue
deleted file mode 100644
index 37a5d592..0000000
--- a/tools/android/dependency_analysis/js/src/vue_components/page_url_generator.vue
+++ /dev/null
@@ -1,51 +0,0 @@
-<!-- Copyright 2020 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file. -->
-
-<template>
-  <div class="url-generator">
-    <button @click="generateUrl">
-      Generate Current URL
-    </button>
-    <input
-        ref="input"
-        type="text"
-        readonly>
-  </div>
-</template>
-
-<script>
-import {generateUrlFromFilter} from '../url_processor.js';
-
-// @vue/component
-const PageUrlGenerator = {
-  props: {
-    pagePathName: String,
-    nodeFilterData: Object,
-  },
-  data: function() {
-    return this.nodeFilterData;
-  },
-  methods: {
-    /**
-     * Generates an URL for the current page containing the filter in its
-     * querystring, then copies the URL to the input elem and highlights it.
-     */
-    generateUrl: function() {
-      const pageUrl = generateUrlFromFilter(
-          document.URL, this.pagePathName, this.nodeList);
-      this.$refs.input.value = pageUrl;
-      this.$refs.input.select();
-    },
-  },
-};
-
-export default PageUrlGenerator;
-</script>
-
-<style scoped>
-.url-generator {
-  display: flex;
-  flex-direction: row;
-}
-</style>
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index bd2bb941..efe9e000 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -689,7 +689,6 @@
       'mac10.11-blink-rel': 'release_bot_blink_minimal_symbols',
       'mac10.12-blink-rel': 'release_bot_blink_minimal_symbols',
       'mac10.13-blink-rel': 'release_bot_blink_minimal_symbols',
-      'mac10.13_retina-blink-rel': 'release_bot_blink_minimal_symbols',
       'mac10.14-blink-rel': 'release_bot_blink_minimal_symbols',
       'mac10.15-blink-rel': 'release_bot_blink_minimal_symbols_no_nacl',
       'win7-blink-rel': 'release_bot_blink_x86_minimal_symbols',
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index ce36e9f..40ead3f 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -1370,6 +1370,71 @@
   </description>
 </action>
 
+<action name="Accessibility.CaretBrowsing.AcceptDialog">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user pressed the caret browsing shortcut and then enabled the feature by
+    confirming in the dialog.
+  </description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.CancelDialog">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user pressed the caret browsing shortcut and then cancelled without
+    enabling caret browsing.
+  </description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.DisableWithKeyboard">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user disabled caret browsing using keyboard shortcuts.
+  </description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.DisableWithSettings">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>A user disabled caret browsing using settings.</description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.DoNotAsk">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user enabled caret browsing and checked the box to never be prompted
+    again.
+  </description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.EnableWithKeyboard">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user enabled caret browsing using the keyboard shortcut directly, when
+    they had already opted into not showing the confirmation dialog.
+  </description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.EnableWithSettings">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>A user enabled caret browsing using settings.</description>
+</action>
+
+<action name="Accessibility.CaretBrowsing.ShowDialog">
+  <owner>dmazzoni@chromium.org</owner>
+  <owner>emilyscharff@google.com</owner>
+  <description>
+    A user pressed the caret browsing shortcut and the confirmation dialog was
+    shown.
+  </description>
+</action>
+
 <action
     name="Accessibility.ChromeVox.BluetoothBrailleDisplayConnectedButtonClick">
   <owner>dtseng@chromium.org</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 0dcc0ef..30a5dcf 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -21338,6 +21338,8 @@
   <int value="755" label="SensorsAllowedForUrls"/>
   <int value="756" label="SensorsBlockedForUrls"/>
   <int value="757" label="DeviceChannelDowngradeBehavior"/>
+  <int value="758" label="BackForwardCacheEnabled"/>
+  <int value="759" label="NoteTakingAppsLockScreenAllowlist"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -50881,6 +50883,7 @@
   <int value="7" label="Parse issue advice failure"/>
   <int value="8" label="Remote consent fallback (deprecated 06/2020)"/>
   <int value="9" label="Parse remote consent failure"/>
+  <int value="10" label="Mint token success with fallback scopes"/>
 </enum>
 
 <enum name="OAuthMultiloginResponseStatus">
@@ -57872,6 +57875,10 @@
   <int value="5" label="User elected to send feedback."/>
 </enum>
 
+<enum name="PromoBrowserCommandEnum">
+  <int value="0" label="Unknown Command"/>
+</enum>
+
 <enum name="ProtectorError">
   <obsolete>
     Deprecated 8/2013. No longer generated.
diff --git a/tools/metrics/histograms/expand_owners.py b/tools/metrics/histograms/expand_owners.py
index c46f739..e57f6e59 100644
--- a/tools/metrics/histograms/expand_owners.py
+++ b/tools/metrics/histograms/expand_owners.py
@@ -34,31 +34,52 @@
       node_to_insert_before)
 
 
-def _IsEmailOrPlaceholder(is_first_owner, owner_tag_text, histogram_name):
-  """Returns true if |owner_tag_text| is an email or the placeholder text.
+def _IsValidPrimaryOwnerEmail(owner_tag_text):
+  """Returns true if |owner_tag_text| is a valid primary owner.
 
-  Also, verifies that a histogram's first owner tag contains either an email
-  address, e.g. 'ali@chromium.org' or the placeholder text.
+  A valid primary owner is an individual (not a team) with a Chromium or Google
+  email address.
+
+  Args:
+    owner_tag_text: The text in an owner tag
+  """
+  if '-' in owner_tag_text:  # Check whether it's a team email address.
+    return False
+
+  return (owner_tag_text.endswith('@chromium.org')
+          or owner_tag_text.endswith('@google.com'))
+
+
+def _IsEmailOrPlaceholder(is_first_owner, owner_tag_text, histogram_name,
+                          is_obsolete):
+  """Returns true if owner_tag_text is an email or the placeholder text.
+
+  Also, for histograms that are not obsolete, verifies that a histogram's first
+  owner tag contains a valid primary owner.
 
   Args:
     is_first_owner: True if a histogram's first owner tag is being checked.
     owner_tag_text: The text of the owner tag being checked, e.g.
       'julie@google.com' or 'src/ios/net/cookies/OWNERS'.
     histogram_name: The string name of the histogram.
+    is_obsolete: True if the histogram is obsolete.
 
   Raises:
-    Error: Raised if (A) the text is from the first owner tag and (B) the text
-      is not a primary owner.
+    Error: Raised if (A) the text is from the first owner tag, (B) the histogram
+    is not obsolete, and (C) the text is not a valid primary owner.
   """
-  is_email_or_placeholder = (re.match(_EMAIL_PATTERN, owner_tag_text) or
-      owner_tag_text == extract_histograms.OWNER_PLACEHOLDER)
+  is_email = re.match(_EMAIL_PATTERN, owner_tag_text)
+  is_placeholder = owner_tag_text == extract_histograms.OWNER_PLACEHOLDER
+  should_check_owner_email = (is_first_owner and not is_obsolete
+                              and not is_placeholder)
 
-  if is_first_owner and not is_email_or_placeholder:
-    raise Error('The histogram {} must have a valid first owner, i.e. an '
-                'individual\'s email address.'
-                .format(histogram_name))
+  if should_check_owner_email and not _IsValidPrimaryOwnerEmail(owner_tag_text):
+    raise Error(
+        'The histogram {} must have a valid primary owner, i.e. a '
+        'person with an @google.com or @chromium.org email address.'.format(
+            histogram_name))
 
-  return is_email_or_placeholder
+  return is_email or is_placeholder
 
 
 def _IsWellFormattedFilePath(path):
@@ -324,7 +345,9 @@
     for index, owner in enumerate(owners):
       owner_text = owner.childNodes[0].data.strip()
       name = histogram.getAttribute('name')
-      if _IsEmailOrPlaceholder(index == 0, owner_text, name):
+      obsolete_tags = [tag for tag in iter_matches(histogram, 'obsolete', 1)]
+      is_obsolete = len(obsolete_tags) > 0
+      if _IsEmailOrPlaceholder(index == 0, owner_text, name, is_obsolete):
         continue
 
       path = _GetOwnersFilePath(owner_text)
diff --git a/tools/metrics/histograms/expand_owners_unittest.py b/tools/metrics/histograms/expand_owners_unittest.py
index 9ac5643..a8457a1 100644
--- a/tools/metrics/histograms/expand_owners_unittest.py
+++ b/tools/metrics/histograms/expand_owners_unittest.py
@@ -307,11 +307,11 @@
     expand_owners.ExpandHistogramsOWNERS(histograms_without_file_paths)
     self.assertEqual(histograms_without_file_paths, expected_histograms)
 
-  def testExpandOwnersWithoutValidFirstOwner(self):
-    """Checks that an error is raised when the first owner is not valid.
+  def testExpandOwnersWithoutValidPrimaryOwner_OwnersPath(self):
+    """Checks that an error is raised when the primary owner is a file path.
 
-    A valid first owner is an individual's email address, e.g. rae@gmail.com,
-    or the owner placeholder.
+    A valid primary owner is an individual's email address, e.g. rae@google.com,
+    sam@chromium.org, or the owner placeholder.
     """
     histograms_without_valid_first_owner = xml.dom.minidom.parseString("""
 <histograms>
@@ -326,8 +326,54 @@
 
     with self.assertRaisesRegexp(
         expand_owners.Error,
-        'The histogram Caffeination must have a valid first owner, i.e. an '
-        'individual\'s email address.'):
+        'The histogram Caffeination must have a valid first owner, i.e. a '
+        'person with an @google.com or @chromium.org email address.'):
+      expand_owners.ExpandHistogramsOWNERS(histograms_without_valid_first_owner)
+
+  def testExpandOwnersWithoutValidPrimaryOwner_TeamEmail(self):
+    """Checks that an error is raised when the primary owner is a team.
+
+    A valid primary owner is an individual's email address, e.g. rae@google.com,
+    sam@chromium.org, or the owner placeholder.
+    """
+    histograms_without_valid_first_owner = xml.dom.minidom.parseString("""
+<histograms>
+
+<histogram name="Caffeination" units="mg">
+  <owner>coffee-team@google.com</owner>
+  <summary>I like coffee.</summary>
+</histogram>
+
+</histograms>
+""")
+
+    with self.assertRaisesRegexp(
+        expand_owners.Error,
+        'The histogram Caffeination must have a valid first owner, i.e. a '
+        'person with an @google.com or @chromium.org email address.'):
+      expand_owners.ExpandHistogramsOWNERS(histograms_without_valid_first_owner)
+
+  def testExpandOwnersWithoutValidPrimaryOwner_InvalidEmail(self):
+    """Checks that an error is raised when the primary owner's email is invalid.
+
+    A valid primary owner is an individual's email address, e.g. rae@google.com,
+    sam@chromium.org, or the owner placeholder.
+    """
+    histograms_without_valid_first_owner = xml.dom.minidom.parseString("""
+<histograms>
+
+<histogram name="Caffeination" units="mg">
+  <owner>alex@coffee.com</owner>
+  <summary>I like coffee.</summary>
+</histogram>
+
+</histograms>
+""")
+
+    with self.assertRaisesRegexp(
+        expand_owners.Error,
+        'The histogram Caffeination must have a valid first owner, i.e. a '
+        'person with an @google.com or @chromium.org email address.'):
       expand_owners.ExpandHistogramsOWNERS(histograms_without_valid_first_owner)
 
   def testExpandOwnersWithFakeFilePath(self):
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py
index 10d7de5..87a0f9e 100644
--- a/tools/metrics/histograms/extract_histograms_test.py
+++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -64,8 +64,8 @@
 TEST_BASE_HISTOGRAM_XML_CONTENT = """
 <histogram-configuration>
 <histograms>
-  <histogram base="true" name="Test.Base" expires_after="2211-11-22"
-      units="units" expires_after="2019-01-01">
+  <histogram base="true" name="Test.Base" units="units"
+      expires_after="2211-11-22">
     <owner>chrome-metrics-team@google.com</owner>
     <summary>
       Base histogram.
@@ -88,8 +88,8 @@
       Not a base histogram: base attribute explicitly set to "false".
     </summary>
   </histogram>
-  <histogram name="Test.NotBase.Implicit" expires_after="M100" units="units"
-      expires_after="2019-01-01">
+  <histogram name="Test.NotBase.Implicit" units="units"
+      expires_after="M100">
     <owner>chrome-metrics-team@google.com</owner>
     <summary>
       Not a base histogram: no base attribute specified.
@@ -527,7 +527,7 @@
 </histogram_suffixes_list>
 </histogram-configuration>
 """)
-    have_errors = extract_histograms. _UpdateHistogramsWithSuffixes(
+    have_errors = extract_histograms._UpdateHistogramsWithSuffixes(
         suffix_with_label, {})
     self.assertFalse(have_errors)
 
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 14ca58e8..e7d68cc8 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -963,6 +963,7 @@
 
 <histogram name="Accessibility.WinHighContrastTheme"
     enum="AccessibilityHighContrastColorScheme" expires_after="M89">
+  <owner>dmazzoni@chromium.org</owner>
   <owner>almaher@microsoft.com</owner>
   <owner>weblayoutdev@microsoft.com</owner>
   <summary>
@@ -2821,7 +2822,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.DialogShown"
     enum="AndroidDefaultBrowserPromoType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2833,7 +2834,7 @@
 <histogram
     name="Android.DefaultBrowserPromo.IntentReceivedFromDisambiguationSheet"
     enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2845,7 +2846,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.Outcome.NoDefault"
     enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2858,7 +2859,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.Outcome.OtherDefault"
     enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2871,7 +2872,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.RoleManagerShown"
     enum="AndroidDefaultBrowserPromoType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2882,7 +2883,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.UIDismissalReason.NoDefault"
     enum="AndroidDefaultBrowserPromoUserActionType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -2893,7 +2894,7 @@
 
 <histogram name="Android.DefaultBrowserPromo.UIDismissalReason.OtherDefault"
     enum="AndroidDefaultBrowserPromoUserActionType" expires_after="2021-03-26">
-  <owner>lazzzis@google.org</owner>
+  <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <owner>pavely@chromium.org</owner>
   <summary>
@@ -3657,6 +3658,7 @@
 
 <histogram name="Android.IsLastSharedAppInfoRetrieved"
     enum="BooleanIsLastSharedAppInfoRetrieved" expires_after="M77">
+  <owner>tedchoc@chromium.org</owner>
   <owner>clank-team@google.com</owner>
   <summary>
     Signifies whether the last shared app information is retrieved successfully
@@ -3677,9 +3679,9 @@
 
 <histogram name="Android.Language.UiIsSystemLanguage" enum="BooleanMatched"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>perrier@chromium.org</owner>
   <owner>megjablon@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Reports whether the Chrome UI language is the same as the Android system
     lanaguage. Recorded once per top-level ChromeActivty start.
@@ -3688,9 +3690,9 @@
 
 <histogram name="Android.Language.WrongLanguageAfterResume" enum="Boolean"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>heamy@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Reports whether Chrome was started in a language other than the system
     language but we support the system language. That can happen if the user
@@ -3821,6 +3823,7 @@
 
 <histogram name="Android.ModerateBindingCount" units="bindings"
     expires_after="M77">
+  <owner>tedchoc@chromium.org</owner>
   <owner>clank-team@google.com</owner>
   <summary>
     The number of moderate bindings which were kept while Chrome process is in
@@ -5994,8 +5997,8 @@
 
 <histogram name="API.StorageAccess.AllowedRequests" enum="StorageAccessResult"
     expires_after="2020-11-27">
-  <owner>brandm@microsoft.com</owner>
   <owner>mkwst@chromium.org</owner>
+  <owner>brandm@microsoft.com</owner>
   <summary>
     Records if various requests to access storage are allowed or not and if the
     Storage Access API unblocked the request or not. Recorded whenever a
@@ -6006,8 +6009,8 @@
 
 <histogram name="API.StorageAccess.GrantIsImplicit" enum="BooleanAvailable"
     expires_after="2020-11-27">
-  <owner>brandm@microsoft.com</owner>
   <owner>mkwst@chromium.org</owner>
+  <owner>brandm@microsoft.com</owner>
   <summary>
     Records if a generated grant was implicit or explicit at the time it was
     created.
@@ -6016,8 +6019,8 @@
 
 <histogram name="API.StorageAccess.RequestStorageAccess"
     enum="RequestStorageResult" expires_after="2020-11-27">
-  <owner>brandm@microsoft.com</owner>
   <owner>mkwst@chromium.org</owner>
+  <owner>brandm@microsoft.com</owner>
   <summary>
     Records requests to use document.requestStorageAccess and reasons the
     request may be approved or rejected.
@@ -8320,8 +8323,8 @@
 
 <histogram name="Apps.ShortcutsMenu.Registration.Win.Result"
     enum="ShortcutsMenuRegistrationWinResult" expires_after="M87">
-  <owner>rahsin@microsoft.com</owner>
   <owner>cmumford@chromium.org</owner>
+  <owner>rahsin@microsoft.com</owner>
   <summary>
     Records the result of shortcuts menu registration for PWA on Windows
   </summary>
@@ -8329,8 +8332,8 @@
 
 <histogram name="Apps.ShortcutsMenu.Unregistration.Win.Result"
     enum="ShortcutsMenuUnregistrationWinResult" expires_after="M87">
-  <owner>rahsin@microsoft.com</owner>
   <owner>cmumford@chromium.org</owner>
+  <owner>rahsin@microsoft.com</owner>
   <summary>
     Records the result of shortcuts menu unregistration for PWA on Windows
   </summary>
@@ -16685,6 +16688,35 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.WebOTP.OneTimeCode.FromAutocomplete" units="Boolean"
+    expires_after="2021-07-01">
+  <owner>yigu@chromium.org</owner>
+  <owner>battre@chromium.org</owner>
+  <owner>web-identity@google.com</owner>
+  <summary>
+    Records whether a frame has ever used autocomplete=&quot;one-time-code&quot;
+    during its lifecycle. i.e. it's only recorded once per frame. In addition,
+    we only record it if the frame has parsed forms.
+  </summary>
+</histogram>
+
+<histogram name="Autofill.WebOTP.PhoneNumberCollection.ParseResult"
+    units="Boolean" expires_after="2021-07-01">
+  <owner>yigu@chromium.org</owner>
+  <owner>battre@chromium.org</owner>
+  <owner>web-identity@google.com</owner>
+  <summary>
+    Records whether a frame collects phone number based on the field
+    classification. It records once per frame only if it has parsed forms.
+
+    Note that the field types may not be calculated if there are less than 3
+    fields in the form unless an autocomplete attribute is provided. e.g. if the
+    form has only a single field regarding phone number without specifiying
+    autocomplete=&quot;phone&quot;, a sample with &quot;false&quot; will be
+    reported.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.WebView.AutofillSession" enum="AutofillSessionStates"
     expires_after="2021-06-08">
   <owner>michaelbai@chromium.org</owner>
@@ -18406,6 +18438,7 @@
 
 <histogram name="Blink.Animation.CompositedAnimationFailureReason"
     enum="CompositorAnimationsFailureReason" expires_after="2020-12-13">
+  <owner>smcgruer@chromium.org</owner>
   <owner>animations-dev@chromium.org</owner>
   <summary>
     Reasons an Animation is not suitable for running on the compositor thread.
@@ -19274,6 +19307,24 @@
 
     Note: As of M70, this histogram has stopped recording metrics on machines
     with low-resolution clocks.
+
+    TODO(crbug.com/1100711): This is being replaced soon by CompositingInputs +
+    CompositingAssignments (== Compositing).
+  </summary>
+</histogram>
+
+<histogram name="Blink.CompositingAssignments.UpdateTime" units="microseconds"
+    expires_after="2021-03-01">
+<!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" -->
+
+  <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Time spent updating compositing assignments in the Blink document lifecycle.
+    This is the legacy compositing approach.
+
+    Note: this histogram has stopped recording metrics on machines with
+    low-resolution clocks.
   </summary>
 </histogram>
 
@@ -19296,6 +19347,21 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.CompositingInputs.UpdateTime" units="microseconds"
+    expires_after="2021-03-01">
+<!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" -->
+
+  <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Time spent updating compositing inputs in the Blink document lifecycle. This
+    is the legacy compositing approach.
+
+    Note: this histogram has stopped recording metrics on machines with
+    low-resolution clocks.
+  </summary>
+</histogram>
+
 <histogram name="Blink.Compression.CompressionStream.Format"
     enum="CompressionStreamsFormat" expires_after="2021-01-24">
   <owner>ricea@chromium.org</owner>
@@ -19393,6 +19459,7 @@
 
 <histogram name="Blink.DecodedImage.DensitySizeCorrectionDetected"
     enum="BooleanPresent" expires_after="2021-01-03">
+  <owner>schenney@chromium.org</owner>
   <owner>noam.j.rosenthal@gmail.com</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
@@ -20162,6 +20229,18 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Blink.MainFrame.CompositingAssignmentsRatio"
+    units="%" expires_after="2020-11-08">
+  <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing compositing assignments.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Blink.MainFrame.CompositingCommitRatio" units="%"
     expires_after="2020-11-08">
   <owner>schenney@chromium.org</owner>
@@ -20174,6 +20253,18 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Blink.MainFrame.CompositingInputsRatio" units="%"
+    expires_after="2020-11-08">
+  <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing compositing inputs.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Blink.MainFrame.CompositingRatio" units="%"
     expires_after="2020-11-08">
   <owner>schenney@chromium.org</owner>
@@ -22045,7 +22136,7 @@
   </summary>
 </histogram>
 
-<histogram name="BlinkGC.TimeForCompleteSweep" units="ms" expires_after="M84">
+<histogram name="BlinkGC.TimeForCompleteSweep" units="ms" expires_after="M88">
   <owner>bikineev@chromium.org</owner>
   <owner>oilpan-reviews@chromium.org</owner>
   <summary>
@@ -22151,7 +22242,7 @@
 </histogram>
 
 <histogram name="BlinkGC.TimeForSweepingBackground" units="ms"
-    expires_after="M84">
+    expires_after="M88">
   <owner>bikineev@chromium.org</owner>
   <owner>oilpan-reviews@chromium.org</owner>
   <summary>
@@ -22162,7 +22253,7 @@
 </histogram>
 
 <histogram name="BlinkGC.TimeForSweepingForeground" units="ms"
-    expires_after="M84">
+    expires_after="M88">
   <owner>bikineev@chromium.org</owner>
   <owner>oilpan-reviews@chromium.org</owner>
   <summary>
@@ -22172,7 +22263,7 @@
   </summary>
 </histogram>
 
-<histogram name="BlinkGC.TimeForSweepingSum" units="ms" expires_after="M84">
+<histogram name="BlinkGC.TimeForSweepingSum" units="ms" expires_after="M88">
   <owner>bikineev@chromium.org</owner>
   <owner>oilpan-reviews@chromium.org</owner>
   <summary>
@@ -22204,15 +22295,17 @@
   </summary>
 </histogram>
 
-<histogram name="BlinkGC.TotalAllocatedSpace" units="KB" expires_after="M84">
+<histogram name="BlinkGC.TotalAllocatedSpace" units="KB" expires_after="M88">
   <owner>haraken@chromium.org</owner>
+  <owner>oilpan-reviews@chromium.org</owner>
   <summary>
     The total size of allocated space in OS when a Blink GC is triggered.
   </summary>
 </histogram>
 
-<histogram name="BlinkGC.TotalObjectSpace" units="KB" expires_after="M84">
+<histogram name="BlinkGC.TotalObjectSpace" units="KB" expires_after="M88">
   <owner>haraken@chromium.org</owner>
+  <owner>oilpan-reviews@chromium.org</owner>
   <summary>
     The total size of object space in all threads when a Blink GC is triggered.
   </summary>
@@ -25072,6 +25165,7 @@
 
 <histogram name="Cast.Network.Down.Duration.In.Seconds" units="seconds"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Records the time the network has been down on a Cast device. Recorded when
@@ -25081,6 +25175,7 @@
 
 <histogram name="Cast.Network.Up.Duration.In.Minutes" units="minutes"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Records the time the network has been up on a Cast device. Recorded when
@@ -25247,6 +25342,7 @@
 
 <histogram name="CastV2.Transport.Connect.Latency.Unknown" units="ms"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     The latency between when a Cast V2 connection is established and the first
@@ -25259,6 +25355,7 @@
 
 <histogram name="CastV2.Transport.SslHandshake.Error.Unknown"
     enum="NetErrorCodes" expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     On accepting a Cast V2 transport socket connection, if an error is
@@ -25272,6 +25369,7 @@
 
 <histogram name="CastV2.Transport.SslHandshake.Unknown" units="ms"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     The time taken to do the handshake during Cast V2 transport socket creation.
@@ -28068,6 +28166,7 @@
 
 <histogram name="Compositing.Browser.LayersUpdateTime" units="microseconds"
     expires_after="2020-12-20">
+  <owner>schenney@chromium.org</owner>
   <owner>animations-dev@chromium.org</owner>
   <summary>
     Time spent updating layers, in microseconds. Recorded when layers are
@@ -28083,6 +28182,7 @@
 
 <histogram name="Compositing.Browser.LayerTreeImpl.CalculateDrawPropertiesUs"
     units="microseconds" expires_after="2020-12-20">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     Time spent updating layer draw properties, in microseconds. Recorded when a
@@ -28098,6 +28198,7 @@
 
 <histogram name="Compositing.Browser.NumActiveLayers" units="layers"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of layers in the active tree for each compositor frame. This is
@@ -28107,6 +28208,7 @@
 
 <histogram name="Compositing.Browser.NumActivePictureLayers" units="layers"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of PictureLayers in the active tree for each compositor frame.
@@ -28117,6 +28219,7 @@
 
 <histogram name="Compositing.Browser.NumRenderSurfaces" units="surfaces"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of render surfaces in the render surface layer list. Recorded
@@ -28898,6 +29001,7 @@
 
 <histogram name="Compositing.Renderer.LayerTreeImpl.CalculateDrawPropertiesUs"
     units="microseconds" expires_after="M81">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     Time spent updating layer draw properties, in microseconds. Recorded when a
@@ -28965,6 +29069,7 @@
 
 <histogram name="Compositing.Renderer.NumActiveLayers" units="layers"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of layers in the active tree for each compositor frame. This is
@@ -28974,6 +29079,7 @@
 
 <histogram name="Compositing.Renderer.NumActivePictureLayers" units="layers"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of PictureLayers in the active tree for each compositor frame.
@@ -28984,6 +29090,7 @@
 
 <histogram name="Compositing.Renderer.NumRenderSurfaces" units="surfaces"
     expires_after="2021-06-01">
+  <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
     The number of render surfaces in the render surface layer list. Recorded
@@ -33579,6 +33686,7 @@
 
 <histogram name="Crashpad.CrashReportPending" enum="CrashpadReportPending"
     expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>
     The reason that a crash report entered the upload pending state.
@@ -33586,42 +33694,49 @@
 </histogram>
 
 <histogram name="Crashpad.CrashReportSize" units="bytes" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>The size of a crash report minidump on disk when captured.</summary>
 </histogram>
 
 <histogram name="Crashpad.CrashUpload.AttemptSuccessful"
     enum="CrashpadUploadAttemptStatus" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>Logs whether a crash uploaded succeeded or failed.</summary>
 </histogram>
 
 <histogram name="Crashpad.CrashUpload.Skipped"
     enum="CrashpadUploadSkippedReason" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>The reason that a crash report upload was skipped.</summary>
 </histogram>
 
 <histogram name="Crashpad.ExceptionCaptureResult"
     enum="CrashpadExceptionCaptureResult" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>The outcome of execution of the Crashpad exception handler.</summary>
 </histogram>
 
 <histogram name="Crashpad.ExceptionCode.Mac" enum="CrashpadMacExceptionCodes"
     expires_after="M85">
+  <owner>mark@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>The exception code encountered in a crash on Mac OS X.</summary>
 </histogram>
 
 <histogram name="Crashpad.ExceptionCode.Win" enum="CrashpadWinExceptionCodes"
     expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>The exception code encountered in a crash on Windows.</summary>
 </histogram>
 
 <histogram name="Crashpad.ExceptionEncountered"
     enum="CrashpadExceptionProcessingState" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>
     A count of the number of exceptions handled by Crashpad with two buckets for
@@ -33631,6 +33746,7 @@
 
 <histogram name="Crashpad.HandlerCrash.ExceptionCode.Mac"
     enum="CrashpadMacExceptionCodes" expires_after="M85">
+  <owner>mark@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>
     The exception code encountered for a crash of the crash handler process on
@@ -33640,6 +33756,7 @@
 
 <histogram name="Crashpad.HandlerCrash.ExceptionCode.Win"
     enum="CrashpadWinExceptionCodes" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>
     The exception code encountered for a crash of the crash handler process on
@@ -33649,6 +33766,7 @@
 
 <histogram name="Crashpad.HandlerLifetimeMilestone"
     enum="CrashpadLifetimeMilestone" expires_after="M85">
+  <owner>jperaza@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>Handler start/crash/exit events.</summary>
 </histogram>
@@ -34570,6 +34688,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceActivityGetter.AsyncTaskResult.ClientAppMetadataFetch"
     enum="CryptAuthAsyncTaskResult" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34582,6 +34703,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceActivityGetter.ExecutionTime.ClientAppMetadataFetch"
     units="ms" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34606,6 +34730,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceManager.AsyncTaskResult.ClientAppMetadataFetch"
     enum="CryptAuthAsyncTaskResult" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34618,6 +34745,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceManager.ExecutionTime.ClientAppMetadataFetch"
     units="ms" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34642,6 +34772,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceNotifier.AsyncTaskResult.ClientAppMetadataFetch"
     enum="CryptAuthAsyncTaskResult" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34654,6 +34787,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.DeviceNotifier.ExecutionTime.ClientAppMetadataFetch"
     units="ms" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34890,6 +35026,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.FeatureStatusSetter.AsyncTaskResult.ClientAppMetadataFetch"
     enum="CryptAuthAsyncTaskResult" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -34902,6 +35041,9 @@
 <histogram
     name="CryptAuth.DeviceSyncV2.FeatureStatusSetter.ExecutionTime.ClientAppMetadataFetch"
     units="ms" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -35266,6 +35408,9 @@
 
 <histogram name="CryptAuth.EnrollmentV2.AsyncTaskResult.ClientAppMetadataFetch"
     enum="CryptAuthAsyncTaskResult" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -35320,6 +35465,9 @@
 
 <histogram name="CryptAuth.EnrollmentV2.ExecutionTime.ClientAppMetadataFetch2"
     units="ms" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. ClientAppMetadata now fetched in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -35380,6 +35528,9 @@
 
 <histogram name="CryptAuth.EnrollmentV2.GcmRegistration.AttemptTime" units="ms"
     expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. GCM registration now occurs in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -35390,6 +35541,9 @@
 
 <histogram name="CryptAuth.EnrollmentV2.GcmRegistration.Success"
     units="boolean" expires_after="2021-02-02">
+  <obsolete>
+    Removed 2020-07-29. GCM registration now occurs in DeviceSync service.
+  </obsolete>
   <owner>nohle@chromium.org</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -39273,7 +39427,7 @@
 
 <histogram name="DevTools.KeyboardShortcutFired"
     enum="DevToolsKeyboardShortcutAction" expires_after="2020-10-31">
-  <owner>yangguo@microsoft.com</owner>
+  <owner>yangguo@chromium.org</owner>
   <owner>jalyn@microsoft.com</owner>
   <owner>leo.lee@microsoft.com</owner>
   <summary>
@@ -51553,6 +51707,7 @@
 
 <histogram name="Event.Latency.EndToEnd.Mouse" units="microseconds"
     expires_after="2020-11-08">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a mouse event and the resulting GPU frame
@@ -51568,6 +51723,7 @@
 
 <histogram name="Event.Latency.EndToEnd.TouchpadPinch" units="microseconds"
     expires_after="2020-10-11">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a touchpad pinch event and the resulting GPU
@@ -51577,6 +51733,7 @@
 
 <histogram name="Event.Latency.EndToEnd.TouchpadPinch2" units="microseconds"
     expires_after="2020-12-13">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a touchpad pinch event and the resulting GPU
@@ -51586,6 +51743,7 @@
 
 <histogram name="Event.Latency.EventToRender.TouchpadPinch"
     units="microseconds" expires_after="M81">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a touchpad pinch event and RenderWidgetHost
@@ -51595,8 +51753,8 @@
 
 <histogram name="Event.Latency.HitTest" units="microseconds"
     expires_after="2021-01-03">
-  <owner>paint-dev@chromium.org</owner>
   <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
   <summary>
     Duration of a non-resurive hitTest operation. The hit test is non-recursive
     when the AllowChildFrameContent flag is clear. See also
@@ -51614,8 +51772,8 @@
 
 <histogram name="Event.Latency.HitTestRecursive" units="microseconds"
     expires_after="2021-01-03">
-  <owner>paint-dev@chromium.org</owner>
   <owner>schenney@chromium.org</owner>
+  <owner>paint-dev@chromium.org</owner>
   <summary>
     Duration of a recursive hitTest operation. The hit test is recursive when
     the AllowChildFrameContent flag is set. See also Event.Latency.HitTest.
@@ -51919,6 +52077,7 @@
 <histogram
     name="Event.Latency.ScrollBegin.Scrollbar.BrowserNotifiedToBeforeGpuSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -51935,6 +52094,7 @@
 
 <histogram name="Event.Latency.ScrollBegin.Scrollbar.GpuSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -51954,6 +52114,7 @@
 
 <histogram name="Event.Latency.ScrollBegin.Scrollbar.HandledToRendererSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -51974,6 +52135,7 @@
 <histogram
     name="Event.Latency.ScrollBegin.Scrollbar.RendererSwapToBrowserNotified2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -51990,6 +52152,7 @@
 
 <histogram name="Event.Latency.ScrollBegin.Scrollbar.TimeToHandled2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52011,6 +52174,7 @@
 <histogram
     name="Event.Latency.ScrollBegin.Scrollbar.TimeToScrollUpdateSwapBegin4"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -52626,6 +52790,7 @@
 <histogram
     name="Event.Latency.ScrollUpdate.Scrollbar.BrowserNotifiedToBeforeGpuSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52642,6 +52807,7 @@
 
 <histogram name="Event.Latency.ScrollUpdate.Scrollbar.GpuSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52660,6 +52826,7 @@
 
 <histogram name="Event.Latency.ScrollUpdate.Scrollbar.HandledToRendererSwap2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52680,6 +52847,7 @@
 <histogram
     name="Event.Latency.ScrollUpdate.Scrollbar.RendererSwapToBrowserNotified2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52696,6 +52864,7 @@
 
 <histogram name="Event.Latency.ScrollUpdate.Scrollbar.TimeToHandled2"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
@@ -52717,6 +52886,7 @@
 <histogram
     name="Event.Latency.ScrollUpdate.Scrollbar.TimeToScrollUpdateSwapBegin4"
     units="microseconds" expires_after="2020-12-01">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>dlibby@microsoft.com</owner>
   <owner>input-dev@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -56931,6 +57101,7 @@
 
 <histogram name="Extensions.ErrorCodeFromCrxOpen" units="units"
     expires_after="M85">
+  <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
     If opening the CRX file for unpacking fails, this integer is the error code
@@ -65698,7 +65869,7 @@
 </histogram>
 
 <histogram name="GPU.DoLinkProgramTime" units="ms" expires_after="2020-11-30">
-  <owner>jonahr@google.org</owner>
+  <owner>jonahr@google.com</owner>
   <owner>angle-team@google.com</owner>
   <summary>
     The time we spend in GLES2DecoderImpl::DoLinkProgram. Related to how much
@@ -68595,8 +68766,8 @@
 
 <histogram name="History.MonthlyHostCount" units="hosts"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Unique hostnames in History database urls table with last-visit times in the
     last 30 days. Metrics are logged on initialization of the History DB on 0.3%
@@ -68608,8 +68779,8 @@
 
 <histogram name="History.MonthlyURLCount" units="urls"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Unique URLs in History database urls table with last-visit times in the last
     30 days. Metrics are logged on initialization of the History DB on 0.3% of
@@ -68619,8 +68790,8 @@
 
 <histogram name="History.MonthlyVisitCount" units="visits"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Number of rows in History visits table with visit times in the last 30 days.
     Metrics are logged on initialization of the History DB on 1% of starts.
@@ -68788,8 +68959,8 @@
 
 <histogram name="History.URLTableCount" units="units"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Number of rows in urls table in History DB. Metrics are logged on
     initialization of the History DB on 1% of starts.
@@ -68798,8 +68969,8 @@
 
 <histogram name="History.VisitTableCount" units="units"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Number of rows in visits table in History DB. Metrics are logged on
     initialization of the History DB on 1% of starts.
@@ -68808,8 +68979,8 @@
 
 <histogram name="History.WeeklyHostCount" units="units"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Unique hostnames in History database urls table with last-visit times in the
     last 7 days. Metrics are logged on initialization of the History DB on 0.3%
@@ -68819,8 +68990,8 @@
 
 <histogram name="History.WeeklyURLCount" units="units"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Unique URLs in History database urls table with last-visit times in the last
     7 days. Metrics are logged on initialization of the History DB on 0.3% of
@@ -68830,8 +69001,8 @@
 
 <histogram name="History.WeeklyVisitCount" units="units"
     expires_after="2020-11-30">
-  <owner>mpearson@chromium.com</owner>
-  <owner>sky@chromium.com</owner>
+  <owner>mpearson@chromium.org</owner>
+  <owner>sky@chromium.org</owner>
   <summary>
     Number of rows in History visits table with visit times in the last 7 days.
     Metrics are logged on initialization of the History DB on 1% of starts.
@@ -69740,8 +69911,8 @@
 
 <histogram name="ImageLoader.Client.Cache.HitMiss" enum="BooleanCacheHit"
     expires_after="2019-01-01">
-  <owner>chromeos-files-app@google.com</owner>
   <owner>tapted@chromium.org</owner>
+  <owner>chromeos-files-app@google.com</owner>
   <summary>
     For each image load request that requested caching, records whether or not
     it was found in the client-side cache. A hit means the request was not
@@ -69751,8 +69922,8 @@
 
 <histogram name="ImageLoader.Client.Cache.Usage" units="%"
     expires_after="2019-01-01">
-  <owner>chromeos-files-app@google.com</owner>
   <owner>tapted@chromium.org</owner>
+  <owner>chromeos-files-app@google.com</owner>
   <summary>
     Returns the percentage of the client-side cache that is used for loading
     images, before they are sent to the ImageLoader extension. Expressed as a
@@ -69762,8 +69933,8 @@
 
 <histogram name="ImageLoader.Client.Cached" enum="BooleanRequested"
     expires_after="2019-01-01">
-  <owner>chromeos-files-app@google.com</owner>
   <owner>tapted@chromium.org</owner>
+  <owner>chromeos-files-app@google.com</owner>
   <summary>
     For each image load request records whether or not it requested caching.
   </summary>
@@ -70415,12 +70586,14 @@
 
 <histogram name="InputMethod.AutoCorrectLevel" enum="IMECorrectionLevel"
     expires_after="2021-04-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>The auto-correction level for suggestion engine.</summary>
 </histogram>
 
 <histogram name="InputMethod.Category" enum="InputMethodCategory"
     expires_after="2021-04-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The breakdown of input method usage by input method category. Recorded when
@@ -70430,6 +70603,7 @@
 
 <histogram name="InputMethod.Commit.Index" units="units"
     expires_after="2021-04-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The suggestion index (1-based) of the suggestion list item which user
@@ -70574,6 +70748,7 @@
 
 <histogram name="InputMethod.ModeChangeKeyAction" enum="ModeChangeKeyAction"
     expires_after="2019-12-31">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>The result of the user pressing the mode change key.</summary>
 </histogram>
@@ -70592,12 +70767,14 @@
 
 <histogram name="InputMethod.Mojo.Extension.Event" enum="IMEExtensionMojoEvent"
     expires_after="2021-04-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>The events of Mojo service in the IME Extension.</summary>
 </histogram>
 
 <histogram name="InputMethod.Mojo.Extension.Rulebased.ProcessLatency"
     units="ms" expires_after="2019-12-31">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The time taken to process a rulebased request via the IME Mojo service
@@ -70607,6 +70784,7 @@
 
 <histogram name="InputMethod.Mojo.Extension.ServiceInitLatency" units="ms"
     expires_after="2019-12-31">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The time taken to initialize the IME Mojo service in the IME extension. It's
@@ -70618,6 +70796,7 @@
 
 <histogram name="InputMethod.PkCommit.Index" units="units"
     expires_after="2021-04-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The suggestion index (1-based) of the suggestion list item which user
@@ -70645,6 +70824,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.BackspaceCount" units="units"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The number of times the backspace key was pressed on the virtual keyboard,
@@ -70655,6 +70835,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.BackspaceOnLayout"
     enum="IMEVKLayout" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The layout type of the virtual keyboard, recorded when backspace is pressed.
@@ -70663,6 +70844,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.BackwardsMovesPerSwipe"
     units="moves" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that counts the number of times the cursor was moved to
@@ -70675,6 +70857,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.CharactersBetweenBackspaces"
     units="units" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Counts the length of text typed by the virtual keyboard between each
@@ -70685,6 +70868,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.CharactersCommitted" units="units"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The total number of characters committed. Recorded when the virtual keyboard
@@ -70712,6 +70896,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.ContainerBehavior"
     enum="VirtualKeyboardContainerType" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that counts the number of times each virtual keyboard
@@ -70722,6 +70907,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.DecoderEvent"
     enum="InputMethodDecoderEvent" expires_after="2021-02-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that counts events from the decoder triggered by the
@@ -70731,6 +70917,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.Duration" units="seconds"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>How long the virtual keyboard was visible.</summary>
 </histogram>
@@ -70744,12 +70931,14 @@
 
 <histogram name="InputMethod.VirtualKeyboard.ErrorType"
     enum="VirtualKeyboardErrorTypeHashes" expires_after="2021-02-01">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>Errors from the virtual keyboard extension</summary>
 </histogram>
 
 <histogram name="InputMethod.VirtualKeyboard.FocusedByStylus" enum="Boolean"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Whether an input field was focused by a stylus or not. Recorded when an
@@ -70759,12 +70948,14 @@
 
 <histogram name="InputMethod.VirtualKeyboard.GestureTypingEvent"
     enum="IMEGestureTypingEvent" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>Text input events related to gesture typing.</summary>
 </histogram>
 
 <histogram name="InputMethod.VirtualKeyboard.InitLatency" units="ms"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The on-screen keyboard initialization latency in milliseconds.
@@ -70784,6 +70975,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.Layout" enum="IMEVKLayout"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The layout of the on-screen keyboard. Logged when the specific layout is
@@ -70803,6 +70995,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.MovesPerSwipe" units="moves"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that counts the number of times the cursor was moved to
@@ -70815,6 +71008,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.PreferredLayoutForStylus"
     enum="IMEVKLayout" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The layout of the virtual keyboard that is shown when the user focuses on an
@@ -70853,6 +71047,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.SwitchMode" enum="IMEVKMode"
     expires_after="2021-06-30">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The count of user actions to switch keyboard mode (floating, docked).
@@ -70862,6 +71057,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.TapCount" units="units"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The number of times the virtual keyboard was tapped while the virtual
@@ -70871,6 +71067,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.WordsDeletedPerSwipe"
     units="words" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that tracks the total number of words that were deleted
@@ -70883,6 +71080,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.WordsPerMinute" units="units"
     expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     The number of words typed per minute. Recorded when the virtual keyboard is
@@ -70892,6 +71090,7 @@
 
 <histogram name="InputMethod.VirtualKeyboard.WordsRestoredPerSwipe"
     units="words" expires_after="M95">
+  <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
     Chrome OS histogram that tracks the total number of words that were restored
@@ -74398,8 +74597,8 @@
 
 <histogram name="LanguageSettings.Actions" enum="LanguageSettingsActionType"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>googleo@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The actions taken on languages settings, recorded every time they happen.
     This histogram will record every single event that happens separately.
@@ -74408,31 +74607,31 @@
 
 <histogram name="LanguageSettings.PageImpression"
     enum="LanguageSettingsPageType" expires_after="2021-01-03">
-  <owner>chrome-language@google.com</owner>
   <owner>googleo@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>The type of panes which language settings loads.</summary>
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguage" enum="LanguageCode"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>Accept languages.</summary>
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguage.Count" units="units"
     expires_after="2021-06-01">
-  <owner>chrome-language@google.com</owner>
   <owner>dvallet@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>The number of accepted languages in the user preferences.</summary>
 </histogram>
 
 <histogram name="LanguageUsage.ApplicationLanguage" enum="LanguageCode"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>Application languages used for UI.</summary>
 </histogram>
 
@@ -78972,6 +79171,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     Audio codec used in HTML5 media. Reporting corrected in M51 to include all
@@ -78984,6 +79184,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Audio codec used in HTML5 media for a local file playback.</summary>
 </histogram>
@@ -78992,6 +79193,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     Container used for HTML5 media. Views that include pre-M34 data will
@@ -79004,6 +79206,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Container used for HTML5 media for a local file playback.</summary>
 </histogram>
@@ -79060,6 +79263,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     Video codec used in HTML5 media. Reporting corrected in M51 to include all
@@ -79072,6 +79276,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>Video codec used in HTML5 media for a local file playback.</summary>
 </histogram>
@@ -81755,6 +81960,7 @@
     expires_after="never">
 <!-- expires-never: Codec and container support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     Video codec used in plain src= (not MSE) HTML5 media if the media container
@@ -81766,6 +81972,7 @@
     expires_after="never">
 <!-- expires-never: Codec and container support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     Video codec used in plain src= (not MSE) HTML5 media if the media container
@@ -82019,6 +82226,7 @@
     expires_after="never">
 <!-- expires-never: Codec support planning metric. -->
 
+  <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
     URL scheme used with HTML5 media; only recorded for src=URL playbacks and
@@ -85743,9 +85951,9 @@
     expires_after="2020-12-13">
 <!-- Name completed by histogram_suffixes name="GPU.PeakMemoryUsage" -->
 
-  <owner>graphics-dev@chromium.org</owner>
   <owner>jonross@chromium.org</owner>
   <owner>sadrul@chromium.org</owner>
+  <owner>graphics-dev@chromium.org</owner>
   <summary>
     The maximum amount of memory of the GPU process during a particular
     interaction (e.g. tab-switch, page-load, scroll etc.).
@@ -87671,6 +87879,7 @@
 </histogram>
 
 <histogram name="Mist.SwitchResult" enum="MistSwitchResult" expires_after="M77">
+  <owner>akhouderchah@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     The result (e.g. success or the type of failure) of a modem interface switch
@@ -98301,6 +98510,7 @@
 
 <histogram name="Net.MediaCache.Response.EnabledOrDisabled"
     enum="MediaResponseCacheType" expires_after="2020-09-01">
+  <owner>morlovich@chromium.org</owner>
   <owner>shawnpi@microsoft.com</owner>
   <owner>webmedia@microsoft.com</owner>
   <summary>
@@ -104187,7 +104397,10 @@
 </histogram>
 
 <histogram name="Net.SSLTLS13Downgrade" enum="BooleanDowngrade"
-    expires_after="2021-01-24">
+    expires_after="2020-07-28">
+  <obsolete>
+    Removed 2020-07-28.
+  </obsolete>
   <owner>svaldez@chromium.org</owner>
   <owner>davidben@chromium.org</owner>
   <summary>
@@ -104198,7 +104411,10 @@
 </histogram>
 
 <histogram name="Net.SSLTLS13DowngradeTLS13Experiment" enum="BooleanDowngrade"
-    expires_after="2020-10-30">
+    expires_after="2020-07-28">
+  <obsolete>
+    Removed 2020-07-28.
+  </obsolete>
   <owner>svaldez@chromium.org</owner>
   <owner>davidben@chromium.org</owner>
   <summary>
@@ -104210,7 +104426,10 @@
 </histogram>
 
 <histogram name="Net.SSLTLS13DowngradeType" enum="TLS13DowngradeType"
-    expires_after="2020-10-30">
+    expires_after="2020-07-28">
+  <obsolete>
+    Removed 2020-07-28.
+  </obsolete>
   <owner>svaldez@chromium.org</owner>
   <owner>davidben@chromium.org</owner>
   <summary>
@@ -104220,7 +104439,10 @@
 </histogram>
 
 <histogram name="Net.SSLTLS13DowngradeTypeTLS13Experiment"
-    enum="TLS13DowngradeType" expires_after="2020-10-30">
+    enum="TLS13DowngradeType" expires_after="2020-07-28">
+  <obsolete>
+    Removed 2020-07-28.
+  </obsolete>
   <owner>svaldez@chromium.org</owner>
   <owner>davidben@chromium.org</owner>
   <summary>
@@ -105912,11 +106134,13 @@
 </histogram>
 
 <histogram name="Network.3G.Gobi.Activation" units="ms" expires_after="M85">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>The time the Gobi modem takes to complete activation.</summary>
 </histogram>
 
 <histogram name="Network.3G.Gobi.Connect" units="ms" expires_after="2019-12-31">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     The time the Gobi modem takes to connect to the cellular network.
@@ -105925,6 +106149,7 @@
 
 <histogram name="Network.3G.Gobi.Disconnect" units="ms"
     expires_after="2019-12-31">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     The time the Gobi modem takes to disconnect from the cellular network.
@@ -105933,18 +106158,21 @@
 
 <histogram name="Network.3G.Gobi.FirmwareDownload.Attempts" units="units"
     expires_after="M85">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>Number of attempts taken to install Gobi firmware.</summary>
 </histogram>
 
 <histogram name="Network.3G.Gobi.FirmwareDownload.Time" units="ms"
     expires_after="M85">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>The time it takes to install Gobi firmware.</summary>
 </histogram>
 
 <histogram name="Network.3G.Gobi.Registration" units="ms"
     expires_after="2019-12-31">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     The time the Gobi modem takes to register on the cellular network.
@@ -105953,6 +106181,7 @@
 
 <histogram name="Network.3G.Gobi.SetPower" enum="Network3GGobiError"
     expires_after="2019-12-31">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>Errors experienced during Gobi device powerup.</summary>
 </histogram>
@@ -106132,6 +106361,7 @@
 <histogram name="Network.Shill.Cellular.3GPPRegistrationDelayedDrop"
     enum="NetworkCellular3GPPRegistrationDelayedDrop"
     expires_after="2020-06-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106143,6 +106373,7 @@
 
 <histogram name="Network.Shill.Cellular.AutoConnectTotalTime" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106154,6 +106385,7 @@
 
 <histogram name="Network.Shill.Cellular.AutoConnectTries" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106165,6 +106397,7 @@
 
 <histogram name="Network.Shill.Cellular.DevicePresenceStatus"
     enum="BooleanPresent" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106189,6 +106422,7 @@
 
 <histogram name="Network.Shill.Cellular.Disconnect"
     enum="NetworkDisconnectType" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106199,6 +106433,7 @@
 
 <histogram name="Network.Shill.Cellular.Drop" enum="NetworkCellularTechnology"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106224,6 +106459,7 @@
 
 <histogram name="Network.Shill.Cellular.ExpiredLeaseLengthSeconds2"
     units="seconds" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106235,6 +106471,7 @@
 
 <histogram name="Network.Shill.Cellular.IPv6ConnectivityStatus"
     enum="IPv6ConnectivityStatus" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106245,6 +106482,7 @@
 
 <histogram name="Network.Shill.Cellular.NetworkConnectionIPType"
     enum="NetworkConnectionIPType" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106255,6 +106493,7 @@
 
 <histogram name="Network.Shill.Cellular.OutOfCreditsReason"
     enum="NetworkCellularOutOfCreditsReason" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106265,6 +106504,7 @@
 
 <histogram name="Network.Shill.Cellular.PortalAttempts" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106276,6 +106516,7 @@
 
 <histogram name="Network.Shill.Cellular.PortalAttemptsToOnline" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106287,6 +106528,7 @@
 
 <histogram name="Network.Shill.Cellular.PortalResult"
     enum="NetworkPortalResult" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106306,6 +106548,7 @@
 
 <histogram name="Network.Shill.Cellular.SignalStrengthBeforeDrop" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106316,6 +106559,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeOnline" units="seconds"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106327,6 +106571,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToConfig" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106337,6 +106582,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToConnect" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106347,6 +106593,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToDisable" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106357,6 +106604,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToEnable" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106367,6 +106615,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToInitialize" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106377,6 +106626,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToOnline" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106387,6 +106637,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToPortal" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106408,6 +106659,7 @@
 
 <histogram name="Network.Shill.Cellular.TimeToScan" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106418,6 +106670,7 @@
 
 <histogram name="Network.Shill.ConnectionDiagnosticsIssue"
     enum="ConnectionDiagnosticsIssue" expires_after="M85">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     Chrome OS network metric that tracks the connectivity issue diagnosed by the
@@ -106429,6 +106682,7 @@
 
 <histogram name="Network.Shill.CorruptedProfile" enum="NetworkCorruptedProfile"
     expires_after="M78">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <summary>
     Chrome OS cellular network metric that tracks the number of corrupted
@@ -106439,6 +106693,7 @@
 <histogram name="Network.Shill.CumulativeTimeOnline" units="seconds"
     expires_after="2020-12-01">
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS device time on line in the previous 24-hour sample period.
@@ -106452,8 +106707,8 @@
 
 <histogram name="Network.Shill.DailyChosenFractionOnline.Cellular" units="%"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS fraction of daily cumulative time on a cellular connection when
@@ -106466,8 +106721,8 @@
 
 <histogram name="Network.Shill.DailyChosenFractionOnline.Wifi" units="%"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS fraction of daily cumulative time on a WiFi connection when both
@@ -106480,8 +106735,8 @@
 
 <histogram name="Network.Shill.DailyChosenTimeOnline.Any" units="seconds"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS daily cumulative time on line when both cellular and WiFi adaptors
@@ -106494,8 +106749,8 @@
 
 <histogram name="Network.Shill.DailyChosenTimeOnline.Cellular" units="seconds"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS daily cumulative time on a cellular connection when both cellular
@@ -106508,8 +106763,8 @@
 
 <histogram name="Network.Shill.DailyChosenTimeOnline.Wifi" units="seconds"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS daily cumulative time on a WiFi connection when both cellular and
@@ -106523,6 +106778,7 @@
 <histogram name="Network.Shill.DarkResumeActionResult"
     enum="ShillSuspendTerminationDarkResumeActionResult"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106533,6 +106789,7 @@
 
 <histogram name="Network.Shill.DarkResumeActionsTimeTaken" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106555,6 +106812,7 @@
 
 <histogram name="Network.Shill.DarkResumeScanNumRetries" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106565,6 +106823,7 @@
 
 <histogram name="Network.Shill.DarkResumeScanRetryResult"
     enum="DarkResumeScanRetryResult" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106577,6 +106836,7 @@
 
 <histogram name="Network.Shill.DeviceConnectionStatus" enum="ConnectionStatus"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106587,6 +106847,7 @@
 
 <histogram name="Network.Shill.DeviceRemovedEvent" enum="DeviceTechnologyType"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106597,6 +106858,8 @@
 
 <histogram name="Network.Shill.DHCPClientMTUValue" units="bytes"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS network diagnostic metric sampling the MTU value proposed by the
@@ -106607,6 +106870,8 @@
 
 <histogram name="Network.Shill.DHCPClientStatus" enum="NetworkDhcpClientStatus"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS network diagnostic metric sampling the current state of the DHCP
@@ -106616,6 +106881,7 @@
 
 <histogram name="Network.Shill.DHCPOptionFailureDetected"
     enum="NetworkTechnology" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106628,6 +106894,7 @@
 
 <histogram name="Network.Shill.Ethernet.DevicePresenceStatus"
     enum="BooleanPresent" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106652,6 +106919,7 @@
 
 <histogram name="Network.Shill.Ethernet.Disconnect"
     enum="NetworkDisconnectType" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106677,6 +106945,7 @@
 
 <histogram name="Network.Shill.Ethernet.ExpiredLeaseLengthSeconds2"
     units="seconds" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106688,6 +106957,7 @@
 
 <histogram name="Network.Shill.Ethernet.LinkMonitorBroadcastErrorsAtFailure"
     units="units" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106699,6 +106969,7 @@
 
 <histogram name="Network.Shill.Ethernet.LinkMonitorFailure"
     enum="LinkMonitorFailureType" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106709,6 +106980,7 @@
 
 <histogram name="Network.Shill.Ethernet.LinkMonitorResponseTimeSample"
     units="ms" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106719,6 +106991,7 @@
 
 <histogram name="Network.Shill.Ethernet.LinkMonitorSecondsToFailure"
     units="seconds" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106729,6 +107002,7 @@
 
 <histogram name="Network.Shill.Ethernet.LinkMonitorUnicastErrorsAtFailure"
     units="units" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106740,6 +107014,7 @@
 
 <histogram name="Network.Shill.Ethernet.PortalAttempts" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106751,6 +107026,7 @@
 
 <histogram name="Network.Shill.Ethernet.PortalAttemptsToOnline" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106762,6 +107038,7 @@
 
 <histogram name="Network.Shill.Ethernet.PortalResult"
     enum="NetworkPortalResult" expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106781,6 +107058,7 @@
 
 <histogram name="Network.Shill.Ethernet.TimeOnline" units="seconds"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106792,6 +107070,7 @@
 
 <histogram name="Network.Shill.Ethernet.TimeToConfig" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106803,6 +107082,7 @@
 
 <histogram name="Network.Shill.Ethernet.TimeToInitialize" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106813,6 +107093,7 @@
 
 <histogram name="Network.Shill.Ethernet.TimeToOnline" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106823,6 +107104,7 @@
 
 <histogram name="Network.Shill.Ethernet.TimeToPortal" units="ms"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106844,8 +107126,8 @@
 
 <histogram name="Network.Shill.MonthlyChosenFractionOnline.Cellular" units="%"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS fraction of monthly cumulative time on a cellular connection when
@@ -106858,8 +107140,8 @@
 
 <histogram name="Network.Shill.MonthlyChosenFractionOnline.Wifi" units="%"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS fraction of monthly cumulative time on a WiFi connection when both
@@ -106872,8 +107154,8 @@
 
 <histogram name="Network.Shill.MonthlyChosenTimeOnline.Any" units="seconds"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS monthly cumulative time on line when both cellular and WiFi
@@ -106886,8 +107168,8 @@
 
 <histogram name="Network.Shill.MonthlyChosenTimeOnline.Cellular"
     units="seconds" expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS monthly cumulative time on a cellular connection when both
@@ -106900,8 +107182,8 @@
 
 <histogram name="Network.Shill.MonthlyChosenTimeOnline.Wifi" units="seconds"
     expires_after="2020-12-01">
-  <owner>benchan@chromium.org</owner>
   <owner>kirtika@chromium.org</owner>
+  <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS monthly cumulative time on a WiFi connection when both cellular
@@ -106950,6 +107232,7 @@
 
 <histogram name="Network.Shill.ServiceErrors" enum="NetworkServiceError"
     expires_after="2021-07-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106959,6 +107242,7 @@
 
 <histogram name="Network.Shill.ServicesOnSameNetwork" units="units"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -106970,6 +107254,7 @@
 <histogram name="Network.Shill.SuspendActionResult"
     enum="ShillSuspendTerminationDarkResumeActionResult"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -107019,6 +107304,7 @@
 <histogram name="Network.Shill.TerminationActionResult"
     enum="ShillSuspendTerminationDarkResumeActionResult"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -107056,7 +107342,9 @@
 
 <histogram name="Network.Shill.TerminationActionsTimeTaken" units="ms"
     expires_after="M85">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
+  <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS network diagnostic metric sampling the time in milliseconds it
     takes termination actions to complete when shill terminates.
@@ -107101,6 +107389,7 @@
 
 <histogram name="Network.Shill.TimeToDrop" units="seconds"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>benchan@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -107113,6 +107402,7 @@
 
 <histogram name="Network.Shill.UserInitiatedEvents" enum="UserInitiatedEvent"
     expires_after="2020-12-01">
+  <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS network metric that tracks the number of user-initiated events.
@@ -107642,6 +107932,7 @@
 
 <histogram name="Network.Shill.WiFi.RememberedNetworkCount" units="units"
     expires_after="M85">
+  <owner>kirtika@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
     Chrome OS network diagnostic metric sampling the number of 802.11 wireless
@@ -108287,6 +108578,7 @@
 
 <histogram name="Network.Wifi.Channel" enum="NetworkChannelType"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Chrome OS network usage metric. The channel used for each successful WiFi
@@ -108296,6 +108588,7 @@
 
 <histogram name="Network.Wifi.PhyMode" enum="NetworkPhyModeType"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Chrome OS network usage metric. The channel type used for each successful
@@ -108304,6 +108597,7 @@
 </histogram>
 
 <histogram name="Network.Wifi.RoundTripTime" units="ms" expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Network metric reporting the average round trip time to the WiFi gateway.
@@ -108313,6 +108607,7 @@
 
 <histogram name="Network.Wifi.Security" enum="NetworkSecurityType"
     expires_after="M85">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <owner>cast-analytics@google.com</owner>
   <summary>
     Chrome OS network usage metric. The security setting for each successful
@@ -108323,7 +108618,7 @@
 <histogram name="Network.Wifi.Synced.Connection.FailureReason"
     enum="ConnectionFailureReason" expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the failure reason for all connection attempts,
     manual or automatic, to Wi-Fi networks which were added from Chrome Sync.
@@ -108333,7 +108628,7 @@
 <histogram name="Network.Wifi.Synced.Connection.Result" enum="BooleanSuccess"
     expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the result of all connection attempts, manual
     or automatic, to Wi-Fi networks which were added from Chrome Sync.
@@ -108343,7 +108638,7 @@
 <histogram name="Network.Wifi.Synced.ManualConnection.FailureReason"
     enum="ConnectionFailureReason" expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the failure reason for manual connection
     attempts to Wi-Fi networks which were added from Chrome Sync.
@@ -108353,7 +108648,7 @@
 <histogram name="Network.Wifi.Synced.ManualConnection.Result"
     enum="BooleanSuccess" expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the result of manual connection attempts to
     Wi-Fi networks which were added from Chrome Sync.
@@ -108363,7 +108658,7 @@
 <histogram name="Network.Wifi.Synced.TotalCount" units="units"
     expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the total number of Wi-Fi networks which are
     stored in Chrome Sync for the active user.
@@ -108373,7 +108668,7 @@
 <histogram name="Network.Wifi.Synced.UpdateOperation.FailureReason"
     enum="ConnectionFailureReason" expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the failure reason for update attempts to
     synced Wi-Fi networks. This includes create/modify/remove operations. Each
@@ -108384,7 +108679,7 @@
 <histogram name="Network.Wifi.Synced.UpdateOperation.Result"
     enum="BooleanSuccess" expires_after="2021-04-22">
   <owner>jonmann@chromium.org</owner>
-  <owner>better-together-dev@google.org</owner>
+  <owner>better-together-dev@google.com</owner>
   <summary>
     Chrome OS metric that tracks the result of update attempts to synced Wi-Fi
     networks. This includes create/modify/remove operations. failures are only
@@ -110368,6 +110663,17 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Promos.PromoBrowserCommand"
+    enum="PromoBrowserCommandEnum" expires_after="M90">
+  <owner>mahmadi@chromium.org</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <summary>
+    Logs how many times various promo browser commands are executed. Triggered
+    when a supported and enabled promo browser command is sent via the New Tab
+    Page promos and is executed by the PromoBrowserCommandHandler.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.Promos.RequestLatency" units="ms"
     expires_after="M76">
   <obsolete>
@@ -115791,9 +116097,9 @@
 
 <histogram name="Omnibox.AnswerInSuggestShown"
     enum="SuggestionAnswerOptionalType" expires_after="M83">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Records number of times an Answer is presented as one of the Omnibox
     Suggestions at the time the user exited the omnibox. Exiting the omnibox
@@ -116226,10 +116532,10 @@
 
 <histogram name="Omnibox.IconOrFaviconShown" enum="SuggestionIconOrFaviconType"
     expires_after="M83">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>ender@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Records suggestions decorated with specific icon or favicon at the time the
     user exited the omnibox. Exiting the omnibox includes navigating (to entered
@@ -116690,10 +116996,10 @@
 
 <histogram name="Omnibox.RichEntity.DecorationType"
     enum="SuggestionEntityDecorationType" expires_after="M84">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>ender@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Records, for each entity suggestion (people, music, ...) whether it was
     decorated with image / color / icon at the time the user exited the omnibox.
@@ -116707,9 +117013,9 @@
 </histogram>
 
 <histogram name="Omnibox.RichEntityShown" units="count" expires_after="M84">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Records number of presented Rich Entity suggestions at the time the user
     exited the omnibox. Exiting the omnibox includes navigating (to entered text
@@ -116871,9 +117177,9 @@
 
 <histogram name="Omnibox.SuggestionUsed.AnswerInSuggest"
     enum="SuggestionAnswerOptionalType" expires_after="M83">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Counts how often omnibox suggestions are used, and in the case an Answer
     suggestion was selected - records the type of an answer.
@@ -116981,9 +117287,9 @@
 
 <histogram name="Omnibox.SuggestionUsed.RichEntity" enum="BooleanUsage"
     expires_after="M84">
-  <owner>chrome-android-omnibox-team@google.com</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
+  <owner>chrome-android-omnibox-team@google.com</owner>
   <summary>
     Whether a Rich Entity omnibox suggestion was selected when the user used the
     omnibox to go somewhere.
@@ -123518,6 +123824,7 @@
 
 <histogram name="PageLoad.PaintTiming.ForegroundToFirstContentfulPaint"
     units="ms" expires_after="2020-11-29">
+  <owner>tdresser@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
     Measures the time from a background tab being switched to the foreground to
@@ -123527,6 +123834,7 @@
 
 <histogram name="PageLoad.PaintTiming.ForegroundToFirstPaint" units="ms"
     expires_after="2020-08-14">
+  <owner>tdresser@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
     Measures the time from a background tab being switched to the foreground to
@@ -123581,6 +123889,7 @@
 
 <histogram name="PageLoad.PaintTiming.NavigationToFirstImagePaint" units="ms"
     expires_after="2020-11-29">
+  <owner>tdresser@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
     Measures the time from navigation timing's navigation start to the time the
@@ -128824,9 +129133,9 @@
 
 <histogram name="PDF.LinkHighlightOverlapsInPage" units="overlaps"
     expires_after="2020-12-01">
+  <owner>thestig@chromium.org</owner>
   <owner>ankk@microsoft.com</owner>
   <owner>mohitb@microsoft.com</owner>
-  <owner>thestig@chromium.org</owner>
   <owner>virens@microsoft.com</owner>
   <summary>
     Records the number of overlapping link and highlight annotations in a PDF
@@ -134504,8 +134813,8 @@
 
 <histogram name="PluginVm.SetupFailureReason" enum="PluginVmSetupFailureReason"
     expires_after="2020-12-31">
-  <owner>chromeos-core-services@google.com</owner>
   <owner>timloh@chromium.org</owner>
+  <owner>chromeos-core-services@google.com</owner>
   <summary>Recorded when the Plugin VM installer fails.</summary>
 </histogram>
 
@@ -138718,7 +139027,7 @@
 
 <histogram name="Printing.CUPS.PrintManagementAppEntryPoint"
     enum="PrintManagementAppEntryPoint" expires_after="2021-06-22">
-  <owner>jimmyxgong@chromium.com</owner>
+  <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
     Records the entry point of where the Print Management App was launched from
@@ -148130,8 +148439,8 @@
 
 <histogram name="SafeBrowsing.UnverifiedDownloads.Allowed"
     enum="SBClientDownloadExtensions" expires_after="M85">
-  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <owner>dtrainor@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
     File types that were allowed to be downloaded without verifying their
     content nor their source URLs with Safe Browsing.
@@ -148140,8 +148449,8 @@
 
 <histogram name="SafeBrowsing.UnverifiedDownloads.AllowedByWhitelist"
     enum="SBClientDownloadExtensions" expires_after="M85">
-  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <owner>dtrainor@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
     File types that were allowed to be downloaded without verifying their
     content nor their source URLs with Safe Browsing due to the requestor URL
@@ -148152,8 +148461,8 @@
 
 <histogram name="SafeBrowsing.UnverifiedDownloads.AllowedDueToDisabledService"
     enum="SBClientDownloadExtensions" expires_after="M85">
-  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <owner>dtrainor@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
     File types that were allowed to be downloaded without verifying their
     content nor their source URLs with Safe Browsing due to the SafeBrowsing
@@ -148174,8 +148483,8 @@
 
 <histogram name="SafeBrowsing.UnverifiedDownloads.Blocked"
     enum="SBClientDownloadExtensions" expires_after="M85">
-  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <owner>dtrainor@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
     File types that were blocked from downloaded without verifying their content
     nor their source URLs with Safe Browsing.
@@ -153541,6 +153850,7 @@
 
 <histogram name="Scheduling.Renderer.DrawIntervalWithCustomPropertyAnimations2"
     units="microseconds" expires_after="2020-10-01">
+  <owner>xidachen@chromium.org</owner>
   <owner>animations-dev@chromium.org</owner>
   <summary>
     The time delta between the draw times of back-to-back BeginImplFrames,
@@ -157099,6 +157409,7 @@
 
 <histogram name="ServiceWorker.AbortPaymentEvent.Time" units="ms"
     expires_after="M85">
+  <owner>nhiroki@chromium.org</owner>
   <owner>jinho.bang@samsung.com</owner>
   <summary>
     The time taken between dispatching an AbortPaymentEvent to a Service Worker
@@ -157316,6 +157627,7 @@
 
 <histogram name="ServiceWorker.CanMakePaymentEvent.Time" units="ms"
     expires_after="2020-04-19">
+  <owner>nhiroki@chromium.org</owner>
   <owner>jinho.bang@samsung.com</owner>
   <summary>
     The time taken between dispatching an CanMakePaymentEvent to a Service
@@ -158360,6 +158672,7 @@
 
 <histogram name="ServiceWorker.PaymentRequestEvent.Time" units="ms"
     expires_after="M81">
+  <owner>nhiroki@chromium.org</owner>
   <owner>jinho.bang@samsung.com</owner>
   <summary>
     The time taken between dispatching an PaymentRequestEvent to a Service
@@ -159471,8 +159784,8 @@
 </histogram>
 
 <histogram name="Session.TimeSpentInFocusMode" units="s" expires_after="M80">
-  <owner>chrome-desktop-ui-sea@google.com</owner>
   <owner>yiningwang@google.com</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
     Time spent in focus mode browser. This is recorded when the focus mode
     window closes. This metric is only recorded on Win/Mac/Linux/ChromeOS.
@@ -169633,6 +169946,7 @@
 
 <histogram name="Startup.BlockForCrashpadHandlerStartupTime" units="ms"
     expires_after="M85">
+  <owner>mark@chromium.org</owner>
   <owner>crashpad-dev@chromium.org</owner>
   <summary>
     The amount of time that elapsed during in
@@ -169896,6 +170210,7 @@
 
 <histogram name="Startup.BrowserWindow.FirstPaint" units="ms"
     expires_after="2021-01-10">
+  <owner>sebmarchand@chromium.org</owner>
   <owner>mblsha@yandex-team.ru</owner>
   <summary>
     Time from application start to the time the first Browser window has
@@ -169909,6 +170224,7 @@
 
 <histogram name="Startup.BrowserWindow.FirstPaint.CompositingEnded" units="ms"
     expires_after="2020-04-26">
+  <owner>sebmarchand@chromium.org</owner>
   <owner>mblsha@yandex-team.ru</owner>
   <summary>
     Time from application start to the time the GPU has finished compositing
@@ -174401,7 +174717,8 @@
   </summary>
 </histogram>
 
-<histogram name="Sync.Local.Enabled" enum="BooleanEnabled" expires_after="M86">
+<histogram name="Sync.Local.Enabled" enum="BooleanEnabled"
+    expires_after="2021-05-31">
   <owner>pastarmovj@chromium.org</owner>
   <summary>
     Tracks the number of times the local sync backend was enabled by the user.
@@ -174416,7 +174733,7 @@
   <summary>Tracks the size of the local sync backend database file.</summary>
 </histogram>
 
-<histogram name="Sync.Local.FileSizeKB" units="KB" expires_after="M86">
+<histogram name="Sync.Local.FileSizeKB" units="KB" expires_after="2021-05-31">
   <owner>pastarmovj@chromium.org</owner>
   <summary>
     Tracks the size of the local sync backend database file. Recorded every time
@@ -174425,7 +174742,7 @@
 </histogram>
 
 <histogram name="Sync.Local.RequestTypeOnError" enum="SyncRequestType"
-    expires_after="M86">
+    expires_after="2021-05-31">
   <owner>pastarmovj@chromium.org</owner>
   <summary>
     Tracks the types of requests that caused errors inside of the local server.
@@ -174433,7 +174750,7 @@
 </histogram>
 
 <histogram name="Sync.Local.RoamingProfileUnavailable" enum="BooleanError"
-    expires_after="M86">
+    expires_after="2021-05-31">
   <owner>pastarmovj@chromium.org</owner>
   <summary>
     Tracks the number of times the Roaming profile cannot be retrieved.
@@ -176847,6 +177164,7 @@
 
 <histogram name="Tab.RendererCrashStatus" enum="TabRendererCrashStatus"
     expires_after="M85">
+  <owner>tedchoc@chromium.org</owner>
   <owner>clank-team@google.com</owner>
   <summary>
     [Android] The status of a tab and an application when a renderer crashes.
@@ -177177,6 +177495,7 @@
 
 <histogram name="Tab.TotalTabCount.BeforeLeavingApp" units="tabs"
     expires_after="M85">
+  <owner>tedchoc@chromium.org</owner>
   <owner>clank-team@google.com</owner>
   <summary>
     [Android] The total count of tabs which were kept while Chrome process is in
@@ -179171,6 +179490,58 @@
   </details>
 </histogram>
 
+<histogram name="Tabs.TabSearch.WebUI.InitialTabsRenderTime" units="ms"
+    expires_after="M90">
+  <owner>tluk@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>
+    Records the time taken to load the Tab Search WebUI and render (at least)
+    the initial list of tabs. This is roughly equivalent to 'time to first
+    meaningful paint' for the Tab Search UI.
+  </summary>
+</histogram>
+
+<histogram name="Tabs.TabSearch.WebUI.LoadCompletedTime" units="ms"
+    expires_after="M90">
+  <owner>tluk@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>
+    The amount of time between the render frame host StartProvisionalLoad event
+    and the render frame DocumentOnLoadCompleted event for the Tab Search WebUI
+    page.
+  </summary>
+</histogram>
+
+<histogram name="Tabs.TabSearch.WebUI.LoadDocumentTime" units="ms"
+    expires_after="M90">
+  <owner>tluk@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>
+    The amount of time between the render frame host StartProvisionalLoad and
+    DidFinishDocumentLoad events for the Tab Search WebUI page.
+  </summary>
+</histogram>
+
+<histogram name="Tabs.TabSearch.WindowDisplayedDuration" units="seconds"
+    expires_after="M90">
+  <owner>tluk@chromium.org</owner>
+  <owner>robliao@chromium.org</owner>
+  <summary>
+    Tab Search is a feature that allows users to better search their browsers
+    for their desired tabs. It can be opened and closed. This records the amount
+    of time between when a Tab Search bubble is opened and when it is closed.
+
+    The Tab Search UI is a bubble anchored to an element within a browser window
+    and is closed if the user switches to a tab, presses the escape key or
+    performs an action to return focus to the hosting window. The Tab Search UI
+    bubble will also close if the hosting browser window is closed or crashes.
+
+    Users may leave the bubble open for long periods of time without directly
+    interacting with the UI which could result in a long tail of displayed
+    durations.
+  </summary>
+</histogram>
+
 <histogram name="Tabs.TabsStatsDailyEventInterval"
     enum="DailyEventIntervalType" expires_after="M77">
   <owner>sebmarchand@chromium.org</owner>
@@ -180944,6 +181315,7 @@
 
 <histogram name="TouchScreen.MissedTOUCHEVENTF_UP" enum="BooleanHit"
     expires_after="M77">
+  <owner>nzolghadr@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
     The touch device driver failed to send a TOUCHEVENTF_UP, and chromium
@@ -181132,8 +181504,8 @@
 
 <histogram name="Translate.AcceptLanguages.CanBeAcceptDuration" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>googleo@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the TranslateAcceptLanguages to decide if a given language is
     available as Accept-Languages.
@@ -181142,8 +181514,8 @@
 
 <histogram name="Translate.AlwaysTranslateLang" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the always translate option was selected in the
     translate infobar.
@@ -181152,8 +181524,8 @@
 
 <histogram name="Translate.BubbleUiEvent" enum="TranslateBubbleUiEvent"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>groby@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>Tracks UI events related to the translate bubble.</summary>
 </histogram>
 
@@ -181192,8 +181564,8 @@
 
 <histogram name="Translate.CLD3.LanguageDetected" enum="CLD3LanguageCode"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Language of the input page detected by CLD3. This information is logged on
     every page load.
@@ -181202,8 +181574,8 @@
 
 <histogram name="Translate.CLD3.LanguagePercentage" units="%"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Percentage of the bytes that are associated with the most popular language
     on the input page. Only recorded if the detection returned a
@@ -181213,15 +181585,15 @@
 
 <histogram name="Translate.CompactInfobar.Event" enum="TranslateCompactUIEvent"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>Various user actions performed in the translate infobar.</summary>
 </histogram>
 
 <histogram name="Translate.CompactInfobar.Language.AlwaysTranslate"
     enum="CLD3LanguageCode" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the hashcode of the source language when always translate this
     language option is clicked in the menu.
@@ -181230,8 +181602,8 @@
 
 <histogram name="Translate.CompactInfobar.Language.MoreLanguages"
     enum="CLD3LanguageCode" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the hashcode of the language clicked on the more languages menu.
   </summary>
@@ -181239,8 +181611,8 @@
 
 <histogram name="Translate.CompactInfobar.Language.NeverTranslate"
     enum="CLD3LanguageCode" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the hashcode of the source language when never translate this
     language option is clicked in the menu.
@@ -181249,8 +181621,8 @@
 
 <histogram name="Translate.CompactInfobar.Language.PageNotIn"
     enum="CLD3LanguageCode" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the hashcode of the language clicked on the menu to indicate the
     page is not in the selected language.
@@ -181259,8 +181631,8 @@
 
 <histogram name="Translate.CompactInfobar.Language.Translate"
     enum="CLD3LanguageCode" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the hashcode of the language clicked on the infobar.
   </summary>
@@ -181268,8 +181640,8 @@
 
 <histogram name="Translate.CompactInfobar.TranslationsPerPage"
     units="translations" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Records the number of times a page is translated, every time the page is
     translated. For instance on a page a) translation from A to B, we record
@@ -181289,8 +181661,8 @@
 
 <histogram name="Translate.ContentLanguage" enum="TranslateLanguage"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     A page may provide a Content-Language HTTP header or a META tag. For each
     page load, measures whether the Content-Language header exists and is valid.
@@ -181299,8 +181671,8 @@
 
 <histogram name="Translate.DeclineTranslate" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the &quot;Nope&quot; (don't translate) or the infobar's
     X button was clicked in the translate infobar.
@@ -181309,8 +181681,8 @@
 
 <histogram name="Translate.DeclineTranslateCloseInfobar" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the translate infobar was closed by clicking the X
     button without the user translating the page.
@@ -181319,8 +181691,8 @@
 
 <histogram name="Translate.DeclineTranslateDismissUI" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the translate UI was closed without translating in the
     way that the user doesn't deny translating explicityly, like pressing 'Nope'
@@ -181333,9 +181705,9 @@
 
 <histogram name="Translate.ExplicitLanguageAsk.Event"
     enum="TranslateExplicitAskPromptEventType" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
   <owner>anthonyvd@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The events (shown, saved, cancelled) happening in the Explicit Language Ask
     prompt.
@@ -181344,9 +181716,9 @@
 
 <histogram name="Translate.ExplicitLanguageAsk.LanguageAdded"
     enum="CLD3LanguageCode" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
   <owner>anthonyvd@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The languages that were added to the Accept Languages list from the Explicit
     Language Ask prompt.
@@ -181355,9 +181727,9 @@
 
 <histogram name="Translate.ExplicitLanguageAsk.LanguageRemoved"
     enum="CLD3LanguageCode" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
   <owner>anthonyvd@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The languages that were removed from the Accept Languages list from the
     Explicit Language Ask prompt.
@@ -181369,9 +181741,9 @@
   <obsolete>
     Removed as of 04/2020. No longer used for analysis.
   </obsolete>
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
   <owner>yyushkina@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Whether or not the backoff threshold for triggering Translate on UI-language
     content is reached when the translation process is initiated.
@@ -181380,8 +181752,8 @@
 
 <histogram name="Translate.HrefHint.Status" enum="HrefTranslateStatus"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>megjablon@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     For Google navigations, the hrefTranslate hint may trigger a translation
     automatically. If the hint is present on a Google navigation, record whether
@@ -181394,8 +181766,8 @@
 
 <histogram name="Translate.HtmlLang" enum="TranslateLanguage"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     A page may provide a lang attribute in html tag. For each page load,
     measures whether the lang attribute exists and is valid.
@@ -181403,8 +181775,8 @@
 </histogram>
 
 <histogram name="Translate.InfobarShown" enum="BooleanHit" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>anthonyvd@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the translate infobar was shown in the old translate UI
     on Android. Only true is recorded.
@@ -181427,8 +181799,8 @@
 
 <histogram name="Translate.InitiationStatus.v2"
     enum="TranslateInitiationStatus" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The reason why Chrome decided to perform the next action (e.g., to show
     infobar, to translate a page without any prompting, and so on) when Chrome
@@ -181469,8 +181841,8 @@
 
 <histogram name="Translate.LanguageDetectionTiming"
     enum="TranslateLanguageDetectionTiming" expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>andrewhayden@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     For each page load, records whether language detection occurs on time or
     gets deferred. If deferred language detection later completes, this is also
@@ -181494,8 +181866,8 @@
 
 <histogram name="Translate.LanguageSettingsIsShown" enum="BooleanShown"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Log everytime the language settings page is shown. This can be either user
     visits chrome://settings/languages or user visits the advanced languages
@@ -181508,8 +181880,8 @@
 
 <histogram name="Translate.LanguageVerification"
     enum="TranslateLanguageVerification" expires_after="M78">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     For each page load, measures whether the provided HTML language (i.e. the
     page lang attribute if it exists, otherwise the header Content-Language
@@ -181525,8 +181897,8 @@
 
 <histogram name="Translate.LocalesOnDisabledByPrefs" enum="LanguageCode"
     expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Logs the user locale when the Translate feature is disabled by the user.
     This is recorded each time a webpage is loaded and prefs for translation is
@@ -181537,9 +181909,9 @@
 
 <histogram name="Translate.MobileMenuTranslate.Shown" enum="Boolean"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
   <owner>frechette@chromium.org</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Whether the 'Translate' app menu entry is shown to the user. Emitted when
     the app menu (three dots) is shown and a translation could be performed.
@@ -181548,8 +181920,8 @@
 
 <histogram name="Translate.ModifyOriginalLang" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the original language in the translate infobar has been
     changed.
@@ -181558,8 +181930,8 @@
 
 <histogram name="Translate.ModifyTargetLang" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the target language in the translate infobar has been
     changed.
@@ -181568,8 +181940,8 @@
 
 <histogram name="Translate.NeverTranslateLang" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the never translate option was selected in the translate
     infobar.
@@ -181578,8 +181950,8 @@
 
 <histogram name="Translate.NeverTranslateSite" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the never translate site was selected in the translate
     infobar.
@@ -181600,15 +181972,15 @@
 
 <histogram name="Translate.PageScheme" enum="TranslateScheme"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>Counts translation target page schemes.</summary>
 </histogram>
 
 <histogram name="Translate.Ranker.Model.Status" enum="RankerModelStatus"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Tracks the outcome of attempts to download a Translate Ranker Model.
   </summary>
@@ -181616,8 +181988,8 @@
 
 <histogram name="Translate.Ranker.Model.Version" units="date stamp"
     expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The date tamp (e.g., 20160916 -&gt; 15 Sept 2016) which denotes the
     TranslateRankerModel's version.
@@ -181626,8 +181998,8 @@
 
 <histogram name="Translate.Ranker.QueryResult" enum="BooleanAccepted"
     expires_after="M85">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Whether the TranslateRanker accepts or denies to show the translation
     prompt.
@@ -181636,8 +182008,8 @@
 
 <histogram name="Translate.Ranker.Timer.CalculateScore" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the TranslateRanker to use the translate ranker model to
     calculate a score for the translation, in ms.
@@ -181646,8 +182018,8 @@
 
 <histogram name="Translate.Ranker.Timer.DownloadModel" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the Translate Ranker Model Loader to download its model from
     the configured URL, in ms.
@@ -181656,8 +182028,8 @@
 
 <histogram name="Translate.Ranker.Timer.ParseModel" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the Translate Ranker Model Loader to parse its model, in ms.
   </summary>
@@ -181665,8 +182037,8 @@
 
 <histogram name="Translate.Ranker.Timer.ReadModel" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the Translate Ranker Model Loader to read its model from
     local storage (cache), in ms.
@@ -181675,8 +182047,8 @@
 
 <histogram name="Translate.Ranker.Timer.ShouldOfferTranslation" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the TranslateRanker to decide if a given translation should
     be offered or not, in ms. This includes the time taken to extract the
@@ -181687,8 +182059,8 @@
 
 <histogram name="Translate.Ranker.Timer.WriteModel" units="ms"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>rogerm@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Time taken for the Translate Ranker Model Loader to write its model to local
     storage, in ms.
@@ -181697,8 +182069,8 @@
 
 <histogram name="Translate.ReportLanguageDetectionError" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the &quot;report this error&quot; of options menu is
     selected in the translate infobar.
@@ -181707,8 +182079,8 @@
 
 <histogram name="Translate.RevertTranslation" units="units"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the show original button was clicked in the translate
     infobar.
@@ -181720,8 +182092,8 @@
   <obsolete>
     Removed 5/2013 by Translate.UndisplayableLanguage
   </obsolete>
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the detected language is not supported by Translate
     Element.
@@ -181756,8 +182128,8 @@
 
 <histogram name="Translate.ShowErrorUI" enum="TranslateError"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Chrome Translate shows an error UI (infobar or bubble) when an error happens
     on translation and the UI message depends on what kind of error happens.
@@ -181767,8 +182139,8 @@
 
 <histogram name="Translate.SimilarLanguageMatch" enum="BooleanMatched"
     expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     This metrics is logged whenever a page is loaded. The logged value is
     &quot;Mathced&quot; when the CLD-detected language differs from the page
@@ -181781,8 +182153,8 @@
 
 <histogram name="Translate.SourceLanguage" enum="CLD3LanguageCode"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of requests sent to the Translate server, grouped by source
     language.
@@ -181791,8 +182163,8 @@
 
 <histogram name="Translate.TargetLanguage" enum="CLD3LanguageCode"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>yyushkina@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of requests sent to the Translate server, grouped by target
     language.
@@ -181801,8 +182173,8 @@
 
 <histogram name="Translate.TargetLanguage.Origin"
     enum="TranslateTargetLanguageOrigin" expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>megjablon@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Where the target language was determined from. Can be the most recent target
     language, from the language model, the UI language, the user's accept
@@ -181811,8 +182183,8 @@
 </histogram>
 
 <histogram name="Translate.TimeToBeReady" units="ms" expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The time from injecting scripts for Chrome Translate to being ready to
     perform translation.
@@ -181820,8 +182192,8 @@
 </histogram>
 
 <histogram name="Translate.TimeToLoad" units="ms" expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The time from injecting scripts for Chrome Translate to the finishing loads
     of all depending libraries.
@@ -181829,15 +182201,15 @@
 </histogram>
 
 <histogram name="Translate.TimeToTranslate" units="ms" expires_after="M77">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>The time from starting translation to the completion.</summary>
 </histogram>
 
 <histogram name="Translate.Translate" enum="BooleanTranslate"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The number of times the translate button was clicked in the translate
     infobar.
@@ -181892,8 +182264,8 @@
 
 <histogram name="Translate.UndisplayableLanguage" enum="LanguageCode"
     expires_after="M81">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Logs an undisplayable language included in the language list sent by the
     Translate server. The Translate server sends the list each time the user
@@ -181904,8 +182276,8 @@
 
 <histogram name="Translate.UnsupportedLanguageAtInitiation" enum="LanguageCode"
     expires_after="M81">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     Logs an unsupported source language detected during initiation of the
     Translate feature. This is reported when the language detector successfully
@@ -181917,8 +182289,8 @@
 
 <histogram name="Translate.UserActionDuration" units="ms"
     expires_after="2020-12-01">
-  <owner>chrome-language@google.com</owner>
   <owner>kenjibaheux@google.com</owner>
+  <owner>chrome-language@google.com</owner>
   <summary>
     The time from a page content language being determined to user requesting
     Chrome Translate.
@@ -194272,7 +194644,7 @@
 <histogram name="WebRTC.PeerConnection.ThermalState" enum="ThermalState"
     expires_after="2021-01-17">
   <owner>eshr@google.com</owner>
-  <owner>hbos@chromium.com</owner>
+  <owner>hbos@chromium.org</owner>
   <summary>
     Measures computer thermal state, sampled every 60s when a PeerConnection is
     open with a video sender. Most quick toggles between thermal states are thus
@@ -196479,7 +196851,7 @@
 <histogram name="Welcome.SignInPromptResult" enum="WelcomeSignInPromptOutcome"
     expires_after="2021-06-30">
   <owner>tmartino@chromium.org</owner>
-  <owner>msarda@chromium.com</owner>
+  <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -196762,8 +197134,8 @@
 
 <histogram name="Windows.IsPinnedToTaskbar2" enum="BooleanError"
     expires_after="M87">
-  <owner>chrdavis@microsoft.com</owner>
   <owner>pmonette@chromium.org</owner>
+  <owner>chrdavis@microsoft.com</owner>
   <summary>
     Indicates whether Chrome is pinned to the Windows taskbar for the current
     user. Recorded shortly after startup. This is different from
@@ -199489,7 +199861,9 @@
   <suffix name="LessThan1ms" label="Ratio when main frame shorter than 1ms."/>
   <suffix name="MoreThan5ms" label="Ratio when main frame longer than 5ms."/>
   <affected-histogram name="Blink.MainFrame.AnimateRatio"/>
+  <affected-histogram name="Blink.MainFrame.CompositingAssignmentsRatio"/>
   <affected-histogram name="Blink.MainFrame.CompositingCommitRatio"/>
+  <affected-histogram name="Blink.MainFrame.CompositingInputsRatio"/>
   <affected-histogram name="Blink.MainFrame.CompositingRatio"/>
   <affected-histogram name="Blink.MainFrame.ForcedStyleAndLayoutRatio"/>
   <affected-histogram name="Blink.MainFrame.HandleInputEventsRatio"/>
@@ -199512,7 +199886,9 @@
       label="All the time spent Pre First Contentful Paint in this component"/>
   <affected-histogram name="Blink.Animate.UpdateTime"/>
   <affected-histogram name="Blink.Compositing.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingAssignments.UpdateTime"/>
   <affected-histogram name="Blink.CompositingCommit.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingInputs.UpdateTime"/>
   <affected-histogram name="Blink.ForcedStyleAndLayout.UpdateTime"/>
   <affected-histogram name="Blink.HandleInputEvents.UpdateTime"/>
   <affected-histogram name="Blink.HitTestDocumentUpdate.UpdateTime"/>
@@ -199533,7 +199909,9 @@
   <suffix name="PostFCP" label="Update occurred after First Contentful Paint."/>
   <affected-histogram name="Blink.Animate.UpdateTime"/>
   <affected-histogram name="Blink.Compositing.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingAssignments.UpdateTime"/>
   <affected-histogram name="Blink.CompositingCommit.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingInputs.UpdateTime"/>
   <affected-histogram name="Blink.ForcedStyleAndLayout.UpdateTime"/>
   <affected-histogram name="Blink.HandleInputEvents.UpdateTime"/>
   <affected-histogram name="Blink.HitTestDocumentUpdate.UpdateTime"/>
@@ -199554,7 +199932,9 @@
   <suffix name="PreFCP" label="Update occurred before First Contentful Paint."/>
   <affected-histogram name="Blink.Animate.UpdateTime"/>
   <affected-histogram name="Blink.Compositing.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingAssignments.UpdateTime"/>
   <affected-histogram name="Blink.CompositingCommit.UpdateTime"/>
+  <affected-histogram name="Blink.CompositingInputs.UpdateTime"/>
   <affected-histogram name="Blink.ForcedStyleAndLayout.UpdateTime"/>
   <affected-histogram name="Blink.HandleInputEvents.UpdateTime"/>
   <affected-histogram name="Blink.HitTestDocumentUpdate.UpdateTime"/>
@@ -206861,7 +207241,11 @@
              history."/>
   <suffix name="SerializedPostDataSize"
       label="Estimated size of PostData in serialized session item used to
-             persist single NavigationItem PostData in session history."/>
+             persist single NavigationItem PostData in session history.">
+    <obsolete>
+      Removed as of July 2020.
+    </obsolete>
+  </suffix>
   <suffix name="SerializedReferrerURLSize"
       label="Estimated size of referrer's URL in serialized session item used
              to persist single NavigationItem referrer's URL in session
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index f476b24..4d550faf 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -292,7 +292,7 @@
   <owner>johnidel@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
-    Recorded when a page has loadded non-zero ad bytes, and the page is being
+    Recorded when a page has loaded non-zero ad bytes, and the page is being
     destroyed/navigated.
   </summary>
   <metric name="AdBytes">
@@ -1798,6 +1798,15 @@
     <summary>
       The time spent in main thread compositing, between navigation and First
       Contentful Paint, in microseconds.
+
+      TODO(crbug.com/1100711): This is being replaced soon by CompositingInputs
+      + CompositingAssignments (== Compositing).
+    </summary>
+  </metric>
+  <metric name="CompositingAssignments">
+    <summary>
+      The time spent in main thread compositing assignments, between navigation
+      and First Contentful Paint, in microseconds.
     </summary>
   </metric>
   <metric name="CompositingCommit">
@@ -1806,6 +1815,12 @@
       navigation and First Contentful Paint, in microseconds.
     </summary>
   </metric>
+  <metric name="CompositingInputs">
+    <summary>
+      The time spent in main thread compositing inputs, between navigation and
+      First Contentful Paint, in microseconds.
+    </summary>
+  </metric>
   <metric name="ForcedStyleAndLayout">
     <summary>
       The time spent in forced style recalc and layouts, between navigation and
@@ -2001,6 +2016,9 @@
     <summary>
       The time taken by the compositing phase in microseconds during the sampled
       frame.
+
+      TODO(crbug.com/1100711): This is being replaced soon by CompositingInputs
+      + CompositingAssignments (== Compositing).
     </summary>
     <aggregation>
       <history>
@@ -2056,6 +2074,26 @@
       within the sample window. An int in the range [0,100].
     </summary>
   </metric>
+  <metric name="CompositingAssignments">
+    <summary>
+      The time taken by compositing assignments in microseconds during the
+      sampled frame.
+    </summary>
+    <aggregation>
+      <history>
+        <index fields="profile.country"/>
+        <statistics>
+          <quantiles type="std-percentiles"/>
+        </statistics>
+      </history>
+    </aggregation>
+  </metric>
+  <metric name="CompositingAssignmentsPercentage">
+    <summary>
+      The percentage of the main frame time used by the compositing assignments
+      phase. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="CompositingCommit">
     <summary>
       The time taken by the compositing commit in microseconds during the
@@ -2122,10 +2160,31 @@
       int in the range [0,100].
     </summary>
   </metric>
+  <metric name="CompositingInputs">
+    <summary>
+      The time taken by the compositing inputs phase in microseconds during the
+      sampled frame.
+    </summary>
+    <aggregation>
+      <history>
+        <index fields="profile.country"/>
+        <statistics>
+          <quantiles type="std-percentiles"/>
+        </statistics>
+      </history>
+    </aggregation>
+  </metric>
+  <metric name="CompositingInputsPercentage">
+    <summary>
+      The percentage of the main frame time used by the compositing inputs
+      phase. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="CompositingPercentage">
     <summary>
       The percentage of the main frame time used by the compositing phase. An
-      int in the range [0,100].
+      int in the range [0,100]. This is being replaced soon by
+      CompositingInputsPercentage and CompositingAssignmentsPercentage.
     </summary>
   </metric>
   <metric name="ForcedStyleAndLayout">
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 0ae6f1f0..7ff4a15 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@
 {
     "trace_processor_shell": {
         "win": {
-            "hash": "73de07d86d401cf82e084397d9b1c88058d99d9b",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/f6c424bb59238a75fbb10d4d802b5ad31107a3a3/trace_processor_shell.exe"
+            "hash": "f82ee5e9f8355d966f34ad17b4ae6f370a5646ed",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/22b8657a5558de83e88093a85d302f0d0773bb9f/trace_processor_shell.exe"
         },
         "mac": {
-            "hash": "9408763913634009e6d7abe323ff5203841ce93b",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/f6c424bb59238a75fbb10d4d802b5ad31107a3a3/trace_processor_shell"
+            "hash": "7feaca03c2586bab7ffd8274ed4d091fcf5c3ea8",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/39c302bccf3a67b44045c5d99badfd0fdea5a432/trace_processor_shell"
         },
         "linux": {
-            "hash": "6272ed239cb17d8d5de1880b69d56c41e9d57f09",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/4766bd88cf78535fd52edab11fa99374581b2bee/trace_processor_shell"
+            "hash": "00fbbdcb3e995dcb25cfb070731624c0ca02a18f",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/39c302bccf3a67b44045c5d99badfd0fdea5a432/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index 16855b7d..7ad126c 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -165,13 +165,14 @@
     "java/res/drawable-xxxhdpi/ic_expand_more_black_24dp.png",
     "java/res/drawable-xxxhdpi/popup_bg.9.png",
     "java/res/drawable/drag_handlebar.xml",
-    "java/res/drawable/ic_expand_more_right_black_24dp.xml",
+    "java/res/drawable/ic_expand_more_horizontal_black_24dp.xml",
     "java/res/drawable/popup_bg_tinted.xml",
     "java/res/font/accent_font.xml",
     "java/res/layout/dropdown_footer_wrapper_jellybean.xml",
     "java/res/layout/dropdown_item.xml",
     "java/res/layout/dropdown_window.xml",
     "java/res/values-ldrtl/dimens.xml",
+    "java/res/values-ldrtl/values.xml",
     "java/res/values-night/colors.xml",
     "java/res/values-night/dimens.xml",
     "java/res/values-sw600dp/values.xml",
diff --git a/ui/android/java/res/drawable/ic_expand_more_right_black_24dp.xml b/ui/android/java/res/drawable/ic_expand_more_horizontal_black_24dp.xml
similarity index 70%
rename from ui/android/java/res/drawable/ic_expand_more_right_black_24dp.xml
rename to ui/android/java/res/drawable/ic_expand_more_horizontal_black_24dp.xml
index c5a7dc2..cc7a74c 100644
--- a/ui/android/java/res/drawable/ic_expand_more_right_black_24dp.xml
+++ b/ui/android/java/res/drawable/ic_expand_more_horizontal_black_24dp.xml
@@ -4,7 +4,7 @@
      found in the LICENSE file. -->
 
 <rotate xmlns:android="http://schemas.android.com/apk/res/android"
-    android:fromDegrees="270"
-    android:toDegrees="270"
+    android:fromDegrees="@integer/expand_more_horizontal_rotation_degree"
+    android:toDegrees="@integer/expand_more_horizontal_rotation_degree"
     android:drawable="@drawable/ic_expand_more_black_24dp">
 </rotate>
\ No newline at end of file
diff --git a/ui/android/java/res/values-ldrtl/values.xml b/ui/android/java/res/values-ldrtl/values.xml
new file mode 100644
index 0000000..4fc8143
--- /dev/null
+++ b/ui/android/java/res/values-ldrtl/values.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 The Chromium Authors. All rights reserved.
+
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!--  Expand more  -->
+    <integer name="expand_more_horizontal_rotation_degree"
+        tools:ignore="UnusedResources">90</integer>
+</resources>
diff --git a/ui/android/java/res/values/values.xml b/ui/android/java/res/values/values.xml
index da39978..f82320b4 100644
--- a/ui/android/java/res/values/values.xml
+++ b/ui/android/java/res/values/values.xml
@@ -9,4 +9,7 @@
     <!-- Whether the device is a phone, tablet or large tablet. Used to determine which resources
          the OS loaded. -->
     <integer name="min_screen_width_bucket">1</integer>
+
+    <!--  Expand more  -->
+    <integer name="expand_more_horizontal_rotation_degree">270</integer>
 </resources>
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
index b1f4aa02..4b39abb9 100644
--- a/ui/gfx/render_text.h
+++ b/ui/gfx/render_text.h
@@ -564,11 +564,13 @@
   const ShadowValues& shadows() const { return shadows_; }
 
   // Get the visual bounds containing the logical substring within the |range|.
-  // If |range| is empty, the result is empty. These bounds could be visually
-  // discontinuous if the substring is split by a LTR/RTL level change.
-  // These bounds are in local coordinates, but may be outside the visible
-  // region if the text is longer than the textfield. Subsequent text, cursor,
-  // or bounds changes may invalidate returned values.
+  // If |range| is empty, the result is empty. This method rounds internally so
+  // the returned bounds may be slightly larger than the |range|, but are
+  // guaranteed not to be smaller. These bounds could be visually discontinuous
+  // if the substring is split by a LTR/RTL level change. These bounds are in
+  // local coordinates, but may be outside the visible region if the text is
+  // longer than the textfield. Subsequent text, cursor, or bounds changes may
+  // invalidate returned values.
   virtual std::vector<Rect> GetSubstringBounds(const Range& range) = 0;
 
   // Gets the horizontal span (relative to the left of the text, not the view)
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index ba488c30..5cad380 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1454,7 +1454,8 @@
         const internal::TextRunHarfBuzz& run = *run_list->runs()[segment.run];
         RangeF selected_span =
             run.GetGraphemeSpanForCharRange(this, intersection);
-        int start_x = base::ClampCeil(selected_span.start() - line_start_x);
+        DCHECK(!selected_span.is_reversed());
+        int start_x = base::ClampFloor(selected_span.start() - line_start_x);
         int end_x = base::ClampCeil(selected_span.end() - line_start_x);
         Rect rect(start_x, 0, end_x - start_x,
                   base::ClampCeil(line.size.height()));
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index ce563541..0ff5f56 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -7016,6 +7016,12 @@
 // Verify GetWordLookupDataAtPoint returns the correct baseline point and
 // decorated word for an LTR string.
 TEST_F(RenderTextTest, GetWordLookupDataAtPoint_LTR) {
+  // Set an integer glyph width; GetCursorBounds() and
+  // GetWordLookupDataAtPoint() use different rounding internally.
+  //
+  // TODO(crbug.com/1111044): this shouldn't be necessary once RenderText keeps
+  // float precision through GetCursorBounds().
+  SetGlyphWidth(5);
   const base::string16 ltr = ASCIIToUTF16("  ab  c ");
   const int kWordOneStartIndex = 2;
   const int kWordTwoStartIndex = 6;
@@ -7095,6 +7101,12 @@
 // Verify GetWordLookupDataAtPoint returns the correct baseline point and
 // decorated word for an RTL string.
 TEST_F(RenderTextTest, GetWordLookupDataAtPoint_RTL) {
+  // Set an integer glyph width; GetCursorBounds() and
+  // GetWordLookupDataAtPoint() use different rounding internally.
+  //
+  // TODO(crbug.com/1111044): this shouldn't be necessary once RenderText keeps
+  // float precision through GetCursorBounds().
+  SetGlyphWidth(5);
   const base::string16 rtl = UTF8ToUTF16(" \u0634\u0632  \u0634");
   const int kWordOneStartIndex = 1;
   const int kWordTwoStartIndex = 5;
@@ -7401,6 +7413,33 @@
   }
 }
 
+// Tests that GetSubstringBounds rounds outward when glyphs have floating-point
+// widths.
+TEST_F(RenderTextTest, GetSubstringBoundsFloatingPoint) {
+  const float kGlyphWidth = 5.8;
+  SetGlyphWidth(kGlyphWidth);
+  RenderText* render_text = GetRenderText();
+  render_text->SetDisplayRect(Rect(200, 1000));
+  render_text->SetText(UTF8ToUTF16("abcdef"));
+  gfx::Rect bounds = GetSubstringBoundsUnion(Range(1, 2));
+  // The bounds should be rounded outwards so that the full substring is always
+  // contained in them.
+  EXPECT_EQ(base::ClampFloor(kGlyphWidth), bounds.x());
+  EXPECT_EQ(base::ClampCeil(2 * kGlyphWidth), bounds.right());
+}
+
+// Tests that GetSubstringBounds handles integer glypth widths correctly.
+TEST_F(RenderTextTest, GetSubstringBoundsInt) {
+  const float kGlyphWidth = 5;
+  SetGlyphWidth(kGlyphWidth);
+  RenderText* render_text = GetRenderText();
+  render_text->SetDisplayRect(Rect(200, 1000));
+  render_text->SetText(UTF8ToUTF16("abcdef"));
+  gfx::Rect bounds = GetSubstringBoundsUnion(Range(1, 2));
+  EXPECT_EQ(kGlyphWidth, bounds.x());
+  EXPECT_EQ(2 * kGlyphWidth, bounds.right());
+}
+
 // Tests that GetSubstringBounds returns the correct bounds for multiline text.
 TEST_F(RenderTextTest, GetSubstringBoundsMultiline) {
   RenderText* render_text = GetRenderText();
diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc
index e9ffc3cb..2a1de563 100644
--- a/ui/views/widget/widget_interactive_uitest.cc
+++ b/ui/views/widget/widget_interactive_uitest.cc
@@ -1718,14 +1718,15 @@
 // Regression test for http://crbug.com/382421 (Linux-Aura issue).
 // TODO(pkotwicz): Make test pass on CrOS and Windows.
 // TODO(tapted): Investigate for toolkit-views on Mac http;//crbug.com/441064.
-#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_APPLE)
+#if defined(OS_CHROMEOS) || defined(OS_APPLE)
 #define MAYBE_MouseExitOnCaptureGrab DISABLED_MouseExitOnCaptureGrab
 #else
 #define MAYBE_MouseExitOnCaptureGrab MouseExitOnCaptureGrab
 #endif
 
 // Test that a synthetic mouse exit is sent to the widget which was handling
-// mouse events when a different widget grabs capture.
+// mouse events when a different widget grabs capture. Except for Windows,
+// which does not send a synthetic mouse exit.
 TEST_F(WidgetCaptureTest, MAYBE_MouseExitOnCaptureGrab) {
   Widget widget1;
   Widget::InitParams params1 =
@@ -1754,9 +1755,15 @@
 
   widget2.SetCapture(nullptr);
   EXPECT_EQ(0, mouse_view1->EnteredCalls());
-  // Grabbing native capture on Windows generates a ui::ET_MOUSE_EXITED event
-  // in addition to the one generated by Chrome.
-  EXPECT_LT(0, mouse_view1->ExitedCalls());
+  // On Windows, Chrome doesn't synthesize a separate mouse exited event.
+  // Instead, it uses ::TrackMouseEvent to get notified of the mouse leaving.
+  // Calling SetCapture does not cause Windows to generate a WM_MOUSELEAVE
+  // event. See WindowEventDispatcher::OnOtherRootGotCapture() for more info.
+#if defined(OS_WIN)
+  EXPECT_EQ(0, mouse_view1->ExitedCalls());
+#else
+  EXPECT_EQ(1, mouse_view1->ExitedCalls());
+#endif  // OS_WIN
 }
 
 namespace {
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
index d075a8d1..fc1fdfa 100644
--- a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
@@ -14,6 +14,7 @@
     ":final_page",
     ":mojo_interface_provider",
     ":provisioning_page",
+    ":psim_flow_ui",
     ":sim_detect_page",
     ":webview_post_util",
   ]
@@ -53,9 +54,8 @@
   deps = [ ":base_page" ]
 }
 
-js_library("cellular_setup") {
+js_library("psim_flow_ui") {
   deps = [
-    ":button_bar",
     ":final_page",
     ":mojo_interface_provider",
     ":provisioning_page",
@@ -65,6 +65,13 @@
   ]
 }
 
+js_library("cellular_setup") {
+  deps = [
+    ":button_bar",
+    ":psim_flow_ui",
+  ]
+}
+
 js_library("mojo_interface_provider") {
   deps = [
     "//chromeos/services/cellular_setup/public/mojom:mojom_js_library_for_compile",
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
index 31727da..d20e457 100644
--- a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.html
@@ -1,39 +1,32 @@
 <link rel="import" href="../../../html/polymer.html">
 
-<link rel="import" href="../../../html/i18n_behavior.html">
-<link rel="import" href="mojo_interface_provider.html">
 <link rel="import" href="button_bar.html">
-<link rel="import" href="sim_detect_page.html">
-<link rel="import" href="provisioning_page.html">
-<link rel="import" href="final_page.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
+<link rel="import" href="psim_flow_ui.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
 
 <dom-module id="cellular-setup">
   <template>
-    <style include="iron-flex">
+    <style>
       :host {
+        flex: 1 1 auto;
+        padding: 10px;
+      }
+
+      iron-pages {
         display: flex;
         flex: 1 1 auto;
-        flex-direction: column;
-        padding: 10px;
       }
     </style>
     <iron-pages attr-for-selected="is"
-        selected="[[selectedPageName_]]"
-        selected-item="{{selectedPage_}}">
-      <sim-detect-page show-error="[[showError_]]"></sim-detect-page>
-      <provisioning-page show-error="{{showError_}}"
-          cellular-metadata="[[cellularMetadata_]]"
-          on-carrier-portal-loaded="onCarrierPortalLoaded_"
-          on-carrier-portal-result="onCarrierPortalResult_">
-      </provisioning-page>
-      <final-page show-error="[[showError_]]"></final-page>
+        selected="[[selectedPageName_]]">
+      <!-- TODO(hsuregan): Implement <setup-flow-selection>. -->
+      <psim-flow-ui></psim-flow-ui>
+      <!-- TODO(hsuregan): Implement <esim-flow>. -->
     </iron-pages>
     <button-bar show-try-again-button="[[showTryAgainButton_]]"
         show-finish-button="[[showFinishButton_]]"
-        show-cancel-button="[[showCancelButton_]]"></button-bar>
+        show-cancel-button="[[showCancelButton_]]">
+    </button-bar>
   </template>
   <script src="cellular_setup.js">
   </script>
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
index e1c8462..e885a7f 100644
--- a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_setup.js
@@ -1,369 +1,55 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 cr.define('cellularSetup', function() {
   /** @enum{string} */
-  const PageName = {
-    SIM_DETECT: 'sim-detect-page',
-    PROVISIONING: 'provisioning-page',
-    FINAL: 'final-page',
+  const CellularSetupPageName = {
+    PSIM_FLOW_UI: 'psim-flow-ui',
   };
 
-  /** @enum{string} */
-  const State = {
-    IDLE: 'idle',
-    STARTING_ACTIVATION: 'starting-activation',
-    WAITING_FOR_ACTIVATION_TO_START: 'waiting-for-activation-to-start',
-    TIMEOUT_START_ACTIVATION: 'timeout-start-activation',
-    WAITING_FOR_PORTAL_TO_LOAD: 'waiting-for-portal-to-load',
-    TIMEOUT_PORTAL_LOAD: 'timeout-portal-load',
-    WAITING_FOR_USER_PAYMENT: 'waiting-for-user-payment',
-    WAITING_FOR_ACTIVATION_TO_FINISH: 'waiting-for-activation-to-finish',
-    TIMEOUT_FINISH_ACTIVATION: 'timeout-finish-activation',
-    ACTIVATION_SUCCESS: 'activation-success',
-    ALREADY_ACTIVATED: 'already-activated',
-    ACTIVATION_FAILURE: 'activation-failure',
-  };
-
-  /**
-   * @param {!cellularSetup.State} state
-   * @return {?number} The time delta, in ms, for the timeout corresponding to
-   *     |state|. If no timeout is applicable for this state, null is returned.
-   */
-  function getTimeoutMsForState(state) {
-    // In some cases, starting activation may require power-cycling the device's
-    // modem, a process that can take several seconds.
-    if (state === State.STARTING_ACTIVATION) {
-      return 10000;  // 10 seconds.
-    }
-
-    // The portal is a website served by the mobile carrier.
-    if (state === State.WAITING_FOR_PORTAL_TO_LOAD) {
-      return 10000;  // 10 seconds.
-    }
-
-    // Finishing activation only requires sending a D-Bus message to Shill.
-    if (state === State.WAITING_FOR_ACTIVATION_TO_FINISH) {
-      return 1000;  // 1 second.
-    }
-
-    // No other states require timeouts.
-    return null;
-  }
-
   return {
-    PageName: PageName,
-    State: State,
-    getTimeoutMsForState: getTimeoutMsForState
+    CellularSetupPageName: CellularSetupPageName,
   };
 });
 
 /**
- * Root element for the cellular setup flow. This element interacts with the
- * CellularSetup service to carry out the activation flow. It contains
- * navigation buttons and sub-pages corresponding to each step of the flow.
+ * @fileoverview Root element for the cellular setup flow. This element wraps
+ * the psim setup flow, esim setup flow, and setup flow selection page.
  */
 Polymer({
   is: 'cellular-setup',
 
-  behaviors: [I18nBehavior],
-
   properties: {
-    /** @private {!cellularSetup.State} */
-    state_: {
-      type: String,
-      value: cellularSetup.State.IDLE,
-    },
-
     /**
      * Element name of the current selected sub-page.
-     * @private {!cellularSetup.PageName}
+     * @private {!cellularSetup.CellularSetupPageName}
      */
     selectedPageName_: {
       type: String,
-      value: cellularSetup.PageName.SIM_DETECT,
+      value: cellularSetup.CellularSetupPageName.PSIM_FLOW_UI,
       notify: true,
-    },
-
-    /**
-     * DOM Element for the current selected sub-page.
-     * @private {!SimDetectPageElement|!ProvisioningPageElement|
-     *           !FinalPageElement}
-     */
-    selectedPage_: Object,
-
-    /**
-     * Whether error state should be shown for the current page.
-     * @private {boolean}
-     */
-    showError_: {type: Boolean, value: false},
-
-    /**
-     * Cellular metadata received via the onActivationStarted() callback. If
-     * that callback has not occurred, this field is null.
-     * @private {?chromeos.cellularSetup.mojom.CellularMetadata}
-     */
-    cellularMetadata_: {
-      type: Object,
-      value: null,
-    },
-
-    /**
-     * Whether try again should be shown in the button bar.
-     * @private {boolean}
-     */
-    showTryAgainButton_: {type: Boolean, value: false},
-
-    /**
-     * Whether finish button should be shown in the button bar.
-     * @private {boolean}
-     */
-    showFinishButton_: {type: Boolean, value: false},
-
-    /**
-     * Whether cancel button should be shown in the button bar.
-     * @private {boolean}
-     */
-    showCancelButton_: {type: Boolean, value: false}
+    }
   },
 
-  observers: [
-    'updateShowError_(state_)',
-    'updateSelectedPage_(state_)',
-    'handleStateChange_(state_)',
-  ],
-
   listeners: {
     'backward-nav-requested': 'onBackwardNavRequested_',
     'retry-requested': 'onRetryRequested_',
     'complete-flow-requested': 'onCompleteFlowRequested_',
   },
 
-  /**
-   * Provides an interface to the CellularSetup Mojo service.
-   * @private {?cellular_setup.MojoInterfaceProvider}
-   */
-  mojoInterfaceProvider_: null,
-
-  /**
-   * Delegate responsible for routing activation started/finished events.
-   * @private {?chromeos.cellularSetup.mojom.ActivationDelegateReceiver}
-   */
-  activationDelegateReceiver_: null,
-
-  /**
-   * The timeout ID corresponding to a timeout for the current state. If no
-   * timeout is active, this value is null.
-   * @private {?number}
-   */
-  currentTimeoutId_: null,
-
-  /**
-   * Handler used to communicate state updates back to the CellularSetup
-   * service.
-   * @private {?chromeos.cellularSetup.mojom.CarrierPortalHandlerRemote}
-   */
-  carrierPortalHandler_: null,
-
-  /** @override */
-  created() {
-    this.mojoInterfaceProvider_ =
-        cellular_setup.MojoInterfaceProviderImpl.getInstance();
-  },
-
-  /** @override */
-  ready() {
-    this.state_ = cellularSetup.State.STARTING_ACTIVATION;
-  },
-
-  /**
-   * Overrides chromeos.cellularSetup.mojom.ActivationDelegateInterface.
-   * @param {!chromeos.cellularSetup.mojom.CellularMetadata} metadata
-   * @private
-   */
-  onActivationStarted(metadata) {
-    this.clearTimer_();
-    this.cellularMetadata_ = metadata;
-    this.state_ = cellularSetup.State.WAITING_FOR_PORTAL_TO_LOAD;
-  },
-
-  /**
-   * Overrides chromeos.cellularSetup.mojom.ActivationDelegateInterface.
-   * @param {!chromeos.cellularSetup.mojom.ActivationResult} result
-   * @private
-   */
-  onActivationFinished(result) {
-    this.closeActivationConnection_();
-
-    const ActivationResult = chromeos.cellularSetup.mojom.ActivationResult;
-    switch (result) {
-      case ActivationResult.kSuccessfullyStartedActivation:
-        this.state_ = cellularSetup.State.ALREADY_ACTIVATED;
-        break;
-      case ActivationResult.kAlreadyActivated:
-        this.state_ = cellularSetup.State.ACTIVATION_SUCCESS;
-        break;
-      case ActivationResult.kFailedToActivate:
-        this.state_ = cellularSetup.State.ACTIVATION_FAILURE;
-        break;
-      default:
-        assertNotReached();
-    }
-  },
-
-  /** @private */
-  updateShowError_() {
-    switch (this.state_) {
-      case cellularSetup.State.TIMEOUT_START_ACTIVATION:
-      case cellularSetup.State.TIMEOUT_PORTAL_LOAD:
-      case cellularSetup.State.TIMEOUT_FINISH_ACTIVATION:
-      case cellularSetup.State.ACTIVATION_FAILURE:
-        this.showError_ = true;
-        return;
-      default:
-        this.showError_ = false;
-        return;
-    }
-  },
-
-  /** @private */
-  updateSelectedPage_() {
-    switch (this.state_) {
-      case cellularSetup.State.IDLE:
-      case cellularSetup.State.STARTING_ACTIVATION:
-      case cellularSetup.State.WAITING_FOR_ACTIVATION_TO_START:
-      case cellularSetup.State.TIMEOUT_START_ACTIVATION:
-        this.selectedPageName_ = cellularSetup.PageName.SIM_DETECT;
-        return;
-      case cellularSetup.State.WAITING_FOR_PORTAL_TO_LOAD:
-      case cellularSetup.State.TIMEOUT_PORTAL_LOAD:
-      case cellularSetup.State.WAITING_FOR_USER_PAYMENT:
-        this.selectedPageName_ = cellularSetup.PageName.PROVISIONING;
-        return;
-      case cellularSetup.State.WAITING_FOR_ACTIVATION_TO_FINISH:
-      case cellularSetup.State.TIMEOUT_FINISH_ACTIVATION:
-      case cellularSetup.State.ACTIVATION_SUCCESS:
-      case cellularSetup.State.ALREADY_ACTIVATED:
-      case cellularSetup.State.ACTIVATION_FAILURE:
-        this.selectedPageName_ = cellularSetup.PageName.FINAL;
-        return;
-      default:
-        assertNotReached();
-    }
-  },
-
-  /** @private */
-  handleStateChange_() {
-    // Since the state has changed, the previous state did not time out, so
-    // clear any active timeout.
-    this.clearTimer_();
-
-    // If the new state has an associated timeout, set it.
-    const timeoutMs = cellularSetup.getTimeoutMsForState(this.state_);
-    if (timeoutMs !== null) {
-      this.currentTimeoutId_ =
-          setTimeout(this.onTimeout_.bind(this), timeoutMs);
-    }
-
-    if (this.state_ === cellularSetup.State.STARTING_ACTIVATION) {
-      this.startActivation_();
-      return;
-    }
-  },
-
-  /** @private */
-  onTimeout_() {
-    // The activation attempt failed, so close the connection to the service.
-    this.closeActivationConnection_();
-
-    switch (this.state_) {
-      case cellularSetup.State.STARTING_ACTIVATION:
-        this.state_ = cellularSetup.State.TIMEOUT_START_ACTIVATION;
-        return;
-      case cellularSetup.State.WAITING_FOR_PORTAL_TO_LOAD:
-        this.state_ = cellularSetup.State.TIMEOUT_PORTAL_LOAD;
-        return;
-      case cellularSetup.State.WAITING_FOR_ACTIVATION_TO_FINISH:
-        this.state_ = cellularSetup.State.TIMEOUT_FINISH_ACTIVATION;
-        return;
-      default:
-        // Only the above states are expected to time out.
-        assertNotReached();
-    }
-  },
-
-  /** @private */
-  startActivation_() {
-    assert(!this.activationDelegateReceiver_);
-    this.activationDelegateReceiver_ =
-        new chromeos.cellularSetup.mojom.ActivationDelegateReceiver(
-            /**
-             * @type {!chromeos.cellularSetup.mojom.ActivationDelegateInterface}
-             */
-            (this));
-
-    this.mojoInterfaceProvider_.getMojoServiceRemote()
-        .startActivation(
-            this.activationDelegateReceiver_.$.bindNewPipeAndPassRemote())
-        .then(
-            /**
-             * @param {!chromeos.cellularSetup.
-             *             mojom.CellularSetup_StartActivation_ResponseParams}
-             *                 params
-             */
-            (params) => {
-              this.carrierPortalHandler_ = params.observer;
-            });
-  },
-
-  /** @private */
-  closeActivationConnection_() {
-    assert(!!this.activationDelegateReceiver_);
-    this.activationDelegateReceiver_.$.close();
-    this.activationDelegateReceiver_ = null;
-    this.carrierPortalHandler_ = null;
-    this.cellularMetadata_ = null;
-  },
-
-  /** @private */
-  clearTimer_() {
-    if (this.currentTimeoutId_) {
-      clearTimeout(this.currentTimeoutId_);
-    }
-    this.currentTimeoutId_ = null;
-  },
-
-  /** @private */
-  onCarrierPortalLoaded_() {
-    this.state_ = cellularSetup.State.WAITING_FOR_USER_PAYMENT;
-    this.carrierPortalHandler_.onCarrierPortalStatusChange(
-        chromeos.cellularSetup.mojom.CarrierPortalStatus
-            .kPortalLoadedWithoutPaidUser);
-  },
-
-  /**
-   * @param {!CustomEvent<boolean>} event
-   * @private
-   */
-  onCarrierPortalResult_(event) {
-    const success = event.detail;
-    this.state_ = success ? cellularSetup.State.ACTIVATION_SUCCESS :
-                            cellularSetup.State.ACTIVATION_FAILURE;
-  },
-
   /** @private */
   onBackwardNavRequested_() {
-    // TODO(azeemarshad): Add back navigation.
+    // TODO(crbug.com/1093185): Add back navigation.
   },
 
   /** @private */
   onRetryRequested_() {
-    // TODO(azeemarshad): Add try again logic.
+    // TODO(crbug.com/1093185): Add try again logic.
   },
 
   /** @private */
-  onCompleteFlowRequested__() {
-    // TODO(azeemarshad): Add completion logic.
+  onCompleteFlowRequested_() {
+    // TODO(crbug.com/1093185): Add completion logic.
   },
 });
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.html
new file mode 100644
index 0000000..2782ca8
--- /dev/null
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.html
@@ -0,0 +1,35 @@
+<link rel="import" href="../../../html/polymer.html">
+
+<link rel="import" href="../../../html/i18n_behavior.html">
+<link rel="import" href="mojo_interface_provider.html">
+<link rel="import" href="sim_detect_page.html">
+<link rel="import" href="provisioning_page.html">
+<link rel="import" href="final_page.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-pages/iron-pages.html">
+
+<dom-module id="psim-flow-ui">
+  <template>
+    <style include="iron-flex">
+      :host {
+        display: flex;
+        flex: 1 1 auto;
+        flex-direction: column;
+      }
+    </style>
+    <iron-pages attr-for-selected="is"
+        selected="[[selectedPSimPageName_]]"
+        selected-item="{{selectedPage_}}">
+      <sim-detect-page show-error="[[showError_]]"></sim-detect-page>
+      <provisioning-page show-error="{{showError_}}"
+          cellular-metadata="[[cellularMetadata_]]"
+          on-carrier-portal-loaded="onCarrierPortalLoaded_"
+          on-carrier-portal-result="onCarrierPortalResult_">
+      </provisioning-page>
+      <final-page show-error="[[showError_]]"></final-page>
+    </iron-pages>
+  </template>
+  <script src="psim_flow_ui.js">
+  </script>
+</dom-module>
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
new file mode 100644
index 0000000..4f7dce5
--- /dev/null
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js
@@ -0,0 +1,348 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('cellularSetup', function() {
+  /** @enum{string} */
+  const PSimPageName = {
+    SIM_DETECT: 'sim-detect-page',
+    PROVISIONING: 'provisioning-page',
+    FINAL: 'final-page',
+  };
+
+  /** @enum{string} */
+  const PSimUIState = {
+    IDLE: 'idle',
+    STARTING_ACTIVATION: 'starting-activation',
+    WAITING_FOR_ACTIVATION_TO_START: 'waiting-for-activation-to-start',
+    TIMEOUT_START_ACTIVATION: 'timeout-start-activation',
+    WAITING_FOR_PORTAL_TO_LOAD: 'waiting-for-portal-to-load',
+    TIMEOUT_PORTAL_LOAD: 'timeout-portal-load',
+    WAITING_FOR_USER_PAYMENT: 'waiting-for-user-payment',
+    WAITING_FOR_ACTIVATION_TO_FINISH: 'waiting-for-activation-to-finish',
+    TIMEOUT_FINISH_ACTIVATION: 'timeout-finish-activation',
+    ACTIVATION_SUCCESS: 'activation-success',
+    ALREADY_ACTIVATED: 'already-activated',
+    ACTIVATION_FAILURE: 'activation-failure',
+  };
+
+  /**
+   * @param {!cellularSetup.PSimUIState} state
+   * @return {?number} The time delta, in ms, for the timeout corresponding to
+   *     |state|. If no timeout is applicable for this state, null is returned.
+   */
+  function getTimeoutMsForPSimUIState(state) {
+    // In some cases, starting activation may require power-cycling the device's
+    // modem, a process that can take several seconds.
+    if (state === PSimUIState.STARTING_ACTIVATION) {
+      return 10000;  // 10 seconds.
+    }
+
+    // The portal is a website served by the mobile carrier.
+    if (state === PSimUIState.WAITING_FOR_PORTAL_TO_LOAD) {
+      return 10000;  // 10 seconds.
+    }
+
+    // Finishing activation only requires sending a D-Bus message to Shill.
+    if (state === PSimUIState.WAITING_FOR_ACTIVATION_TO_FINISH) {
+      return 1000;  // 1 second.
+    }
+
+    // No other states require timeouts.
+    return null;
+  }
+
+  return {
+    PSimPageName: PSimPageName,
+    PSimUIState: PSimUIState,
+    getTimeoutMsForPSimUIState: getTimeoutMsForPSimUIState
+  };
+});
+
+/**
+ * Root element for the pSIM cellular setup flow. This element interacts with
+ * the CellularSetup service to carry out the psim activation flow. It contains
+ * navigation buttons and sub-pages corresponding to each step of the flow.
+ */
+Polymer({
+  is: 'psim-flow-ui',
+
+  behaviors: [I18nBehavior],
+
+  properties: {
+    /** @private {!cellularSetup.PSimUIState} */
+    state_: {
+      type: String,
+      value: cellularSetup.PSimUIState.IDLE,
+    },
+
+    /**
+     * Element name of the current selected sub-page.
+     * @private {!cellularSetup.PSimPageName}
+     */
+    selectedPSimPageName_: {
+      type: String,
+      value: cellularSetup.PSimPageName.SIM_DETECT,
+      notify: true,
+    },
+
+    /**
+     * DOM Element for the current selected sub-page.
+     * @private {!SimDetectPageElement|!ProvisioningPageElement|
+     *           !FinalPageElement}
+     */
+    selectedPage_: Object,
+
+    /**
+     * Whether error state should be shown for the current page.
+     * @private {boolean}
+     */
+    showError_: {type: Boolean, value: false},
+
+    /**
+     * Cellular metadata received via the onActivationStarted() callback. If
+     * that callback has not occurred, this field is null.
+     * @private {?chromeos.cellularSetup.mojom.CellularMetadata}
+     */
+    cellularMetadata_: {
+      type: Object,
+      value: null,
+    },
+
+    /**
+     * Whether try again should be shown in the button bar.
+     * @private {boolean}
+     */
+    showTryAgainButton_: {type: Boolean, value: false},
+
+    /**
+     * Whether finish button should be shown in the button bar.
+     * @private {boolean}
+     */
+    showFinishButton_: {type: Boolean, value: false},
+
+    /**
+     * Whether cancel button should be shown in the button bar.
+     * @private {boolean}
+     */
+    showCancelButton_: {type: Boolean, value: false}
+  },
+
+  observers: [
+    'updateShowError_(state_)',
+    'updateSelectedPage_(state_)',
+    'handlePSimUIStateChange_(state_)',
+  ],
+
+  /**
+   * Provides an interface to the CellularSetup Mojo service.
+   * @private {?cellular_setup.MojoInterfaceProvider}
+   */
+  mojoInterfaceProvider_: null,
+
+  /**
+   * Delegate responsible for routing activation started/finished events.
+   * @private {?chromeos.cellularSetup.mojom.ActivationDelegateReceiver}
+   */
+  activationDelegateReceiver_: null,
+
+  /**
+   * The timeout ID corresponding to a timeout for the current state. If no
+   * timeout is active, this value is null.
+   * @private {?number}
+   */
+  currentTimeoutId_: null,
+
+  /**
+   * Handler used to communicate state updates back to the CellularSetup
+   * service.
+   * @private {?chromeos.cellularSetup.mojom.CarrierPortalHandlerRemote}
+   */
+  carrierPortalHandler_: null,
+
+  /** @override */
+  created() {
+    this.mojoInterfaceProvider_ =
+        cellular_setup.MojoInterfaceProviderImpl.getInstance();
+  },
+
+  /** @override */
+  ready() {
+    this.state_ = cellularSetup.PSimUIState.STARTING_ACTIVATION;
+  },
+
+  /**
+   * Overrides chromeos.cellularSetup.mojom.ActivationDelegateInterface.
+   * @param {!chromeos.cellularSetup.mojom.CellularMetadata} metadata
+   * @private
+   */
+  onActivationStarted(metadata) {
+    this.clearTimer_();
+    this.cellularMetadata_ = metadata;
+    this.state_ = cellularSetup.PSimUIState.WAITING_FOR_PORTAL_TO_LOAD;
+  },
+
+  /**
+   * Overrides chromeos.cellularSetup.mojom.ActivationDelegateInterface.
+   * @param {!chromeos.cellularSetup.mojom.ActivationResult} result
+   * @private
+   */
+  onActivationFinished(result) {
+    this.closeActivationConnection_();
+
+    const ActivationResult = chromeos.cellularSetup.mojom.ActivationResult;
+    switch (result) {
+      case ActivationResult.kSuccessfullyStartedActivation:
+        this.state_ = cellularSetup.PSimUIState.ALREADY_ACTIVATED;
+        break;
+      case ActivationResult.kAlreadyActivated:
+        this.state_ = cellularSetup.PSimUIState.ACTIVATION_SUCCESS;
+        break;
+      case ActivationResult.kFailedToActivate:
+        this.state_ = cellularSetup.PSimUIState.ACTIVATION_FAILURE;
+        break;
+      default:
+        assertNotReached();
+    }
+  },
+
+  /** @private */
+  updateShowError_() {
+    switch (this.state_) {
+      case cellularSetup.PSimUIState.TIMEOUT_START_ACTIVATION:
+      case cellularSetup.PSimUIState.TIMEOUT_PORTAL_LOAD:
+      case cellularSetup.PSimUIState.TIMEOUT_FINISH_ACTIVATION:
+      case cellularSetup.PSimUIState.ACTIVATION_FAILURE:
+        this.showError_ = true;
+        return;
+      default:
+        this.showError_ = false;
+        return;
+    }
+  },
+
+  /** @private */
+  updateSelectedPage_() {
+    switch (this.state_) {
+      case cellularSetup.PSimUIState.IDLE:
+      case cellularSetup.PSimUIState.STARTING_ACTIVATION:
+      case cellularSetup.PSimUIState.WAITING_FOR_ACTIVATION_TO_START:
+      case cellularSetup.PSimUIState.TIMEOUT_START_ACTIVATION:
+        this.selectedPSimPageName_ = cellularSetup.PSimPageName.SIM_DETECT;
+        return;
+      case cellularSetup.PSimUIState.WAITING_FOR_PORTAL_TO_LOAD:
+      case cellularSetup.PSimUIState.TIMEOUT_PORTAL_LOAD:
+      case cellularSetup.PSimUIState.WAITING_FOR_USER_PAYMENT:
+        this.selectedPSimPageName_ = cellularSetup.PSimPageName.PROVISIONING;
+        return;
+      case cellularSetup.PSimUIState.WAITING_FOR_ACTIVATION_TO_FINISH:
+      case cellularSetup.PSimUIState.TIMEOUT_FINISH_ACTIVATION:
+      case cellularSetup.PSimUIState.ACTIVATION_SUCCESS:
+      case cellularSetup.PSimUIState.ALREADY_ACTIVATED:
+      case cellularSetup.PSimUIState.ACTIVATION_FAILURE:
+        this.selectedPSimPageName_ = cellularSetup.PSimPageName.FINAL;
+        return;
+      default:
+        assertNotReached();
+    }
+  },
+
+  /** @private */
+  handlePSimUIStateChange_() {
+    // Since the state has changed, the previous state did not time out, so
+    // clear any active timeout.
+    this.clearTimer_();
+
+    // If the new state has an associated timeout, set it.
+    const timeoutMs = cellularSetup.getTimeoutMsForPSimUIState(this.state_);
+    if (timeoutMs !== null) {
+      this.currentTimeoutId_ =
+          setTimeout(this.onTimeout_.bind(this), timeoutMs);
+    }
+
+    if (this.state_ === cellularSetup.PSimUIState.STARTING_ACTIVATION) {
+      this.startActivation_();
+      return;
+    }
+  },
+
+  /** @private */
+  onTimeout_() {
+    // The activation attempt failed, so close the connection to the service.
+    this.closeActivationConnection_();
+
+    switch (this.state_) {
+      case cellularSetup.PSimUIState.STARTING_ACTIVATION:
+        this.state_ = cellularSetup.PSimUIState.TIMEOUT_START_ACTIVATION;
+        return;
+      case cellularSetup.PSimUIState.WAITING_FOR_PORTAL_TO_LOAD:
+        this.state_ = cellularSetup.PSimUIState.TIMEOUT_PORTAL_LOAD;
+        return;
+      case cellularSetup.PSimUIState.WAITING_FOR_ACTIVATION_TO_FINISH:
+        this.state_ = cellularSetup.PSimUIState.TIMEOUT_FINISH_ACTIVATION;
+        return;
+      default:
+        // Only the above states are expected to time out.
+        assertNotReached();
+    }
+  },
+
+  /** @private */
+  startActivation_() {
+    assert(!this.activationDelegateReceiver_);
+    this.activationDelegateReceiver_ =
+        new chromeos.cellularSetup.mojom.ActivationDelegateReceiver(
+            /**
+             * @type {!chromeos.cellularSetup.mojom.ActivationDelegateInterface}
+             */
+            (this));
+
+    this.mojoInterfaceProvider_.getMojoServiceRemote()
+        .startActivation(
+            this.activationDelegateReceiver_.$.bindNewPipeAndPassRemote())
+        .then(
+            /**
+             * @param {!chromeos.cellularSetup.
+             *             mojom.CellularSetup_StartActivation_ResponseParams}
+             *                 params
+             */
+            (params) => {
+              this.carrierPortalHandler_ = params.observer;
+            });
+  },
+
+  /** @private */
+  closeActivationConnection_() {
+    assert(!!this.activationDelegateReceiver_);
+    this.activationDelegateReceiver_.$.close();
+    this.activationDelegateReceiver_ = null;
+    this.carrierPortalHandler_ = null;
+    this.cellularMetadata_ = null;
+  },
+
+  /** @private */
+  clearTimer_() {
+    if (this.currentTimeoutId_) {
+      clearTimeout(this.currentTimeoutId_);
+    }
+    this.currentTimeoutId_ = null;
+  },
+
+  /** @private */
+  onCarrierPortalLoaded_() {
+    this.state_ = cellularSetup.PSimUIState.WAITING_FOR_USER_PAYMENT;
+    this.carrierPortalHandler_.onCarrierPortalStatusChange(
+        chromeos.cellularSetup.mojom.CarrierPortalStatus
+            .kPortalLoadedWithoutPaidUser);
+  },
+
+  /**
+   * @param {!CustomEvent<boolean>} event
+   * @private
+   */
+  onCarrierPortalResult_(event) {
+    const success = event.detail;
+    this.state_ = success ? cellularSetup.PSimUIState.ACTIVATION_SUCCESS :
+                            cellularSetup.PSimUIState.ACTIVATION_FAILURE;
+  },
+});
diff --git a/ui/webui/resources/cr_components/cr_components_resources.grdp b/ui/webui/resources/cr_components/cr_components_resources.grdp
index b358b05..61c6cd7 100644
--- a/ui/webui/resources/cr_components/cr_components_resources.grdp
+++ b/ui/webui/resources/cr_components/cr_components_resources.grdp
@@ -134,6 +134,12 @@
     <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_CELLULAR_SETUP_JS"
                file="cr_components/chromeos/cellular_setup/cellular_setup.js"
                type="chrome_html" />
+    <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PSIM_FLOW_HTML"
+               file="cr_components/chromeos/cellular_setup/psim_flow_ui.html"
+               type="chrome_html" />
+    <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_PSIM_FLOW_JS"
+               file="cr_components/chromeos/cellular_setup/psim_flow_ui.js"
+               type="chrome_html" />
     <structure name="IDR_WEBUI_CHROMEOS_CELLULAR_SETUP_MOJO_INTERFACE_PROVIDER_HTML"
                file="cr_components/chromeos/cellular_setup/mojo_interface_provider.html"
                type="chrome_html" />
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenSizeTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenSizeTest.java
index d477958..95770eb 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenSizeTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenSizeTest.java
@@ -62,6 +62,13 @@
             return;
         }
 
+        // Reset the OSK state.
+        int withKeyboardHeight = getVisiblePageHeight();
+        dismissOsk();
+        CriteriaHelper.pollInstrumentationThread(() -> {
+            Criteria.checkThat(getVisiblePageHeight(), Matchers.greaterThan(withKeyboardHeight));
+        });
+
         // Now, try with fullscreen.
         // Second touch enters fullscreen.
         EventUtils.simulateTouchCenterOfView(mActivity.getWindow().getDecorView());
@@ -85,12 +92,7 @@
         Assert.assertEquals(fsWithOskWidth, fsWidth);
         Assert.assertThat(fsWithOskHeight, Matchers.lessThan(fsHeight));
 
-        // Dismiss OSK.
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            InputMethodManager inputManager =
-                    (InputMethodManager) mActivity.getSystemService(Activity.INPUT_METHOD_SERVICE);
-            inputManager.hideSoftInputFromWindow(mActivity.getCurrentFocus().getWindowToken(), 0);
-        });
+        dismissOsk();
         CriteriaHelper.pollInstrumentationThread(() -> {
             Criteria.checkThat(getVisiblePageHeight(), Matchers.greaterThan(fsWithOskHeight));
         });
@@ -106,4 +108,12 @@
     private int getVisiblePageHeight() {
         return mActivityTestRule.executeScriptAndExtractInt("window.innerHeight");
     }
+
+    private void dismissOsk() {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            InputMethodManager inputManager =
+                    (InputMethodManager) mActivity.getSystemService(Activity.INPUT_METHOD_SERVICE);
+            inputManager.hideSoftInputFromWindow(mActivity.getCurrentFocus().getWindowToken(), 0);
+        });
+    }
 }
diff --git a/weblayer/browser/browser_controls_container_view.cc b/weblayer/browser/browser_controls_container_view.cc
index 81a1f9e9..725571a 100644
--- a/weblayer/browser/browser_controls_container_view.cc
+++ b/weblayer/browser/browser_controls_container_view.cc
@@ -52,6 +52,16 @@
   return controls_layer_ ? controls_layer_->bounds().height() : 0;
 }
 
+int BrowserControlsContainerView::GetMinHeight() {
+  return Java_BrowserControlsContainerView_getMinHeight(
+      AttachCurrentThread(), java_browser_controls_container_view_);
+}
+
+bool BrowserControlsContainerView::ShouldPinControlsToContentTop() {
+  return Java_BrowserControlsContainerView_shouldPinControlsToContentTop(
+      AttachCurrentThread(), java_browser_controls_container_view_);
+}
+
 int BrowserControlsContainerView::GetContentHeightDelta() {
   if (!controls_layer_ || !web_contents())
     return 0;
diff --git a/weblayer/browser/browser_controls_container_view.h b/weblayer/browser/browser_controls_container_view.h
index 9231531..fe567fa5 100644
--- a/weblayer/browser/browser_controls_container_view.h
+++ b/weblayer/browser/browser_controls_container_view.h
@@ -37,6 +37,13 @@
   // Height needed to display the control.
   int GetControlsHeight();
 
+  // Returns the minimum height the browser controls can collapse to.
+  int GetMinHeight();
+
+  // Returns true if the browser controls should only expand when the page
+  // contents are scrolled to the top.
+  bool ShouldPinControlsToContentTop();
+
   // Returns the amount of vertical space to take away from the contents.
   int GetContentHeightDelta();
 
@@ -54,8 +61,7 @@
 
   // Sets the offsets of the controls and content. See
   // BrowserControlsContainerView's javadoc for details on this.
-  void SetTopControlsOffset(JNIEnv* env,
-                            int content_offset_y);
+  void SetTopControlsOffset(JNIEnv* env, int content_offset_y);
   void SetBottomControlsOffset(JNIEnv* env);
 
   // Sets the size of |controls_layer_|.
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java
index 47bfffa..b72d6d9 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java
@@ -90,6 +90,10 @@
     // The minimum height that the controls should collapse to. Only used for top controls.
     private int mMinHeight;
 
+    // Whether the controls should only expand when the page is scrolled to the top. Only used for
+    // top controls.
+    private boolean mPinControlsToContentTop;
+
     // Set to true if |mView| is hidden because the user has scrolled or triggered some action such
     // that mView is not visible. While |mView| is not visible if this is true, the bitmap from
     // |mView| may be partially visible.
@@ -252,6 +256,14 @@
     }
 
     /**
+     * Sets whether the controls should only expand at the top of the page contents.
+     * Only valid for top controls.
+     */
+    public void setPinControlsToContentTop(boolean pinToContentTop) {
+        mPinControlsToContentTop = pinToContentTop;
+    }
+
+    /**
      * Called from ViewAndroidDelegate, see it for details.
      */
     public void onOffsetsChanged(int controlsOffsetY, int contentOffsetY) {
@@ -422,6 +434,16 @@
     }
 
     @CalledByNative
+    private int getMinHeight() {
+        return mMinHeight;
+    }
+
+    @CalledByNative
+    private boolean shouldPinControlsToContentTop() {
+        return mPinControlsToContentTop;
+    }
+
+    @CalledByNative
     private void didToggleFullscreenModeForTab(final boolean isFullscreen) {
         // Delay hiding until after the animation. This comes from Chrome code.
         if (mSystemUiFullscreenResizeRunnable != null) {
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
index e49fee4..1edfbaf 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
@@ -57,9 +57,6 @@
     private final View.OnAttachStateChangeListener mOnAttachedStateChangeListener;
     private final ModalDialogManager mModalDialogManager;
 
-    private int mTopControlsMinHeight;
-    private boolean mPinToContentTop;
-
     private TabImpl mTab;
 
     private WebContentsGestureStateTracker mGestureStateTracker;
@@ -169,8 +166,6 @@
 
         if (mTab != null) {
             mTab.onDidLoseActive();
-            // Clean up UI related state now that the old Tab is inactive.
-            mTab.setTopControlsMinHeight(0);
             // WebContentsGestureStateTracker is relatively cheap, easier to destroy rather than
             // update WebContents.
             mGestureStateTracker.destroy();
@@ -194,7 +189,6 @@
         mContentViewRenderView.setWebContents(webContents);
         mTopControlsContainerView.setWebContents(webContents);
         mBottomControlsContainerView.setWebContents(webContents);
-        updateActiveTabScrollBehavior();
         if (mTab != null) {
             mTab.onDidGainActive(mTopControlsContainerView.getNativeHandle(),
                     mBottomControlsContainerView.getNativeHandle());
@@ -211,14 +205,11 @@
     }
 
     public void setTopControlsMinHeight(int minHeight) {
-        mTopControlsMinHeight = minHeight;
         mTopControlsContainerView.setMinHeight(minHeight);
-        updateActiveTabScrollBehavior();
     }
 
     public void setPinTopControlsToContentTop(boolean pinToContentTop) {
-        mPinToContentTop = pinToContentTop;
-        updateActiveTabScrollBehavior();
+        mTopControlsContainerView.setPinControlsToContentTop(pinToContentTop);
     }
 
     public void setBottomView(View view) {
@@ -311,13 +302,6 @@
                         || mBottomControlsContainerView.isControlVisible());
     }
 
-    private void updateActiveTabScrollBehavior() {
-        if (mTab != null) {
-            mTab.setTopControlsMinHeight(mTopControlsMinHeight);
-            mTab.setPinTopControlsToContentTop(mPinToContentTop);
-        }
-    }
-
     /**
      * Causes the browser controls to be fully shown. Take care in calling this. Normally the
      * renderer drives the offsets, but this method circumvents that.
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
index a777ac8..57676f90 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
@@ -886,14 +886,6 @@
         WebLayerAccessibilityUtil.get().removeObserver(mAccessibilityObserver);
     }
 
-    /* package */ void setTopControlsMinHeight(int minHeight) {
-        TabImplJni.get().setTopControlsMinHeight(mNativeTab, minHeight);
-    }
-
-    /* package */ void setPinTopControlsToContentTop(boolean pinToContentTop) {
-        TabImplJni.get().setPinTopControlsToContentTop(mNativeTab, pinToContentTop);
-    }
-
     @CalledByNative
     private boolean doBrowserControlsShrinkRendererSize() {
         BrowserViewController viewController = getViewController();
@@ -1043,7 +1035,5 @@
         void unregisterWebMessageCallback(long nativeTabImpl, String jsObjectName);
         boolean canTranslate(long nativeTabImpl);
         void showTranslateUi(long nativeTabImpl);
-        void setTopControlsMinHeight(long nativeTabImpl, int minHeight);
-        void setPinTopControlsToContentTop(long nativeTabImpl, boolean pinToContentTop);
     }
 }
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc
index 0ca85a64..f05819a9 100644
--- a/weblayer/browser/tab_impl.cc
+++ b/weblayer/browser/tab_impl.cc
@@ -775,16 +775,6 @@
   TranslateClientImpl::FromWebContents(web_contents())
       ->ManualTranslateWhenReady();
 }
-
-void TabImpl::SetTopControlsMinHeight(JNIEnv* env, int min_height) {
-  top_controls_min_height_ = min_height;
-}
-
-void TabImpl::SetPinTopControlsToContentTop(
-    JNIEnv* env,
-    jboolean pin_top_controls_to_content_top) {
-  pin_top_controls_to_content_top_ = pin_top_controls_to_content_top;
-}
 #endif  // OS_ANDROID
 
 content::WebContents* TabImpl::OpenURLFromTab(
@@ -898,7 +888,9 @@
 
 int TabImpl::GetTopControlsMinHeight() {
 #if defined(OS_ANDROID)
-  return top_controls_min_height_;
+  return top_controls_container_view_
+             ? top_controls_container_view_->GetMinHeight()
+             : 0;
 #else
   return 0;
 #endif
@@ -927,7 +919,9 @@
 
 bool TabImpl::ShouldPinTopControlsToContentTop() {
 #if defined(OS_ANDROID)
-  return pin_top_controls_to_content_top_;
+  return top_controls_container_view_
+             ? top_controls_container_view_->ShouldPinControlsToContentTop()
+             : false;
 #else
   return false;
 #endif
diff --git a/weblayer/browser/tab_impl.h b/weblayer/browser/tab_impl.h
index 2d8b393..1bfbedf 100644
--- a/weblayer/browser/tab_impl.h
+++ b/weblayer/browser/tab_impl.h
@@ -193,9 +193,6 @@
       const base::android::JavaParamRef<jstring>& js_object_name);
   jboolean CanTranslate(JNIEnv* env);
   void ShowTranslateUi(JNIEnv* env);
-  void SetTopControlsMinHeight(JNIEnv* env, int min_height);
-  void SetPinTopControlsToContentTop(JNIEnv* env,
-                                     jboolean pin_top_controls_to_content_top);
 #endif
 
   ErrorPageDelegate* error_page_delegate() { return error_page_delegate_; }
@@ -369,8 +366,6 @@
   base::android::ScopedJavaGlobalRef<jobject> java_impl_;
   std::unique_ptr<BrowserControlsNavigationStateHandler>
       browser_controls_navigation_state_handler_;
-  int top_controls_min_height_ = 0;
-  bool pin_top_controls_to_content_top_ = false;
 
   // Last value supplied to UpdateBrowserControlsConstraint(). This *constraint*
   // can be SHOWN, if for example a modal dialog is forcing the controls to be
diff --git a/weblayer/shell/android/BUILD.gn b/weblayer/shell/android/BUILD.gn
index 312e242..9109070 100644
--- a/weblayer/shell/android/BUILD.gn
+++ b/weblayer/shell/android/BUILD.gn
@@ -21,8 +21,10 @@
 android_resources("weblayer_shell_resources") {
   sources = [
     "shell_apk/res/layout/bottom_controls.xml",
+    "shell_apk/res/layout/main.xml",
     "shell_apk/res/layout/shell_browser_controls.xml",
     "shell_apk/res/menu/app_menu.xml",
+    "shell_apk/res/menu/controls_menu.xml",
     "shell_apk/res/values/strings.xml",
     "shell_apk/res/values/styles.xml",
   ]
diff --git a/weblayer/shell/android/shell_apk/res/layout/main.xml b/weblayer/shell/android/shell_apk/res/layout/main.xml
new file mode 100644
index 0000000..eb1c9c1
--- /dev/null
+++ b/weblayer/shell/android/shell_apk/res/layout/main.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <ImageButton
+        android:id="@+id/controls_menu_button"
+        android:layout_width="25dp"
+        android:layout_height="25dp"
+        android:scaleType="fitXY"
+        android:paddingLeft="5px"
+        android:paddingRight="5px"
+        android:src="@android:drawable/ic_menu_more"
+        android:background="@android:color/transparent" />
+    <TextView
+        android:id="@+id/version_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toRightOf="@id/controls_menu_button"
+        android:paddingTop="5px" />
+    <FrameLayout
+        android:id="@+id/weblayer"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@id/controls_menu_button" />
+</RelativeLayout>
diff --git a/weblayer/shell/android/shell_apk/res/layout/shell_browser_controls.xml b/weblayer/shell/android/shell_apk/res/layout/shell_browser_controls.xml
index f0f01f5..1b457f9 100644
--- a/weblayer/shell/android/shell_apk/res/layout/shell_browser_controls.xml
+++ b/weblayer/shell/android/shell_apk/res/layout/shell_browser_controls.xml
@@ -39,7 +39,7 @@
     </ViewSwitcher>
 
     <ImageButton
-        android:id="@+id/menu_button"
+        android:id="@+id/app_menu_button"
         android:src="@android:drawable/ic_menu_more"
         android:background="@android:color/transparent"
         android:layout_width="25dp"
diff --git a/weblayer/shell/android/shell_apk/res/menu/app_menu.xml b/weblayer/shell/android/shell_apk/res/menu/app_menu.xml
index f29d1c9..4057cc4 100644
--- a/weblayer/shell/android/shell_apk/res/menu/app_menu.xml
+++ b/weblayer/shell/android/shell_apk/res/menu/app_menu.xml
@@ -12,19 +12,6 @@
         android:title="Find in page" />
     <item android:id="@+id/find_end_menu_id"
         android:title="Clear find in page" />
-    <item android:id="@+id/toggle_bottom_view_id"
-          android:checkable="true"
-        android:title="Bottom view" />
-    <item android:title="Scrolling">
-        <menu xmlns:android="http://schemas.android.com/apk/res/android">
-            <item android:id="@+id/toggle_top_view_min_height_id"
-                android:checkable="true"
-                android:title="Set top view min height" />
-            <item android:id="@+id/toggle_top_view_pinned_to_top_id"
-                android:checkable="true"
-                android:title="Pin top view to content top" />
-        </menu>
-    </item>
     <item android:id="@+id/site_settings_menu_id"
         android:title="Site Settings" />
     <item android:id="@+id/translate_menu_id"
diff --git a/weblayer/shell/android/shell_apk/res/menu/controls_menu.xml b/weblayer/shell/android/shell_apk/res/menu/controls_menu.xml
new file mode 100644
index 0000000..3c57eaa
--- /dev/null
+++ b/weblayer/shell/android/shell_apk/res/menu/controls_menu.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="HardcodedText">
+    <item android:id="@+id/toggle_bottom_view_id"
+          android:checkable="true"
+        android:title="Bottom view" />
+    <item android:id="@+id/toggle_top_view_min_height_id"
+        android:checkable="true"
+        android:title="Set top view min height" />
+    <item android:id="@+id/toggle_top_view_pinned_to_top_id"
+        android:checkable="true"
+        android:title="Pin top view to content top" />
+</menu>
diff --git a/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java b/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
index 210a64d..4d38b9c3 100644
--- a/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
+++ b/weblayer/shell/android/shell_apk/src/org/chromium/weblayer/shell/WebLayerShellActivity.java
@@ -18,12 +18,10 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
 import android.webkit.URLUtil;
 import android.widget.EditText;
 import android.widget.ImageButton;
-import android.widget.LinearLayout;
 import android.widget.PopupMenu;
 import android.widget.ProgressBar;
 import android.widget.TextView;
@@ -122,19 +120,16 @@
     }
 
     private static final String TAG = "WebLayerShell";
-    private static final String KEY_MAIN_VIEW_ID = "mainViewId";
     private static final float DEFAULT_TEXT_SIZE = 15.0F;
     private static final int EDITABLE_URL_TEXT_VIEW = 0;
     private static final int NONEDITABLE_URL_TEXT_VIEW = 1;
 
     private Profile mProfile;
     private Browser mBrowser;
-    private ImageButton mMenuButton;
+    private ImageButton mAppMenuButton;
     private ViewSwitcher mUrlViewContainer;
     private EditText mEditUrlView;
     private ProgressBar mLoadProgressBar;
-    private View mMainView;
-    private int mMainViewId;
     private View mTopContentsContainer;
     private TabListCallback mTabListCallback;
     private List<Tab> mPreviousTabList = new ArrayList<>();
@@ -143,35 +138,21 @@
     private int mTopViewMinHeight;
     private boolean mTopViewPinnedToContentTop;
     private boolean mInIncognitoMode;
+    private boolean mEnableWebViewCompat;
 
     @Override
     protected void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        boolean enableWebViewCompat = getIntent().getBooleanExtra(EXTRA_WEBVIEW_COMPAT, false);
-        if (enableWebViewCompat) {
+        mEnableWebViewCompat = getIntent().getBooleanExtra(EXTRA_WEBVIEW_COMPAT, false);
+        if (mEnableWebViewCompat) {
             WebLayer.initializeWebViewCompatibilityMode(getApplicationContext());
         }
-        LinearLayout mainView = new LinearLayout(this);
-        mainView.setOrientation(LinearLayout.VERTICAL);
-        TextView versionText = new TextView(this);
-        versionText.setPadding(10, 0, 0, 0);
-        String versionString = getString(
-                R.string.version, WebLayer.getVersion(), WebLayer.getSupportedFullVersion(this));
-        if (enableWebViewCompat) {
-            versionString += " | WebView Compat";
-        }
-        versionText.setText(versionString);
-        mainView.addView(versionText,
-                new LinearLayout.LayoutParams(
-                        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
-        if (savedInstanceState == null) {
-            mMainViewId = View.generateViewId();
-        } else {
-            mMainViewId = savedInstanceState.getInt(KEY_MAIN_VIEW_ID);
-        }
-        mainView.setId(mMainViewId);
-        mMainView = mainView;
-        setContentView(mainView);
+        setContentView(R.layout.main);
+        TextView versionText = (TextView) findViewById(R.id.version_text);
+        versionText.setText(getString(
+                R.string.version, WebLayer.getVersion(), WebLayer.getSupportedFullVersion(this)));
+        ImageButton controlsMenuButton = (ImageButton) findViewById(R.id.controls_menu_button);
+        controlsMenuButton.setOnClickListener(this::onControlsMenuButtonClicked);
 
         mTopContentsContainer =
                 LayoutInflater.from(this).inflate(R.layout.shell_browser_controls, null);
@@ -185,107 +166,8 @@
         });
         mUrlViewContainer.setDisplayedChild(EDITABLE_URL_TEXT_VIEW);
 
-        mMenuButton = mTopContentsContainer.findViewById(R.id.menu_button);
-        mMenuButton.setOnClickListener(v -> {
-            PopupMenu popup = new PopupMenu(WebLayerShellActivity.this, v);
-            popup.getMenuInflater().inflate(R.menu.app_menu, popup.getMenu());
-            MenuItem bottomMenuItem = popup.getMenu().findItem(R.id.toggle_bottom_view_id);
-            bottomMenuItem.setChecked(mBottomView != null);
-            popup.getMenu()
-                    .findItem(R.id.toggle_top_view_min_height_id)
-                    .setChecked(mTopViewMinHeight > 0);
-            popup.getMenu()
-                    .findItem(R.id.toggle_top_view_pinned_to_top_id)
-                    .setChecked(mTopViewPinnedToContentTop);
-            popup.getMenu()
-                    .findItem(R.id.translate_menu_id)
-                    .setVisible(mBrowser.getActiveTab().canTranslate());
-            popup.getMenu().findItem(R.id.webview_compat_menu_id).setVisible(!enableWebViewCompat);
-            popup.getMenu()
-                    .findItem(R.id.no_webview_compat_menu_id)
-                    .setVisible(enableWebViewCompat);
-            popup.setOnMenuItemClickListener(item -> {
-                if (item.getItemId() == R.id.reload_menu_id) {
-                    mBrowser.getActiveTab().getNavigationController().reload();
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.find_begin_menu_id) {
-                    // TODO(estade): add a UI for FIP. For now, just search for "cat", or go
-                    // to the next result if a search has already been initiated.
-                    mBrowser.getActiveTab().getFindInPageController().setFindInPageCallback(
-                            new FindInPageCallback() {});
-                    mBrowser.getActiveTab().getFindInPageController().find("cat", true);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.find_end_menu_id) {
-                    mBrowser.getActiveTab().getFindInPageController().setFindInPageCallback(null);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.toggle_bottom_view_id) {
-                    if (mBottomView == null) {
-                        mBottomView =
-                                LayoutInflater.from(this).inflate(R.layout.bottom_controls, null);
-                    } else {
-                        mBottomView = null;
-                    }
-                    mBrowser.setBottomView(mBottomView);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.toggle_top_view_min_height_id) {
-                    mTopViewMinHeight = (mTopViewMinHeight == 0) ? 50 : 0;
-                    mBrowser.setTopView(
-                            mTopContentsContainer, mTopViewMinHeight, mTopViewPinnedToContentTop);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.toggle_top_view_pinned_to_top_id) {
-                    mTopViewPinnedToContentTop = !mTopViewPinnedToContentTop;
-                    mBrowser.setTopView(
-                            mTopContentsContainer, mTopViewMinHeight, mTopViewPinnedToContentTop);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.site_settings_menu_id) {
-                    // TODO(crbug.com/1083233): Figure out the right long-term behavior here.
-                    if (mInIncognitoMode) return true;
-
-                    Intent intent = SiteSettingsActivity.createIntentForCategoryList(
-                            this, NON_INCOGNITO_PROFILE_NAME);
-                    IntentUtils.safeStartActivity(this, intent);
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.translate_menu_id) {
-                    mBrowser.getActiveTab().showTranslateUi();
-                    return true;
-                }
-
-                if (item.getItemId() == R.id.clear_browsing_data_menu_id) {
-                    mProfile.clearBrowsingData(new int[] {BrowsingDataType.COOKIES_AND_SITE_DATA,
-                                                       BrowsingDataType.CACHE},
-                            () -> {
-                                Toast.makeText(getApplicationContext(), "Data cleared!",
-                                             Toast.LENGTH_SHORT)
-                                        .show();
-                            });
-                }
-
-                if (item.getItemId() == R.id.webview_compat_menu_id) {
-                    restartShell(true);
-                }
-
-                if (item.getItemId() == R.id.no_webview_compat_menu_id) {
-                    restartShell(false);
-                }
-
-                return false;
-            });
-            popup.show();
-        });
+        mAppMenuButton = mTopContentsContainer.findViewById(R.id.app_menu_button);
+        mAppMenuButton.setOnClickListener(this::onAppMenuButtonClicked);
 
         mLoadProgressBar = mTopContentsContainer.findViewById(R.id.progress_bar);
 
@@ -301,6 +183,114 @@
         }
     }
 
+    private void onAppMenuButtonClicked(View appMenuButtonView) {
+        PopupMenu popup = new PopupMenu(WebLayerShellActivity.this, appMenuButtonView);
+        popup.getMenuInflater().inflate(R.menu.app_menu, popup.getMenu());
+        popup.getMenu()
+                .findItem(R.id.translate_menu_id)
+                .setVisible(mBrowser.getActiveTab().canTranslate());
+        popup.getMenu().findItem(R.id.webview_compat_menu_id).setVisible(!mEnableWebViewCompat);
+        popup.getMenu().findItem(R.id.no_webview_compat_menu_id).setVisible(mEnableWebViewCompat);
+        popup.setOnMenuItemClickListener(item -> {
+            if (item.getItemId() == R.id.reload_menu_id) {
+                mBrowser.getActiveTab().getNavigationController().reload();
+                return true;
+            }
+
+            if (item.getItemId() == R.id.find_begin_menu_id) {
+                // TODO(estade): add a UI for FIP. For now, just search for "cat", or go
+                // to the next result if a search has already been initiated.
+                mBrowser.getActiveTab().getFindInPageController().setFindInPageCallback(
+                        new FindInPageCallback() {});
+                mBrowser.getActiveTab().getFindInPageController().find("cat", true);
+                return true;
+            }
+
+            if (item.getItemId() == R.id.find_end_menu_id) {
+                mBrowser.getActiveTab().getFindInPageController().setFindInPageCallback(null);
+                return true;
+            }
+
+            if (item.getItemId() == R.id.site_settings_menu_id) {
+                // TODO(crbug.com/1083233): Figure out the right long-term behavior here.
+                if (mInIncognitoMode) return true;
+
+                Intent intent = SiteSettingsActivity.createIntentForCategoryList(
+                        this, NON_INCOGNITO_PROFILE_NAME);
+                IntentUtils.safeStartActivity(this, intent);
+                return true;
+            }
+
+            if (item.getItemId() == R.id.translate_menu_id) {
+                mBrowser.getActiveTab().showTranslateUi();
+                return true;
+            }
+
+            if (item.getItemId() == R.id.clear_browsing_data_menu_id) {
+                mProfile.clearBrowsingData(
+                        new int[] {BrowsingDataType.COOKIES_AND_SITE_DATA, BrowsingDataType.CACHE},
+                        () -> {
+                            Toast.makeText(getApplicationContext(), "Data cleared!",
+                                         Toast.LENGTH_SHORT)
+                                    .show();
+                        });
+            }
+
+            if (item.getItemId() == R.id.webview_compat_menu_id) {
+                restartShell(true);
+            }
+
+            if (item.getItemId() == R.id.no_webview_compat_menu_id) {
+                restartShell(false);
+            }
+
+            return false;
+        });
+        popup.show();
+    }
+
+    private void onControlsMenuButtonClicked(View controlsMenuButtonView) {
+        PopupMenu popup = new PopupMenu(WebLayerShellActivity.this, controlsMenuButtonView);
+        popup.getMenuInflater().inflate(R.menu.controls_menu, popup.getMenu());
+        popup.getMenu().findItem(R.id.toggle_bottom_view_id).setChecked(mBottomView != null);
+        popup.getMenu()
+                .findItem(R.id.toggle_top_view_min_height_id)
+                .setChecked(mTopViewMinHeight > 0);
+        popup.getMenu()
+                .findItem(R.id.toggle_top_view_pinned_to_top_id)
+                .setChecked(mTopViewPinnedToContentTop);
+        popup.setOnMenuItemClickListener(item -> {
+            if (item.getItemId() == R.id.toggle_bottom_view_id) {
+                if (mBottomView == null) {
+                    mBottomView = LayoutInflater.from(this).inflate(R.layout.bottom_controls, null);
+                } else {
+                    mBottomView = null;
+                }
+                mBrowser.setBottomView(mBottomView);
+                return true;
+            }
+
+            if (item.getItemId() == R.id.toggle_top_view_min_height_id) {
+                mTopViewMinHeight = (mTopViewMinHeight == 0) ? 50 : 0;
+                updateTopView();
+                return true;
+            }
+
+            if (item.getItemId() == R.id.toggle_top_view_pinned_to_top_id) {
+                mTopViewPinnedToContentTop = !mTopViewPinnedToContentTop;
+                updateTopView();
+                return true;
+            }
+
+            return false;
+        });
+        popup.show();
+    }
+
+    private void updateTopView() {
+        mBrowser.setTopView(mTopContentsContainer, mTopViewMinHeight, mTopViewPinnedToContentTop);
+    }
+
     @Override
     protected void onDestroy() {
         super.onDestroy();
@@ -328,7 +318,7 @@
         mProfile.setBooleanSetting(SettingType.UKM_ENABLED, true);
         setTabCallbacks(mBrowser.getActiveTab(), fragment);
 
-        mBrowser.setTopView(mTopContentsContainer, /*minHeight=*/0, /*pinToContentTop=*/false);
+        updateTopView();
         mTabListCallback = new TabListCallback() {
             @Override
             public void onActiveTabChanged(Tab activeTab) {
@@ -446,7 +436,7 @@
 
             @Override
             public void onTabModalStateChanged(boolean isTabModalShowing) {
-                mMenuButton.setEnabled(!isTabModalShowing);
+                mAppMenuButton.setEnabled(!isTabModalShowing);
             }
 
             @Override
@@ -516,7 +506,7 @@
 
         Fragment fragment = WebLayer.createBrowserFragment(profileName);
         FragmentTransaction transaction = fragmentManager.beginTransaction();
-        transaction.add(mMainViewId, fragment);
+        transaction.add(R.id.weblayer, fragment);
 
         // Note the commitNow() instead of commit(). We want the fragment to get attached to
         // activity synchronously, so we can use all the functionality immediately. Otherwise we'd
@@ -545,14 +535,6 @@
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        // When restoring Fragments, FragmentManager tries to put them in the containers with same
-        // ids as before.
-        outState.putInt(KEY_MAIN_VIEW_ID, mMainViewId);
-    }
-
-    @Override
     public void onBackPressed() {
         if (mBrowser != null) {
             Tab activeTab = mBrowser.getActiveTab();