diff --git a/DEPS b/DEPS
index 5c67293..7d029d44 100644
--- a/DEPS
+++ b/DEPS
@@ -213,7 +213,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:582e828c5a8aaf5cdd0ad1d5465fb9092b71eab8',
+  'luci_go': 'git_revision:a1616e207f0d9c24beefe848ee899b7a73efcb70',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -253,7 +253,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '953c92880b887089f519ee6b8a1c8edb1f7082cd',
+  'skia_revision': '5deac304821b04176c0c3ac9535e5889a2966265',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -261,15 +261,15 @@
   # 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': '802e0d4db24c65f3cc24401f74abc65c480cdbe0',
+  'angle_revision': 'c80c7ae3fb274e61373ae9cd8081e8e0723c6cde',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'f066b8ef930f30c9ad1746aa0ac63c152debd46d',
+  'swiftshader_revision': '6e9eafd3463912183cfcac9c2b26bd61ab57a43b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '8bc6915d4bac163b72fc2db031f5aa0369905129',
+  'pdfium_revision': '3fa9afc042f113c75e79d8d7966ef03ceea1fca5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -320,7 +320,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': '666eff907b58ca7b4c82c0fae4c6e1d24f223ea0',
+  'catapult_revision': '2cfdaa8ce0e0c959b01c0280a93be107788b7d24',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -368,7 +368,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '17ea678173f962dd269bf99d2d7ba2acb6333241',
+  'dawn_revision': 'b793bac93b9d2421d5a79d716703eb6da2577d78',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1131,7 +1131,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c9a747c5ed646001df33e798c62bbac0d27c8d08',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ca9706d13903f1efabb4ce6ea04d6f8340fb88c5',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1514,7 +1514,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '134b9ef223989bd7ceaa32de04a6a10ed3946ec5',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '54ba566cdda23803c888afe5b664005be30d06e0',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1653,7 +1653,7 @@
     Var('chromium_git') + '/external/github.com/google/snappy.git' + '@' + '65dc7b383985eb4f63cd3e752136db8d9b4be8c0',
 
   'src/third_party/sqlite/src':
-    Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + '9ccd3058ec6dcfa5b0ebd2edb3e88c9b97813025',
+    Var('chromium_git') + '/chromium/deps/sqlite.git' + '@' + 'bae060174325d9f8bbab105e9f807977bb1d3cf9',
 
   'src/third_party/sqlite4java': {
       'packages': [
@@ -1675,7 +1675,7 @@
   },
 
   'src/third_party/tflite/src':
-    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '965c39fdf304a80eacd6cdca43241956084301c3',
+    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '3c8e39ece0c32337ac9371a20cdfad888b2539d1',
 
   'src/third_party/turbine': {
       'packages': [
@@ -1732,10 +1732,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'cf04aebdf9b53bb2853f22a81465688daf879ec6',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '48cf29b0b746a3d74cdbb75ae4124a29be15bd14',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '008969e4d83211e112f83143bd7932f30e4ef549',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '141007668cf12f06c6fc4d49706ab87ddc9e82a0',
+    Var('webrtc_git') + '/src.git' + '@' + '07e021c780c1600faaf5945e05bd1f91075a7fb3',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1805,7 +1805,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@20d5f4822b46442e3203c2b3436a82f23ffbedb7',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b989b1f690504d23cf9140606965b1514c4132a5',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index ecf6fe9..5d09929 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -990,6 +990,17 @@
           r'^base[\\/]win[\\/]scoped_winrt_initializer\.cc$'
       ),
     ),
+    (
+        r'/base::(size|empty|data)',
+        (
+            'Please use the STL equivalent (std::size/std::empty/std::data) ',
+            'instead. The base versions are being removed: ',
+            'https://crbug.com/1299695'
+
+        ),
+        False,
+        [_THIRD_PARTY_EXCEPT_BLINK],  # Don't warn in third_party folders.
+    ),
 )
 
 # Format: Sequence of tuples containing:
diff --git a/ash/app_list/views/productivity_launcher_search_view.cc b/ash/app_list/views/productivity_launcher_search_view.cc
index 91b91d5f..05c8976 100644
--- a/ash/app_list/views/productivity_launcher_search_view.cc
+++ b/ash/app_list/views/productivity_launcher_search_view.cc
@@ -16,6 +16,7 @@
 #include "ash/app_list/views/search_result_list_view.h"
 #include "ash/app_list/views/search_result_view.h"
 #include "ash/constants/ash_features.h"
+#include "ash/controls/rounded_scroll_bar.h"
 #include "ash/public/cpp/app_list/app_list_color_provider.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/bind.h"
@@ -43,6 +44,9 @@
 // result page changes are delayed.
 constexpr base::TimeDelta kNotifyA11yDelay = base::Milliseconds(1500);
 
+// Insets for the vertical scroll bar.
+constexpr gfx::Insets kVerticalScrollInsets(1, 0, 1, 1);
+
 }  // namespace
 
 ProductivityLauncherSearchView::ProductivityLauncherSearchView(
@@ -60,11 +64,18 @@
       views::ScrollView::ScrollWithLayers::kEnabled));
   scroll_view_->ClipHeightTo(0, std::numeric_limits<int>::max());
   scroll_view_->SetDrawOverflowIndicator(false);
-  scroll_view_->SetHorizontalScrollBarMode(
-      views::ScrollView::ScrollBarMode::kDisabled);
+
   // Don't paint a background. The bubble already has one.
   scroll_view_->SetBackgroundColor(absl::nullopt);
 
+  // Set up scroll bars.
+  scroll_view_->SetHorizontalScrollBarMode(
+      views::ScrollView::ScrollBarMode::kDisabled);
+  auto vertical_scroll =
+      std::make_unique<RoundedScrollBar>(/*horizontal=*/false);
+  vertical_scroll->SetInsets(kVerticalScrollInsets);
+  scroll_view_->SetVerticalScrollBar(std::move(vertical_scroll));
+
   auto scroll_contents = std::make_unique<views::View>();
   scroll_contents->SetLayoutManager(
       std::make_unique<BoxLayout>(BoxLayout::Orientation::kVertical));
@@ -150,6 +161,8 @@
     result_count += view->num_results();
   }
 
+  SearchResultBaseView* first_result_view = nullptr;
+
   // If the user cleared the search box text, skip animating the views. The
   // visible views will animate out and the whole search page will be hidden.
   // See AppListBubbleSearchPage::AnimateHidePage().
@@ -164,6 +177,10 @@
           container_animation_info->total_views;
       aggregate_animation_info.animating_views +=
           container_animation_info->animating_views;
+      // Fetch the first visible search result view for search box autocomplete.
+      if (!first_result_view && view->GetFirstResultView()) {
+        first_result_view = view->GetFirstResultView();
+      }
     }
   }
   Layout();
@@ -171,10 +188,6 @@
   last_search_result_count_ = result_count;
 
   ScheduleResultsChangedA11yNotification();
-  // Find the first result view.
-  DCHECK(!result_container_views_.empty());
-  SearchResultBaseView* first_result_view =
-      result_container_views_.front()->GetFirstResultView();
 
   // Reset selection to first when things change. The first result is set as
   // as the default result.
@@ -183,7 +196,11 @@
                                                /*default_selection=*/true);
   // Update SearchBoxView search box autocomplete as necessary based on new
   // first result view.
-  search_box_view_->ProcessAutocomplete(first_result_view);
+  if (first_result_view) {
+    search_box_view_->ProcessAutocomplete(first_result_view);
+  } else {
+    search_box_view_->ClearAutocompleteText();
+  }
 }
 
 void ProductivityLauncherSearchView::GetAccessibleNodeData(
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index ec21107..e3f5143 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -582,6 +582,22 @@
   ClearAutocompleteText();
 }
 
+void SearchBoxView::ClearAutocompleteText() {
+  if (!ShouldProcessAutocomplete())
+    return;
+
+  // Avoid triggering subsequent query by temporarily setting controller to
+  // nullptr.
+  search_box()->set_controller(nullptr);
+  // search_box()->ClearCompositionText() does not work here because
+  // SetAutocompleteText() calls SelectRange(), which comfirms the active
+  // composition text (so there is nothing to clear here). Set empty composition
+  // text to clear the selected range.
+  search_box()->SetCompositionText(ui::CompositionText());
+  search_box()->set_controller(this);
+  ResetHighlightRange();
+}
+
 void SearchBoxView::OnResultContainerVisibilityChanged(bool visible) {
   if (search_result_page_visible_ == visible)
     return;
@@ -632,22 +648,6 @@
          highlight_range_.length() > 0;
 }
 
-void SearchBoxView::ClearAutocompleteText() {
-  if (!ShouldProcessAutocomplete())
-    return;
-
-  // Avoid triggering subsequent query by temporarily setting controller to
-  // nullptr.
-  search_box()->set_controller(nullptr);
-  // search_box()->ClearCompositionText() does not work here because
-  // SetAutocompleteText() calls SelectRange(), which comfirms the active
-  // composition text (so there is nothing to clear here). Set empty composition
-  // text to clear the selected range.
-  search_box()->SetCompositionText(ui::CompositionText());
-  search_box()->set_controller(this);
-  ResetHighlightRange();
-}
-
 void SearchBoxView::OnBeforeUserAction(views::Textfield* sender) {
   if (a11y_active_descendant_)
     SetA11yActiveDescendant(absl::nullopt);
diff --git a/ash/app_list/views/search_box_view.h b/ash/app_list/views/search_box_view.h
index e628c868..f4eb15a 100644
--- a/ash/app_list/views/search_box_view.h
+++ b/ash/app_list/views/search_box_view.h
@@ -115,6 +115,9 @@
   // Sets the autocomplete text if autocomplete conditions are met.
   void ProcessAutocomplete(SearchResultBaseView* first_result_view);
 
+  // Removes all autocomplete text.
+  void ClearAutocompleteText();
+
   // Updates the search box with |new_query| and starts a new search.
   void UpdateQuery(const std::u16string& new_query);
 
@@ -157,9 +160,6 @@
   // search_box().
   bool HasAutocompleteText();
 
-  // Removes all autocomplete text.
-  void ClearAutocompleteText();
-
   // After verifying autocomplete text is valid, sets the current searchbox
   // text to the autocomplete text and sets the text highlight.
   void SetAutocompleteText(const std::u16string& autocomplete_text);
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc
index dc1e640..a5f55de 100644
--- a/ash/app_list/views/search_box_view_unittest.cc
+++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -1171,7 +1171,7 @@
   base::test::ScopedFeatureList scoped_features_;
 };
 
-TEST_F(SearchBoxViewAppListBubbleTest, Autocomplete) {
+TEST_F(SearchBoxViewAppListBubbleTest, AutocompleteAnswerCard) {
   GetAppListTestHelper()->ShowAppList();
 
   // Type "he".
@@ -1180,12 +1180,41 @@
 
   // Simulate "hello" being returned as a search result.
   AddAnswerCardResult("id", u"hello");
+  AddSearchResult("id", u"world");
   base::RunLoop().RunUntilIdle();  // Allow observer tasks to run.
 
   // The text autocompletes to "hello" and selects "llo".
   SearchBoxView* view = GetAppListTestHelper()->GetBubbleSearchBoxView();
   EXPECT_EQ(view->search_box()->GetText(), u"hello");
   EXPECT_EQ(view->search_box()->GetSelectedText(), u"llo");
+
+  GetSearchModel()->DeleteAllResults();
+  base::RunLoop().RunUntilIdle();  // Allow observer tasks to run.
+  EXPECT_EQ(view->search_box()->GetText(), u"he");
+  EXPECT_EQ(view->search_box()->GetSelectedText(), u"");
+}
+
+TEST_F(SearchBoxViewAppListBubbleTest, AutocompleteCategoricalResult) {
+  GetAppListTestHelper()->ShowAppList();
+
+  // Type "he".
+  PressAndReleaseKey(ui::VKEY_H);
+  PressAndReleaseKey(ui::VKEY_E);
+
+  // Simulate "hello" being returned as a search result.
+  AddSearchResult("id", u"hello");
+  AddSearchResult("id", u"world");
+  base::RunLoop().RunUntilIdle();  // Allow observer tasks to run.
+
+  // The text autocompletes to "hello" and selects "llo".
+  SearchBoxView* view = GetAppListTestHelper()->GetBubbleSearchBoxView();
+  EXPECT_EQ(view->search_box()->GetText(), u"hello");
+  EXPECT_EQ(view->search_box()->GetSelectedText(), u"llo");
+
+  GetSearchModel()->DeleteAllResults();
+  base::RunLoop().RunUntilIdle();  // Allow observer tasks to run.
+  EXPECT_EQ(view->search_box()->GetText(), u"he");
+  EXPECT_EQ(view->search_box()->GetSelectedText(), u"");
 }
 
 TEST_F(SearchBoxViewAppListBubbleTest, ResultSelection) {
diff --git a/ash/capture_mode/capture_mode_camera_controller.cc b/ash/capture_mode/capture_mode_camera_controller.cc
index b8a1dec4..bb52d5a1 100644
--- a/ash/capture_mode/capture_mode_camera_controller.cc
+++ b/ash/capture_mode/capture_mode_camera_controller.cc
@@ -113,6 +113,10 @@
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
   params.parent = CaptureModeController::Get()->GetCameraPreviewParentWindow();
   params.bounds = bounds;
+  // Need to set `params.child` to true here, otherwise camera preview widget
+  // will be added as a transient child to `params.parent`. For more details,
+  // please check `NativeWidgetAura::InitNativeWidget`.
+  params.child = true;
   params.name = "CameraPreviewWidget";
   camera_preview_widget->Init(std::move(params));
   StackingPreviewAtTop(camera_preview_widget.get());
@@ -363,7 +367,6 @@
 
 gfx::Rect CaptureModeCameraController::GetPreviewWidgetBounds() const {
   auto* controller = CaptureModeController::Get();
-  DCHECK_EQ(CaptureModeType::kVideo, controller->type());
   DCHECK(controller->IsActive() || controller->is_recording_in_progress());
   const gfx::Rect confine_bounds = controller->GetCameraPreviewConfineBounds();
   const gfx::Size preview_size = camera_preview_view_
diff --git a/ash/capture_mode/capture_mode_camera_unittests.cc b/ash/capture_mode/capture_mode_camera_unittests.cc
index 5a0be2b..1907cdc 100644
--- a/ash/capture_mode/capture_mode_camera_unittests.cc
+++ b/ash/capture_mode/capture_mode_camera_unittests.cc
@@ -17,6 +17,7 @@
 #include "ash/capture_mode/fake_video_source_provider.h"
 #include "ash/capture_mode/test_capture_mode_delegate.h"
 #include "ash/constants/ash_features.h"
+#include "ash/display/window_tree_host_manager.h"
 #include "ash/public/cpp/capture_mode/capture_mode_test_api.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -26,7 +27,9 @@
 #include "base/system/system_monitor.h"
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/views/widget/widget.h"
+#include "ui/wm/core/coordinate_conversion.h"
 
 namespace ash {
 
@@ -45,6 +48,22 @@
   return CaptureModeController::Get()->camera_controller();
 }
 
+// Returns the current root window where the current capture activities are
+// hosted in.
+aura::Window* GetCurrentRoot() {
+  auto* controller = CaptureModeController::Get();
+  if (controller->IsActive())
+    return controller->capture_mode_session()->current_root();
+
+  if (controller->is_recording_in_progress()) {
+    return controller->video_recording_watcher_for_testing()
+        ->window_being_recorded()
+        ->GetRootWindow();
+  }
+
+  return Shell::GetPrimaryRootWindow();
+}
+
 // Defines a waiter for the camera devices change notifications.
 class CameraDevicesChangeWaiter : public CaptureModeCameraController::Observer {
  public:
@@ -840,6 +859,31 @@
       preview_widget->GetWindowBoundsInScreen()));
 }
 
+// Tests that switching from `kImage` to `kVideo` with capture source `kWindow`,
+// and capture window is already selected before the switch, the camera preview
+// widget should be positioned and parented correctly.
+TEST_F(CaptureModeCameraTest, CameraPreviewWidgetAfterTypeSwitched) {
+  auto* controller =
+      StartCaptureSession(CaptureModeSource::kWindow, CaptureModeType::kImage);
+  auto* camera_controller = GetCameraController();
+  GetEventGenerator()->MoveMouseToCenterOf(window());
+
+  AddDefaultCamera();
+  camera_controller->SetSelectedCamera(CameraId(kDefaultCameraModelId, 1));
+
+  controller->SetType(CaptureModeType::kVideo);
+  const auto* camera_preview_widget =
+      camera_controller->camera_preview_widget();
+  EXPECT_TRUE(camera_preview_widget);
+  auto* parent = camera_preview_widget->GetNativeWindow()->parent();
+  const auto* selected_window =
+      controller->capture_mode_session()->GetSelectedWindow();
+  ASSERT_EQ(parent, selected_window);
+
+  // Verify that camera preview is at the bottom right corner of the window.
+  VerifyPreviewAlignment(selected_window->GetBoundsInScreen());
+}
+
 // Tests that audio and camera menu groups should be hidden from the settings
 // menu when there's a video recording in progress.
 TEST_F(CaptureModeCameraTest,
@@ -984,6 +1028,108 @@
                                    ->GetWindowBoundsInScreen()
                                    .CenterPoint());
   EXPECT_EQ(window(), controller->capture_mode_session()->GetSelectedWindow());
+
+  controller->Stop();
 }
 
+class CameraPreviewBoundsTest
+    : public CaptureModeCameraTest,
+      public testing::WithParamInterface<CaptureModeSource> {
+ public:
+  CameraPreviewBoundsTest() = default;
+  CameraPreviewBoundsTest(
+      const CameraPreviewBoundsTest& capture_mode_save_file_test) = delete;
+  CameraPreviewBoundsTest& operator=(const CameraPreviewBoundsTest&) = delete;
+  ~CameraPreviewBoundsTest() override = default;
+
+  void StartCaptureSessionWithParam() {
+    auto* controller = CaptureModeController::Get();
+    const gfx::Rect capture_region(10, 20, 1300, 750);
+    controller->SetUserCaptureRegion(capture_region, /*by_user=*/true);
+    // Set the window's bounds big enough here to make sure after display
+    // rotation, the event is located on top of `window_`.
+    // TODO(conniekxu): investigate why the position of the event received is
+    // different than the position we pass.
+    window()->SetBounds({30, 40, 1300, 750});
+
+    StartCaptureSession(GetParam(), CaptureModeType::kVideo);
+    if (GetParam() == CaptureModeSource::kWindow)
+      GetEventGenerator()->MoveMouseToCenterOf(window());
+  }
+
+  // Based on the `CaptureModeSource`, it returns the current capture region's
+  // bounds in screen.
+  gfx::Rect GetCaptureBoundsInScreen() {
+    auto* controller = CaptureModeController::Get();
+    auto* root = GetCurrentRoot();
+
+    switch (GetParam()) {
+      case CaptureModeSource::kFullscreen:
+        return display::Screen::GetScreen()
+            ->GetDisplayNearestWindow(root)
+            .work_area();
+
+      case CaptureModeSource::kRegion: {
+        auto* recording_watcher =
+            controller->video_recording_watcher_for_testing();
+        gfx::Rect capture_region =
+            controller->is_recording_in_progress()
+                ? recording_watcher->GetEffectivePartialRegionBounds()
+                : controller->user_capture_region();
+        wm::ConvertRectToScreen(root, &capture_region);
+        return capture_region;
+      }
+
+      case CaptureModeSource::kWindow:
+        return window()->GetBoundsInScreen();
+    }
+  }
+};
+
+// Tests that camera preview's bounds is updated after display rotations with
+// two use cases, when capture session is active and when there's a video
+// recording in progress.
+TEST_P(CameraPreviewBoundsTest, DisplayRotation) {
+  StartCaptureSessionWithParam();
+  auto* camera_controller = GetCameraController();
+  AddDefaultCamera();
+  camera_controller->SetSelectedCamera(CameraId(kDefaultCameraModelId, 1));
+
+  // Verify that the camera preview should be at the bottom right corner of
+  // capture bounds.
+  VerifyPreviewAlignment(GetCaptureBoundsInScreen());
+
+  // Rotate the primary display by 90 degrees. Verify that the camera preview is
+  // still at the bottom right corner of capture bounds.
+  Shell::Get()->display_manager()->SetDisplayRotation(
+      WindowTreeHostManager::GetPrimaryDisplayId(), display::Display::ROTATE_90,
+      display::Display::RotationSource::USER);
+  VerifyPreviewAlignment(GetCaptureBoundsInScreen());
+
+  // Start video recording, verify camera preview's bounds is updated after
+  // display rotations when there's a video recording in progress.
+  StartVideoRecordingImmediately();
+  EXPECT_FALSE(CaptureModeController::Get()->IsActive());
+
+  // Rotate the primary display by 180 degrees. Verify that the camera preview
+  // is still at the bottom right corner of capture bounds.
+  Shell::Get()->display_manager()->SetDisplayRotation(
+      WindowTreeHostManager::GetPrimaryDisplayId(),
+      display::Display::ROTATE_180, display::Display::RotationSource::USER);
+  VerifyPreviewAlignment(GetCaptureBoundsInScreen());
+
+  // Rotate the primary display by 270 degrees. Verify that the camera preview
+  // is still at the bottom right corner of capture bounds.
+  Shell::Get()->display_manager()->SetDisplayRotation(
+      WindowTreeHostManager::GetPrimaryDisplayId(),
+      display::Display::ROTATE_270, display::Display::RotationSource::USER);
+  VerifyPreviewAlignment(GetCaptureBoundsInScreen());
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         CameraPreviewBoundsTest,
+                         testing::Values(CaptureModeSource::kFullscreen,
+                                         CaptureModeSource::kRegion,
+                                         CaptureModeSource::kWindow));
+
 }  // namespace ash
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 325b1c1..f966ea82 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -533,8 +533,10 @@
   if (!user_capture_region_.IsEmpty() && by_user)
     last_capture_region_update_time_ = base::TimeTicks::Now();
 
-  if (camera_controller_ && !is_recording_in_progress())
+  if (camera_controller_ && !is_recording_in_progress() &&
+      source_ == CaptureModeSource::kRegion) {
     camera_controller_->MaybeReparentPreviewWidget();
+  }
 }
 
 bool CaptureModeController::CanShowUserNudge() const {
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index c9239eb..88bbe3d7 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -1029,6 +1029,17 @@
   RefreshBarWidgetBounds();
   MaybeUpdateSettingsBounds();
 
+  // Only need to update the camera preview's bounds if the capture source is
+  // `kFullscreen`, since `ClampCaptureRegionToRootWindowSize` will take care of
+  // it if the source is `kRegion`.
+  // `CaptureWindowObserver::OnWindowBoundsChanged` will take care of it if the
+  // source is `kWindow`.
+  if (controller_->camera_controller() &&
+      controller_->source() == CaptureModeSource::kFullscreen &&
+      !controller_->is_recording_in_progress()) {
+    controller_->camera_controller()->MaybeUpdatePreviewWidgetBounds();
+  }
+
   if (capture_label_widget_)
     UpdateCaptureLabelWidget(CaptureLabelAnimation::kNone);
   layer()->SchedulePaint(layer()->bounds());
diff --git a/ash/capture_mode/capture_window_observer.cc b/ash/capture_mode/capture_window_observer.cc
index 7a04398..eaa77fb 100644
--- a/ash/capture_mode/capture_window_observer.cc
+++ b/ash/capture_mode/capture_window_observer.cc
@@ -76,6 +76,13 @@
     ui::PropertyChangeReason reason) {
   DCHECK_EQ(window, window_);
   RepaintCaptureRegion();
+
+  // The bounds of camera preview should be updated accordingly if the bounds of
+  // the selected window has been updated.
+  auto* controller = CaptureModeController::Get();
+  auto* camera_controller = controller->camera_controller();
+  if (camera_controller && !controller->is_recording_in_progress())
+    camera_controller->MaybeUpdatePreviewWidgetBounds();
 }
 
 void CaptureWindowObserver::OnWindowVisibilityChanging(aura::Window* window,
diff --git a/ash/capture_mode/video_recording_watcher.cc b/ash/capture_mode/video_recording_watcher.cc
index 5c8d04c..7809d593 100644
--- a/ash/capture_mode/video_recording_watcher.cc
+++ b/ash/capture_mode/video_recording_watcher.cc
@@ -295,7 +295,7 @@
           ->GetDisplayNearestWindow(window_being_recorded_)
           .work_area();
     case CaptureModeSource::kRegion: {
-      gfx::Rect capture_region = partial_region_bounds_;
+      gfx::Rect capture_region = GetEffectivePartialRegionBounds();
       wm::ConvertRectToScreen(current_root_, &capture_region);
       return capture_region;
     }
@@ -338,6 +338,12 @@
   window_size_change_throttle_timer_.Start(
       FROM_HERE, kWindowSizeChangeThrottleDelay, this,
       &VideoRecordingWatcher::OnWindowSizeChangeThrottleTimerFiring);
+
+  // The bounds of the camera preview should be updated if the bounds of the
+  // window being recorded is changed.
+  auto* camera_controller = controller_->camera_controller();
+  if (camera_controller)
+    camera_controller->MaybeUpdatePreviewWidgetBounds();
 }
 
 void VideoRecordingWatcher::OnWindowOpacitySet(
@@ -410,7 +416,8 @@
 
   gfx::ScopedCanvas scoped_canvas(canvas);
   const float dsf = canvas->UndoDeviceScaleFactor();
-  gfx::Rect region = gfx::ScaleToEnclosingRect(partial_region_bounds_, dsf);
+  gfx::Rect region =
+      gfx::ScaleToEnclosingRect(GetEffectivePartialRegionBounds(), dsf);
   region.Inset(-capture_mode::kCaptureRegionBorderStrokePx,
                -capture_mode::kCaptureRegionBorderStrokePx);
   canvas->FillRect(region, SK_ColorTRANSPARENT, SkBlendMode::kClear);
@@ -454,6 +461,13 @@
   controller_->PushNewRootSizeToRecordingService(
       root_bounds.size(), current_root_->GetHost()->device_scale_factor());
 
+  // The bounds of camera preview should be updated accordingly if the display
+  // metrics is changed. When the capture source is `kWindow`, it will be
+  // handled in `OnWindowBoundsChanged`;
+  auto* camera_controller = controller_->camera_controller();
+  if (camera_controller && recording_source_ != CaptureModeSource::kWindow)
+    camera_controller->MaybeUpdatePreviewWidgetBounds();
+
   // We don't show a dimming overlay when recording a fullscreen.
   if (recording_source_ == CaptureModeSource::kFullscreen)
     return;
@@ -513,6 +527,13 @@
           : GetCursorLocationInWindow(window_being_recorded_));
 }
 
+gfx::Rect VideoRecordingWatcher::GetEffectivePartialRegionBounds() const {
+  DCHECK_EQ(recording_source_, CaptureModeSource::kRegion);
+  gfx::Rect result = current_root_->bounds();
+  result.Intersect(partial_region_bounds_);
+  return result;
+}
+
 bool VideoRecordingWatcher::IsWindowDimmedForTesting(
     aura::Window* window) const {
   return dimmers_.contains(window);
@@ -772,7 +793,7 @@
 
 gfx::Rect VideoRecordingWatcher::GetOverlayWidgetBounds() const {
   gfx::Rect bounds = recording_source_ == CaptureModeSource::kRegion
-                         ? partial_region_bounds_
+                         ? GetEffectivePartialRegionBounds()
                          : gfx::Rect(window_being_recorded_->bounds().size());
   bounds.Subtract(Shell::Get()
                       ->docked_magnifier_controller()
diff --git a/ash/capture_mode/video_recording_watcher.h b/ash/capture_mode/video_recording_watcher.h
index 89272bf..15f8a66a 100644
--- a/ash/capture_mode/video_recording_watcher.h
+++ b/ash/capture_mode/video_recording_watcher.h
@@ -131,6 +131,11 @@
   // CursorWindowController::Observer:
   void OnCursorCompositingStateChanged(bool enabled) override;
 
+  // Returns the `partial_region_bounds_` clamped to the bounds of the
+  // `current_root_`. It should only be called if `recording_source_` is
+  // `kRegion`.
+  gfx::Rect GetEffectivePartialRegionBounds() const;
+
   bool IsWindowDimmedForTesting(aura::Window* window) const;
 
   void BindCursorOverlayForTesting(
diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc
index 8e96758..e785da4 100644
--- a/ash/components/arc/arc_features.cc
+++ b/ash/components/arc/arc_features.cc
@@ -63,6 +63,10 @@
 const base::Feature kEnableUsap{"ArcEnableUsap",
                                 base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Controls whether ARCVM uses virtio-blk for /data in Android storage.
+const base::Feature kEnableVirtioBlkForData{"ArcEnableVirtioBlkForData",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls experimental file picker feature for ARC.
 const base::Feature kFilePickerExperimentFeature{
     "ArcFilePickerExperiment", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ash/components/arc/arc_features.h b/ash/components/arc/arc_features.h
index ed877941..232b61fd 100644
--- a/ash/components/arc/arc_features.h
+++ b/ash/components/arc/arc_features.h
@@ -23,6 +23,7 @@
 extern const base::Feature kEnableUnifiedAudioFocusFeature;
 extern const base::Feature kEnableUnmanagedToManagedTransitionFeature;
 extern const base::Feature kEnableUsap;
+extern const base::Feature kEnableVirtioBlkForData;
 extern const base::Feature kFilePickerExperimentFeature;
 extern const base::Feature kGmsCoreLowMemoryKillerProtection;
 extern const base::Feature kGuestZram;
diff --git a/ash/components/arc/arc_util.cc b/ash/components/arc/arc_util.cc
index 1f65d7d..30cb09c 100644
--- a/ash/components/arc/arc_util.cc
+++ b/ash/components/arc/arc_util.cc
@@ -188,6 +188,11 @@
              ash::switches::kArcStartMode) == kManualStart;
 }
 
+bool ShouldMountVmDebugFs() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      ash::switches::kArcVmMountDebugFs);
+}
+
 bool ShouldShowOptInForTesting() {
   return base::CommandLine::ForCurrentProcess()->HasSwitch(
       ash::switches::kArcForceShowOptInUi);
diff --git a/ash/components/arc/arc_util.h b/ash/components/arc/arc_util.h
index 16d9110d..f25383b 100644
--- a/ash/components/arc/arc_util.h
+++ b/ash/components/arc/arc_util.h
@@ -128,6 +128,9 @@
 // manually in tests using autotest API |startArc|.
 bool ShouldArcStartManually();
 
+// Returns true if the debugfs file system should me mounted in ARCVM.
+bool ShouldMountVmDebugFs();
+
 // Returns true if ARC OptIn ui needs to be shown for testing.
 bool ShouldShowOptInForTesting();
 
diff --git a/ash/components/arc/arc_util_unittest.cc b/ash/components/arc/arc_util_unittest.cc
index 64487b2..dfeb360 100644
--- a/ash/components/arc/arc_util_unittest.cc
+++ b/ash/components/arc/arc_util_unittest.cc
@@ -323,6 +323,15 @@
   EXPECT_TRUE(IsArcVmDevConfIgnored());
 }
 
+TEST_F(ArcUtilTest, GetShouldMountVmDebugFs) {
+  auto* command_line = base::CommandLine::ForCurrentProcess();
+  command_line->InitFromArgv({""});
+  EXPECT_FALSE(ShouldMountVmDebugFs());
+
+  command_line->InitFromArgv({"", "--arcvm-mount-debugfs"});
+  EXPECT_TRUE(ShouldMountVmDebugFs());
+}
+
 TEST_F(ArcUtilTest, GetArcVmUreadaheadMode) {
   constexpr char kArcMemProfile4GbName[] = "4G";
   constexpr char kArcMemProfile8GbName[] = "8G";
diff --git a/ash/components/arc/session/arc_vm_client_adapter.cc b/ash/components/arc/session/arc_vm_client_adapter.cc
index 38ac340..75d34d6 100644
--- a/ash/components/arc/session/arc_vm_client_adapter.cc
+++ b/ash/components/arc/session/arc_vm_client_adapter.cc
@@ -246,6 +246,9 @@
       base::StringPrintf("androidboot.zram_size=%d", guest_zram_size),
   };
 
+  if (ShouldMountVmDebugFs())
+    result.push_back("androidboot.arcvm_mount_debugfs=1");
+
   const ArcVmUreadaheadMode mode =
       GetArcVmUreadaheadMode(base::BindRepeating(&base::GetSystemMemoryInfo));
   switch (mode) {
@@ -271,6 +274,8 @@
   if (start_params.arc_generate_play_auto_install)
     result.push_back("androidboot.arc_generate_pai=1");
 
+  result.push_back("androidboot.arcvm_virtio_blk_data=0");
+
   // Conditionally sets some properties based on |start_params|.
   switch (start_params.play_store_auto_update) {
     case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_DEFAULT:
diff --git a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
index e376ca3..54a92d4 100644
--- a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
+++ b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -1376,6 +1376,22 @@
                      "androidboot.disable_media_store_maintenance=1"));
 }
 
+TEST_F(ArcVmClientAdapterTest, StartMiniArc_ArcVmMountDebugFsDefaultDisabled) {
+  StartMiniArcWithParams(true, GetPopulatedStartParams());
+  EXPECT_FALSE(
+      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
+                     "androidboot.arcvm_mount_debugfs=1"));
+}
+
+TEST_F(ArcVmClientAdapterTest, StartMiniArc_ArcVmMountDebugFsEnabled) {
+  base::CommandLine::ForCurrentProcess()->InitFromArgv(
+      {"", "--arcvm-mount-debugfs"});
+  StartMiniArcWithParams(true, GetPopulatedStartParams());
+  EXPECT_TRUE(
+      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
+                     "androidboot.arcvm_mount_debugfs=1"));
+}
+
 TEST_F(ArcVmClientAdapterTest, StartUpgradeArc_ArcVmUreadaheadMode) {
   StartParams start_params(GetPopulatedStartParams());
   SetValidUserInfo();
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc
index 02b24fb..a2e74d5 100644
--- a/ash/constants/ash_switches.cc
+++ b/ash/constants/ash_switches.cc
@@ -149,6 +149,11 @@
 // Sets ARC Terms Of Service hostname url for testing.
 const char kArcTosHostForTests[] = "arc-tos-host-for-tests";
 
+// Mounts the debugfs file system if this flag is set.
+// Debugfs was removed in Android S to meet GTS requirements, but for ureadahead
+// tracing we need to enable it in developer mode only.
+const char kArcVmMountDebugFs[] = "arcvm-mount-debugfs";
+
 // Sets the mode of operation for ureadahead during ARCVM boot. If this switch
 // is not set, ARCVM ureadahead will check for the presence and age of pack
 // file and reads ahead files to page cache for improved boot performance.
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h
index b828680..1a6cedf 100644
--- a/ash/constants/ash_switches.h
+++ b/ash/constants/ash_switches.h
@@ -53,6 +53,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcScale[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcStartMode[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcTosHostForTests[];
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcVmMountDebugFs[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcVmUreadaheadMode[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kArcVmUseHugePages[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kAshClearFastInkBuffer[];
diff --git a/ash/quick_pair/common/BUILD.gn b/ash/quick_pair/common/BUILD.gn
index e0828a2c..e8833f1e 100644
--- a/ash/quick_pair/common/BUILD.gn
+++ b/ash/quick_pair/common/BUILD.gn
@@ -82,7 +82,6 @@
     "device_unittest.cc",
     "fast_pair/fast_pair_decoder_unittest.cc",
     "fast_pair/fast_pair_feature_usage_metrics_logger_unittest.cc",
-    "log_buffer_unittest.cc",
     "logging_unittest.cc",
   ]
 
diff --git a/ash/quick_pair/common/log_buffer_unittest.cc b/ash/quick_pair/common/log_buffer_unittest.cc
deleted file mode 100644
index cf3b89b..0000000
--- a/ash/quick_pair/common/log_buffer_unittest.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/quick_pair/common/log_buffer.h"
-
-#include <stddef.h>
-
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace ash {
-namespace quick_pair {
-
-class QuickPairLogBufferTest : public testing::Test,
-                               public LogBuffer::Observer {
- public:
-  void SetUp() override {
-    log_buffer_ = LogBuffer::GetInstance();
-    log_buffer_->AddObserver(this);
-  }
-
-  void TearDown() override { log_buffer_->RemoveObserver(this); }
-
-  void OnLogMessageAdded(const LogBuffer::LogMessage& log_message) override {
-    log_messages_.push_back(log_message);
-  }
-
-  void OnLogBufferCleared() override { log_messages_.clear(); }
-
- protected:
-  std::vector<LogBuffer::LogMessage> log_messages_;
-  LogBuffer* log_buffer_ = nullptr;
-};
-
-TEST_F(QuickPairLogBufferTest, ObserversNotifiedWhenLogsAdded) {
-  LogBuffer::GetInstance()->AddLogMessage(LogBuffer::LogMessage(
-      /*text=*/"text", /*time=*/base::Time::Now(), /*file=*/"file", /*line=*/0,
-      /*severity=*/logging::LOGGING_WARNING));
-  EXPECT_EQ(log_messages_.size(), 1u);
-}
-
-TEST_F(QuickPairLogBufferTest, ObserversNotifiedWhenLogBufferCleared) {
-  LogBuffer::GetInstance()->Clear();
-  EXPECT_EQ(log_messages_.size(), 0u);
-}
-
-}  // namespace quick_pair
-}  // namespace ash
diff --git a/ash/quick_pair/common/logging.cc b/ash/quick_pair/common/logging.cc
index 12daeff..741bf584 100644
--- a/ash/quick_pair/common/logging.cc
+++ b/ash/quick_pair/common/logging.cc
@@ -10,12 +10,29 @@
 namespace ash {
 namespace quick_pair {
 
+namespace {
+
+bool g_logging_enabled = true;
+
+}  // namespace
+
+ScopedDisableLoggingForTesting::ScopedDisableLoggingForTesting() {
+  g_logging_enabled = false;
+}
+
+ScopedDisableLoggingForTesting::~ScopedDisableLoggingForTesting() {
+  g_logging_enabled = true;
+}
+
 ScopedLogMessage::ScopedLogMessage(const char* file,
                                    int line,
                                    logging::LogSeverity severity)
     : file_(file), line_(line), severity_(severity) {}
 
 ScopedLogMessage::~ScopedLogMessage() {
+  if (!g_logging_enabled)
+    return;
+
   const std::string string_from_stream = stream_.str();
   LogBuffer::GetInstance()->AddLogMessage(LogBuffer::LogMessage(
       string_from_stream, base::Time::Now(), file_, line_, severity_));
diff --git a/ash/quick_pair/common/logging.h b/ash/quick_pair/common/logging.h
index 649aa02..7111671a 100644
--- a/ash/quick_pair/common/logging.h
+++ b/ash/quick_pair/common/logging.h
@@ -27,6 +27,14 @@
                                     logging::LOG_##severity) \
       .stream()
 
+// Disables all logging while in scope. Intended to be called only from test
+// code, to clean up test output.
+class COMPONENT_EXPORT(QUICK_PAIR_COMMON) ScopedDisableLoggingForTesting {
+ public:
+  ScopedDisableLoggingForTesting();
+  ~ScopedDisableLoggingForTesting();
+};
+
 // An intermediate object used by the QP_LOG macro, wrapping a
 // logging::LogMessage instance. When this object is destroyed, the message will
 // be logged with the standard logging system and also added to Proximity Auth
diff --git a/ash/services/nearby/public/cpp/fake_tcp_socket_factory.cc b/ash/services/nearby/public/cpp/fake_tcp_socket_factory.cc
index 0a7b73f..aad35edc 100644
--- a/ash/services/nearby/public/cpp/fake_tcp_socket_factory.cc
+++ b/ash/services/nearby/public/cpp/fake_tcp_socket_factory.cc
@@ -97,6 +97,7 @@
 }
 
 void FakeTcpSocketFactory::CreateTCPConnectedSocket(
+    base::TimeDelta timeout,
     const absl::optional<net::IPEndPoint>& local_addr,
     const net::AddressList& remote_addr_list,
     network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
diff --git a/ash/services/nearby/public/cpp/fake_tcp_socket_factory.h b/ash/services/nearby/public/cpp/fake_tcp_socket_factory.h
index 7f62afe9..f125023 100644
--- a/ash/services/nearby/public/cpp/fake_tcp_socket_factory.h
+++ b/ash/services/nearby/public/cpp/fake_tcp_socket_factory.h
@@ -51,6 +51,7 @@
       mojo::PendingReceiver<network::mojom::TCPServerSocket> socket,
       CreateTCPServerSocketCallback callback) override;
   void CreateTCPConnectedSocket(
+      base::TimeDelta timeout,
       const absl::optional<net::IPEndPoint>& local_addr,
       const net::AddressList& remote_addr_list,
       network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
diff --git a/ash/services/nearby/public/mojom/tcp_socket_factory.mojom b/ash/services/nearby/public/mojom/tcp_socket_factory.mojom
index 1ac67ccac..289198b7 100644
--- a/ash/services/nearby/public/mojom/tcp_socket_factory.mojom
+++ b/ash/services/nearby/public/mojom/tcp_socket_factory.mojom
@@ -5,6 +5,7 @@
 module sharing.mojom;
 
 import "ash/services/nearby/public/mojom/tcp_server_socket_port.mojom";
+import "mojo/public/mojom/base/time.mojom";
 import "services/network/public/mojom/address_list.mojom";
 import "services/network/public/mojom/ip_address.mojom";
 import "services/network/public/mojom/ip_endpoint.mojom";
@@ -27,8 +28,13 @@
       pending_receiver<network.mojom.TCPServerSocket> socket)
       => (int32 result, network.mojom.IPEndPoint? local_addr_out);
 
-  // See //services/network/public/mojom/network_context.mojom.
+  // See //services/network/public/mojom/network_context.mojom. One
+  // modification is a user-defined |timeout|. There is timeout logic in the
+  // networking stack, but it is not configurable and can be too long in
+  // practice (over 2 minutes). The networking stack timeout can still be
+  // triggered if |timeout| is too long.
   CreateTCPConnectedSocket(
+      mojo_base.mojom.TimeDelta timeout,
       network.mojom.IPEndPoint? local_addr,
       network.mojom.AddressList remote_addr_list,
       network.mojom.TCPConnectedSocketOptions? tcp_connected_socket_options,
diff --git a/ash/shell.cc b/ash/shell.cc
index 1f07e60a..f123131 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -606,6 +606,12 @@
 
 Shell::~Shell() {
   TRACE_EVENT0("shutdown", "ash::Shell::Destructor");
+#if DCHECK_IS_ON()
+  // All WindowEventDispatchers should be shutdown before the Shell is
+  // destroyed.
+  for (RootWindowController* rwc : GetAllRootWindowControllers())
+    DCHECK(rwc->GetHost()->dispatcher()->in_shutdown());
+#endif
   login_unlock_throughput_recorder_.reset();
 
   hud_display::HUDDisplayView::Destroy();
diff --git a/ash/system/message_center/metrics_utils.cc b/ash/system/message_center/metrics_utils.cc
index 459df5f..300981b 100644
--- a/ash/system/message_center/metrics_utils.cc
+++ b/ash/system/message_center/metrics_utils.cc
@@ -492,5 +492,14 @@
       count);
 }
 
+void LogCountOfNotificationsInOneGroup(int notification_count) {
+  // `notification_count` might be zero if the parent doesn't have any child
+  // notification left after remove.
+  if (notification_count <= 0)
+    return;
+  base::UmaHistogramCounts100("Ash.Notification.CountOfNotificationsInOneGroup",
+                              notification_count);
+}
+
 }  // namespace metrics_utils
 }  // namespace ash
diff --git a/ash/system/message_center/metrics_utils.h b/ash/system/message_center/metrics_utils.h
index ff3fc475..7b49347 100644
--- a/ash/system/message_center/metrics_utils.h
+++ b/ash/system/message_center/metrics_utils.h
@@ -134,6 +134,9 @@
 // user logs in.
 void LogNotificationsShownInFirstMinute(int notifications_count);
 
+// Logs the number of notifications contained in a group.
+void LogCountOfNotificationsInOneGroup(int notification_count);
+
 }  // namespace metrics_utils
 
 }  // namespace ash
diff --git a/ash/system/message_center/metrics_utils_unittest.cc b/ash/system/message_center/metrics_utils_unittest.cc
index 2a26831..8cd5e047 100644
--- a/ash/system/message_center/metrics_utils_unittest.cc
+++ b/ash/system/message_center/metrics_utils_unittest.cc
@@ -27,6 +27,9 @@
 constexpr char kNotificationViewTypeHistogramName[] =
     "Ash.NotificationView.NotificationAdded.Type";
 
+constexpr char kCountInOneGroupHistogramName[] =
+    "Ash.Notification.CountOfNotificationsInOneGroup";
+
 const gfx::Image CreateTestImage() {
   SkBitmap bitmap;
   bitmap.allocN32Pixels(/*width=*/80, /*height=*/80);
@@ -50,6 +53,8 @@
 
 namespace ash {
 
+// This serves as an unit test class for all metrics recording in
+// notification/message center.
 class MessageCenterMetricsUtilsTest : public AshTestBase {
  public:
   MessageCenterMetricsUtilsTest() {
@@ -304,4 +309,36 @@
       metrics_utils::NotificationViewType::GROUPED_HAS_IMAGE_AND_INLINE_REPLY);
 }
 
+TEST_F(MessageCenterMetricsUtilsTest, RecordCountOfNotificationsInOneGroup) {
+  base::HistogramTester histograms;
+
+  auto notification1 = CreateTestNotification();
+  std::string id1 = notification1->id();
+  auto notification2 = CreateTestNotification();
+  std::string id2 = notification2->id();
+  auto notification3 = CreateTestNotification();
+
+  message_center::MessageCenter::Get()->AddNotification(
+      std::move(notification1));
+  message_center::MessageCenter::Get()->AddNotification(
+      std::move(notification2));
+
+  histograms.ExpectBucketCount(kCountInOneGroupHistogramName, 2, 1);
+
+  message_center::MessageCenter::Get()->AddNotification(
+      std::move(notification3));
+  histograms.ExpectBucketCount(kCountInOneGroupHistogramName, 3, 1);
+
+  message_center::MessageCenter::Get()->RemoveNotification(id1,
+                                                           /*by_user=*/true);
+  histograms.ExpectBucketCount(kCountInOneGroupHistogramName, 2, 2);
+
+  // Turn back to single notification when group has only 1 notification. The
+  // count should not be recorded in this case.
+  message_center::MessageCenter::Get()->RemoveNotification(id2,
+                                                           /*by_user=*/true);
+  histograms.ExpectBucketCount(kCountInOneGroupHistogramName, 1, 0);
+  histograms.ExpectBucketCount(kCountInOneGroupHistogramName, 0, 0);
+}
+
 }  // namespace ash
diff --git a/ash/system/message_center/notification_grouping_controller.cc b/ash/system/message_center/notification_grouping_controller.cc
index 62aeb12c..3c2b0be 100644
--- a/ash/system/message_center/notification_grouping_controller.cc
+++ b/ash/system/message_center/notification_grouping_controller.cc
@@ -5,6 +5,7 @@
 #include "ash/system/message_center/notification_grouping_controller.h"
 
 #include "ash/system/message_center/ash_message_popup_collection.h"
+#include "ash/system/message_center/metrics_utils.h"
 #include "ash/system/message_center/unified_message_center_bubble.h"
 #include "ash/system/message_center/unified_message_center_view.h"
 #include "ash/system/message_center/unified_message_list_view.h"
@@ -46,7 +47,8 @@
 
   // Remove a single child notification from a grouped notification.
   void RemoveGroupedChildNotification(const std::string& notification_id) {
-    std::string& parent_id = child_parent_map_[notification_id];
+    DCHECK(base::Contains(child_parent_map_, notification_id));
+    const std::string& parent_id = child_parent_map_[notification_id];
     notifications_in_parent_map_[parent_id].erase(notification_id);
     child_parent_map_.erase(notification_id);
   }
@@ -267,6 +269,7 @@
   copy->set_timestamp(parent_notification.timestamp() - base::Milliseconds(1));
   copy->set_settings_button_handler(
       parent_notification.rich_notification_data().settings_button_handler);
+  copy->set_fullscreen_visibility(parent_notification.fullscreen_visibility());
   copy->set_delegate(parent_notification.delegate());
 
   // After copying, set to be a group parent.
@@ -356,6 +359,10 @@
     parent_view->AddGroupNotification(*notification, /*newest_first=*/false);
   else
     message_center->ResetSinglePopup(parent_id);
+
+  metrics_utils::LogCountOfNotificationsInOneGroup(
+      grouped_notification_list_->GetGroupedNotificationsForParent(parent_id)
+          .size());
 }
 
 void NotificationGroupingController::OnNotificationDisplayed(
@@ -370,7 +377,14 @@
     bool by_user) {
   if (grouped_notification_list_->GroupedChildNotificationExists(
           notification_id)) {
+    const std::string parent_id =
+        grouped_notification_list_->GetParentForChild(notification_id);
+
     RemoveGroupedChild(notification_id);
+
+    metrics_utils::LogCountOfNotificationsInOneGroup(
+        grouped_notification_list_->GetGroupedNotificationsForParent(parent_id)
+            .size());
   }
 
   if (grouped_notification_list_->ParentNotificationExists(notification_id)) {
diff --git a/ash/system/network/vpn_list.cc b/ash/system/network/vpn_list.cc
index 18ab170..c02176df5 100644
--- a/ash/system/network/vpn_list.cc
+++ b/ash/system/network/vpn_list.cc
@@ -61,6 +61,7 @@
   // Add Third Party (Extension and Arc) providers.
   for (auto& provider : providers) {
     switch (provider->type) {
+      case VpnType::kIKEv2:
       case VpnType::kL2TPIPsec:
       case VpnType::kOpenVPN:
       case VpnType::kWireGuard:
diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc
index 3902a13..cb4af35a6 100644
--- a/ash/system/time/calendar_view.cc
+++ b/ash/system/time/calendar_view.cc
@@ -1165,7 +1165,7 @@
     return;
   }
 
-  set_should_months_animate(false);
+  SetShouldMonthsAnimateAndScrollEnabled(false);
   set_should_header_animate(false);
   gfx::Vector2dF moving_up_location = gfx::Vector2dF(
       0, previous_month_->GetPreferredSize().height() +
@@ -1204,6 +1204,7 @@
             if (!calendar_view)
               return;
             calendar_view->set_should_header_animate(true);
+            calendar_view->SetShouldMonthsAnimateAndScrollEnabled(true);
             calendar_view->ScrollOneMonthAndAutoScroll(scroll_up);
           },
           weak_factory_.GetWeakPtr(), scroll_up))
@@ -1211,6 +1212,7 @@
           [](base::WeakPtr<CalendarView> calendar_view, bool scroll_up) {
             if (!calendar_view)
               return;
+            calendar_view->SetShouldMonthsAnimateAndScrollEnabled(true);
             calendar_view->ScrollOneMonthAndAutoScroll(scroll_up);
           },
           weak_factory_.GetWeakPtr(), scroll_up))
diff --git a/ash/system/time/calendar_view_unittest.cc b/ash/system/time/calendar_view_unittest.cc
index 934f0f0..d563169 100644
--- a/ash/system/time/calendar_view_unittest.cc
+++ b/ash/system/time/calendar_view_unittest.cc
@@ -827,6 +827,19 @@
   views::View* previous_label() { return calendar_view_->previous_label_; }
   views::View* current_label() { return calendar_view_->current_label_; }
   views::View* next_label() { return calendar_view_->next_label_; }
+  views::ScrollView* scroll_view() { return calendar_view_->scroll_view_; }
+  views::ScrollView::ScrollBarMode GetScrollBarMode() {
+    return scroll_view()->GetVerticalScrollBarMode();
+  }
+
+  // The position of the `next_month_`.
+  int NextMonthPosition() {
+    return previous_label()->GetPreferredSize().height() +
+           calendar_view_->previous_month_->GetPreferredSize().height() +
+           current_label()->GetPreferredSize().height() +
+           calendar_view_->current_month_->GetPreferredSize().height();
+  }
+
   bool is_scrolling_up() { return calendar_view_->is_scrolling_up_; }
 
   void ScrollUpOneMonth() {
@@ -1033,6 +1046,81 @@
   EXPECT_EQ(u"2021", header_year()->GetText());
 }
 
+// The content view should not be scrollable when the month view is animating.
+TEST_F(CalendarViewAnimationTest, NotScrollableWhenAnimating) {
+  ui::ScopedAnimationDurationScaleMode test_duration_mode(
+      ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
+
+  base::Time date;
+  ASSERT_TRUE(base::Time::FromString("24 Oct 2021 10:00 GMT", &date));
+
+  CreateCalendarView();
+  // Gives it a duration to let the animation finish and pass the cool down
+  // duration.
+  task_environment()->FastForwardBy(
+      calendar_test_utils::kAnimationSettleDownDuration);
+  UpdateMonth(date);
+  task_environment()->FastForwardBy(
+      calendar_test_utils::kAnimationSettleDownDuration);
+
+  EXPECT_EQ(u"October", month_header()->GetText());
+  EXPECT_EQ(u"2021", header_year()->GetText());
+
+  // The scrll bar is enaled before tapping on the up button.
+  EXPECT_EQ(views::ScrollView::ScrollBarMode::kHiddenButEnabled,
+            GetScrollBarMode());
+
+  // Scrolls to the previous month.
+  ScrollUpOneMonth();
+
+  // If scrolls down, the month views and labels will be animating.
+  EXPECT_EQ(1.0f, header()->layer()->opacity());
+  task_environment()->FastForwardBy(
+      calendar_utils::kAnimationDurationForVisibility);
+  EXPECT_TRUE(current_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(next_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(next_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(previous_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(previous_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(current_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_EQ(u"October", month_header()->GetText());
+  EXPECT_EQ(u"2021", header_year()->GetText());
+
+  // Try to scrol to the next month.
+  scroll_view()->ScrollToPosition(scroll_view()->vertical_scroll_bar(),
+                                  NextMonthPosition());
+
+  // Should not scroll and keep showing the animation.
+  EXPECT_EQ(views::ScrollView::ScrollBarMode::kDisabled, GetScrollBarMode());
+  EXPECT_TRUE(current_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(next_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(next_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(previous_month()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(previous_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_TRUE(current_label()->layer()->GetAnimator()->is_animating());
+  EXPECT_EQ(u"October", month_header()->GetText());
+  EXPECT_EQ(u"2021", header_year()->GetText());
+
+  task_environment()->FastForwardBy(
+      calendar_test_utils::kAnimationSettleDownDuration);
+
+  // Animation finished. On the previous month.
+  EXPECT_EQ(u"September", month_header()->GetText());
+  EXPECT_EQ(u"2021", header_year()->GetText());
+  EXPECT_EQ(views::ScrollView::ScrollBarMode::kHiddenButEnabled,
+            GetScrollBarMode());
+
+  // Try to scroll to the next month. Should get to the next month.
+  scroll_view()->ScrollToPosition(scroll_view()->vertical_scroll_bar(),
+                                  NextMonthPosition());
+  EXPECT_EQ(views::ScrollView::ScrollBarMode::kHiddenButEnabled,
+            GetScrollBarMode());
+  task_environment()->FastForwardBy(
+      calendar_test_utils::kAnimationSettleDownDuration);
+  EXPECT_EQ(u"October", month_header()->GetText());
+  EXPECT_EQ(u"2021", header_year()->GetText());
+}
+
 // TODO(crbug.com/1298314) flaky test
 TEST_F(CalendarViewAnimationTest, DISABLED_ResetToTodayWithAnimation) {
   ui::ScopedAnimationDurationScaleMode test_duration_mode(
diff --git a/ash/webui/os_feedback_ui/resources/BUILD.gn b/ash/webui/os_feedback_ui/resources/BUILD.gn
index 33c0c02..32187b2 100644
--- a/ash/webui/os_feedback_ui/resources/BUILD.gn
+++ b/ash/webui/os_feedback_ui/resources/BUILD.gn
@@ -87,7 +87,10 @@
 }
 
 js_library("feedback_types") {
-  deps = [ "//ash/webui/os_feedback_ui/mojom:mojom_js_library_for_compile" ]
+  deps = [
+    "//ash/webui/common/resources:mojo_utils",
+    "//ash/webui/os_feedback_ui/mojom:mojom_js_library_for_compile",
+  ]
 }
 
 js_library("help_resources_icons") {
diff --git a/ash/webui/os_feedback_ui/resources/fake_data.js b/ash/webui/os_feedback_ui/resources/fake_data.js
index d80fee0c..5f56461 100644
--- a/ash/webui/os_feedback_ui/resources/fake_data.js
+++ b/ash/webui/os_feedback_ui/resources/fake_data.js
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {HelpContentList, HelpContentType, SearchRequest, SearchResponse, stringToMojoString16} from './feedback_types.js';
+import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
+import {HelpContentList, HelpContentType, SearchRequest, SearchResponse} from './feedback_types.js';
 
 /**
  * @fileoverview
diff --git a/ash/webui/os_feedback_ui/resources/fake_help_content_provider.js b/ash/webui/os_feedback_ui/resources/fake_help_content_provider.js
index 8933f67f..fb19006 100644
--- a/ash/webui/os_feedback_ui/resources/fake_help_content_provider.js
+++ b/ash/webui/os_feedback_ui/resources/fake_help_content_provider.js
@@ -3,8 +3,9 @@
 // found in the LICENSE file.
 
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
+import {mojoString16ToString} from 'chrome://resources/ash/common/mojo_utils.js';
 
-import {HelpContentProviderInterface, mojoString16ToString, SearchRequest, SearchResponse} from './feedback_types.js';
+import {HelpContentProviderInterface, SearchRequest, SearchResponse} from './feedback_types.js';
 
 /**
  * @fileoverview
diff --git a/ash/webui/os_feedback_ui/resources/feedback_types.js b/ash/webui/os_feedback_ui/resources/feedback_types.js
index 0e8943d..1790e16 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_types.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_types.js
@@ -9,34 +9,8 @@
 
 import '//resources/mojo/mojo/public/js/mojo_bindings_lite.js';
 import '//resources/mojo/url/mojom/url.mojom-lite.js';
-import '//resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
-import '//resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
 import './mojom/os_feedback_ui.mojom-lite.js';
 
-// TODO(xiangdongkong): Remove the following two functions once they have been
-// added to ash/common.
-/**
- * Converts a JS string to mojo_base::mojom::String16 object.
- * @param {string} str
- * @return {!mojoBase.mojom.String16}
- */
-export function stringToMojoString16(str) {
-  const arr = [];
-  for (let i = 0; i < str.length; i++) {
-    arr[i] = str.charCodeAt(i);
-  }
-  return {data: arr};
-}
-
-/**
- * Converts mojo_base::mojom::String16 to a JS string.
- * @param {!mojoBase.mojom.String16} str16
- * @return {string}
- */
-export function mojoString16ToString(str16) {
-  return str16.data.map(ch => String.fromCodePoint(ch)).join('');
-}
-
 /**
  * Type alias for HelpContentType.
  * @typedef {ash.osFeedbackUi.mojom.HelpContentType}
diff --git a/ash/webui/os_feedback_ui/resources/help_content.js b/ash/webui/os_feedback_ui/resources/help_content.js
index 1538ee3..43f6720 100644
--- a/ash/webui/os_feedback_ui/resources/help_content.js
+++ b/ash/webui/os_feedback_ui/resources/help_content.js
@@ -2,9 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {mojoString16ToString} from '//resources/ash/common/mojo_utils.js';
 import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {HelpContent, HelpContentList, mojoString16ToString} from './feedback_types.js';
+import {HelpContent, HelpContentList} from './feedback_types.js';
 
 /**
  * @fileoverview
diff --git a/ash/webui/os_feedback_ui/resources/search_page.js b/ash/webui/os_feedback_ui/resources/search_page.js
index 9553ccb7..e719aeb 100644
--- a/ash/webui/os_feedback_ui/resources/search_page.js
+++ b/ash/webui/os_feedback_ui/resources/search_page.js
@@ -7,9 +7,10 @@
 import './os_feedback_shared_css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
 
+import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {HelpContentProviderInterface, SearchRequest, SearchResponse, stringToMojoString16} from './feedback_types.js';
+import {HelpContentProviderInterface, SearchRequest, SearchResponse} from './feedback_types.js';
 import {getHelpContentProvider} from './mojo_interface_provider.js';
 
 /**
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index 66274a4..fd7b991 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -409,4 +409,7 @@
 
   // Sets the ambient mode temperature unit.
   SetTemperatureUnit(TemperatureUnit temperature_unit);
+
+  // Sets one album as selected or not.
+  SetAlbumSelected(string id, TopicSource topic_source, bool selected);
 };
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/album_item_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/album_item_element.ts
index 92ec054..6627be5 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/album_item_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/album_item_element.ts
@@ -16,6 +16,9 @@
 import {WithPersonalizationStore} from '../personalization_store.js';
 import {isRecentHighlightsAlbum} from '../utils.js';
 
+import {setAlbumSelected} from './ambient_controller.js';
+import {getAmbientProvider} from './ambient_interface_provider.js';
+
 export class AlbumItem extends WithPersonalizationStore {
   static get is() {
     return 'album-item';
@@ -38,15 +41,15 @@
         reflectToAttribute: true,
         notify: true,
       },
+      ariaLabel: {
+        type: String,
+        computed: 'computeAriaLabel_(album, checked, topicSource)',
+        reflectToAttribute: true,
+      },
       itemDescription_: {
         type: String,
         computed: 'computeItemDescription_(album.*, topicSource)',
       },
-      ariaLabel: {
-        type: String,
-        computed: 'computeAriaLabel_(album.*, checked, topicSource)',
-        reflectToAttribute: true,
-      },
     };
   }
 
@@ -116,6 +119,10 @@
   }
 
   private onItemSelected_(event: Event) {
+    if (!this.album) {
+      return;
+    }
+
     if (!isSelectionEvent(event)) {
       return;
     }
@@ -123,7 +130,7 @@
     event.preventDefault();
     event.stopPropagation();
     this.checked = !this.checked;
-    // TODO(b/217282564): Set the selected album.
+    setAlbumSelected(this.album, getAmbientProvider());
   }
 }
 
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_controller.ts b/ash/webui/personalization_app/resources/trusted/ambient/ambient_controller.ts
index 10a3f075..8d45b4e 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_controller.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_controller.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {AmbientProviderInterface, TemperatureUnit, TopicSource} from '../personalization_app.mojom-webui.js';
+import {AmbientModeAlbum, AmbientProviderInterface, TemperatureUnit, TopicSource} from '../personalization_app.mojom-webui.js';
 import {PersonalizationStore} from '../personalization_store.js';
 
 import {setAmbientModeEnabledAction, setTemperatureUnitAction, setTopicSourceAction} from './ambient_actions.js';
@@ -43,3 +43,9 @@
 
   provider.setTemperatureUnit(temperatureUnit);
 }
+
+// Set one album as selected or not.
+export function setAlbumSelected(
+    album: AmbientModeAlbum, provider: AmbientProviderInterface): void {
+  provider.setAlbumSelected(album.id, album.topicSource, album.checked);
+}
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h
index 75b0708..6ab9c17 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h
+++ b/ash/webui/personalization_app/test/fake_personalization_app_ambient_provider.h
@@ -46,6 +46,9 @@
   void SetTopicSource(ash::AmbientModeTopicSource topic_source) override {}
   void SetTemperatureUnit(
       ash::AmbientModeTemperatureUnit temperature_unit) override {}
+  void SetAlbumSelected(const std::string& id,
+                        ash::AmbientModeTopicSource topic_source,
+                        bool selected) override {}
 
  private:
   mojo::Receiver<ash::personalization_app::mojom::AmbientProvider>
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index 9e4c38e..e5168d8 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -40,6 +40,8 @@
 #include "ash/wm/window_restore/window_restore_controller.h"
 #include "ash/wm/window_restore/window_restore_util.h"
 #include "ash/wm/window_util.h"
+#include "ash/wm/workspace/workspace_layout_manager.h"
+#include "ash/wm/workspace_controller.h"
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/check.h"
@@ -1240,6 +1242,8 @@
   for (auto& observer : observers_)
     observer.OnDeskActivationChanged(active_desk_, old_active);
 
+  NotifyFullScreenStateChangedAcrossDesksIfNeeded(old_active);
+
   // Only update active desk prefs when a primary user switches a desk.
   if (shell->session_controller()->IsUserPrimary()) {
     desks_restore_util::UpdatePrimaryUserActiveDeskPrefs(
@@ -1424,6 +1428,26 @@
   mru_tracker->SetIgnoreActivations(false);
 }
 
+void DesksController::NotifyFullScreenStateChangedAcrossDesksIfNeeded(
+    const Desk* previous_active_desk) {
+  Shell* shell = Shell::Get();
+  for (aura::Window* root : Shell::GetAllRootWindows()) {
+    aura::Window* active_desk_container =
+        active_desk_->GetDeskContainerForRoot(root);
+    const bool is_active_desk_fullscreen =
+        GetWorkspaceController(active_desk_container)
+            ->layout_manager()
+            ->is_fullscreen();
+    if (GetWorkspaceController(
+            previous_active_desk->GetDeskContainerForRoot(root))
+            ->layout_manager()
+            ->is_fullscreen() != is_active_desk_fullscreen) {
+      shell->NotifyFullscreenStateChanged(is_active_desk_fullscreen,
+                                          active_desk_container);
+    }
+  }
+}
+
 void DesksController::RestackVisibleOnAllDesksWindowsOnActiveDesk() {
   auto mru_windows =
       Shell::Get()->mru_window_tracker()->BuildMruWindowList(kActiveDesk);
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h
index a5a68f5..4239ff3a 100644
--- a/ash/wm/desks/desks_controller.h
+++ b/ash/wm/desks/desks_controller.h
@@ -339,6 +339,13 @@
   // reside on |active_desk_| to |new_desk|.
   void MoveVisibleOnAllDesksWindowsFromActiveDeskTo(Desk* new_desk);
 
+  // Checks if the fullscreen state has changed after desks were switched and
+  // notifies shell if needed. For e.g Desk 1 has a window in fullscreen while
+  // Desk 2 does not, this function would notify shell of a fullscreen state
+  // change when switching between Desk 1 and 2 in that case.
+  void NotifyFullScreenStateChangedAcrossDesksIfNeeded(
+      const Desk* previous_active_desk);
+
   // Iterates through the visible on all desks windows on the active desk
   // and restacks them based on their position in the global MRU tracker. This
   // should be called after desk activation.
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index 4e9f99c..d425106 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -345,6 +345,29 @@
   int notify_counts_ = 0;
 };
 
+class FullScreenStateObserver : public ShellObserver {
+ public:
+  FullScreenStateObserver() { Shell::Get()->AddShellObserver(this); }
+
+  FullScreenStateObserver(const FullScreenStateObserver&) = delete;
+  FullScreenStateObserver& operator=(const FullScreenStateObserver&) = delete;
+
+  ~FullScreenStateObserver() override {
+    Shell::Get()->RemoveShellObserver(this);
+  }
+
+  // ShellObserver:
+  void OnFullscreenStateChanged(bool is_fullscreen,
+                                aura::Window* container) override {
+    is_fullscreen_ = is_fullscreen;
+  }
+
+  bool is_fullscreen() const { return is_fullscreen_; }
+
+ private:
+  bool is_fullscreen_ = false;
+};
+
 // Defines a test fixture to test Virtual Desks behavior, parameterized to run
 // some window drag tests with both touch gestures and with mouse events.
 class DesksTest : public AshTestBase,
@@ -1859,6 +1882,51 @@
             DesksTestApi::GetNewDeskButtonBackgroundColor());
 }
 
+// Tests that the fullscreen state in shell is updated when switching between
+// desks that have active windows in different fullscreen states.
+TEST_F(DesksTest, FullscreenStateUpdatedAcrossDesks) {
+  FullScreenStateObserver full_screen_state_observer;
+  auto* controller = DesksController::Get();
+  WMEvent event_toggle_fullscreen(WM_EVENT_TOGGLE_FULLSCREEN);
+
+  // Create one new desks.
+  NewDesk();
+  EXPECT_EQ(2u, controller->desks().size());
+
+  // Create one window in each desk.
+  std::vector<std::unique_ptr<aura::Window>> windows;
+  for (int i = 0; i < 2; i++) {
+    windows.push_back(CreateAppWindow());
+    controller->SendToDeskAtIndex(windows[i].get(), i);
+    EXPECT_EQ(i, windows[i]->GetProperty(aura::client::kWindowWorkspaceKey));
+  }
+
+  WindowState* win0_state = WindowState::Get(windows[0].get());
+  WindowState* win1_state = WindowState::Get(windows[1].get());
+
+  EXPECT_FALSE(full_screen_state_observer.is_fullscreen());
+
+  // Set window on desk 0 to fullscreen.
+  win0_state->OnWMEvent(&event_toggle_fullscreen);
+  EXPECT_EQ(windows[0].get(), window_util::GetActiveWindow());
+  EXPECT_TRUE(win0_state->IsFullscreen());
+  EXPECT_TRUE(full_screen_state_observer.is_fullscreen());
+
+  // Switch to desk 1 and expect the fullscreen state to change.
+  ActivateDesk(controller->desks()[1].get());
+
+  EXPECT_EQ(windows[1].get(), window_util::GetActiveWindow());
+  EXPECT_FALSE(win1_state->IsFullscreen());
+  EXPECT_FALSE(full_screen_state_observer.is_fullscreen());
+
+  // Cycle back to desk 0 and expect the fullscreen state to change back.
+  ActivateDesk(controller->desks()[0].get());
+
+  EXPECT_EQ(windows[0].get(), window_util::GetActiveWindow());
+  EXPECT_TRUE(win0_state->IsFullscreen());
+  EXPECT_TRUE(full_screen_state_observer.is_fullscreen());
+}
+
 class DesksWithMultiDisplayOverview : public AshTestBase {
  public:
   DesksWithMultiDisplayOverview() = default;
diff --git a/ash/wm/workspace/workspace_layout_manager.h b/ash/wm/workspace/workspace_layout_manager.h
index 947ae77..47d6dc8 100644
--- a/ash/wm/workspace/workspace_layout_manager.h
+++ b/ash/wm/workspace/workspace_layout_manager.h
@@ -47,6 +47,8 @@
     return backdrop_controller_.get();
   }
 
+  bool is_fullscreen() { return is_fullscreen_; }
+
   // aura::LayoutManager:
   void OnWindowResized() override;
   void OnWindowAddedToLayout(aura::Window* child) override;
diff --git a/base/allocator/partition_allocator/address_pool_manager.cc b/base/allocator/partition_allocator/address_pool_manager.cc
index c1bcd73..ef28997 100644
--- a/base/allocator/partition_allocator/address_pool_manager.cc
+++ b/base/allocator/partition_allocator/address_pool_manager.cc
@@ -17,7 +17,6 @@
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 #include "base/allocator/partition_allocator/partition_alloc_notreached.h"
 #include "base/allocator/partition_allocator/reservation_offset_table.h"
-#include "base/cxx17_backports.h"
 #include "base/lazy_instance.h"
 #include "build/build_config.h"
 
@@ -57,7 +56,7 @@
   PA_DCHECK(!(ptr & kSuperPageOffsetMask));
   PA_DCHECK(!((ptr + length) & kSuperPageOffsetMask));
 
-  for (pool_handle i = 0; i < base::size(pools_); ++i) {
+  for (pool_handle i = 0; i < std::size(pools_); ++i) {
     if (!pools_[i].IsInitialized()) {
       pools_[i].Initialize(ptr, length);
       return i + 1;
@@ -86,7 +85,7 @@
 }
 
 void AddressPoolManager::ResetForTesting() {
-  for (pool_handle i = 0; i < base::size(pools_); ++i)
+  for (pool_handle i = 0; i < std::size(pools_); ++i)
     pools_[i].Reset();
 }
 
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index f02c4b8..9d20204 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -32,7 +32,6 @@
 #include "base/allocator/partition_allocator/tagging.h"
 #include "base/bits.h"
 #include "base/cpu.h"
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/rand_util.h"
 #include "base/system/sys_info.h"
@@ -147,7 +146,7 @@
     1 << 20,
     1 << 21,
 };
-constexpr size_t kTestSizesCount = base::size(kTestSizes);
+constexpr size_t kTestSizesCount = std::size(kTestSizes);
 
 void AllocateRandomly(base::PartitionRoot<base::internal::ThreadSafe>* root,
                       size_t count,
@@ -4382,10 +4381,10 @@
     const size_t source_lengths[] = {
         strlen(sources[0]),
     };
-    static_assert(base::size(sources) == base::size(source_lengths),
+    static_assert(std::size(sources) == std::size(source_lengths),
                   "arrays must be parallel");
 
-    program_ = clCreateProgramWithSource(context_, base::size(sources), sources,
+    program_ = clCreateProgramWithSource(context_, std::size(sources), sources,
                                          source_lengths, &rv);
     ASSERT_EQ(rv, CL_SUCCESS) << "clCreateProgramWithSource";
 
diff --git a/base/android/jank_metric_uma_recorder_unittest.cc b/base/android/jank_metric_uma_recorder_unittest.cc
index 23d9bd5a..e72f4347 100644
--- a/base/android/jank_metric_uma_recorder_unittest.cc
+++ b/base/android/jank_metric_uma_recorder_unittest.cc
@@ -49,9 +49,9 @@
     1'000'000,   // 1ms
     20'000'000,  // 20ms
 };
-const size_t kDurationsLen = base::size(kDurations);
+const size_t kDurationsLen = std::size(kDurations);
 
-static_assert(base::size(kDurations) == base::size(kTimestampsNs),
+static_assert(std::size(kDurations) == std::size(kTimestampsNs),
               "Length of timestamps and durations should be equal.");
 
 // Jank bursts are calculated based on durations.
@@ -59,7 +59,7 @@
     100'000'000,  // 100ms
     20'000'000,   // 20ms
 };
-const size_t kJankBurstsLen = base::size(kJankBursts);
+const size_t kJankBurstsLen = std::size(kJankBursts);
 
 }  // namespace
 
diff --git a/base/android/jni_array_unittest.cc b/base/android/jni_array_unittest.cc
index f862a2d9..89293aa1 100644
--- a/base/android/jni_array_unittest.cc
+++ b/base/android/jni_array_unittest.cc
@@ -6,14 +6,13 @@
 
 #include <stddef.h>
 #include <stdint.h>
-#include <algorithm>
 
+#include <algorithm>
 #include <limits>
 
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
-#include "base/cxx17_backports.h"
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -23,7 +22,7 @@
 
 TEST(JniArray, BasicConversions) {
   const uint8_t kBytes[] = {0, 1, 2, 3};
-  const size_t kLen = base::size(kBytes);
+  const size_t kLen = std::size(kBytes);
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jbyteArray> bytes = ToJavaByteArray(env, kBytes, kLen);
   ASSERT_TRUE(bytes);
@@ -79,7 +78,7 @@
 
 TEST(JniArray, BoolConversions) {
   const bool kBools[] = {false, true, false};
-  const size_t kLen = base::size(kBools);
+  const size_t kLen = std::size(kBools);
 
   JNIEnv* env = AttachCurrentThread();
   CheckBoolConversion(env, kBools, kLen, ToJavaBooleanArray(env, kBools, kLen));
@@ -105,7 +104,7 @@
 TEST(JniArray, IntConversions) {
   const int kInts[] = {0, 1, -1, std::numeric_limits<int32_t>::min(),
                        std::numeric_limits<int32_t>::max()};
-  const size_t kLen = base::size(kInts);
+  const size_t kLen = std::size(kInts);
 
   JNIEnv* env = AttachCurrentThread();
   CheckIntConversion(env, kInts, kLen, ToJavaIntArray(env, kInts, kLen));
@@ -133,7 +132,7 @@
 TEST(JniArray, LongConversions) {
   const int64_t kLongs[] = {0, 1, -1, std::numeric_limits<int64_t>::min(),
                             std::numeric_limits<int64_t>::max()};
-  const size_t kLen = base::size(kLongs);
+  const size_t kLen = std::size(kLongs);
 
   JNIEnv* env = AttachCurrentThread();
   CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, kLongs, kLen));
@@ -207,7 +206,7 @@
 
 TEST(JniArray, FloatConversions) {
   const float kFloats[] = { 0.0f, 1.0f, -10.0f};
-  const size_t kLen = base::size(kFloats);
+  const size_t kLen = std::size(kFloats);
 
   JNIEnv* env = AttachCurrentThread();
   CheckFloatConversion(env, kFloats, kLen,
@@ -219,7 +218,7 @@
 
 TEST(JniArray, JavaBooleanArrayToBoolVector) {
   const bool kBools[] = {false, true, false};
-  const size_t kLen = base::size(kBools);
+  const size_t kLen = std::size(kBools);
 
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jbooleanArray> jbooleans(env, env->NewBooleanArray(kLen));
@@ -242,7 +241,7 @@
 
 TEST(JniArray, JavaIntArrayToIntVector) {
   const int kInts[] = {0, 1, -1};
-  const size_t kLen = base::size(kInts);
+  const size_t kLen = std::size(kInts);
 
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jintArray> jints(env, env->NewIntArray(kLen));
@@ -264,7 +263,7 @@
 
 TEST(JniArray, JavaLongArrayToInt64Vector) {
   const int64_t kInt64s[] = {0LL, 1LL, -1LL};
-  const size_t kLen = base::size(kInt64s);
+  const size_t kLen = std::size(kInt64s);
 
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen));
@@ -292,7 +291,7 @@
 
 TEST(JniArray, JavaLongArrayToLongVector) {
   const int64_t kInt64s[] = {0LL, 1LL, -1LL};
-  const size_t kLen = base::size(kInt64s);
+  const size_t kLen = std::size(kInt64s);
 
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen));
@@ -319,7 +318,7 @@
 
 TEST(JniArray, JavaFloatArrayToFloatVector) {
   const float kFloats[] = {0.0, 0.5, -0.5};
-  const size_t kLen = base::size(kFloats);
+  const size_t kLen = std::size(kFloats);
 
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jfloatArray> jfloats(env, env->NewFloatArray(kLen));
@@ -489,12 +488,12 @@
   // Populate int[][] object.
   const int kInts0[] = {0, 1, -1, std::numeric_limits<int32_t>::min(),
                         std::numeric_limits<int32_t>::max()};
-  const size_t kLen0 = base::size(kInts0);
+  const size_t kLen0 = std::size(kInts0);
   ScopedJavaLocalRef<jintArray> int_array0 = ToJavaIntArray(env, kInts0, kLen0);
   env->SetObjectArrayElement(array.obj(), 0, int_array0.obj());
 
   const int kInts1[] = {3, 4, 5};
-  const size_t kLen1 = base::size(kInts1);
+  const size_t kLen1 = std::size(kInts1);
   ScopedJavaLocalRef<jintArray> int_array1 = ToJavaIntArray(env, kInts1, kLen1);
   env->SetObjectArrayElement(array.obj(), 1, int_array1.obj());
 
@@ -504,7 +503,7 @@
   env->SetObjectArrayElement(array.obj(), 2, int_array2.obj());
 
   const int kInts3[] = {16};
-  const size_t kLen3 = base::size(kInts3);
+  const size_t kLen3 = std::size(kInts3);
   ScopedJavaLocalRef<jintArray> int_array3 = ToJavaIntArray(env, kInts3, kLen3);
   env->SetObjectArrayElement(array.obj(), 3, int_array3.obj());
 
diff --git a/base/command_line.cc b/base/command_line.cc
index 8f26e95..b59bc4b 100644
--- a/base/command_line.cc
+++ b/base/command_line.cc
@@ -50,7 +50,7 @@
 // Unixes don't use slash as a switch.
 constexpr CommandLine::StringPieceType kSwitchPrefixes[] = {"--", "-"};
 #endif
-size_t switch_prefix_count = base::size(kSwitchPrefixes);
+size_t switch_prefix_count = std::size(kSwitchPrefixes);
 
 #if BUILDFLAG(IS_WIN)
 // Switch string that specifies the single argument to the command line.
@@ -196,7 +196,7 @@
   // The last switch prefix should be slash, so adjust the size to skip it.
   static_assert(base::make_span(kSwitchPrefixes).back() == L"/",
                 "Error: Last switch prefix is not a slash.");
-  switch_prefix_count = base::size(kSwitchPrefixes) - 1;
+  switch_prefix_count = std::size(kSwitchPrefixes) - 1;
 }
 
 // static
diff --git a/base/command_line_unittest.cc b/base/command_line_unittest.cc
index ec3d1bd5..20226a0c 100644
--- a/base/command_line_unittest.cc
+++ b/base/command_line_unittest.cc
@@ -48,7 +48,7 @@
       FILE_PATH_LITERAL("--not-a-switch"),
       FILE_PATH_LITERAL("\"in the time of submarines...\""),
       FILE_PATH_LITERAL("unquoted arg-with-space")};
-  CommandLine cl(size(argv), argv);
+  CommandLine cl(std::size(argv), argv);
 
   EXPECT_FALSE(cl.GetCommandLineString().empty());
   EXPECT_FALSE(cl.HasSwitch("cruller"));
@@ -293,7 +293,7 @@
  const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"),
                                              FILE_PATH_LITERAL("--"),
                                              FILE_PATH_LITERAL("--arg1") };
- CommandLine cl(size(raw_argv), raw_argv);
+ CommandLine cl(std::size(raw_argv), raw_argv);
 
  cl.AppendSwitch("switch1");
  cl.AppendSwitchASCII("switch2", "foo");
@@ -564,7 +564,7 @@
       FILE_PATH_LITERAL("-baz"),
       FILE_PATH_LITERAL("--foo=two")  // --foo second time
   };
-  CommandLine cl(size(argv), argv);
+  CommandLine cl(std::size(argv), argv);
 
   EXPECT_TRUE(cl.HasSwitch("foo"));
   EXPECT_TRUE(cl.HasSwitch("baz"));
@@ -614,7 +614,7 @@
   CommandLine::SetDuplicateSwitchHandler(
       std::make_unique<MergeDuplicateFoosSemicolon>());
 
-  CommandLine cl(size(argv), argv);
+  CommandLine cl(std::size(argv), argv);
 
   EXPECT_TRUE(cl.HasSwitch("mergeable-foo"));
   EXPECT_TRUE(cl.HasSwitch("baz"));
diff --git a/base/containers/checked_range.h b/base/containers/checked_range.h
index e3e799f3..1dae907 100644
--- a/base/containers/checked_range.h
+++ b/base/containers/checked_range.h
@@ -12,7 +12,6 @@
 #include <utility>
 
 #include "base/containers/checked_iterators.h"
-#include "base/cxx17_backports.h"
 #include "base/template_util.h"
 
 namespace base {
@@ -20,7 +19,7 @@
 // CheckedContiguousRange is a light-weight wrapper around a container modeling
 // the ContiguousContainer requirement [1, 2]. Effectively this means that the
 // container stores its elements contiguous in memory. Furthermore, it is
-// expected that base::data(container) and base::size(container) are valid
+// expected that std::data(container) and std::size(container) are valid
 // expressions, and that data() + idx is dereferenceable for all idx in the
 // range [0, size()). In the standard library this includes the containers
 // std::string, std::vector and std::array, but other containers like
@@ -51,7 +50,7 @@
 class CheckedContiguousRange {
  public:
   using element_type = std::remove_pointer_t<decltype(
-      base::data(std::declval<ContiguousContainer&>()))>;
+      std::data(std::declval<ContiguousContainer&>()))>;
   using value_type = std::remove_cv_t<element_type>;
   using reference = element_type&;
   using const_reference = const element_type&;
@@ -132,17 +131,17 @@
   }
 
   constexpr pointer data() const noexcept {
-    return container_ ? base::data(*container_) : nullptr;
+    return container_ ? std::data(*container_) : nullptr;
   }
 
   constexpr const_pointer cdata() const noexcept { return data(); }
 
   constexpr size_type size() const noexcept {
-    return container_ ? base::size(*container_) : 0;
+    return container_ ? std::size(*container_) : 0;
   }
 
   constexpr bool empty() const noexcept {
-    return container_ ? base::empty(*container_) : true;
+    return container_ ? std::empty(*container_) : true;
   }
 
  private:
diff --git a/base/containers/checked_range_unittest.cc b/base/containers/checked_range_unittest.cc
index a84496d..4880059d 100644
--- a/base/containers/checked_range_unittest.cc
+++ b/base/containers/checked_range_unittest.cc
@@ -39,15 +39,15 @@
 TEST(CheckedContiguousRange, Constructor_Array) {
   static constexpr int array[] = {1, 2, 3, 4, 5};
   constexpr CheckedContiguousRange<const int[5]> range(array);
-  static_assert(data(array) == range.data(), "");
-  static_assert(size(array) == range.size(), "");
+  static_assert(std::data(array) == range.data(), "");
+  static_assert(std::size(array) == range.size(), "");
 }
 
 TEST(CheckedContiguousRange, Constructor_StdArray) {
   static constexpr std::array<int, 5> array = {1, 2, 3, 4, 5};
   constexpr CheckedContiguousRange<const std::array<int, 5>> range(array);
   static_assert(data(array) == range.data(), "");
-  static_assert(base::size(array) == range.size(), "");
+  static_assert(std::size(array) == range.size(), "");
 }
 
 TEST(CheckedContiguousRange, Constructor_StringPiece) {
@@ -60,8 +60,8 @@
 TEST(CheckedContiguousRange, Constructor_InitializerList) {
   static constexpr std::initializer_list<int> il = {1, 2, 3, 4, 5};
   constexpr CheckedContiguousRange<const std::initializer_list<int>> range(il);
-  static_assert(base::data(il) == range.data(), "");
-  static_assert(base::size(il) == range.size(), "");
+  static_assert(std::data(il) == range.data(), "");
+  static_assert(std::size(il) == range.size(), "");
 }
 
 TEST(CheckedContiguousRange, Constructor_Copy) {
@@ -162,7 +162,7 @@
   constexpr CheckedContiguousRange<const std::array<int, 0>> range(array);
   static_assert(data(array) == range.data(), "");
   static_assert(data(array) == range.cdata(), "");
-  static_assert(base::size(array) == range.size(), "");
+  static_assert(std::size(array) == range.size(), "");
   static_assert(range.empty(), "");
 }
 
diff --git a/base/containers/flat_tree.h b/base/containers/flat_tree.h
index 0e6616f..c1b4432 100644
--- a/base/containers/flat_tree.h
+++ b/base/containers/flat_tree.h
@@ -15,7 +15,6 @@
 #include "base/as_const.h"
 #include "base/check.h"
 #include "base/compiler_specific.h"
-#include "base/cxx17_backports.h"
 #include "base/functional/not_fn.h"
 #include "base/ranges/algorithm.h"
 #include "base/template_util.h"
@@ -75,14 +74,14 @@
   return ToArrayImpl<U>(data, std::make_index_sequence<N>());
 }
 
-// Helper that calls `container.reserve(base::size(source))`.
+// Helper that calls `container.reserve(std::size(source))`.
 template <typename T, typename U>
 constexpr void ReserveIfSupported(const T&, const U&) {}
 
 template <typename T, typename U>
 auto ReserveIfSupported(T& container, const U& source)
-    -> decltype(container.reserve(base::size(source)), void()) {
-  container.reserve(base::size(source));
+    -> decltype(container.reserve(std::size(source)), void()) {
+  container.reserve(std::size(source));
 }
 
 // std::pair's operator= is not constexpr prior to C++20. Thus we need this
diff --git a/base/containers/intrusive_heap_unittest.cc b/base/containers/intrusive_heap_unittest.cc
index cda59df..38f103b5 100644
--- a/base/containers/intrusive_heap_unittest.cc
+++ b/base/containers/intrusive_heap_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/callback_helpers.h"
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
 #include "base/rand_util.h"
@@ -69,7 +68,7 @@
 void MakeCanonical(IntrusiveHeapInt* heap) {
   static constexpr int kInts[] = {CANONICAL_ELEMENTS};
   heap->clear();
-  heap->insert(kInts, kInts + base::size(kInts));
+  heap->insert(kInts, kInts + std::size(kInts));
   ExpectCanonical(*heap);
 }
 
diff --git a/base/containers/linked_list_unittest.cc b/base/containers/linked_list_unittest.cc
index bacbca5..83f5111 100644
--- a/base/containers/linked_list_unittest.cc
+++ b/base/containers/linked_list_unittest.cc
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/containers/linked_list.h"
-#include "base/cxx17_backports.h"
+
 #include "base/test/gtest_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -92,7 +92,7 @@
   EXPECT_EQ(&n1, list.tail());
   {
     const int expected[] = {1};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   Node n2(2);
@@ -102,7 +102,7 @@
   EXPECT_EQ(&n2, list.tail());
   {
     const int expected[] = {1, 2};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   Node n3(3);
@@ -112,7 +112,7 @@
   EXPECT_EQ(&n3, list.tail());
   {
     const int expected[] = {1, 2, 3};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 }
 
@@ -135,7 +135,7 @@
   EXPECT_EQ(&n5, list.tail());
   {
     const int expected[] = {1, 2, 3, 4, 5};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   // Remove from the middle.
@@ -145,7 +145,7 @@
   EXPECT_EQ(&n5, list.tail());
   {
     const int expected[] = {1, 2, 4, 5};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   // Remove from the tail.
@@ -155,7 +155,7 @@
   EXPECT_EQ(&n4, list.tail());
   {
     const int expected[] = {1, 2, 4};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   // Remove from the head.
@@ -165,7 +165,7 @@
   EXPECT_EQ(&n4, list.tail());
   {
     const int expected[] = {2, 4};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   // Empty the list.
@@ -187,7 +187,7 @@
   EXPECT_EQ(&n5, list.tail());
   {
     const int expected[] = {1, 2, 3, 4, 5};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 }
 
@@ -206,7 +206,7 @@
   EXPECT_EQ(&n2, list.tail());
   {
     const int expected[] = {1, 2};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   n3.InsertBefore(&n2);
@@ -215,7 +215,7 @@
   EXPECT_EQ(&n2, list.tail());
   {
     const int expected[] = {1, 3, 2};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   n4.InsertBefore(&n1);
@@ -224,7 +224,7 @@
   EXPECT_EQ(&n2, list.tail());
   {
     const int expected[] = {4, 1, 3, 2};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 }
 
@@ -243,7 +243,7 @@
   EXPECT_EQ(&n2, list.tail());
   {
     const int expected[] = {1, 2};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   n3.InsertAfter(&n2);
@@ -252,7 +252,7 @@
   EXPECT_EQ(&n3, list.tail());
   {
     const int expected[] = {1, 2, 3};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 
   n4.InsertAfter(&n1);
@@ -261,7 +261,7 @@
   EXPECT_EQ(&n3, list.tail());
   {
     const int expected[] = {1, 4, 2, 3};
-    ExpectListContents(list, base::size(expected), expected);
+    ExpectListContents(list, std::size(expected), expected);
   }
 }
 
diff --git a/base/containers/span.h b/base/containers/span.h
index 3694913..3906e0d6 100644
--- a/base/containers/span.h
+++ b/base/containers/span.h
@@ -18,7 +18,6 @@
 #include "base/compiler_specific.h"
 #include "base/containers/checked_iterators.h"
 #include "base/containers/contiguous_iterator.h"
-#include "base/cxx17_backports.h"
 #include "base/cxx20_to_address.h"
 #include "base/template_util.h"
 
@@ -85,12 +84,12 @@
 
 template <typename Container, typename T>
 using ContainerHasConvertibleData = IsLegalDataConversion<
-    std::remove_pointer_t<decltype(base::data(std::declval<Container>()))>,
+    std::remove_pointer_t<decltype(std::data(std::declval<Container>()))>,
     T>;
 
 template <typename Container>
 using ContainerHasIntegralSize =
-    std::is_integral<decltype(base::size(std::declval<Container>()))>;
+    std::is_integral<decltype(std::size(std::declval<Container>()))>;
 
 template <typename From, size_t FromExtent, typename To, size_t ToExtent>
 using EnableIfLegalSpanConversion =
@@ -297,7 +296,7 @@
   template <
       size_t N,
       typename = internal::EnableIfSpanCompatibleArray<T (&)[N], T, Extent>>
-  constexpr span(T (&array)[N]) noexcept : span(base::data(array), N) {}
+  constexpr span(T (&array)[N]) noexcept : span(std::data(array), N) {}
 
   template <
       typename U,
@@ -305,17 +304,17 @@
       typename =
           internal::EnableIfSpanCompatibleArray<std::array<U, N>&, T, Extent>>
   constexpr span(std::array<U, N>& array) noexcept
-      : span(base::data(array), N) {}
+      : span(std::data(array), N) {}
 
   template <typename U,
             size_t N,
             typename = internal::
                 EnableIfSpanCompatibleArray<const std::array<U, N>&, T, Extent>>
   constexpr span(const std::array<U, N>& array) noexcept
-      : span(base::data(array), N) {}
+      : span(std::data(array), N) {}
 
-  // Conversion from a container that has compatible base::data() and integral
-  // base::size().
+  // Conversion from a container that has compatible std::data() and integral
+  // std::size().
   template <
       typename Container,
       typename =
@@ -323,7 +322,7 @@
                                                                     T,
                                                                     Extent>>
   constexpr span(Container& container) noexcept
-      : span(base::data(container), base::size(container)) {}
+      : span(std::data(container), std::size(container)) {}
 
   template <
       typename Container,
@@ -332,7 +331,7 @@
           T,
           Extent>>
   constexpr span(const Container& container) noexcept
-      : span(base::data(container), base::size(container)) {}
+      : span(std::data(container), std::size(container)) {}
 
   constexpr span(const span& other) noexcept = default;
 
@@ -485,7 +484,7 @@
 template <int&... ExplicitArgumentBarrier, typename Container>
 constexpr auto make_span(Container&& container) noexcept {
   using T =
-      std::remove_pointer_t<decltype(base::data(std::declval<Container>()))>;
+      std::remove_pointer_t<decltype(std::data(std::declval<Container>()))>;
   using Extent = internal::Extent<Container>;
   return span<T, Extent::value>(std::forward<Container>(container));
 }
@@ -510,8 +509,8 @@
 template <size_t N, int&... ExplicitArgumentBarrier, typename Container>
 constexpr auto make_span(Container&& container) noexcept {
   using T =
-      std::remove_pointer_t<decltype(base::data(std::declval<Container>()))>;
-  return span<T, N>(base::data(container), base::size(container));
+      std::remove_pointer_t<decltype(std::data(std::declval<Container>()))>;
+  return span<T, N>(std::data(container), std::size(container));
 }
 
 }  // namespace base
@@ -520,7 +519,7 @@
 // with definite extent, i.e. everything that is a contiguous storage of some
 // sort with static size. Specifically, this works for std::array in a constexpr
 // context. Note:
-//   * |base::size| should be preferred for plain arrays.
+//   * |std::size| should be preferred for plain arrays.
 //   * In run-time contexts, functions such as |std::array::size| should be
 //     preferred.
 #define EXTENT(x)                                        \
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
index 28306e04..6dfb4f9 100644
--- a/base/containers/span_unittest.cc
+++ b/base/containers/span_unittest.cc
@@ -230,7 +230,7 @@
 
   constexpr span<const int> dynamic_span(kArray);
   static_assert(kArray == dynamic_span.data(), "");
-  static_assert(base::size(kArray) == dynamic_span.size(), "");
+  static_assert(std::size(kArray) == dynamic_span.size(), "");
 
   static_assert(kArray[0] == dynamic_span[0], "");
   static_assert(kArray[1] == dynamic_span[1], "");
@@ -238,9 +238,9 @@
   static_assert(kArray[3] == dynamic_span[3], "");
   static_assert(kArray[4] == dynamic_span[4], "");
 
-  constexpr span<const int, base::size(kArray)> static_span(kArray);
+  constexpr span<const int, std::size(kArray)> static_span(kArray);
   static_assert(kArray == static_span.data(), "");
-  static_assert(base::size(kArray) == static_span.size(), "");
+  static_assert(std::size(kArray) == static_span.size(), "");
 
   static_assert(kArray[0] == static_span[0], "");
   static_assert(kArray[1] == static_span[1], "");
@@ -254,19 +254,19 @@
 
   span<const int> const_span(array);
   EXPECT_EQ(array, const_span.data());
-  EXPECT_EQ(base::size(array), const_span.size());
+  EXPECT_EQ(std::size(array), const_span.size());
   for (size_t i = 0; i < const_span.size(); ++i)
     EXPECT_EQ(array[i], const_span[i]);
 
   span<int> dynamic_span(array);
   EXPECT_EQ(array, dynamic_span.data());
-  EXPECT_EQ(base::size(array), dynamic_span.size());
+  EXPECT_EQ(std::size(array), dynamic_span.size());
   for (size_t i = 0; i < dynamic_span.size(); ++i)
     EXPECT_EQ(array[i], dynamic_span[i]);
 
-  span<int, base::size(array)> static_span(array);
+  span<int, std::size(array)> static_span(array);
   EXPECT_EQ(array, static_span.data());
-  EXPECT_EQ(base::size(array), static_span.size());
+  EXPECT_EQ(std::size(array), static_span.size());
   for (size_t i = 0; i < static_span.size(); ++i)
     EXPECT_EQ(array[i], static_span[i]);
 }
@@ -288,7 +288,7 @@
   for (size_t i = 0; i < dynamic_span.size(); ++i)
     EXPECT_EQ(array[i], dynamic_span[i]);
 
-  span<int, base::size(array)> static_span(array);
+  span<int, std::size(array)> static_span(array);
   EXPECT_EQ(array.data(), static_span.data());
   EXPECT_EQ(array.size(), static_span.size());
   for (size_t i = 0; i < static_span.size(); ++i)
@@ -1342,7 +1342,7 @@
 
   constexpr span<const int> lasts = constexpr_span.last(size);
   for (size_t i = 0; i < lasts.size(); ++i) {
-    const size_t j = (base::size(kArray) - size) + i;
+    const size_t j = (std::size(kArray) - size) + i;
     EXPECT_EQ(kArray[j], lasts[i]);
   }
 
diff --git a/base/cpu.cc b/base/cpu.cc
index 54ce0bf7..17c201b 100644
--- a/base/cpu.cc
+++ b/base/cpu.cc
@@ -14,7 +14,6 @@
 #include <sstream>
 #include <utility>
 
-#include "base/cxx17_backports.h"
 #include "base/no_destructor.h"
 #include "build/build_config.h"
 
@@ -244,7 +243,7 @@
   int num_ids = cpu_info[0];
   std::swap(cpu_info[2], cpu_info[3]);
   static constexpr size_t kVendorNameSize = 3 * sizeof(cpu_info[1]);
-  static_assert(kVendorNameSize < base::size(cpu_string),
+  static_assert(kVendorNameSize < std::size(cpu_string),
                 "cpu_string too small");
   memcpy(cpu_string, &cpu_info[1], kVendorNameSize);
   cpu_string[kVendorNameSize] = '\0';
@@ -309,7 +308,7 @@
   static constexpr int kParameterStart = 0x80000002;
   static constexpr int kParameterEnd = 0x80000004;
   static constexpr int kParameterSize = kParameterEnd - kParameterStart + 1;
-  static_assert(kParameterSize * sizeof(cpu_info) + 1 == base::size(cpu_string),
+  static_assert(kParameterSize * sizeof(cpu_info) + 1 == std::size(cpu_string),
                 "cpu_string has wrong size");
 
   if (max_parameter >= kParameterEnd) {
diff --git a/base/cxx17_backports_unittest.cc b/base/cxx17_backports_unittest.cc
index 1080aaea..5a788bb 100644
--- a/base/cxx17_backports_unittest.cc
+++ b/base/cxx17_backports_unittest.cc
@@ -22,36 +22,35 @@
   {
     std::vector<int> vector = {1, 2, 3, 4, 5};
     static_assert(
-        std::is_same<decltype(base::size(vector)),
+        std::is_same<decltype(std::size(vector)),
                      decltype(vector.size())>::value,
-        "base::size(vector) should have the same type as vector.size()");
-    EXPECT_EQ(vector.size(), base::size(vector));
+        "std::size(vector) should have the same type as vector.size()");
+    EXPECT_EQ(vector.size(), std::size(vector));
   }
 
   {
     std::string empty_str;
     static_assert(
-        std::is_same<decltype(base::size(empty_str)),
+        std::is_same<decltype(std::size(empty_str)),
                      decltype(empty_str.size())>::value,
-        "base::size(empty_str) should have the same type as empty_str.size()");
-    EXPECT_EQ(0u, base::size(empty_str));
+        "std::size(empty_str) should have the same type as empty_str.size()");
+    EXPECT_EQ(0u, std::size(empty_str));
   }
 
   {
     std::array<int, 4> array = {{1, 2, 3, 4}};
     static_assert(
-        std::is_same<decltype(base::size(array)),
-                     decltype(array.size())>::value,
-        "base::size(array) should have the same type as array.size()");
-    static_assert(base::size(array) == array.size(),
-                  "base::size(array) should be equal to array.size()");
+        std::is_same<decltype(std::size(array)), decltype(array.size())>::value,
+        "std::size(array) should have the same type as array.size()");
+    static_assert(std::size(array) == array.size(),
+                  "std::size(array) should be equal to array.size()");
   }
 
   {
     int array[] = {1, 2, 3};
-    static_assert(std::is_same<size_t, decltype(base::size(array))>::value,
-                  "base::size(array) should be of type size_t");
-    static_assert(3u == base::size(array), "base::size(array) should be 3");
+    static_assert(std::is_same<size_t, decltype(std::size(array))>::value,
+                  "std::size(array) should be of type size_t");
+    static_assert(3u == std::size(array), "std::size(array) should be 3");
   }
 }
 
@@ -59,34 +58,34 @@
   {
     std::vector<int> vector;
     static_assert(
-        std::is_same<decltype(base::empty(vector)),
+        std::is_same<decltype(std::empty(vector)),
                      decltype(vector.empty())>::value,
-        "base::empty(vector) should have the same type as vector.empty()");
-    EXPECT_EQ(vector.empty(), base::empty(vector));
+        "std::empty(vector) should have the same type as vector.empty()");
+    EXPECT_EQ(vector.empty(), std::empty(vector));
   }
 
   {
     std::array<int, 4> array = {{1, 2, 3, 4}};
     static_assert(
-        std::is_same<decltype(base::empty(array)),
+        std::is_same<decltype(std::empty(array)),
                      decltype(array.empty())>::value,
-        "base::empty(array) should have the same type as array.empty()");
-    static_assert(base::empty(array) == array.empty(),
-                  "base::empty(array) should be equal to array.empty()");
+        "std::empty(array) should have the same type as array.empty()");
+    static_assert(std::empty(array) == array.empty(),
+                  "std::empty(array) should be equal to array.empty()");
   }
 
   {
     int array[] = {1, 2, 3};
-    static_assert(std::is_same<bool, decltype(base::empty(array))>::value,
-                  "base::empty(array) should be of type bool");
-    static_assert(!base::empty(array), "base::empty(array) should be false");
+    static_assert(std::is_same<bool, decltype(std::empty(array))>::value,
+                  "std::empty(array) should be of type bool");
+    static_assert(!std::empty(array), "std::empty(array) should be false");
   }
 
   {
     constexpr std::initializer_list<int> il;
-    static_assert(std::is_same<bool, decltype(base::empty(il))>::value,
-                  "base::empty(il) should be of type bool");
-    static_assert(base::empty(il), "base::empty(il) should be true");
+    static_assert(std::is_same<bool, decltype(std::empty(il))>::value,
+                  "std::empty(il) should be of type bool");
+    static_assert(std::empty(il), "std::empty(il) should be true");
   }
 }
 
@@ -94,61 +93,60 @@
   {
     std::vector<int> vector = {1, 2, 3, 4, 5};
     static_assert(
-        std::is_same<decltype(base::data(vector)),
+        std::is_same<decltype(std::data(vector)),
                      decltype(vector.data())>::value,
-        "base::data(vector) should have the same type as vector.data()");
-    EXPECT_EQ(vector.data(), base::data(vector));
+        "std::data(vector) should have the same type as vector.data()");
+    EXPECT_EQ(vector.data(), std::data(vector));
   }
 
   {
     const std::string cstr = "const string";
     static_assert(
-        std::is_same<decltype(base::data(cstr)), decltype(cstr.data())>::value,
-        "base::data(cstr) should have the same type as cstr.data()");
+        std::is_same<decltype(std::data(cstr)), decltype(cstr.data())>::value,
+        "std::data(cstr) should have the same type as cstr.data()");
 
-    EXPECT_EQ(cstr.data(), base::data(cstr));
+    EXPECT_EQ(cstr.data(), std::data(cstr));
   }
 
   {
     std::string str = "mutable string";
-    static_assert(std::is_same<decltype(base::data(str)), char*>::value,
-                  "base::data(str) should be of type char*");
-    EXPECT_EQ(str.data(), base::data(str));
+    static_assert(std::is_same<decltype(std::data(str)), char*>::value,
+                  "std::data(str) should be of type char*");
+    EXPECT_EQ(str.data(), std::data(str));
   }
 
   {
     std::string empty_str;
-    static_assert(std::is_same<decltype(base::data(empty_str)), char*>::value,
-                  "base::data(empty_str) should be of type char*");
-    EXPECT_EQ(empty_str.data(), base::data(empty_str));
+    static_assert(std::is_same<decltype(std::data(empty_str)), char*>::value,
+                  "std::data(empty_str) should be of type char*");
+    EXPECT_EQ(empty_str.data(), std::data(empty_str));
   }
 
   {
     std::array<int, 4> array = {{1, 2, 3, 4}};
     static_assert(
-        std::is_same<decltype(base::data(array)),
-                     decltype(array.data())>::value,
-        "base::data(array) should have the same type as array.data()");
+        std::is_same<decltype(std::data(array)), decltype(array.data())>::value,
+        "std::data(array) should have the same type as array.data()");
     // std::array::data() is not constexpr prior to C++17, hence the runtime
     // check.
-    EXPECT_EQ(array.data(), base::data(array));
+    EXPECT_EQ(array.data(), std::data(array));
   }
 
   {
     constexpr int array[] = {1, 2, 3};
-    static_assert(std::is_same<const int*, decltype(base::data(array))>::value,
-                  "base::data(array) should be of type const int*");
-    static_assert(array == base::data(array),
-                  "base::data(array) should be array");
+    static_assert(std::is_same<const int*, decltype(std::data(array))>::value,
+                  "std::data(array) should be of type const int*");
+    static_assert(array == std::data(array),
+                  "std::data(array) should be array");
   }
 
   {
     constexpr std::initializer_list<int> il;
     static_assert(
-        std::is_same<decltype(il.begin()), decltype(base::data(il))>::value,
-        "base::data(il) should have the same type as il.begin()");
-    static_assert(il.begin() == base::data(il),
-                  "base::data(il) should be equal to il.begin()");
+        std::is_same<decltype(il.begin()), decltype(std::data(il))>::value,
+        "std::data(il) should have the same type as il.begin()");
+    static_assert(il.begin() == std::data(il),
+                  "std::data(il) should be equal to il.begin()");
   }
 }
 
diff --git a/base/debug/crash_logging.h b/base/debug/crash_logging.h
index ae98753..c308e22 100644
--- a/base/debug/crash_logging.h
+++ b/base/debug/crash_logging.h
@@ -12,7 +12,6 @@
 #include <type_traits>
 
 #include "base/base_export.h"
-#include "base/cxx17_backports.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
@@ -125,7 +124,7 @@
 // that restricts the name of a crash key to 40 characters.
 #define SCOPED_CRASH_KEY_STRING_INTERNAL2(category, name, nonce, data,  \
                                           key_size)                     \
-  static_assert(::base::size(category "-" name) < 40,                   \
+  static_assert(::std::size(category "-" name) < 40,                    \
                 "Crash key names must be shorter than 40 characters."); \
   ::base::debug::ScopedCrashKeyString scoped_crash_key_helper##nonce(   \
       [] {                                                              \
diff --git a/base/debug/debugger_posix.cc b/base/debug/debugger_posix.cc
index ca6a9d31..ef5e47ad 100644
--- a/base/debug/debugger_posix.cc
+++ b/base/debug/debugger_posix.cc
@@ -17,7 +17,6 @@
 #include <memory>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/threading/platform_thread.h"
@@ -100,13 +99,13 @@
   size_t info_size = sizeof(info);
 
 #if BUILDFLAG(IS_OPENBSD)
-  if (sysctl(mib, base::size(mib), NULL, &info_size, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), NULL, &info_size, NULL, 0) < 0)
     return -1;
 
   mib[5] = (info_size / sizeof(struct kinfo_proc));
 #endif
 
-  int sysctl_result = sysctl(mib, base::size(mib), &info, &info_size, NULL, 0);
+  int sysctl_result = sysctl(mib, std::size(mib), &info, &info_size, NULL, 0);
   DCHECK_EQ(sysctl_result, 0);
   if (sysctl_result != 0) {
     is_set = true;
diff --git a/base/debug/proc_maps_linux_unittest.cc b/base/debug/proc_maps_linux_unittest.cc
index ba190689..56d3106 100644
--- a/base/debug/proc_maps_linux_unittest.cc
+++ b/base/debug/proc_maps_linux_unittest.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/debug/proc_maps_linux.h"
+
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/cxx17_backports.h"
-#include "base/debug/proc_maps_linux.h"
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
@@ -172,7 +172,7 @@
          MappedMemoryRegion::EXECUTE | MappedMemoryRegion::PRIVATE},
   };
 
-  for (size_t i = 0; i < base::size(kTestCases); ++i) {
+  for (size_t i = 0; i < std::size(kTestCases); ++i) {
     SCOPED_TRACE(
         base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i].input));
 
@@ -269,7 +269,7 @@
     "00400000-0040b000 r-xp 00000000 794418 /bin/cat\n",   // Missing device.
   };
 
-  for (size_t i = 0; i < base::size(kTestCases); ++i) {
+  for (size_t i = 0; i < std::size(kTestCases); ++i) {
     SCOPED_TRACE(base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i]));
     std::vector<MappedMemoryRegion> regions;
     EXPECT_FALSE(ParseProcMaps(kTestCases[i], &regions));
@@ -286,7 +286,7 @@
     "00400000-0040b000 rwxp 00000000 fc:00 parse! /bin/cat\n",
   };
 
-  for (size_t i = 0; i < base::size(kTestCases); ++i) {
+  for (size_t i = 0; i < std::size(kTestCases); ++i) {
     SCOPED_TRACE(base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i]));
     std::vector<MappedMemoryRegion> regions;
     EXPECT_FALSE(ParseProcMaps(kTestCases[i], &regions));
diff --git a/base/debug/stack_trace.cc b/base/debug/stack_trace.cc
index 50abca1..6a5bb4b 100644
--- a/base/debug/stack_trace.cc
+++ b/base/debug/stack_trace.cc
@@ -10,7 +10,6 @@
 #include <sstream>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "build/build_config.h"
 #include "build/config/compiler/compiler_buildflags.h"
 
@@ -216,14 +215,14 @@
 }
 #endif  // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
 
-StackTrace::StackTrace() : StackTrace(base::size(trace_)) {}
+StackTrace::StackTrace() : StackTrace(std::size(trace_)) {}
 
 StackTrace::StackTrace(size_t count) {
-  count_ = CollectStackTrace(trace_, std::min(count, base::size(trace_)));
+  count_ = CollectStackTrace(trace_, std::min(count, std::size(trace_)));
 }
 
 StackTrace::StackTrace(const void* const* trace, size_t count) {
-  count = std::min(count, base::size(trace_));
+  count = std::min(count, std::size(trace_));
   if (count)
     memcpy(trace_, trace, count * sizeof(trace_[0]));
   count_ = count;
diff --git a/base/debug/stack_trace_fuchsia.cc b/base/debug/stack_trace_fuchsia.cc
index a2ad540..3840187 100644
--- a/base/debug/stack_trace_fuchsia.cc
+++ b/base/debug/stack_trace_fuchsia.cc
@@ -21,7 +21,6 @@
 #include <type_traits>
 
 #include "base/atomic_sequence_num.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/elf_reader.h"
 #include "base/logging.h"
 
@@ -132,7 +131,7 @@
     // The process name may have a process type suffix at the end (e.g.
     // "context", "renderer", gpu"), which doesn't belong in the module list.
     // Trim the suffix from the name.
-    for (size_t i = 0; i < base::size(app_name) && app_name[i] != '\0'; ++i) {
+    for (size_t i = 0; i < std::size(app_name) && app_name[i] != '\0'; ++i) {
       if (app_name[i] == ':') {
         app_name[i] = 0;
         break;
diff --git a/base/debug/stack_trace_posix.cc b/base/debug/stack_trace_posix.cc
index b558155..31b8a4ca 100644
--- a/base/debug/stack_trace_posix.cc
+++ b/base/debug/stack_trace_posix.cc
@@ -430,7 +430,7 @@
   const int kRegisterPadding = 16;
 #endif
 
-  for (size_t i = 0; i < base::size(registers); i++) {
+  for (size_t i = 0; i < std::size(registers); i++) {
     PrintToStderr(registers[i].label);
     internal::itoa_r(registers[i].value, buf, sizeof(buf),
                      16, kRegisterPadding);
diff --git a/base/feature_list_unittest.cc b/base/feature_list_unittest.cc
index 5cddec583..052875b 100644
--- a/base/feature_list_unittest.cc
+++ b/base/feature_list_unittest.cc
@@ -9,7 +9,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/feature_list_buildflags.h"
 #include "base/format_macros.h"
 #include "base/memory/read_only_shared_memory_region.h"
@@ -82,7 +81,7 @@
       {"OnByDefault", "OnByDefault,OffByDefault", false, false},
   };
 
-  for (size_t i = 0; i < base::size(test_cases); ++i) {
+  for (size_t i = 0; i < std::size(test_cases); ++i) {
     const auto& test_case = test_cases[i];
     SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: [%s] [%s]", i,
                                     test_case.enable_features,
@@ -173,7 +172,7 @@
   };
 
   FieldTrial::ActiveGroup active_group;
-  for (size_t i = 0; i < base::size(test_cases); ++i) {
+  for (size_t i = 0; i < std::size(test_cases); ++i) {
     const auto& test_case = test_cases[i];
     SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]", i));
 
@@ -391,7 +390,7 @@
   const char kForcedOnGroupName[] = "ForcedOn";
   const char kForcedOffGroupName[] = "ForcedOff";
 
-  for (size_t i = 0; i < base::size(test_cases); ++i) {
+  for (size_t i = 0; i < std::size(test_cases); ++i) {
     const auto& test_case = test_cases[i];
     SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: [%s] [%s]", i,
                                     test_case.enable_features,
@@ -727,7 +726,7 @@
        FeatureList::OVERRIDE_DISABLE_FEATURE},
   };
 
-  for (size_t i = 0; i < base::size(test_cases); ++i) {
+  for (size_t i = 0; i < std::size(test_cases); ++i) {
     const auto& test_case = test_cases[i];
     SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: [%s] [%s]", i,
                                     test_case.enable_features,
diff --git a/base/files/file_path.h b/base/files/file_path.h
index 2ef1c22..b75dc08 100644
--- a/base/files/file_path.h
+++ b/base/files/file_path.h
@@ -169,7 +169,7 @@
   // when composing pathnames.
   static const CharType kSeparators[];
 
-  // base::size(kSeparators).
+  // std::size(kSeparators).
   static const size_t kSeparatorsLength;
 
   // A special path component meaning "this directory."
diff --git a/base/files/file_path_constants.cc b/base/files/file_path_constants.cc
index 8794f12..dcf3316 100644
--- a/base/files/file_path_constants.cc
+++ b/base/files/file_path_constants.cc
@@ -4,7 +4,6 @@
 
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 
 namespace base {
@@ -15,7 +14,7 @@
 const FilePath::CharType FilePath::kSeparators[] = FILE_PATH_LITERAL("/");
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
 
-const size_t FilePath::kSeparatorsLength = base::size(kSeparators);
+const size_t FilePath::kSeparatorsLength = std::size(kSeparators);
 
 const FilePath::CharType FilePath::kCurrentDirectory[] = FILE_PATH_LITERAL(".");
 const FilePath::CharType FilePath::kParentDirectory[] = FILE_PATH_LITERAL("..");
diff --git a/base/files/file_path_unittest.cc b/base/files/file_path_unittest.cc
index 6e2fcdf..49433d7 100644
--- a/base/files/file_path_unittest.cc
+++ b/base/files/file_path_unittest.cc
@@ -2,12 +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_path.h"
+
 #include <stddef.h>
 
 #include <sstream>
 
-#include "base/cxx17_backports.h"
-#include "base/files/file_path.h"
 #include "base/files/safe_base_name.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -27,7 +27,7 @@
 #define FPL(x) FILE_PATH_LITERAL(x)
 
 // This macro constructs strings which can contain NULs.
-#define FPS(x) FilePath::StringType(FPL(x), base::size(FPL(x)) - 1)
+#define FPS(x) FilePath::StringType(FPL(x), std::size(FPL(x)) - 1)
 
 namespace base {
 
@@ -148,7 +148,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     FilePath observed = input.DirName();
     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
@@ -235,7 +235,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     FilePath observed = input.BaseName();
     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
@@ -313,7 +313,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath root(cases[i].inputs[0]);
     FilePath::StringType leaf(cases[i].inputs[1]);
     FilePath observed_str = root.Append(leaf);
@@ -392,7 +392,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     FilePath observed = input.StripTrailingSeparators();
     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
@@ -464,7 +464,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     bool observed_is_absolute = input.IsAbsolute();
     EXPECT_EQ(cases[i].expected_is_absolute, observed_is_absolute) <<
@@ -513,7 +513,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     std::vector<FilePath::StringType> comps = input.GetComponents();
 
@@ -571,7 +571,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath parent(cases[i].inputs[0]);
     FilePath child(cases[i].inputs[1]);
 
@@ -653,7 +653,7 @@
 
   const FilePath base(FPL("blah"));
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath parent(cases[i].inputs[0]);
     FilePath child(cases[i].inputs[1]);
     {
@@ -720,7 +720,7 @@
 #endif  // FILE_PATH_USES_WIN_SEPARATORS
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath a(cases[i].inputs[0]);
     FilePath b(cases[i].inputs[1]);
 
@@ -729,7 +729,7 @@
       b.value();
   }
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath a(cases[i].inputs[0]);
     FilePath b(cases[i].inputs[1]);
 
@@ -817,7 +817,7 @@
   };
   // clang-format on
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].input);
     FilePath::StringType extension = path.Extension();
     FilePath::StringType final_extension = path.FinalExtension();
@@ -827,7 +827,7 @@
         << "i: " << i << ", path: " << path.value();
   }
 
-  for (size_t i = 0; i < base::size(double_extension_cases); ++i) {
+  for (size_t i = 0; i < std::size(double_extension_cases); ++i) {
     FilePath path(double_extension_cases[i].input);
     FilePath::StringType extension = path.Extension();
     EXPECT_EQ(double_extension_cases[i].expected, extension)
@@ -895,7 +895,7 @@
     { { FPL("/bar/baz/foo.exe"), FPL(" (1)") },   FPL("/bar/baz/foo (1).exe") },
     { { FPL("/bar/baz/..////"), FPL(" (1)") },    FPL("") },
   };
-  for (unsigned int i = 0; i < base::size(cases); ++i) {
+  for (unsigned int i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].inputs[0]);
     FilePath result = path.InsertBeforeExtension(cases[i].inputs[1]);
     EXPECT_EQ(cases[i].expected, result.value())
@@ -923,7 +923,7 @@
     { FPL("/foo.bar/foo"),        FPL("/foo.bar/foo") },
     { FPL("/foo.bar/..////"),     FPL("/foo.bar/..////") },
   };
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].input);
     FilePath removed = path.RemoveExtension();
     FilePath removed_final = path.RemoveFinalExtension();
@@ -936,7 +936,7 @@
   const FilePath::StringPieceType tarballs[] = {
       FPL("foo.tar.gz"), FPL("foo.tar.xz"), FPL("foo.tar.bz2"),
       FPL("foo.tar.Z"), FPL("foo.tar.bz")};
-  for (size_t i = 0; i < base::size(tarballs); ++i) {
+  for (size_t i = 0; i < std::size(tarballs); ++i) {
     FilePath path(FPL("foo.tar.gz"));
     FilePath removed = path.RemoveExtension();
     FilePath removed_final = path.RemoveFinalExtension();
@@ -977,7 +977,7 @@
     { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
     { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
   };
-  for (unsigned int i = 0; i < base::size(cases); ++i) {
+  for (unsigned int i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].inputs[0]);
     FilePath replaced = path.ReplaceExtension(cases[i].inputs[1]);
     EXPECT_EQ(cases[i].expected, replaced.value()) << "i: " << i <<
@@ -1015,7 +1015,7 @@
     { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
     { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
   };
-  for (unsigned int i = 0; i < base::size(cases); ++i) {
+  for (unsigned int i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].inputs[0]);
     FilePath added = path.AddExtension(cases[i].inputs[1]);
     EXPECT_EQ(cases[i].expected, added.value()) << "i: " << i <<
@@ -1061,7 +1061,7 @@
 #endif
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].inputs[0]);
     FilePath::StringType ext(cases[i].inputs[1]);
 
@@ -1110,7 +1110,7 @@
 #endif
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath path(cases[i].inputs[0]);
     FilePath::StringType ext(cases[i].inputs[1]);
 
@@ -1187,7 +1187,7 @@
 #endif
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath::StringType s1(cases[i].inputs[0]);
     FilePath::StringType s2(cases[i].inputs[1]);
     int result = FilePath::CompareIgnoreCase(s1, s2);
@@ -1222,7 +1222,7 @@
     { FPL("a/b/c"),    false },
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     bool observed = input.ReferencesParent();
     EXPECT_EQ(cases[i].expected, observed) <<
@@ -1236,7 +1236,7 @@
       {FPL("!#$%&'()"), "!#$%&'()"},
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath from_ascii = FilePath::FromASCII(cases[i].utf8);
     EXPECT_EQ(FilePath::StringType(cases[i].native), from_ascii.value())
         << "i: " << i << ", input: " << cases[i].utf8;
@@ -1258,7 +1258,7 @@
   ScopedLocale locale("en_US.UTF-8");
 #endif
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     // Test FromUTF8Unsafe() works.
     FilePath from_utf8 = FilePath::FromUTF8Unsafe(cases[i].utf8);
     EXPECT_EQ(cases[i].native, from_utf8.value())
@@ -1353,7 +1353,7 @@
     { FPL("foo/\\bar/\\"), FPL("foo\\\\bar\\\\") },
     { FPL("/\\foo\\/bar"), FPL("\\\\foo\\\\bar") },
   };
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     FilePath observed = input.NormalizePathSeparators();
     EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
@@ -1410,7 +1410,7 @@
     { FPL("content%2a%2f%2f"),     false },
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     FilePath input(cases[i].input);
     bool observed = input.IsContentUri();
     EXPECT_EQ(cases[i].expected, observed) <<
diff --git a/base/files/file_path_watcher_fsevents.cc b/base/files/file_path_watcher_fsevents.cc
index 2ff9af0..689e5c28 100644
--- a/base/files/file_path_watcher_fsevents.cc
+++ b/base/files/file_path_watcher_fsevents.cc
@@ -11,7 +11,6 @@
 
 #include "base/bind.h"
 #include "base/check.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
 #include "base/mac/scoped_cftyperef.h"
@@ -222,7 +221,7 @@
   CFStringRef paths_array[] = { cf_path.get(), cf_dir_path.get() };
   ScopedCFTypeRef<CFArrayRef> watched_paths(
       CFArrayCreate(NULL, reinterpret_cast<const void**>(paths_array),
-                    base::size(paths_array), &kCFTypeArrayCallBacks));
+                    std::size(paths_array), &kCFTypeArrayCallBacks));
 
   FSEventStreamContext context;
   context.version = 0;
diff --git a/base/files/file_proxy_unittest.cc b/base/files/file_proxy_unittest.cc
index 1323e4f22..c9c8019a 100644
--- a/base/files/file_proxy_unittest.cc
+++ b/base/files/file_proxy_unittest.cc
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -301,7 +300,7 @@
 TEST_F(FileProxyTest, Read) {
   // Setup.
   const char expected_data[] = "bleh";
-  int expected_bytes = base::size(expected_data);
+  int expected_bytes = std::size(expected_data);
   ASSERT_EQ(expected_bytes,
             base::WriteFile(TestPath(), expected_data, expected_bytes));
 
@@ -328,7 +327,7 @@
   CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy);
 
   const char data[] = "foo!";
-  int data_bytes = base::size(data);
+  int data_bytes = std::size(data);
   {
     RunLoop run_loop;
     proxy.Write(0, data, data_bytes,
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 6663259b..c814cebed 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -25,7 +25,6 @@
 #include "base/command_line.h"
 #include "base/containers/contains.h"
 #include "base/containers/stack.h"
-#include "base/cxx17_backports.h"
 #include "base/environment.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
@@ -490,8 +489,7 @@
   DCHECK(!symlink_path.empty());
   DCHECK(target_path);
   char buf[PATH_MAX];
-  ssize_t count =
-      ::readlink(symlink_path.value().c_str(), buf, base::size(buf));
+  ssize_t count = ::readlink(symlink_path.value().c_str(), buf, std::size(buf));
 
 #if BUILDFLAG(IS_ANDROID) && defined(__LP64__)
   // A few 64-bit Android L/M devices return INT_MAX instead of -1 here for
@@ -1063,7 +1061,7 @@
   ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK);
 
   std::set<gid_t> allowed_group_ids;
-  for (int i = 0, ie = base::size(kAdminGroupNames); i < ie; ++i) {
+  for (int i = 0, ie = std::size(kAdminGroupNames); i < ie; ++i) {
     struct group *group_record = getgrnam(kAdminGroupNames[i]);
     if (!group_record) {
       DPLOG(ERROR) << "Could not get the group ID of group \""
diff --git a/base/files/file_util_unittest.cc b/base/files/file_util_unittest.cc
index e3b6b7f..a57f38d 100644
--- a/base/files/file_util_unittest.cc
+++ b/base/files/file_util_unittest.cc
@@ -20,7 +20,6 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
-#include "base/cxx17_backports.h"
 #include "base/environment.h"
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
@@ -351,7 +350,7 @@
   file.open(filename.value());
 #endif  // BUILDFLAG(IS_WIN)
   EXPECT_TRUE(file.is_open());
-  file.getline(contents, size(contents));
+  file.getline(contents, std::size(contents));
   file.close();
   return std::wstring(contents);
 }
@@ -2545,7 +2544,7 @@
   ASSERT_EQ(0, ::_tdupenv_s(&original_tmp, &original_tmp_size, kTmpKey));
   // original_tmp may be NULL.
 
-  for (unsigned int i = 0; i < size(kTmpValues); ++i) {
+  for (unsigned int i = 0; i < std::size(kTmpValues); ++i) {
     FilePath path;
     ::_tputenv_s(kTmpKey, kTmpValues[i]);
     GetTempDir(&path);
@@ -4152,7 +4151,7 @@
   CreateTextFile(text_file, bogus_content);
 
   EXPECT_TRUE(
-      PreReadFile(text_file, /*is_executable=*/false, base::size(bogus_content))
+      PreReadFile(text_file, /*is_executable=*/false, std::size(bogus_content))
           .succeeded());
 }
 
@@ -4161,7 +4160,7 @@
   CreateTextFile(text_file, bogus_content);
 
   EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
-                          base::size(bogus_content) * 2)
+                          std::size(bogus_content) * 2)
                   .succeeded());
 }
 
@@ -4170,7 +4169,7 @@
   CreateTextFile(text_file, bogus_content);
 
   EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
-                          base::size(bogus_content) / 2)
+                          std::size(bogus_content) / 2)
                   .succeeded());
 }
 
diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc
index 90116ac..444cd14 100644
--- a/base/files/file_util_win.cc
+++ b/base/files/file_util_win.cc
@@ -5,6 +5,7 @@
 #include "base/files/file_util.h"
 
 #include <windows.h>
+
 #include <io.h>
 #include <psapi.h>
 #include <shellapi.h>
@@ -20,7 +21,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
@@ -382,10 +382,10 @@
   // Alias paths for investigation of shutdown hangs. crbug.com/1054164
   FilePath::CharType from_path_str[MAX_PATH];
   base::wcslcpy(from_path_str, from_path.value().c_str(),
-                base::size(from_path_str));
+                std::size(from_path_str));
   base::debug::Alias(from_path_str);
   FilePath::CharType to_path_str[MAX_PATH];
-  base::wcslcpy(to_path_str, to_path.value().c_str(), base::size(to_path_str));
+  base::wcslcpy(to_path_str, to_path.value().c_str(), std::size(to_path_str));
   base::debug::Alias(to_path_str);
 
   // Assume that |to_path| already exists and try the normal replace. This will
@@ -935,7 +935,7 @@
 
   wchar_t volume_path[MAX_PATH];
   if (!GetVolumePathNameW(path.NormalizePathSeparators().value().c_str(),
-                          volume_path, size(volume_path))) {
+                          volume_path, std::size(volume_path))) {
     return -1;
   }
 
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index 69fd3f2..6cc86fb 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -16,7 +16,6 @@
 #include "base/callback_helpers.h"
 #include "base/check.h"
 #include "base/critical_closure.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/alias.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
@@ -155,7 +154,7 @@
   // hits a DCHECK because creation fails with no indication why. Pull the path
   // onto the stack so that we can see if it is malformed in some odd way.
   wchar_t path_copy[MAX_PATH];
-  base::wcslcpy(path_copy, path.value().c_str(), base::size(path_copy));
+  base::wcslcpy(path_copy, path.value().c_str(), std::size(path_copy));
   base::debug::Alias(path_copy);
 #endif  // BUILDFLAG(IS_WIN) && DCHECK_IS_ON()
 
@@ -169,7 +168,7 @@
     char path[128];
   } file_info;
   file_info.data_size = data.size();
-  strlcpy(file_info.path, path.value().c_str(), base::size(file_info.path));
+  strlcpy(file_info.path, path.value().c_str(), std::size(file_info.path));
   debug::Alias(&file_info);
 #endif
 
diff --git a/base/hash/md5_constexpr_unittest.cc b/base/hash/md5_constexpr_unittest.cc
index dba6bbae5..da2e283 100644
--- a/base/hash/md5_constexpr_unittest.cc
+++ b/base/hash/md5_constexpr_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "base/hash/md5_constexpr.h"
 
-#include "base/cxx17_backports.h"
 #include "base/hash/md5.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -21,7 +20,7 @@
 // A constexpr comparison operator for MD5Results, allowing compile time tests
 // to be expressed.
 constexpr bool Equal(const MD5Digest& lhs, const MD5Digest& rhs) {
-  for (size_t i = 0; i < base::size(lhs.a); ++i) {
+  for (size_t i = 0; i < std::size(lhs.a); ++i) {
     if (lhs.a[i] != rhs.a[i])
       return false;
   }
@@ -38,18 +37,18 @@
               "incorrect MD5Hash32 implementation");
 
 constexpr char kMessage1[] = "The quick brown fox jumps over the lazy dog";
-static_assert(MD5Hash64Constexpr(kMessage1, base::size(kMessage1) - 1) ==
+static_assert(MD5Hash64Constexpr(kMessage1, std::size(kMessage1) - 1) ==
                   0x9E107D9D372BB682ull,
               "incorrect MD5Hash64 implementation");
 
-static_assert(MD5Hash32Constexpr(kMessage1, base::size(kMessage1) - 1) ==
+static_assert(MD5Hash32Constexpr(kMessage1, std::size(kMessage1) - 1) ==
                   0x9E107D9Dul,
               "incorrect MD5Hash32 implementation");
 
 // Comparison operator for checking that the constexpr MD5 implementation
 // matches the default implementation.
 void ExpectEqual(const MD5Digest& lhs, const MD5Digest& rhs) {
-  for (size_t i = 0; i < base::size(lhs.a); ++i)
+  for (size_t i = 0; i < std::size(lhs.a); ++i)
     EXPECT_EQ(lhs.a[i], rhs.a[i]);
 }
 
diff --git a/base/i18n/break_iterator_unittest.cc b/base/i18n/break_iterator_unittest.cc
index dd05231..a9ba8e87 100644
--- a/base/i18n/break_iterator_unittest.cc
+++ b/base/i18n/break_iterator_unittest.cc
@@ -5,9 +5,9 @@
 #include "base/i18n/break_iterator.h"
 
 #include <stddef.h>
+
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
@@ -506,7 +506,7 @@
   }
   BreakIterator iter(text, BreakIterator::BREAK_CHARACTER);
   ASSERT_TRUE(iter.Init());
-  for (size_t i = 0; i < base::size(kCharacters); ++i) {
+  for (size_t i = 0; i < std::size(kCharacters); ++i) {
     EXPECT_TRUE(iter.Advance());
     EXPECT_EQ(characters[i], iter.GetString());
   }
diff --git a/base/i18n/build_utf8_validator_tables.cc b/base/i18n/build_utf8_validator_tables.cc
index 302ac96..bd8e042 100644
--- a/base/i18n/build_utf8_validator_tables.cc
+++ b/base/i18n/build_utf8_validator_tables.cc
@@ -38,7 +38,6 @@
 #include <vector>
 
 #include "base/command_line.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
@@ -72,7 +71,7 @@
     "};\n"
     "\n"
     "const size_t kUtf8ValidatorTablesSize = "
-    "base::size(kUtf8ValidatorTables);\n"
+    "std::size(kUtf8ValidatorTables);\n"
     "\n"
     "}  // namespace internal\n"
     "}  // namespace base\n";
@@ -183,10 +182,10 @@
     uint8_t bytes[4];
     unsigned int offset = 0;
     UBool is_error = false;
-    U8_APPEND(bytes, offset, base::size(bytes), i, is_error);
+    U8_APPEND(bytes, offset, std::size(bytes), i, is_error);
     DCHECK(!is_error);
     DCHECK_GT(offset, 0u);
-    DCHECK_LE(offset, base::size(bytes));
+    DCHECK_LE(offset, std::size(bytes));
     Pair pair = {Character(bytes, bytes + offset), StringSet()};
     vector.push_back(pair);
   }
@@ -321,7 +320,7 @@
       {static_cast<uint8_t>(range.to() + 1), 1}};
   states->push_back(
       State(new_state_initializer,
-            new_state_initializer + base::size(new_state_initializer)));
+            new_state_initializer + std::size(new_state_initializer)));
   const uint8_t new_state_number =
       base::checked_cast<uint8_t>(states->size() - 1);
   CHECK(state_map->insert(std::make_pair(set, new_state_number)).second);
@@ -355,7 +354,7 @@
           {static_cast<uint8_t>(range.to() + 1), 1}};
       states[0].insert(
           states[0].end(), new_range_initializer,
-          new_range_initializer + base::size(new_range_initializer));
+          new_range_initializer + std::size(new_range_initializer));
     }
   }
   return states;
@@ -431,7 +430,7 @@
       logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
   logging::InitLogging(settings);
   if (base::CommandLine::ForCurrentProcess()->HasSwitch("help")) {
-    fwrite(kHelpText, 1, base::size(kHelpText), stdout);
+    fwrite(kHelpText, 1, std::size(kHelpText), stdout);
     exit(EXIT_SUCCESS);
   }
   base::FilePath filename =
diff --git a/base/i18n/file_util_icu_unittest.cc b/base/i18n/file_util_icu_unittest.cc
index c4fa774..62c3f20 100644
--- a/base/i18n/file_util_icu_unittest.cc
+++ b/base/i18n/file_util_icu_unittest.cc
@@ -148,7 +148,7 @@
 };
 
 TEST_F(FileUtilICUTest, NormalizeFileNameEncoding) {
-  for (size_t i = 0; i < size(kNormalizeFileNameEncodingTestCases); i++) {
+  for (size_t i = 0; i < std::size(kNormalizeFileNameEncodingTestCases); i++) {
     FilePath path(kNormalizeFileNameEncodingTestCases[i].original_path);
     NormalizeFileNameEncoding(&path);
     EXPECT_EQ(FilePath(kNormalizeFileNameEncodingTestCases[i].normalized_path),
diff --git a/base/i18n/icu_string_conversions_unittest.cc b/base/i18n/icu_string_conversions_unittest.cc
index 626df46..bd8c19fd 100644
--- a/base/i18n/icu_string_conversions_unittest.cc
+++ b/base/i18n/icu_string_conversions_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/i18n/icu_string_conversions.h"
+
 #include <math.h>
 #include <stdarg.h>
 #include <stddef.h>
@@ -10,9 +12,7 @@
 #include <sstream>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/format_macros.h"
-#include "base/i18n/icu_string_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -163,7 +163,7 @@
 };
 
 TEST(ICUStringConversionsTest, ConvertBetweenCodepageAndUTF16) {
-  for (size_t i = 0; i < base::size(kConvertCodepageCases); ++i) {
+  for (size_t i = 0; i < std::size(kConvertCodepageCases); ++i) {
     SCOPED_TRACE(base::StringPrintf(
                      "Test[%" PRIuS "]: <encoded: %s> <codepage: %s>", i,
                      kConvertCodepageCases[i].encoded,
@@ -218,7 +218,7 @@
 };
 TEST(ICUStringConversionsTest, ConvertToUtf8AndNormalize) {
   std::string result;
-  for (size_t i = 0; i < base::size(kConvertAndNormalizeCases); ++i) {
+  for (size_t i = 0; i < std::size(kConvertAndNormalizeCases); ++i) {
     SCOPED_TRACE(base::StringPrintf(
                      "Test[%" PRIuS "]: <encoded: %s> <codepage: %s>", i,
                      kConvertAndNormalizeCases[i].encoded,
diff --git a/base/i18n/rtl.cc b/base/i18n/rtl.cc
index fec3f28a..c7f90845 100644
--- a/base/i18n/rtl.cc
+++ b/base/i18n/rtl.cc
@@ -10,7 +10,6 @@
 #include <algorithm>
 
 #include "base/command_line.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/i18n/base_i18n_switches.h"
 #include "base/logging.h"
@@ -203,7 +202,7 @@
       SplitStringPiece(locale_name, "-_", KEEP_WHITESPACE, SPLIT_WANT_ALL);
   const StringPiece& language_code = locale_split[0];
   if (std::binary_search(kRTLLanguageCodes,
-                         kRTLLanguageCodes + base::size(kRTLLanguageCodes),
+                         kRTLLanguageCodes + std::size(kRTLLanguageCodes),
                          language_code))
     return RIGHT_TO_LEFT;
   return LEFT_TO_RIGHT;
diff --git a/base/i18n/streaming_utf8_validator_unittest.cc b/base/i18n/streaming_utf8_validator_unittest.cc
index c82fdc1c..f0706b3 100644
--- a/base/i18n/streaming_utf8_validator_unittest.cc
+++ b/base/i18n/streaming_utf8_validator_unittest.cc
@@ -11,7 +11,6 @@
 
 #include <string>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/string_piece.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -143,7 +142,7 @@
                              "\xef\xbb\xbf",  // UTF-8 BOM
 };
 
-const char* const* const valid_end = valid + base::size(valid);
+const char* const* const valid_end = valid + std::size(valid);
 
 const char* const invalid[] = {
     // always invalid bytes
@@ -176,7 +175,7 @@
     "\xfe\xff", "\xff\xfe",
 };
 
-const char* const* const invalid_end = invalid + base::size(invalid);
+const char* const* const invalid_end = invalid + std::size(invalid);
 
 // A ForwardIterator which returns all the non-empty prefixes of the elements of
 // "valid".
@@ -189,7 +188,7 @@
   // This is a value type; the default copy constructor and assignment operator
   // generated by the compiler are used.
 
-  static PartialIterator end() { return PartialIterator(base::size(valid), 1); }
+  static PartialIterator end() { return PartialIterator(std::size(valid), 1); }
 
   PartialIterator& operator++() {
     Advance();
@@ -212,9 +211,9 @@
       : index_(index), prefix_length_(prefix_length) {}
 
   void Advance() {
-    if (index_ < base::size(valid) && prefix_length_ < strlen(valid[index_]))
+    if (index_ < std::size(valid) && prefix_length_ < strlen(valid[index_]))
       ++prefix_length_;
-    while (index_ < base::size(valid) &&
+    while (index_ < std::size(valid) &&
            prefix_length_ == strlen(valid[index_])) {
       ++index_;
       prefix_length_ = 1;
diff --git a/base/i18n/string_search_unittest.cc b/base/i18n/string_search_unittest.cc
index 4a1606f0..298eafa 100644
--- a/base/i18n/string_search_unittest.cc
+++ b/base/i18n/string_search_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/i18n/string_search.h"
+
 #include <stddef.h>
 
 #include <string>
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/i18n/rtl.h"
-#include "base/i18n/string_search.h"
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/icu/source/i18n/unicode/usearch.h"
@@ -361,7 +361,7 @@
           {.match_index = match_index, .match_length = match_length});
     }
 
-    ASSERT_EQ(base::size(kExpectation), results.size());
+    ASSERT_EQ(std::size(kExpectation), results.size());
     for (size_t i = 0; i < results.size(); ++i) {
       EXPECT_EQ(results[i].match_index, kExpectation[i].match_index);
       EXPECT_EQ(results[i].match_length, kExpectation[i].match_length);
@@ -381,7 +381,7 @@
           {.match_index = match_index, .match_length = match_length});
     }
 
-    ASSERT_EQ(base::size(kExpectation), results.size());
+    ASSERT_EQ(std::size(kExpectation), results.size());
     for (size_t i = 0; i < results.size(); ++i) {
       EXPECT_EQ(results[i].match_index, kExpectation[i].match_index);
       EXPECT_EQ(results[i].match_length, kExpectation[i].match_length);
diff --git a/base/i18n/utf8_validator_tables.cc b/base/i18n/utf8_validator_tables.cc
index 085f08e..5dc9727 100644
--- a/base/i18n/utf8_validator_tables.cc
+++ b/base/i18n/utf8_validator_tables.cc
@@ -6,7 +6,8 @@
 // DO NOT EDIT.
 
 #include "base/i18n/utf8_validator_tables.h"
-#include "base/cxx17_backports.h"
+
+#include <iterator>
 
 namespace base {
 namespace internal {
@@ -50,7 +51,7 @@
     0x81,                                            // 0xa8
 };
 
-const size_t kUtf8ValidatorTablesSize = base::size(kUtf8ValidatorTables);
+const size_t kUtf8ValidatorTablesSize = std::size(kUtf8ValidatorTables);
 
 }  // namespace internal
 }  // namespace base
diff --git a/base/ios/ios_util.mm b/base/ios/ios_util.mm
index 6aa164c..c36a79a3 100644
--- a/base/ios/ios_util.mm
+++ b/base/ios/ios_util.mm
@@ -6,10 +6,8 @@
 
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
-
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/mac/foundation_util.h"
 #include "base/system/sys_info.h"
 
@@ -54,7 +52,7 @@
 bool IsRunningOnOrLater(int32_t major, int32_t minor, int32_t bug_fix) {
   static const int32_t* current_version = OSVersionAsArray();
   int32_t version[] = {major, minor, bug_fix};
-  for (size_t i = 0; i < base::size(version); i++) {
+  for (size_t i = 0; i < std::size(version); i++) {
     if (current_version[i] != version[i])
       return current_version[i] > version[i];
   }
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc
index f4c71f7..16ebccb 100644
--- a/base/json/json_reader_unittest.cc
+++ b/base/json/json_reader_unittest.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/base_paths.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/path_service.h"
@@ -767,7 +766,7 @@
       "/* test *", "{\"foo\"", "{\"foo\":", "  [", "\"\\u123g\"", "{\n\"eh:\n}",
   };
 
-  for (size_t i = 0; i < base::size(kInvalidJson); ++i) {
+  for (size_t i = 0; i < std::size(kInvalidJson); ++i) {
     LOG(INFO) << "Sanity test " << i << ": <" << kInvalidJson[i] << ">";
     JSONReader::ValueWithError root =
         JSONReader::ReadAndReturnValueWithError(kInvalidJson[i]);
@@ -922,7 +921,7 @@
       // clang-format on
   };
 
-  for (unsigned int i = 0; i < base::size(kCases); ++i) {
+  for (unsigned int i = 0; i < std::size(kCases); ++i) {
     auto test_case = kCases[i];
     SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case.input));
 
@@ -963,7 +962,7 @@
       // clang-format on
   };
 
-  for (unsigned int i = 0; i < base::size(kCases); ++i) {
+  for (unsigned int i = 0; i < std::size(kCases); ++i) {
     auto* test_case = kCases[i];
     SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case));
 
@@ -1035,7 +1034,7 @@
       },
   };
 
-  for (unsigned int i = 0; i < base::size(kCases); ++i) {
+  for (unsigned int i = 0; i < std::size(kCases); ++i) {
     auto test_case = kCases[i];
     SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case.input));
 
@@ -1068,7 +1067,7 @@
       {"[\"\\v\"]", JSON_ALLOW_VERT_TAB},
   };
 
-  for (size_t i = 0; i < base::size(kCases); ++i) {
+  for (size_t i = 0; i < std::size(kCases); ++i) {
     SCOPED_TRACE(testing::Message() << "case " << i);
     const auto& test_case = kCases[i];
 
diff --git a/base/json/string_escape_unittest.cc b/base/json/string_escape_unittest.cc
index 601d926..7cc66b5 100644
--- a/base/json/string_escape_unittest.cc
+++ b/base/json/string_escape_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -252,7 +251,7 @@
   }
 
   const char kEmbedNull[] = { '\xab', '\x39', '\0', '\x9f', '\xab' };
-  std::string in(kEmbedNull, base::size(kEmbedNull));
+  std::string in(kEmbedNull, std::size(kEmbedNull));
   EXPECT_FALSE(IsStringUTF8AllowingNoncharacters(in));
   EXPECT_EQ(std::string("\\u00AB9\\u0000\\u009F\\u00AB"),
             EscapeBytesAsInvalidJSONString(in, false));
diff --git a/base/logging.cc b/base/logging.cc
index afb0b870..aa45657 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -143,7 +143,7 @@
 VlogInfo* g_vlog_info_prev = nullptr;
 
 const char* const log_severity_names[] = {"INFO", "WARNING", "ERROR", "FATAL"};
-static_assert(LOGGING_NUM_SEVERITIES == base::size(log_severity_names),
+static_assert(LOGGING_NUM_SEVERITIES == std::size(log_severity_names),
               "Incorrect number of log_severity_names");
 
 const char* log_severity_name(int severity) {
@@ -301,8 +301,8 @@
     // try the current directory
     wchar_t system_buffer[MAX_PATH];
     system_buffer[0] = 0;
-    DWORD len = ::GetCurrentDirectory(base::size(system_buffer), system_buffer);
-    if (len == 0 || len > base::size(system_buffer))
+    DWORD len = ::GetCurrentDirectory(std::size(system_buffer), system_buffer);
+    if (len == 0 || len > std::size(system_buffer))
       return false;
 
     *g_log_file_name = system_buffer;
@@ -714,7 +714,7 @@
       // By default, messages are only readable by the admin group. Explicitly
       // make them readable by the user generating the messages.
       char euid_string[12];
-      snprintf(euid_string, base::size(euid_string), "%d", geteuid());
+      snprintf(euid_string, std::size(euid_string), "%d", geteuid());
       asl_set(asl_message.get(), ASL_KEY_READ_UID, euid_string);
 
       // Map Chrome log severities to ASL log levels.
@@ -877,7 +877,7 @@
       tracker->RecordLogMessage(str_newline);
 
     char str_stack[1024];
-    base::strlcpy(str_stack, str_newline.data(), base::size(str_stack));
+    base::strlcpy(str_stack, str_newline.data(), std::size(str_stack));
     base::debug::Alias(&str_stack);
 
     if (!GetLogAssertHandlerStack().empty()) {
@@ -1005,7 +1005,7 @@
   char msgbuf[kErrorMessageBufferSize];
   DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
   DWORD len = FormatMessageA(flags, nullptr, error_code, 0, msgbuf,
-                             base::size(msgbuf), nullptr);
+                             std::size(msgbuf), nullptr);
   if (len) {
     // Messages returned by system end with line breaks.
     return base::CollapseWhitespaceASCII(msgbuf, true) +
diff --git a/base/mac/authorization_util.mm b/base/mac/authorization_util.mm
index e1900a303..6247665 100644
--- a/base/mac/authorization_util.mm
+++ b/base/mac/authorization_util.mm
@@ -10,7 +10,6 @@
 
 #include <string>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/mac/bundle_locations.h"
 #include "base/mac/foundation_util.h"
@@ -70,7 +69,7 @@
     {kAuthorizationEnvironmentPrompt, prompt_length, (void*)prompt_c, 0}
   };
 
-  AuthorizationEnvironment environment = {base::size(environment_items),
+  AuthorizationEnvironment environment = {std::size(environment_items),
                                           environment_items};
 
   status = AuthorizationCopyRights(authorization,
@@ -95,7 +94,7 @@
   AuthorizationItem right_items[] = {
     {kAuthorizationRightExecute, 0, NULL, 0}
   };
-  AuthorizationRights rights = {base::size(right_items), right_items};
+  AuthorizationRights rights = {std::size(right_items), right_items};
 
   return GetAuthorizationRightsWithPrompt(&rights, prompt, 0);
 }
diff --git a/base/mac/backup_util_unittest.mm b/base/mac/backup_util_unittest.mm
index 854a4147..f746e7d1 100644
--- a/base/mac/backup_util_unittest.mm
+++ b/base/mac/backup_util_unittest.mm
@@ -30,9 +30,9 @@
   FilePath excluded_file_path = temp_dir_.GetPath().Append("excluded");
   constexpr char placeholder_data[] = "All your base are belong to us!";
   // Dump something real into the file.
-  ASSERT_EQ(checked_cast<int>(base::size(placeholder_data)),
+  ASSERT_EQ(checked_cast<int>(std::size(placeholder_data)),
             WriteFile(excluded_file_path, placeholder_data,
-                      base::size(placeholder_data)));
+                      std::size(placeholder_data)));
   // Initial state should be non-excluded.
   EXPECT_FALSE(GetBackupExclusion(excluded_file_path));
   // Exclude the file.
@@ -48,9 +48,9 @@
       base::mac::FilePathToCFURL(excluded_file_path);
 
   constexpr char placeholder_data[] = "All your base are belong to us!";
-  ASSERT_EQ(checked_cast<int>(base::size(placeholder_data)),
+  ASSERT_EQ(checked_cast<int>(std::size(placeholder_data)),
             WriteFile(excluded_file_path, placeholder_data,
-                      base::size(placeholder_data)));
+                      std::size(placeholder_data)));
 
   ASSERT_TRUE(SetBackupExclusion(excluded_file_path));
   EXPECT_TRUE(GetBackupExclusion(excluded_file_path))
@@ -58,9 +58,9 @@
 
   // Re-create the file.
   ASSERT_TRUE(DeleteFile(excluded_file_path));
-  ASSERT_EQ(checked_cast<int>(base::size(placeholder_data)),
+  ASSERT_EQ(checked_cast<int>(std::size(placeholder_data)),
             WriteFile(excluded_file_path, placeholder_data,
-                      base::size(placeholder_data)));
+                      std::size(placeholder_data)));
   EXPECT_FALSE(GetBackupExclusion(excluded_file_path))
       << "Re-created file should not be excluded from backup";
 }
diff --git a/base/mac/foundation_util.mm b/base/mac/foundation_util.mm
index bd26c08..61641e1a 100644
--- a/base/mac/foundation_util.mm
+++ b/base/mac/foundation_util.mm
@@ -10,7 +10,6 @@
 
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/mac/bundle_locations.h"
@@ -158,7 +157,7 @@
 //   returns - path to the application bundle, or empty on error
 FilePath GetAppBundlePath(const FilePath& exec_name) {
   const char kExt[] = ".app";
-  const size_t kExtLength = base::size(kExt) - 1;
+  const size_t kExtLength = std::size(kExt) - 1;
 
   // Split the path into components.
   std::vector<std::string> components = exec_name.GetComponents();
diff --git a/base/mac/foundation_util_unittest.mm b/base/mac/foundation_util_unittest.mm
index c48e2bf..8fcfc003 100644
--- a/base/mac/foundation_util_unittest.mm
+++ b/base/mac/foundation_util_unittest.mm
@@ -7,7 +7,6 @@
 #include <limits.h>
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/format_macros.h"
 #include "base/mac/scoped_cftyperef.h"
@@ -275,12 +274,12 @@
   CFStringRef keys[] = { CFSTR("one"), CFSTR("two"), CFSTR("three") };
   CFNumberRef values[] = { cf_one, cf_two, cf_three };
 
-  static_assert(base::size(keys) == base::size(values),
+  static_assert(std::size(keys) == std::size(values),
                 "keys and values arrays must have the same size");
 
   ScopedCFTypeRef<CFDictionaryRef> test_dict(CFDictionaryCreate(
       kCFAllocatorDefault, reinterpret_cast<const void**>(keys),
-      reinterpret_cast<const void**>(values), base::size(values),
+      reinterpret_cast<const void**>(values), std::size(values),
       &kCFCopyStringDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
 
   // GetValueFromDictionary<>(_, _) should produce the correct
@@ -369,7 +368,7 @@
 #endif  // !defined(ARCH_CPU_64_BITS)
   };
 
-  for (size_t i = 0; i < base::size(nsinteger_cases); ++i) {
+  for (size_t i = 0; i < std::size(nsinteger_cases); ++i) {
     EXPECT_EQ(nsinteger_cases[i].expected,
               StringPrintf("%" PRIdNS, nsinteger_cases[i].value));
     EXPECT_EQ(nsinteger_cases[i].expected_hex,
@@ -393,7 +392,7 @@
 #endif  // !defined(ARCH_CPU_64_BITS)
   };
 
-  for (size_t i = 0; i < base::size(nsuinteger_cases); ++i) {
+  for (size_t i = 0; i < std::size(nsuinteger_cases); ++i) {
     EXPECT_EQ(nsuinteger_cases[i].expected,
               StringPrintf("%" PRIuNS, nsuinteger_cases[i].value));
     EXPECT_EQ(nsuinteger_cases[i].expected_hex,
diff --git a/base/mac/mac_util_unittest.mm b/base/mac/mac_util_unittest.mm
index 4f0a5e5..8360b7c2 100644
--- a/base/mac/mac_util_unittest.mm
+++ b/base/mac/mac_util_unittest.mm
@@ -10,7 +10,6 @@
 #include <stdint.h>
 #include <sys/xattr.h>
 
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -61,7 +60,7 @@
     "/", "/foo", "foo", "/foo/bar.", "foo/bar.", "/foo/bar./bazquux",
     "foo/bar./bazquux", "foo/.app", "//foo",
   };
-  for (size_t i = 0; i < base::size(invalid_inputs); i++) {
+  for (size_t i = 0; i < std::size(invalid_inputs); i++) {
     out = GetAppBundlePath(FilePath(invalid_inputs[i]));
     EXPECT_TRUE(out.empty()) << "loop: " << i;
   }
@@ -85,7 +84,7 @@
     { "/Applications/Google Foo.app/bar/Foo Helper.app/quux/Foo Helper",
         "/Applications/Google Foo.app" },
   };
-  for (size_t i = 0; i < base::size(valid_inputs); i++) {
+  for (size_t i = 0; i < std::size(valid_inputs); i++) {
     out = GetAppBundlePath(FilePath(valid_inputs[i].in));
     EXPECT_FALSE(out.empty()) << "loop: " << i;
     EXPECT_STREQ(valid_inputs[i].expected_out,
diff --git a/base/mac/mach_port_rendezvous_unittest.cc b/base/mac/mach_port_rendezvous_unittest.cc
index 4a140fd..a858337 100644
--- a/base/mac/mach_port_rendezvous_unittest.cc
+++ b/base/mac/mach_port_rendezvous_unittest.cc
@@ -9,7 +9,6 @@
 #include <utility>
 
 #include "base/at_exit.h"
-#include "base/cxx17_backports.h"
 #include "base/mac/foundation_util.h"
 #include "base/mac/mach_logging.h"
 #include "base/strings/stringprintf.h"
@@ -189,7 +188,7 @@
       // insert_right MAKE_SEND_ONCE.
   };
 
-  for (size_t i = 0; i < base::size(kCases); ++i) {
+  for (size_t i = 0; i < std::size(kCases); ++i) {
     SCOPED_TRACE(base::StringPrintf("case %zu", i).c_str());
     const auto& test = kCases[i];
 
diff --git a/base/mac/os_crash_dumps.cc b/base/mac/os_crash_dumps.cc
index 616b9b9..2f13e05 100644
--- a/base/mac/os_crash_dumps.cc
+++ b/base/mac/os_crash_dumps.cc
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 
 namespace base::mac {
@@ -41,7 +40,7 @@
   };
 
   // For all these signals, just wire things up so we exit immediately.
-  for (size_t i = 0; i < base::size(signals_to_intercept); ++i) {
+  for (size_t i = 0; i < std::size(signals_to_intercept); ++i) {
     struct sigaction act = {};
     act.sa_handler = ExitSignalHandler;
 
diff --git a/base/memory/ref_counted_memory_unittest.cc b/base/memory/ref_counted_memory_unittest.cc
index 5ee0165..62ac3173 100644
--- a/base/memory/ref_counted_memory_unittest.cc
+++ b/base/memory/ref_counted_memory_unittest.cc
@@ -51,7 +51,7 @@
   scoped_refptr<RefCountedMemory> mem2;
   {
     const unsigned char kData[] = {12, 11, 99};
-    mem2 = MakeRefCounted<RefCountedBytes>(kData, size(kData));
+    mem2 = MakeRefCounted<RefCountedBytes>(kData, std::size(kData));
   }
   ASSERT_EQ(3U, mem2->size());
   EXPECT_EQ(12U, mem2->front()[0]);
diff --git a/base/message_loop/message_pump_mac.mm b/base/message_loop/message_pump_mac.mm
index 3683667..981822b7 100644
--- a/base/message_loop/message_pump_mac.mm
+++ b/base/message_loop/message_pump_mac.mm
@@ -11,7 +11,6 @@
 
 #include "base/auto_reset.h"
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/feature_list.h"
 #include "base/mac/call_with_eh_frame.h"
 #include "base/mac/scoped_cftyperef.h"
@@ -134,7 +133,7 @@
         // Process work when AppKit is highlighting an item on the main menubar.
         CFSTR("NSUnhighlightMenuRunLoopMode"),
     };
-    static_assert(base::size(modes) == kNumModes, "mode size mismatch");
+    static_assert(std::size(modes) == kNumModes, "mode size mismatch");
     static_assert((1 << kNumModes) - 1 == kAllModesMask,
                   "kAllModesMask not large enough");
 
diff --git a/base/metrics/metrics_hashes_unittest.cc b/base/metrics/metrics_hashes_unittest.cc
index 84f41d4..0cb05f1 100644
--- a/base/metrics/metrics_hashes_unittest.cc
+++ b/base/metrics/metrics_hashes_unittest.cc
@@ -7,7 +7,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/cxx17_backports.h"
 #include "base/format_macros.h"
 #include "base/strings/stringprintf.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -26,7 +25,7 @@
       {"Forward", "0x67d2f6740a8eaebf"},
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     uint64_t hash = HashMetricName(cases[i].input);
     std::string hash_hex = base::StringPrintf("0x%016" PRIx64, hash);
     EXPECT_EQ(cases[i].output, hash_hex);
@@ -44,7 +43,7 @@
       {"Forward", "0x67d2f674"},
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     uint32_t hash = HashMetricNameAs32Bits(cases[i].input);
     std::string hash_hex = base::StringPrintf("0x%08" PRIx32, hash);
     EXPECT_EQ(cases[i].output, hash_hex);
diff --git a/base/metrics/sparse_histogram_unittest.cc b/base/metrics/sparse_histogram_unittest.cc
index 862c757..6b6eda84 100644
--- a/base/metrics/sparse_histogram_unittest.cc
+++ b/base/metrics/sparse_histogram_unittest.cc
@@ -8,7 +8,6 @@
 #include <string>
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_base.h"
@@ -366,7 +365,7 @@
       {2147483647, 2147483648LL},
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     HistogramBase* histogram =
         SparseHistogram::FactoryGet(StringPrintf("ExtremeValues_%zu", i),
                                     HistogramBase::kUmaTargetedHistogramFlag);
diff --git a/base/pickle_unittest.cc b/base/pickle_unittest.cc
index bc623e3..322f163e 100644
--- a/base/pickle_unittest.cc
+++ b/base/pickle_unittest.cc
@@ -12,8 +12,8 @@
 #include <string>
 #include <tuple>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -37,7 +37,7 @@
 // Test raw char16_t writing, assumes UTF16 encoding is ANSI for alpha chars.
 const char16_t testrawstring16[] = {'A', 'l', 'o', 'h', 'a', 0};
 const char testdata[] = "AAA\0BBB\0";
-const int testdatalen = base::size(testdata) - 1;
+const int testdatalen = std::size(testdata) - 1;
 
 // checks that the results can be read correctly from the Pickle
 void VerifyResult(const Pickle& pickle) {
diff --git a/base/process/memory.cc b/base/process/memory.cc
index e73c664..99162fa 100644
--- a/base/process/memory.cc
+++ b/base/process/memory.cc
@@ -40,7 +40,7 @@
   // Pass the size of the failed request in an exception argument.
   ULONG_PTR exception_args[] = {size};
   ::RaiseException(base::win::kOomExceptionCode, EXCEPTION_NONCONTINUABLE,
-                   base::size(exception_args), exception_args);
+                   std::size(exception_args), exception_args);
 
   // Safety check, make sure process exits here.
   _exit(win::kOomExceptionCode);
diff --git a/base/process/process_handle_freebsd.cc b/base/process/process_handle_freebsd.cc
index 6cea233..8fdb4c0 100644
--- a/base/process/process_handle_freebsd.cc
+++ b/base/process/process_handle_freebsd.cc
@@ -11,8 +11,6 @@
 #include <sys/user.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
-
 namespace base {
 
 ProcessId GetParentProcessId(ProcessHandle process) {
@@ -20,7 +18,7 @@
   size_t length;
   int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process };
 
-  if (sysctl(mib, base::size(mib), &info, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
     return -1;
 
   return info.ki_ppid;
@@ -33,7 +31,7 @@
 
   length = sizeof(pathname);
 
-  if (sysctl(mib, base::size(mib), pathname, &length, NULL, 0) < 0 ||
+  if (sysctl(mib, std::size(mib), pathname, &length, NULL, 0) < 0 ||
       length == 0) {
     return FilePath();
   }
diff --git a/base/process/process_handle_openbsd.cc b/base/process/process_handle_openbsd.cc
index 7856df55..2b4bbac 100644
--- a/base/process/process_handle_openbsd.cc
+++ b/base/process/process_handle_openbsd.cc
@@ -9,8 +9,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
-
 namespace base {
 
 ProcessId GetParentProcessId(ProcessHandle process) {
@@ -19,12 +17,12 @@
   int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process,
                 sizeof(struct kinfo_proc), 0 };
 
-  if (sysctl(mib, base::size(mib), NULL, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0)
     return -1;
 
   mib[5] = (length / sizeof(struct kinfo_proc));
 
-  if (sysctl(mib, base::size(mib), &info, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
     return -1;
 
   return info.p_ppid;
@@ -36,10 +34,10 @@
   int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, process,
                 sizeof(struct kinfo_proc), 0 };
 
-  if (sysctl(mib, base::size(mib), NULL, &len, NULL, 0) == -1)
+  if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) == -1)
     return FilePath();
   mib[5] = (len / sizeof(struct kinfo_proc));
-  if (sysctl(mib, base::size(mib), &kp, &len, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &kp, &len, NULL, 0) < 0)
     return FilePath();
   if ((kp.p_flag & P_SYSTEM) != 0)
     return FilePath();
diff --git a/base/process/process_iterator_freebsd.cc b/base/process/process_iterator_freebsd.cc
index bf0215b..5603de9 100644
--- a/base/process/process_iterator_freebsd.cc
+++ b/base/process/process_iterator_freebsd.cc
@@ -10,7 +10,6 @@
 #include <sys/sysctl.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -29,7 +28,7 @@
 
   do {
     size_t len = 0;
-    if (sysctl(mib, base::size(mib), NULL, &len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) < 0) {
       LOG(ERROR) << "failed to get the size needed for the process list";
       kinfo_procs_.resize(0);
       done = true;
@@ -40,7 +39,7 @@
       num_of_kinfo_proc += 16;
       kinfo_procs_.resize(num_of_kinfo_proc);
       len = num_of_kinfo_proc * sizeof(struct kinfo_proc);
-      if (sysctl(mib, base::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
+      if (sysctl(mib, std::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
         // If we get a mem error, it just means we need a bigger buffer, so
         // loop around again.  Anything else is a real error and give up.
         if (errno != ENOMEM) {
@@ -78,14 +77,14 @@
       continue;
 
     length = 0;
-    if (sysctl(mib, base::size(mib), NULL, &length, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0) {
       LOG(ERROR) << "failed to figure out the buffer size for a command line";
       continue;
     }
 
     data.resize(length);
 
-    if (sysctl(mib, base::size(mib), &data[0], &length, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), &data[0], &length, NULL, 0) < 0) {
       LOG(ERROR) << "failed to fetch a commandline";
       continue;
     }
diff --git a/base/process/process_iterator_mac.cc b/base/process/process_iterator_mac.cc
index 882f166..caa2295 100644
--- a/base/process/process_iterator_mac.cc
+++ b/base/process/process_iterator_mac.cc
@@ -10,7 +10,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -35,7 +34,7 @@
   do {
     // Get the size of the buffer
     size_t len = 0;
-    if (sysctl(mib, base::size(mib), NULL, &len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) < 0) {
       DLOG(ERROR) << "failed to get the size needed for the process list";
       kinfo_procs_.resize(0);
       done = true;
@@ -47,7 +46,7 @@
       kinfo_procs_.resize(num_of_kinfo_proc);
       len = num_of_kinfo_proc * sizeof(struct kinfo_proc);
       // Load the list of processes
-      if (sysctl(mib, base::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
+      if (sysctl(mib, std::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
         // If we get a mem error, it just means we need a bigger buffer, so
         // loop around again.  Anything else is a real error and give up.
         if (errno != ENOMEM) {
@@ -85,13 +84,13 @@
 
     // Find out what size buffer we need.
     size_t data_len = 0;
-    if (sysctl(mib, base::size(mib), NULL, &data_len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &data_len, NULL, 0) < 0) {
       DVPLOG(1) << "failed to figure out the buffer size for a commandline";
       continue;
     }
 
     data.resize(data_len);
-    if (sysctl(mib, base::size(mib), &data[0], &data_len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), &data[0], &data_len, NULL, 0) < 0) {
       DVPLOG(1) << "failed to fetch a commandline";
       continue;
     }
diff --git a/base/process/process_iterator_openbsd.cc b/base/process/process_iterator_openbsd.cc
index 782d7015..8168c584 100644
--- a/base/process/process_iterator_openbsd.cc
+++ b/base/process/process_iterator_openbsd.cc
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <sys/sysctl.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -28,7 +27,7 @@
 
   do {
     size_t len = 0;
-    if (sysctl(mib, base::size(mib), NULL, &len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &len, NULL, 0) < 0) {
       DLOG(ERROR) << "failed to get the size needed for the process list";
       kinfo_procs_.resize(0);
       done = true;
@@ -39,7 +38,7 @@
       num_of_kinfo_proc += 16;
       kinfo_procs_.resize(num_of_kinfo_proc);
       len = num_of_kinfo_proc * sizeof(struct kinfo_proc);
-      if (sysctl(mib, base::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
+      if (sysctl(mib, std::size(mib), &kinfo_procs_[0], &len, NULL, 0) < 0) {
         // If we get a mem error, it just means we need a bigger buffer, so
         // loop around again.  Anything else is a real error and give up.
         if (errno != ENOMEM) {
@@ -78,13 +77,13 @@
 
     // Find out what size buffer we need.
     size_t data_len = 0;
-    if (sysctl(mib, base::size(mib), NULL, &data_len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), NULL, &data_len, NULL, 0) < 0) {
       DVPLOG(1) << "failed to figure out the buffer size for a commandline";
       continue;
     }
 
     data.resize(data_len);
-    if (sysctl(mib, base::size(mib), &data[0], &data_len, NULL, 0) < 0) {
+    if (sysctl(mib, std::size(mib), &data[0], &data_len, NULL, 0) < 0) {
       DVPLOG(1) << "failed to fetch a commandline";
       continue;
     }
diff --git a/base/process/process_metrics_freebsd.cc b/base/process/process_metrics_freebsd.cc
index 2c3c13ede..8557b64 100644
--- a/base/process/process_metrics_freebsd.cc
+++ b/base/process/process_metrics_freebsd.cc
@@ -9,7 +9,6 @@
 #include <sys/user.h>
 #include <unistd.h>
 
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/process/process_metrics_iocounters.h"
 
@@ -30,7 +29,7 @@
   int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, process_};
   size_t length = sizeof(info);
 
-  if (sysctl(mib, base::size(mib), &info, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
     return 0;
 
   return (info.ki_pctcpu / FSCALE) * 100.0;
@@ -50,7 +49,7 @@
   unsigned long mem_total, mem_free, mem_inactive;
   size_t length = sizeof(mem_total);
 
-  if (sysctl(mib, base::size(mib), &mem_total, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &mem_total, &length, NULL, 0) < 0)
     return 0;
 
   length = sizeof(mem_free);
diff --git a/base/process/process_metrics_openbsd.cc b/base/process/process_metrics_openbsd.cc
index b5cafee..1317a35 100644
--- a/base/process/process_metrics_openbsd.cc
+++ b/base/process/process_metrics_openbsd.cc
@@ -9,7 +9,6 @@
 #include <sys/param.h>
 #include <sys/sysctl.h>
 
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/process/process_metrics_iocounters.h"
 
@@ -31,12 +30,12 @@
   int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid,
                 sizeof(struct kinfo_proc), 0 };
 
-  if (sysctl(mib, base::size(mib), NULL, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), NULL, &length, NULL, 0) < 0)
     return -1;
 
   mib[5] = (length / sizeof(struct kinfo_proc));
 
-  if (sysctl(mib, base::size(mib), &info, &length, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &info, &length, NULL, 0) < 0)
     return 0;
 
   return info.p_pctcpu;
@@ -75,7 +74,7 @@
   unsigned long mem_total, mem_free, mem_inactive;
   size_t len = sizeof(vmtotal);
 
-  if (sysctl(mib, base::size(mib), &vmtotal, &len, NULL, 0) < 0)
+  if (sysctl(mib, std::size(mib), &vmtotal, &len, NULL, 0) < 0)
     return 0;
 
   mem_total = vmtotal.t_vm;
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index f37a0a9..fcc1ecd 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -186,7 +186,7 @@
 
   HANDLE events[] = {Handle(), stop_event_handle.get()};
   DWORD wait_result =
-      ::WaitForMultipleObjects(base::size(events), events, FALSE, INFINITE);
+      ::WaitForMultipleObjects(std::size(events), events, FALSE, INFINITE);
 
   if (wait_result == WAIT_OBJECT_0) {
     DWORD temp_code;  // Don't clobber out-parameters in case of failure.
diff --git a/base/profiler/chrome_unwind_info_android_unittest.cc b/base/profiler/chrome_unwind_info_android_unittest.cc
index e33cf7c..6eaeeb9 100644
--- a/base/profiler/chrome_unwind_info_android_unittest.cc
+++ b/base/profiler/chrome_unwind_info_android_unittest.cc
@@ -19,8 +19,8 @@
                   e2.function_offset_table_byte_index);
 }
 
-template <class T>
-void ExpectSpanSizeAndContentsEqual(span<T> actual, span<T> expected) {
+template <class T, size_t E1, size_t E2>
+void ExpectSpanSizeAndContentsEqual(span<T, E1> actual, span<T, E2> expected) {
   EXPECT_EQ(actual.size(), expected.size());
   if (actual.size() != expected.size()) {
     return;
@@ -76,17 +76,13 @@
   ASSERT_EQ(&data[256], reinterpret_cast<const uint8_t*>(
                             &unwind_info.unwind_instruction_table[0]));
 
-  ExpectSpanSizeAndContentsEqual(unwind_info.page_table,
-                                 make_span(page_table, size(page_table)));
-  ExpectSpanSizeAndContentsEqual(
-      unwind_info.function_table,
-      make_span(function_table, size(function_table)));
-  ExpectSpanSizeAndContentsEqual(
-      unwind_info.function_offset_table,
-      make_span(function_offset_table, size(function_offset_table)));
-  ExpectSpanSizeAndContentsEqual(
-      unwind_info.unwind_instruction_table,
-      make_span(unwind_instruction_table, size(unwind_instruction_table)));
+  ExpectSpanSizeAndContentsEqual(unwind_info.page_table, make_span(page_table));
+  ExpectSpanSizeAndContentsEqual(unwind_info.function_table,
+                                 make_span(function_table));
+  ExpectSpanSizeAndContentsEqual(unwind_info.function_offset_table,
+                                 make_span(function_offset_table));
+  ExpectSpanSizeAndContentsEqual(unwind_info.unwind_instruction_table,
+                                 make_span(unwind_instruction_table));
 }
 
 }  // namespace base
diff --git a/base/profiler/chrome_unwinder_android_v2_unittest.cc b/base/profiler/chrome_unwinder_android_v2_unittest.cc
index b76d5d9..67ea7a8 100644
--- a/base/profiler/chrome_unwinder_android_v2_unittest.cc
+++ b/base/profiler/chrome_unwinder_android_v2_unittest.cc
@@ -1002,7 +1002,7 @@
 
 TEST(ChromeUnwinderAndroidV2Test, TryUnwind) {
   const uint32_t page_table[] = {0, 2};
-  const size_t number_of_pages = base::size(page_table);
+  const size_t number_of_pages = std::size(page_table);
   const size_t page_size = 1 << 17;
 
   const FunctionTableEntry function_table[] = {
@@ -1044,10 +1044,10 @@
   };
 
   auto unwind_info = ChromeUnwindInfoAndroid{
-      make_span(unwind_instruction_table, base::size(unwind_instruction_table)),
-      make_span(function_offset_table, base::size(function_offset_table)),
-      make_span(function_table, base::size(function_table)),
-      make_span(page_table, base::size(page_table)),
+      make_span(unwind_instruction_table, std::size(unwind_instruction_table)),
+      make_span(function_offset_table, std::size(function_offset_table)),
+      make_span(function_table, std::size(function_table)),
+      make_span(page_table, std::size(page_table)),
   };
 
   ModuleCache module_cache;
diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc
index 7e5a145..0f402ae 100644
--- a/base/profiler/stack_sampling_profiler_unittest.cc
+++ b/base/profiler/stack_sampling_profiler_unittest.cc
@@ -634,7 +634,7 @@
         params[1].sampling_interval = Milliseconds(1);
         params[1].samples_per_profile = 100000;
 
-        SampleRecordedCounter samples_recorded[size(params)];
+        SampleRecordedCounter samples_recorded[std::size(params)];
         ModuleCache module_cache1, module_cache2;
         TestProfilerInfo profiler_info0(target_thread_token, params[0],
                                         &module_cache1, &samples_recorded[0]);
diff --git a/base/strings/abseil_string_number_conversions_unittest.cc b/base/strings/abseil_string_number_conversions_unittest.cc
index 12e60ee4..dd8191f1 100644
--- a/base/strings/abseil_string_number_conversions_unittest.cc
+++ b/base/strings/abseil_string_number_conversions_unittest.cc
@@ -8,7 +8,6 @@
 
 #include <limits>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/string_piece.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/numeric/int128.h"
@@ -93,7 +92,7 @@
   const char input[] =
       "0xc0ffee\0"
       "9";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   absl::uint128 output;
   EXPECT_FALSE(HexStringToUInt128(input_string, &output));
   EXPECT_EQ(0xc0ffeeU, output);
diff --git a/base/strings/escape.cc b/base/strings/escape.cc
index 5d83218..23eac91 100644
--- a/base/strings/escape.cc
+++ b/base/strings/escape.cc
@@ -96,7 +96,7 @@
     // reach max character length number of bytes, or hit an unescaped
     // character. No need to check length of escaped_text, as
     // UnescapeUnsignedByteAtIndex checks lengths.
-    while (num_bytes < size(bytes) &&
+    while (num_bytes < std::size(bytes) &&
            UnescapeUnsignedByteAtIndex(escaped_text, index + num_bytes * 3,
                                        &bytes[num_bytes]) &&
            CBU8_IS_TRAIL(bytes[num_bytes])) {
@@ -441,4 +441,4 @@
   return false;
 }
 
-}  // namespace base
\ No newline at end of file
+}  // namespace base
diff --git a/base/strings/string_number_conversions_unittest.cc b/base/strings/string_number_conversions_unittest.cc
index 572e930..8becfde 100644
--- a/base/strings/string_number_conversions_unittest.cc
+++ b/base/strings/string_number_conversions_unittest.cc
@@ -14,7 +14,6 @@
 #include <limits>
 
 #include "base/bit_cast.h"
-#include "base/cxx17_backports.h"
 #include "base/format_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -155,7 +154,7 @@
   // embedded NUL characters.  The NUL and extra data after it should be
   // interpreted as junk after the number.
   const char input[] = "6\06";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   int output;
   EXPECT_FALSE(StringToInt(input_string, &output));
   EXPECT_EQ(6, output);
@@ -221,7 +220,7 @@
   // embedded NUL characters.  The NUL and extra data after it should be
   // interpreted as junk after the number.
   const char input[] = "6\06";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   unsigned output;
   EXPECT_FALSE(StringToUint(input_string, &output));
   EXPECT_EQ(6U, output);
@@ -291,7 +290,7 @@
   // embedded NUL characters.  The NUL and extra data after it should be
   // interpreted as junk after the number.
   const char input[] = "6\06";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   int64_t output;
   EXPECT_FALSE(StringToInt64(input_string, &output));
   EXPECT_EQ(6, output);
@@ -358,7 +357,7 @@
   // embedded NUL characters.  The NUL and extra data after it should be
   // interpreted as junk after the number.
   const char input[] = "6\06";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   uint64_t output;
   EXPECT_FALSE(StringToUint64(input_string, &output));
   EXPECT_EQ(6U, output);
@@ -427,7 +426,7 @@
   // embedded NUL characters.  The NUL and extra data after it should be
   // interpreted as junk after the number.
   const char input[] = "6\06";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   size_t output;
   EXPECT_FALSE(StringToSizeT(input_string, &output));
   EXPECT_EQ(6U, output);
@@ -486,7 +485,7 @@
   const char input[] =
       "0xc0ffee\0"
       "9";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   int output;
   EXPECT_FALSE(HexStringToInt(input_string, &output));
   EXPECT_EQ(0xc0ffee, output);
@@ -553,7 +552,7 @@
   const char input[] =
       "0xc0ffee\0"
       "9";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   uint32_t output;
   EXPECT_FALSE(HexStringToUInt(input_string, &output));
   EXPECT_EQ(0xc0ffeeU, output);
@@ -614,7 +613,7 @@
   const char input[] =
       "0xc0ffee\0"
       "9";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   int64_t output;
   EXPECT_FALSE(HexStringToInt64(input_string, &output));
   EXPECT_EQ(0xc0ffee, output);
@@ -679,7 +678,7 @@
   const char input[] =
       "0xc0ffee\0"
       "9";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   uint64_t output;
   EXPECT_FALSE(HexStringToUInt64(input_string, &output));
   EXPECT_EQ(0xc0ffeeU, output);
@@ -712,7 +711,7 @@
        11, true},
   };
 
-  for (size_t test_i = 0; test_i < base::size(cases); ++test_i) {
+  for (size_t test_i = 0; test_i < std::size(cases); ++test_i) {
     const auto& test = cases[test_i];
 
     std::string expected_output(test.output, test.output_len);
@@ -855,7 +854,7 @@
        -1.0000000000000001e-259, true},
   };
 
-  for (size_t i = 0; i < base::size(cases); ++i) {
+  for (size_t i = 0; i < std::size(cases); ++i) {
     SCOPED_TRACE(
         StringPrintf("case %" PRIuS " \"%s\"", i, cases[i].input.c_str()));
     double output;
@@ -872,7 +871,7 @@
   const char input[] =
       "3.14\0"
       "159";
-  std::string input_string(input, base::size(input) - 1);
+  std::string input_string(input, std::size(input) - 1);
   double output;
   EXPECT_FALSE(StringToDouble(input_string, &output));
   EXPECT_DOUBLE_EQ(3.14, output);
@@ -901,12 +900,12 @@
   // The following two values were seen in crashes in the wild.
   const char input_bytes[8] = {0, 0, 0, 0, '\xee', '\x6d', '\x73', '\x42'};
   double input = 0;
-  memcpy(&input, input_bytes, base::size(input_bytes));
+  memcpy(&input, input_bytes, std::size(input_bytes));
   EXPECT_EQ("1.335179083776e+12", NumberToString(input));
   const char input_bytes2[8] = {0,      0,      0,      '\xa0',
                                 '\xda', '\x6c', '\x73', '\x42'};
   input = 0;
-  memcpy(&input, input_bytes2, base::size(input_bytes2));
+  memcpy(&input, input_bytes2, std::size(input_bytes2));
   EXPECT_EQ("1.33489033216e+12", NumberToString(input));
 }
 
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index 1bc53b3..2ff7cec 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -22,7 +22,6 @@
 #include <vector>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/no_destructor.h"
 #include "base/strings/string_util_internal.h"
 #include "base/strings/utf_string_conversion_utils.h"
@@ -336,17 +335,17 @@
   size_t dimension = 0;
   const int kKilo = 1024;
   while (unit_amount >= kKilo &&
-         dimension < base::size(kByteStringsUnlocalized) - 1) {
+         dimension < std::size(kByteStringsUnlocalized) - 1) {
     unit_amount /= kKilo;
     dimension++;
   }
 
   char buf[64];
   if (bytes != 0 && dimension > 0 && unit_amount < 100) {
-    base::snprintf(buf, base::size(buf), "%.1lf%s", unit_amount,
+    base::snprintf(buf, std::size(buf), "%.1lf%s", unit_amount,
                    kByteStringsUnlocalized[dimension]);
   } else {
-    base::snprintf(buf, base::size(buf), "%.0lf%s", unit_amount,
+    base::snprintf(buf, std::size(buf), "%.0lf%s", unit_amount,
                    kByteStringsUnlocalized[dimension]);
   }
 
diff --git a/base/strings/string_util_internal.h b/base/strings/string_util_internal.h
index 9544500..1e64412f 100644
--- a/base/strings/string_util_internal.h
+++ b/base/strings/string_util_internal.h
@@ -523,7 +523,7 @@
           typename T,
           typename CharT = typename T::value_type>
 static std::basic_string<CharT> JoinStringT(list_type parts, T sep) {
-  if (base::empty(parts))
+  if (std::empty(parts))
     return std::basic_string<CharT>();
 
   // Pre-allocate the eventual size of the string. Start with the size of all of
diff --git a/base/strings/string_util_unittest.cc b/base/strings/string_util_unittest.cc
index 01888cf..e0a3f76 100644
--- a/base/strings/string_util_unittest.cc
+++ b/base/strings/string_util_unittest.cc
@@ -14,7 +14,6 @@
 #include <type_traits>
 
 #include "base/bits.h"
-#include "base/cxx17_backports.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
@@ -218,14 +217,14 @@
 
   {
     const char array[] = "\x00\x00\xc2\x81\xc2\x81";
-    const std::string array_string(array, base::size(array));
+    const std::string array_string(array, std::size(array));
     EXPECT_TRUE(Truncated(array_string, 4, &output));
     EXPECT_EQ(output.compare(std::string("\x00\x00\xc2\x81", 4)), 0);
   }
 
   {
     const char array[] = "\x00\xc2\x81\xc2\x81";
-    const std::string array_string(array, base::size(array));
+    const std::string array_string(array, std::size(array));
     EXPECT_TRUE(Truncated(array_string, 4, &output));
     EXPECT_EQ(output.compare(std::string("\x00\xc2\x81", 3)), 0);
   }
@@ -292,7 +291,7 @@
 
   {
     const char array[] = "\x00\x00\xfe\xff";
-    const std::string array_string(array, base::size(array));
+    const std::string array_string(array, std::size(array));
     EXPECT_TRUE(Truncated(array_string, 4, &output));
     EXPECT_EQ(output.compare(std::string("\x00\x00", 2)), 0);
   }
@@ -306,7 +305,7 @@
   }
   {
     const char array[] = "\xff\x00\x00\xfe";
-    const std::string array_string(array, base::size(array));
+    const std::string array_string(array, std::size(array));
     EXPECT_TRUE(Truncated(array_string, 4, &output));
     EXPECT_EQ(output.compare(std::string("\xff\x00\x00", 3)), 0);
   }
@@ -536,7 +535,7 @@
   // Also, test that a non-ASCII character will be detected regardless of its
   // position inside the string.
   {
-    const size_t string_length = base::size(char_ascii) - 1;
+    const size_t string_length = std::size(char_ascii) - 1;
     for (size_t offset = 0; offset < 8; ++offset) {
       for (size_t len = 0, max_len = string_length - offset; len < max_len;
            ++len) {
@@ -551,7 +550,7 @@
   }
 
   {
-    const size_t string_length = base::size(char16_ascii) - 1;
+    const size_t string_length = std::size(char16_ascii) - 1;
     for (size_t offset = 0; offset < 4; ++offset) {
       for (size_t len = 0, max_len = string_length - offset; len < max_len;
            ++len) {
@@ -605,7 +604,7 @@
     L"0123ABCDwxyz \a\b\t\r\n!+,.~"
   };
 
-  for (size_t i = 0; i < base::size(char_cases); ++i) {
+  for (size_t i = 0; i < std::size(char_cases); ++i) {
     EXPECT_TRUE(IsStringASCII(char_cases[i]));
     std::u16string utf16 = ASCIIToUTF16(char_cases[i]);
     EXPECT_EQ(WideToUTF16(wchar_cases[i]), utf16);
@@ -624,7 +623,7 @@
 
   // Convert strings with an embedded NUL character.
   const char chars_with_nul[] = "test\0string";
-  const int length_with_nul = base::size(chars_with_nul) - 1;
+  const int length_with_nul = std::size(chars_with_nul) - 1;
   std::string string_with_nul(chars_with_nul, length_with_nul);
   std::u16string string16_with_nul = ASCIIToUTF16(string_with_nul);
   EXPECT_EQ(static_cast<std::u16string::size_type>(length_with_nul),
@@ -1219,9 +1218,9 @@
   {
     char dst[10];
     wchar_t wdst[10];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", base::size(dst)));
+    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", std::size(dst)));
     EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", base::size(wdst)));
+    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", std::size(wdst)));
     EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
   }
 
@@ -1242,9 +1241,9 @@
   {
     char dst[8];
     wchar_t wdst[8];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", base::size(dst)));
+    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", std::size(dst)));
     EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", base::size(wdst)));
+    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", std::size(wdst)));
     EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
   }
 
@@ -1252,9 +1251,9 @@
   {
     char dst[7];
     wchar_t wdst[7];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", base::size(dst)));
+    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", std::size(dst)));
     EXPECT_EQ(0, memcmp(dst, "abcdef", 7));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", base::size(wdst)));
+    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", std::size(wdst)));
     EXPECT_EQ(0, memcmp(wdst, L"abcdef", sizeof(wchar_t) * 7));
   }
 
@@ -1262,9 +1261,9 @@
   {
     char dst[3];
     wchar_t wdst[3];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", base::size(dst)));
+    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", std::size(dst)));
     EXPECT_EQ(0, memcmp(dst, "ab", 3));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", base::size(wdst)));
+    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", std::size(wdst)));
     EXPECT_EQ(0, memcmp(wdst, L"ab", sizeof(wchar_t) * 3));
   }
 }
@@ -1504,7 +1503,7 @@
     // Using std::string(buffer.c_str()) instead of |buffer| truncates the
     // string at the first \0.
     EXPECT_EQ(
-        std::string(kOriginal, std::min(num_chars, base::size(kOriginal) - 1)),
+        std::string(kOriginal, std::min(num_chars, std::size(kOriginal) - 1)),
         std::string(buffer.c_str()));
     EXPECT_EQ(num_chars, buffer.size());
   }
diff --git a/base/strings/stringprintf.cc b/base/strings/stringprintf.cc
index fa91ce4..1a404853 100644
--- a/base/strings/stringprintf.cc
+++ b/base/strings/stringprintf.cc
@@ -9,7 +9,6 @@
 
 #include <vector>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/scoped_clear_last_error.h"
 #include "base/strings/string_util.h"
@@ -64,17 +63,17 @@
   va_copy(ap_copy, ap);
 
   base::ScopedClearLastError last_error;
-  int result = vsnprintfT(stack_buf, base::size(stack_buf), format, ap_copy);
+  int result = vsnprintfT(stack_buf, std::size(stack_buf), format, ap_copy);
   va_end(ap_copy);
 
-  if (result >= 0 && result < static_cast<int>(base::size(stack_buf))) {
+  if (result >= 0 && result < static_cast<int>(std::size(stack_buf))) {
     // It fit.
     dst->append(stack_buf, result);
     return;
   }
 
   // Repeatedly increase buffer size until it fits.
-  int mem_length = base::size(stack_buf);
+  int mem_length = std::size(stack_buf);
   while (true) {
     if (result < 0) {
 #if BUILDFLAG(IS_WIN)
diff --git a/base/strings/utf_offset_string_conversions_unittest.cc b/base/strings/utf_offset_string_conversions_unittest.cc
index b2526d0..aea9bd04 100644
--- a/base/strings/utf_offset_string_conversions_unittest.cc
+++ b/base/strings/utf_offset_string_conversions_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/strings/utf_offset_string_conversions.h"
+
 #include <stddef.h>
 
 #include <algorithm>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/string_piece.h"
-#include "base/strings/utf_offset_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -66,7 +66,7 @@
       {{'A', 0xd800, 0xdf00, 'z'}, 3, 5},
       {{'A', 0xd800, 0xdf00, 'z'}, 4, 6},
   };
-  for (size_t i = 0; i < base::size(utf16_to_utf8_cases); ++i) {
+  for (size_t i = 0; i < std::size(utf16_to_utf8_cases); ++i) {
     size_t offset = utf16_to_utf8_cases[i].input_offset;
     std::vector<size_t> offsets;
     offsets.push_back(offset);
@@ -117,8 +117,8 @@
     adjustments.push_back(OffsetAdjuster::Adjustment(3, 3, 1));
     OffsetAdjuster::AdjustOffsets(adjustments, &offsets);
     size_t expected_1[] = {0, 1, 2, 3, kNpos, kNpos, 4, 5, 6, 7};
-    EXPECT_EQ(offsets.size(), base::size(expected_1));
-    for (size_t i = 0; i < base::size(expected_1); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_1));
+    for (size_t i = 0; i < std::size(expected_1); ++i)
       EXPECT_EQ(expected_1[i], offsets[i]);
   }
 
@@ -137,8 +137,8 @@
       0, kNpos, kNpos, 1, 2, kNpos, kNpos, kNpos, 4, 5, 6, kNpos, kNpos, kNpos,
       kNpos, kNpos, kNpos, 10, 11, 12, 13, kNpos, kNpos, 14
     };
-    EXPECT_EQ(offsets.size(), base::size(expected_2));
-    for (size_t i = 0; i < base::size(expected_2); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_2));
+    for (size_t i = 0; i < std::size(expected_2); ++i)
       EXPECT_EQ(expected_2[i], offsets[i]);
   }
 
@@ -157,8 +157,8 @@
       0, kNpos, kNpos, 0, 1, kNpos, kNpos, kNpos, 5, 6, 7, 8, kNpos, kNpos, 11,
       12, kNpos, 12
     };
-    EXPECT_EQ(offsets.size(), base::size(expected_3));
-    for (size_t i = 0; i < base::size(expected_3); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_3));
+    for (size_t i = 0; i < std::size(expected_3); ++i)
       EXPECT_EQ(expected_3[i], offsets[i]);
   }
 }
@@ -175,8 +175,8 @@
     adjustments.push_back(OffsetAdjuster::Adjustment(3, 3, 1));
     OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
     size_t expected_1[] = {0, 1, 2, 3, 6, 7, 8, 9};
-    EXPECT_EQ(offsets.size(), base::size(expected_1));
-    for (size_t i = 0; i < base::size(expected_1); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_1));
+    for (size_t i = 0; i < std::size(expected_1); ++i)
       EXPECT_EQ(expected_1[i], offsets[i]);
   }
 
@@ -194,8 +194,8 @@
     size_t expected_2[] = {
       0, 3, 4, kNpos, 8, 9, 10, kNpos, kNpos, kNpos, 17, 18, 19, 20, 23
     };
-    EXPECT_EQ(offsets.size(), base::size(expected_2));
-    for (size_t i = 0; i < base::size(expected_2); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_2));
+    for (size_t i = 0; i < std::size(expected_2); ++i)
       EXPECT_EQ(expected_2[i], offsets[i]);
   }
 
@@ -215,8 +215,8 @@
       4, kNpos, kNpos, kNpos, 8, 9, 10, 11, kNpos, kNpos, 14,
       15  // this could just as easily be 17
     };
-    EXPECT_EQ(offsets.size(), base::size(expected_3));
-    for (size_t i = 0; i < base::size(expected_3); ++i)
+    EXPECT_EQ(offsets.size(), std::size(expected_3));
+    for (size_t i = 0; i < std::size(expected_3); ++i)
       EXPECT_EQ(expected_3[i], offsets[i]);
   }
 }
diff --git a/base/strings/utf_string_conversions_unittest.cc b/base/strings/utf_string_conversions_unittest.cc
index bdf9e7d..3055040 100644
--- a/base/strings/utf_string_conversions_unittest.cc
+++ b/base/strings/utf_string_conversions_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/strings/utf_string_conversions.h"
+
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -189,14 +189,14 @@
     '\0'
   };
   std::u16string multistring16;
-  memcpy(WriteInto(&multistring16, base::size(multi16)), multi16,
+  memcpy(WriteInto(&multistring16, std::size(multi16)), multi16,
          sizeof(multi16));
-  EXPECT_EQ(base::size(multi16) - 1, multistring16.length());
+  EXPECT_EQ(std::size(multi16) - 1, multistring16.length());
   std::string expected;
-  memcpy(WriteInto(&expected, base::size(multi)), multi, sizeof(multi));
-  EXPECT_EQ(base::size(multi) - 1, expected.length());
+  memcpy(WriteInto(&expected, std::size(multi)), multi, sizeof(multi));
+  EXPECT_EQ(std::size(multi) - 1, expected.length());
   const std::string& converted = UTF16ToUTF8(multistring16);
-  EXPECT_EQ(base::size(multi) - 1, converted.length());
+  EXPECT_EQ(std::size(multi) - 1, converted.length());
   EXPECT_EQ(expected, converted);
 }
 
diff --git a/base/sync_socket_win.cc b/base/sync_socket_win.cc
index b5dd2424..b35f8f3 100644
--- a/base/sync_socket_win.cc
+++ b/base/sync_socket_win.cc
@@ -7,7 +7,6 @@
 #include <limits.h>
 #include <stddef.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/rand_util.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -22,7 +21,7 @@
 // in sandboxed scenarios as we might have by-name policies that allow pipe
 // creation. Also keep the secure random number generation.
 const wchar_t kPipeNameFormat[] = L"\\\\.\\pipe\\chrome.sync.%u.%u.%lu";
-const size_t kPipePathMax = base::size(kPipeNameFormat) + (3 * 10) + 1;
+const size_t kPipePathMax = std::size(kPipeNameFormat) + (3 * 10) + 1;
 
 // To avoid users sending negative message lengths to Send/Receive
 // we clamp message lengths, which are size_t, to no more than INT_MAX.
@@ -154,7 +153,7 @@
       if (::GetLastError() == ERROR_IO_PENDING) {
         HANDLE events[] = { io_event->handle(), cancel_event->handle() };
         const int wait_result = WaitForMultipleObjects(
-            base::size(events), events, FALSE,
+            std::size(events), events, FALSE,
             timeout_in_ms == INFINITE
                 ? timeout_in_ms
                 : static_cast<DWORD>(
diff --git a/base/system/sys_info_chromeos.cc b/base/system/sys_info_chromeos.cc
index 188552e..fba0a0d6 100644
--- a/base/system/sys_info_chromeos.cc
+++ b/base/system/sys_info_chromeos.cc
@@ -8,7 +8,6 @@
 #include <stdint.h>
 #include <sys/utsname.h>
 
-#include "base/cxx17_backports.h"
 #include "base/environment.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
@@ -117,7 +116,7 @@
     }
     // Parse the version from the first matching recognized version key.
     std::string version;
-    for (size_t i = 0; i < base::size(kLinuxStandardBaseVersionKeys); ++i) {
+    for (size_t i = 0; i < std::size(kLinuxStandardBaseVersionKeys); ++i) {
       std::string key = kLinuxStandardBaseVersionKeys[i];
       if (GetLsbReleaseValue(key, &version) && !version.empty())
         break;
@@ -136,7 +135,7 @@
     // Check release name for Chrome OS.
     std::string release_name;
     if (GetLsbReleaseValue(kChromeOsReleaseNameKey, &release_name)) {
-      for (size_t i = 0; i < base::size(kChromeOsReleaseNames); ++i) {
+      for (size_t i = 0; i < std::size(kChromeOsReleaseNames); ++i) {
         if (release_name == kChromeOsReleaseNames[i]) {
           is_running_on_chromeos_ = true;
           break;
diff --git a/base/system/sys_info_ios.mm b/base/system/sys_info_ios.mm
index 3bb3fd5..e278a18 100644
--- a/base/system/sys_info_ios.mm
+++ b/base/system/sys_info_ios.mm
@@ -12,7 +12,6 @@
 #include <sys/types.h>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/mac/scoped_mach_port.h"
 #include "base/notreached.h"
 #include "base/process/process_metrics.h"
@@ -29,7 +28,7 @@
 // system or the empty string on failure.
 std::string GetSysctlValue(const char* key_name) {
   char value[256];
-  size_t len = base::size(value);
+  size_t len = std::size(value);
   if (sysctlbyname(key_name, &value, &len, nullptr, 0) == 0) {
     DCHECK_GE(len, 1u);
     DCHECK_EQ('\0', value[len - 1]);
diff --git a/base/system/sys_info_mac.mm b/base/system/sys_info_mac.mm
index c67480e..dc52dea1 100644
--- a/base/system/sys_info_mac.mm
+++ b/base/system/sys_info_mac.mm
@@ -13,7 +13,6 @@
 #include <sys/types.h>
 
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/mac/mac_util.h"
 #include "base/mac/scoped_mach_port.h"
 #include "base/notreached.h"
@@ -29,7 +28,7 @@
 // system or the empty string on failure.
 std::string GetSysctlValue(const char* key_name) {
   char value[256];
-  size_t len = base::size(value);
+  size_t len = std::size(value);
   if (sysctlbyname(key_name, &value, &len, nullptr, 0) == 0) {
     DCHECK_GE(len, 1u);
     DCHECK_EQ('\0', value[len - 1]);
diff --git a/base/system/sys_info_openbsd.cc b/base/system/sys_info_openbsd.cc
index 7f98054b..8849960 100644
--- a/base/system/sys_info_openbsd.cc
+++ b/base/system/sys_info_openbsd.cc
@@ -10,7 +10,6 @@
 #include <sys/shm.h>
 #include <sys/sysctl.h>
 
-#include "base/cxx17_backports.h"
 #include "base/notreached.h"
 
 namespace {
@@ -34,7 +33,7 @@
   int mib[] = {CTL_HW, HW_NCPU};
   int ncpu;
   size_t size = sizeof(ncpu);
-  if (sysctl(mib, base::size(mib), &ncpu, &size, NULL, 0) < 0) {
+  if (sysctl(mib, std::size(mib), &ncpu, &size, NULL, 0) < 0) {
     NOTREACHED();
     return 1;
   }
@@ -58,7 +57,7 @@
   int mib[] = {CTL_KERN, KERN_SHMINFO, KERN_SHMINFO_SHMMAX};
   size_t limit;
   size_t size = sizeof(limit);
-  if (sysctl(mib, base::size(mib), &limit, &size, NULL, 0) < 0) {
+  if (sysctl(mib, std::size(mib), &limit, &size, NULL, 0) < 0) {
     NOTREACHED();
     return 0;
   }
@@ -69,8 +68,8 @@
 std::string SysInfo::CPUModelName() {
   int mib[] = {CTL_HW, HW_MODEL};
   char name[256];
-  size_t len = base::size(name);
-  if (sysctl(mib, base::size(mib), name, &len, NULL, 0) < 0) {
+  size_t len = std::size(name);
+  if (sysctl(mib, std::size(mib), name, &len, NULL, 0) < 0) {
     NOTREACHED();
     return std::string();
   }
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
index cd6081e..7ce212d 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
@@ -902,9 +902,9 @@
         // "ThreadController active" state at the end.
         for (auto& t : tasks)
           task_source_.AddTask(FROM_HERE, t.Get(), TimeTicks());
-        for (size_t i = 0; i < size(tasks); ++i) {
+        for (size_t i = 0; i < std::size(tasks); ++i) {
           const TimeTicks expected_delayed_run_time =
-              i < size(tasks) - 1 ? TimeTicks() : TimeTicks::Max();
+              i < std::size(tasks) - 1 ? TimeTicks() : TimeTicks::Max();
 
           EXPECT_CALL(tasks[i], Run());
           EXPECT_EQ(thread_controller_.DoWork().delayed_run_time,
diff --git a/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc b/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc
index a6c3172d0..66f0f40 100644
--- a/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc
+++ b/base/task/thread_pool/pooled_single_thread_task_runner_manager.cc
@@ -10,7 +10,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/ranges/algorithm.h"
@@ -758,8 +757,8 @@
 #endif
   {
     CheckedAutoLock auto_lock(lock_);
-    for (size_t i = 0; i < base::size(shared_worker_threads_); ++i) {
-      for (size_t j = 0; j < base::size(shared_worker_threads_[i]); ++j) {
+    for (size_t i = 0; i < std::size(shared_worker_threads_); ++i) {
+      for (size_t j = 0; j < std::size(shared_worker_threads_[i]); ++j) {
         local_shared_worker_threads[i][j] = shared_worker_threads_[i][j];
         shared_worker_threads_[i][j] = nullptr;
 #if BUILDFLAG(IS_WIN)
@@ -771,8 +770,8 @@
     }
   }
 
-  for (size_t i = 0; i < base::size(local_shared_worker_threads); ++i) {
-    for (size_t j = 0; j < base::size(local_shared_worker_threads[i]); ++j) {
+  for (size_t i = 0; i < std::size(local_shared_worker_threads); ++i) {
+    for (size_t j = 0; j < std::size(local_shared_worker_threads[i]); ++j) {
       if (local_shared_worker_threads[i][j])
         UnregisterWorkerThread(local_shared_worker_threads[i][j]);
 #if BUILDFLAG(IS_WIN)
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc
index cf270422..61cc19c7 100644
--- a/base/task/thread_pool/task_tracker.cc
+++ b/base/task/thread_pool/task_tracker.cc
@@ -45,7 +45,7 @@
 constexpr const char* kExecutionModeString[] = {"parallel", "sequenced",
                                                 "single thread", "job"};
 static_assert(
-    size(kExecutionModeString) ==
+    std::size(kExecutionModeString) ==
         static_cast<size_t>(TaskSourceExecutionMode::kMax) + 1,
     "Array kExecutionModeString is out of sync with TaskSourceExecutionMode.");
 
diff --git a/base/threading/hang_watcher.cc b/base/threading/hang_watcher.cc
index 771879f..5cb6b27 100644
--- a/base/threading/hang_watcher.cc
+++ b/base/threading/hang_watcher.cc
@@ -446,7 +446,7 @@
   if (last_critical_memory_pressure_time.is_null()) {
     constexpr char kNoMemoryPressureMsg[] = "No critical memory pressure";
     static_assert(
-        base::size(kNoMemoryPressureMsg) <=
+        std::size(kNoMemoryPressureMsg) <=
             static_cast<uint64_t>(kCrashKeyContentSize),
         "The crash key is too small to hold \"No critical memory pressure\".");
     return debug::ScopedCrashKeyString(crash_key, kNoMemoryPressureMsg);
diff --git a/base/threading/platform_thread_unittest.cc b/base/threading/platform_thread_unittest.cc
index 397afea..33082ac 100644
--- a/base/threading/platform_thread_unittest.cc
+++ b/base/threading/platform_thread_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/threading/platform_thread.h"
+
 #include <stddef.h>
 
 #include "base/compiler_specific.h"
-#include "base/cxx17_backports.h"
 #include "base/process/process.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/threading/platform_thread.h"
 #include "base/threading/threading_features.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -74,11 +74,11 @@
 
 TEST(PlatformThreadTest, TrivialJoinTimesTen) {
   TrivialThread thread[10];
-  PlatformThreadHandle handle[base::size(thread)];
+  PlatformThreadHandle handle[std::size(thread)];
 
   for (auto& n : thread)
     ASSERT_FALSE(n.run_event().IsSignaled());
-  for (size_t n = 0; n < base::size(thread); n++)
+  for (size_t n = 0; n < std::size(thread); n++)
     ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
   for (auto n : handle)
     PlatformThread::Join(n);
@@ -101,11 +101,11 @@
 
 TEST(PlatformThreadTest, TrivialDetachTimesTen) {
   TrivialThread thread[10];
-  PlatformThreadHandle handle[base::size(thread)];
+  PlatformThreadHandle handle[std::size(thread)];
 
   for (auto& n : thread)
     ASSERT_FALSE(n.run_event().IsSignaled());
-  for (size_t n = 0; n < base::size(thread); n++) {
+  for (size_t n = 0; n < std::size(thread); n++) {
     ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
     PlatformThread::Detach(handle[n]);
   }
@@ -209,17 +209,17 @@
   PlatformThreadId main_thread_id = PlatformThread::CurrentId();
 
   FunctionTestThread thread[10];
-  PlatformThreadHandle handle[base::size(thread)];
+  PlatformThreadHandle handle[std::size(thread)];
 
   for (const auto& n : thread)
     ASSERT_FALSE(n.IsRunning());
 
-  for (size_t n = 0; n < base::size(thread); n++)
+  for (size_t n = 0; n < std::size(thread); n++)
     ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
   for (auto& n : thread)
     n.WaitForTerminationReady();
 
-  for (size_t n = 0; n < base::size(thread); n++) {
+  for (size_t n = 0; n < std::size(thread); n++) {
     ASSERT_TRUE(thread[n].IsRunning());
     EXPECT_NE(thread[n].thread_id(), main_thread_id);
 
diff --git a/base/threading/sequence_local_storage_slot_unittest.cc b/base/threading/sequence_local_storage_slot_unittest.cc
index 487f0e6..17f43c7 100644
--- a/base/threading/sequence_local_storage_slot_unittest.cc
+++ b/base/threading/sequence_local_storage_slot_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/cxx17_backports.h"
 #include "base/memory/ptr_util.h"
 #include "base/threading/sequence_local_storage_map.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -133,14 +132,14 @@
 
   // Set the value of the slot to be the index of the current
   // SequenceLocalStorageMaps in the vector
-  for (unsigned int i = 0; i < base::size(sequence_local_storage_maps); ++i) {
+  for (unsigned int i = 0; i < std::size(sequence_local_storage_maps); ++i) {
     internal::ScopedSetSequenceLocalStorageMapForCurrentThread
         scoped_sequence_local_storage(&sequence_local_storage_maps[i]);
 
     slot.emplace(i);
   }
 
-  for (unsigned int i = 0; i < base::size(sequence_local_storage_maps); ++i) {
+  for (unsigned int i = 0; i < std::size(sequence_local_storage_maps); ++i) {
     internal::ScopedSetSequenceLocalStorageMapForCurrentThread
         scoped_sequence_local_storage(&sequence_local_storage_maps[i]);
 
diff --git a/base/time/pr_time_unittest.cc b/base/time/pr_time_unittest.cc
index d319384..0952bac 100644
--- a/base/time/pr_time_unittest.cc
+++ b/base/time/pr_time_unittest.cc
@@ -6,7 +6,6 @@
 #include <time.h>
 
 #include "base/compiler_specific.h"
-#include "base/cxx17_backports.h"
 #include "base/third_party/nspr/prtime.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -79,7 +78,7 @@
   char time_buf[64] = {};
 #if BUILDFLAG(IS_WIN)
   localtime_s(&local_time, &current_time);
-  asctime_s(time_buf, base::size(time_buf), &local_time);
+  asctime_s(time_buf, std::size(time_buf), &local_time);
 #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
   localtime_r(&current_time, &local_time);
   asctime_r(&local_time, time_buf);
diff --git a/base/time/time_mac.mm b/base/time/time_mac.mm
index 1a1a44c6..51f602b8 100644
--- a/base/time/time_mac.mm
+++ b/base/time/time_mac.mm
@@ -14,7 +14,6 @@
 #include <sys/types.h>
 #include <time.h>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/mac/mach_logging.h"
 #include "base/mac/scoped_cftyperef.h"
@@ -108,7 +107,7 @@
   struct timeval boottime;
   int mib[2] = {CTL_KERN, KERN_BOOTTIME};
   size_t size = sizeof(boottime);
-  int kr = sysctl(mib, base::size(mib), &boottime, &size, nullptr, 0);
+  int kr = sysctl(mib, std::size(mib), &boottime, &size, nullptr, 0);
   DCHECK_EQ(KERN_SUCCESS, kr);
   base::TimeDelta time_difference = base::subtle::TimeNowIgnoringOverride() -
                                     (base::Time::FromTimeT(boottime.tv_sec) +
diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
index 9fc0501..92971a9 100644
--- a/base/time/time_unittest.cc
+++ b/base/time/time_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/build_time.h"
 #include "base/check_op.h"
 #include "base/compiler_specific.h"
-#include "base/cxx17_backports.h"
 #include "base/environment.h"
 #include "base/test/gtest_util.h"
 #include "base/threading/platform_thread.h"
@@ -478,7 +477,7 @@
   char time_buf[64] = {};
 #if BUILDFLAG(IS_WIN)
   localtime_s(&local_time, &current_time);
-  asctime_s(time_buf, base::size(time_buf), &local_time);
+  asctime_s(time_buf, std::size(time_buf), &local_time);
 #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
   localtime_r(&current_time, &local_time);
   asctime_r(&local_time, time_buf);
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h
index 10751632..083a46a 100644
--- a/base/trace_event/builtin_categories.h
+++ b/base/trace_event/builtin_categories.h
@@ -5,8 +5,10 @@
 #ifndef BASE_TRACE_EVENT_BUILTIN_CATEGORIES_H_
 #define BASE_TRACE_EVENT_BUILTIN_CATEGORIES_H_
 
+#include <cstddef>
+#include <iterator>
+
 #include "base/base_export.h"
-#include "base/cxx17_backports.h"
 #include "base/trace_event/common/trace_event_common.h"
 #include "base/tracing_buildflags.h"
 #include "build/build_config.h"
@@ -420,9 +422,7 @@
   }
 
   // Returns the amount of built-in categories in the registry.
-  static constexpr size_t Size() {
-    return base::size(kBuiltinCategories);
-  }
+  static constexpr size_t Size() { return std::size(kBuiltinCategories); }
 
   // Where in the builtin category list to start when populating the
   // about://tracing UI.
@@ -526,13 +526,13 @@
   // Returns whether |category| is used only for testing.
   static constexpr bool IsCategoryForTesting(const char* category) {
     return IsStringInArray(category, kCategoriesForTesting,
-                           base::size(kCategoriesForTesting));
+                           std::size(kCategoriesForTesting));
   }
 
   // Returns whether |category| is registered in the builtin list.
   static constexpr bool IsBuiltinCategory(const char* category) {
     return IsStringInArray(category, kBuiltinCategories,
-                           base::size(kBuiltinCategories));
+                           std::size(kBuiltinCategories));
   }
 };
 
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker.cc b/base/trace_event/heap_profiler_allocation_context_tracker.cc
index 8901a90..1c0a6c5 100644
--- a/base/trace_event/heap_profiler_allocation_context_tracker.cc
+++ b/base/trace_event/heap_profiler_allocation_context_tracker.cc
@@ -12,7 +12,6 @@
 
 #include "base/atomicops.h"
 #include "base/check_op.h"
-#include "base/cxx17_backports.h"
 #include "base/debug/debugging_buildflags.h"
 #include "base/debug/leak_annotations.h"
 #include "base/debug/stack_trace.h"
@@ -197,17 +196,17 @@
 #if !BUILDFLAG(IS_NACL)  // We don't build base/debug/stack_trace.cc for NaCl.
 #if BUILDFLAG(IS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE)
       const void* frames[Backtrace::kMaxFrameCount + 1];
-      static_assert(base::size(frames) >= Backtrace::kMaxFrameCount,
+      static_assert(std::size(frames) >= Backtrace::kMaxFrameCount,
                     "not requesting enough frames to fill Backtrace");
       size_t frame_count =
           CFIBacktraceAndroid::GetInitializedInstance()->Unwind(
-              frames, base::size(frames));
+              frames, std::size(frames));
 #elif BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
         const void* frames[Backtrace::kMaxFrameCount + 1];
-        static_assert(base::size(frames) >= Backtrace::kMaxFrameCount,
+        static_assert(std::size(frames) >= Backtrace::kMaxFrameCount,
                       "not requesting enough frames to fill Backtrace");
         size_t frame_count = debug::TraceStackFramePointers(
-            frames, base::size(frames),
+            frames, std::size(frames),
             1 /* exclude this function from the trace */);
 #else
         // Fall-back to capturing the stack with base::debug::StackTrace,
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index 2bf5b8e..d4a18dd 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -296,7 +296,7 @@
 void MemoryDumpManager::CreateProcessDump(const MemoryDumpRequestArgs& args,
                                           ProcessMemoryDumpCallback callback) {
   char guid_str[20];
-  snprintf(guid_str, base::size(guid_str), "0x%" PRIx64, args.dump_guid);
+  snprintf(guid_str, std::size(guid_str), "0x%" PRIx64, args.dump_guid);
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(kTraceCategory, "ProcessMemoryDump",
                                     TRACE_ID_LOCAL(args.dump_guid), "dump_guid",
                                     TRACE_STR_COPY(guid_str));
diff --git a/base/values.cc b/base/values.cc
index fcb00bf..9c87c811 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -45,7 +45,7 @@
 
 const char* const kTypeNames[] = {"null",   "boolean", "integer",    "double",
                                   "string", "binary",  "dictionary", "list"};
-static_assert(base::size(kTypeNames) ==
+static_assert(std::size(kTypeNames) ==
                   static_cast<size_t>(Value::Type::LIST) + 1,
               "kTypeNames Has Wrong Size");
 
@@ -295,7 +295,7 @@
 // static
 const char* Value::GetTypeName(Value::Type type) {
   DCHECK_GE(static_cast<int>(type), 0);
-  DCHECK_LT(static_cast<size_t>(type), base::size(kTypeNames));
+  DCHECK_LT(static_cast<size_t>(type), std::size(kTypeNames));
   return kTypeNames[static_cast<size_t>(type)];
 }
 
@@ -1837,7 +1837,7 @@
 
 std::ostream& operator<<(std::ostream& out, const Value::Type& type) {
   if (static_cast<int>(type) < 0 ||
-      static_cast<size_t>(type) >= base::size(kTypeNames))
+      static_cast<size_t>(type) >= std::size(kTypeNames))
     return out << "Invalid Type (index = " << static_cast<int>(type) << ")";
   return out << Value::GetTypeName(type);
 }
diff --git a/base/vlog.cc b/base/vlog.cc
index dbef831..9ee90ceb 100644
--- a/base/vlog.cc
+++ b/base/vlog.cc
@@ -9,7 +9,6 @@
 #include <ostream>
 #include <utility>
 
-#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -93,7 +92,7 @@
   base::StringPiece::size_type extension_start = module.rfind('.');
   module = module.substr(0, extension_start);
   static const char kInlSuffix[] = "-inl";
-  static const int kInlSuffixLen = base::size(kInlSuffix) - 1;
+  static const int kInlSuffixLen = std::size(kInlSuffix) - 1;
   if (base::EndsWith(module, kInlSuffix))
     module.remove_suffix(kInlSuffixLen);
   return module;
diff --git a/base/win/access_token.cc b/base/win/access_token.cc
index 89c3ccb..0e34b82c 100644
--- a/base/win/access_token.cc
+++ b/base/win/access_token.cc
@@ -6,7 +6,6 @@
 
 #include <windows.h>
 
-#include "base/cxx17_backports.h"
 #include "base/strings/stringprintf.h"
 
 namespace base {
@@ -117,7 +116,7 @@
   LUID luid;
   luid.LowPart = luid_.LowPart;
   luid.HighPart = luid_.HighPart;
-  DWORD size = base::size(name);
+  DWORD size = std::size(name);
   if (!::LookupPrivilegeName(nullptr, &luid, name, &size))
     return base::StringPrintf(L"%08X-%08X", luid.HighPart, luid.LowPart);
   return name;
diff --git a/base/win/i18n.cc b/base/win/i18n.cc
index 851da4da..d03ab938 100644
--- a/base/win/i18n.cc
+++ b/base/win/i18n.cc
@@ -33,7 +33,7 @@
   }
 
   std::wstring buffer(buffer_length, '\0');
-  if (!function(call_flags, &language_count, base::data(buffer),
+  if (!function(call_flags, &language_count, std::data(buffer),
                 &buffer_length) ||
       !language_count) {
     DPCHECK(!language_count) << "Failed getting preferred UI languages.";
diff --git a/base/win/scoped_process_information_unittest.cc b/base/win/scoped_process_information_unittest.cc
index 0800e17..631856ac 100644
--- a/base/win/scoped_process_information_unittest.cc
+++ b/base/win/scoped_process_information_unittest.cc
@@ -55,7 +55,7 @@
   STARTUPINFO startup_info = {};
   startup_info.cb = sizeof(startup_info);
 
-  EXPECT_TRUE(::CreateProcess(nullptr, base::data(cmd_line), nullptr, nullptr,
+  EXPECT_TRUE(::CreateProcess(nullptr, std::data(cmd_line), nullptr, nullptr,
                               false, 0, nullptr, nullptr, &startup_info,
                               process_handle));
 }
diff --git a/base/win/shortcut_unittest.cc b/base/win/shortcut_unittest.cc
index f97b0049..c4b7efb2f 100644
--- a/base/win/shortcut_unittest.cc
+++ b/base/win/shortcut_unittest.cc
@@ -8,7 +8,6 @@
 
 #include <string>
 
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -39,7 +38,7 @@
     {
       const FilePath target_file(
           temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Target 1.txt")));
-      WriteFile(target_file, kFileContents, base::size(kFileContents));
+      WriteFile(target_file, kFileContents, std::size(kFileContents));
 
       link_properties_.set_target(target_file);
       link_properties_.set_working_dir(temp_dir_.GetPath());
@@ -62,7 +61,7 @@
     {
       const FilePath target_file_2(
           temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Target 2.txt")));
-      WriteFile(target_file_2, kFileContents2, base::size(kFileContents2));
+      WriteFile(target_file_2, kFileContents2, std::size(kFileContents2));
 
       FilePath icon_path_2;
       CreateTemporaryFileInDir(temp_dir_.GetPath(), &icon_path_2);
@@ -160,8 +159,8 @@
   FilePath resolved_name;
   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, nullptr));
 
-  char read_contents[base::size(kFileContents)];
-  base::ReadFile(resolved_name, read_contents, base::size(read_contents));
+  char read_contents[std::size(kFileContents)];
+  base::ReadFile(resolved_name, read_contents, std::size(read_contents));
   EXPECT_STREQ(kFileContents, read_contents);
 }
 
@@ -177,8 +176,8 @@
   std::wstring args;
   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, &args));
 
-  char read_contents[base::size(kFileContents)];
-  base::ReadFile(resolved_name, read_contents, base::size(read_contents));
+  char read_contents[std::size(kFileContents)];
+  base::ReadFile(resolved_name, read_contents, std::size(read_contents));
   EXPECT_STREQ(kFileContents, read_contents);
   EXPECT_EQ(link_properties_.arguments, args);
 }
@@ -244,8 +243,8 @@
   FilePath resolved_name;
   EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, nullptr));
 
-  char read_contents[base::size(kFileContents2)];
-  base::ReadFile(resolved_name, read_contents, base::size(read_contents));
+  char read_contents[std::size(kFileContents2)];
+  base::ReadFile(resolved_name, read_contents, std::size(read_contents));
   EXPECT_STREQ(kFileContents2, read_contents);
 }
 
diff --git a/base/win/win_util.cc b/base/win/win_util.cc
index 9c4a8902..7d78505a 100644
--- a/base/win/win_util.cc
+++ b/base/win/win_util.cc
@@ -7,6 +7,7 @@
 #include <aclapi.h>
 #include <cfgmgr32.h>
 #include <initguid.h>
+#include <lm.h>
 #include <powrprof.h>
 #include <shobjidl.h>  // Must be before propkey.
 
@@ -33,11 +34,13 @@
 
 #include <limits>
 #include <memory>
+#include <utility>
 
 #include "base/base_switches.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/scoped_native_library.h"
 #include "base/strings/string_util.h"
@@ -45,6 +48,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/scoped_thread_priority.h"
 #include "base/threading/thread_restrictions.h"
+#include "base/timer/elapsed_timer.h"
 #include "base/win/access_token.h"
 #include "base/win/core_winrt_util.h"
 #include "base/win/propvarutil.h"
@@ -185,6 +189,47 @@
   return &state;
 }
 
+// TODO (crbug/1300219): return a DSREG_JOIN_TYPE* instead of bool*.
+bool* GetAzureADJoinStateStorage() {
+  static bool state = []() {
+    base::ElapsedTimer timer;
+
+    // Mitigate the issues caused by loading DLLs on a background thread
+    // (http://crbug/973868).
+    SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY();
+
+    ScopedNativeLibrary netapi32(
+        base::LoadSystemLibrary(FILE_PATH_LITERAL("netapi32.dll")));
+    if (!netapi32.is_valid())
+      return false;
+
+    const auto net_get_aad_join_information_function =
+        reinterpret_cast<decltype(&::NetGetAadJoinInformation)>(
+            netapi32.GetFunctionPointer("NetGetAadJoinInformation"));
+    if (!net_get_aad_join_information_function)
+      return false;
+
+    const auto net_free_aad_join_information_function =
+        reinterpret_cast<decltype(&::NetFreeAadJoinInformation)>(
+            netapi32.GetFunctionPointer("NetFreeAadJoinInformation"));
+    DPCHECK(net_free_aad_join_information_function);
+
+    DSREG_JOIN_INFO* join_info = nullptr;
+    HRESULT hr = net_get_aad_join_information_function(/*pcszTenantId=*/nullptr,
+                                                       &join_info);
+    const bool is_aad_joined =
+        SUCCEEDED(hr) && join_info && join_info->joinType != DSREG_UNKNOWN_JOIN;
+    if (join_info) {
+      net_free_aad_join_information_function(join_info);
+    }
+
+    base::UmaHistogramTimes("EnterpriseCheck.AzureADJoinStatusCheckTime",
+                            timer.Elapsed());
+    return is_aad_joined;
+  }();
+  return &state;
+}
+
 NativeLibrary PinUser32Internal(NativeLibraryLoadError* error) {
   static NativeLibraryLoadError load_error;
   static const NativeLibrary user32_module =
@@ -599,6 +644,10 @@
   return *GetRegisteredWithManagementStateStorage();
 }
 
+bool IsJoinedToAzureAD() {
+  return *GetAzureADJoinStateStorage();
+}
+
 bool IsUser32AndGdi32Available() {
   static auto is_user32_and_gdi32_available = []() {
     // If win32k syscalls aren't disabled, then user32 and gdi32 are available.
@@ -835,5 +884,12 @@
   *GetRegisteredWithManagementStateStorage() = initial_state_;
 }
 
+ScopedAzureADJoinStateForTesting::ScopedAzureADJoinStateForTesting(bool state)
+    : initial_state_(std::exchange(*GetAzureADJoinStateStorage(), state)) {}
+
+ScopedAzureADJoinStateForTesting::~ScopedAzureADJoinStateForTesting() {
+  *GetAzureADJoinStateStorage() = initial_state_;
+}
+
 }  // namespace win
 }  // namespace base
diff --git a/base/win/win_util.h b/base/win/win_util.h
index f8ae136..242b7e3 100644
--- a/base/win/win_util.h
+++ b/base/win/win_util.h
@@ -161,6 +161,11 @@
 // Returns true if the machine is enrolled to a domain.
 BASE_EXPORT bool IsEnrolledToDomain();
 
+// Returns true if either the device is joined to Azure Active Directory (AD) or
+// one or more Azure AD work accounts have been added on the device. This call
+// trigger some I/O when loading netapi32.dll to determine the management state.
+BASE_EXPORT bool IsJoinedToAzureAD();
+
 // Returns true if the machine is being managed by an MDM system.
 BASE_EXPORT bool IsDeviceRegisteredWithManagement();
 
@@ -260,6 +265,21 @@
   bool initial_state_;
 };
 
+// Allows changing the Azure Active Directory join state for the lifetime of the
+// object. The original state is restored upon destruction.
+class BASE_EXPORT ScopedAzureADJoinStateForTesting {
+ public:
+  explicit ScopedAzureADJoinStateForTesting(bool state);
+  ScopedAzureADJoinStateForTesting(const ScopedAzureADJoinStateForTesting&) =
+      delete;
+  ScopedAzureADJoinStateForTesting& operator=(
+      const ScopedAzureADJoinStateForTesting&) = delete;
+  ~ScopedAzureADJoinStateForTesting();
+
+ private:
+  const bool initial_state_;
+};
+
 }  // namespace win
 }  // namespace base
 
diff --git a/base/win/win_util_unittest.cc b/base/win/win_util_unittest.cc
index 1972d5d..10c7ea5 100644
--- a/base/win/win_util_unittest.cc
+++ b/base/win/win_util_unittest.cc
@@ -7,7 +7,6 @@
 #include <objbase.h>
 
 #include "base/containers/contains.h"
-#include "base/cxx17_backports.h"
 #include "base/files/file_path.h"
 #include "base/scoped_native_library.h"
 #include "base/strings/string_util.h"
@@ -84,7 +83,7 @@
   auto guid_wstring = WStringFromGUID(kGuid);
   EXPECT_EQ(guid_wstring, kGuidStr);
   wchar_t guid_wchar[39];
-  ::StringFromGUID2(kGuid, guid_wchar, base::size(guid_wchar));
+  ::StringFromGUID2(kGuid, guid_wchar, std::size(guid_wchar));
   EXPECT_STREQ(guid_wstring.c_str(), guid_wchar);
   ScopedCoMem<OLECHAR> clsid_string;
   ::StringFromCLSID(kGuid, &clsid_string);
diff --git a/build/config/arm.gni b/build/config/arm.gni
index 568067b..410d3cb 100644
--- a/build/config/arm.gni
+++ b/build/config/arm.gni
@@ -129,7 +129,12 @@
     # - "pac": Enables Pointer Authentication Code (PAC, featured in Armv8.3)
     # - "standard": Enables both PAC and Branch Target Identification (Armv8.5).
     # - "none": No branch protection.
-    arm_control_flow_integrity = "none"
+    arm_control_flow_integrity = "pac"
+
+    # TODO(cavalcantii): enable the feature for the following OSes next.
+    if (is_mac || is_chromeos || is_fuchsia || is_win) {
+      arm_control_flow_integrity = "none"
+    }
   }
   assert(arm_control_flow_integrity == "none" ||
              arm_control_flow_integrity == "standard" ||
diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni
index 64eb20c..60a21ab 100644
--- a/build/config/chromeos/rules.gni
+++ b/build/config/chromeos/rules.gni
@@ -58,6 +58,7 @@
     _symlinks = []
     _symlinks = [
       # Tast harness & test data.
+      rebase_path("${_cache_path_prefix}+autotest_server_package.tar.bz2"),
       rebase_path("${_cache_path_prefix}+chromeos-base/tast-cmd"),
       rebase_path("${_cache_path_prefix}+chromeos-base/tast-remote-tests-cros"),
 
@@ -200,6 +201,7 @@
           _sdk_data += [
             _symlink_targets[0],
             _symlink_targets[1],
+            _symlink_targets[2],
           ]
         }
         if (deploy_chrome) {
@@ -207,16 +209,16 @@
           # the VM. This is done by using binutils in the toolchain. So add the
           # toolchain to the data.
           _sdk_data += [
-            _symlink_targets[2],
             _symlink_targets[3],
+            _symlink_targets[4],
           ]
         }
         if (_cros_is_vm) {
           # Add vm sdk items.
           _sdk_data += [
-            _symlink_targets[4],
             _symlink_targets[5],
             _symlink_targets[6],
+            _symlink_targets[7],
           ]
         }
       }
diff --git a/build/fuchsia/COMMON_METADATA b/build/fuchsia/COMMON_METADATA
index fe8198a..8c03853 100644
--- a/build/fuchsia/COMMON_METADATA
+++ b/build/fuchsia/COMMON_METADATA
@@ -2,4 +2,4 @@
   component: "Fuchsia"
 }
 
-team_email: "cr-fuchsia@chromium.org"
+team_email: "fuchsia-dev@chromium.org"
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 62b410b..6cd8a19 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-7.20220228.1.1
+7.20220228.2.3
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 62b410b..c329a3c4 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-7.20220228.1.1
+7.20220228.2.2
diff --git a/build/rust/rust_macro.gni b/build/rust/rust_macro.gni
index 88fb3c6..f951068 100644
--- a/build/rust/rust_macro.gni
+++ b/build/rust/rust_macro.gni
@@ -6,17 +6,8 @@
 import("//build/rust/rust_target.gni")
 
 # Template for generating a Rust proc-macro library. Such targets produce a
-# dynamic library that is loaded during compilation, and thus should be
-# targeted toward the $host_toolchain, instead of the $current_toolchain.
-# Currently that is done by specifying the host toolchain in any dependency on
-# a proc-macro target, such as:
-#
-# deps = [
-#   "//a/proc/macro($host_toolchain)"
-# ]
-#
-# TODO(crbug.com/1299883): Improve this, such as how Fuchsia has done here.
-# https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/build/rust/rustc_macro.gni#258
+# dynamic library that is loaded during compilation and used to generate Rust
+# code for compilation.
 template("rust_macro") {
   rust_target(target_name) {
     forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index 01f25b21..57070d4 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -130,6 +130,10 @@
     // https://crbug.com/1158622
     "race:absl::synchronization_internal::Waiter::Post\n"
 
+    // Harmless data races, see WTF::StringImpl::Release code comments.
+    "race:scoped_refptr<WTF::StringImpl>::AddRef\n"
+    "race:scoped_refptr<WTF::StringImpl>::Release\n"
+
     // End of suppressions.
     ;  // Please keep this semicolon.
 
diff --git a/build/toolchain/fuchsia/DIR_METADATA b/build/toolchain/fuchsia/DIR_METADATA
index 6d8f079..566a281f 100644
--- a/build/toolchain/fuchsia/DIR_METADATA
+++ b/build/toolchain/fuchsia/DIR_METADATA
@@ -2,6 +2,6 @@
   component: "Fuchsia"
 }
 
-team_email: "cr-fuchsia@chromium.org"
+team_email: "fuchsia-dev@chromium.org"
 
 os: FUCHSIA
diff --git a/chrome/VERSION b/chrome/VERSION
index 094682d..5efd784 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=101
 MINOR=0
-BUILD=4917
+BUILD=4918
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java
index ec4f9cf..7bfcdc7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java
@@ -94,7 +94,7 @@
         }
 
         public void detachFromParent() {
-            Log.e(TAG, "SurfaceState : detach from parent : " + format);
+            Log.i(TAG, "SurfaceState : detach from parent : %d", format);
             final ViewGroup parent = mParent;
             // Since removeView can call surfaceDestroyed before returning, be sure that isAttached
             // will return false.
@@ -159,7 +159,7 @@
 
     @Override
     public void requestSurface(int format) {
-        Log.e(TAG, "Transitioning to surface with format : " + format);
+        Log.i(TAG, "Transitioning to surface with format: %d", format);
         mRequestedByClient = (format == PixelFormat.TRANSLUCENT) ? mTranslucent : mOpaque;
 
         // If destruction is pending, then we must wait for it to complete.  When we're notified
@@ -284,7 +284,7 @@
         // Note that |createPending| might not be set, if Android destroyed and recreated this
         // surface on its own.
 
-        Log.e(TAG, "surfaceCreated format : " + state.format);
+        Log.i(TAG, "surfaceCreated format: %d", state.format);
         if (state != mRequestedByClient) {
             // Surface is created, but it's not the one that's been requested most recently.  Just
             // destroy it again.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
index 6a07e73..35869d1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -36,6 +36,8 @@
 import org.chromium.chrome.browser.compositor.layouts.components.TintedCompositorButton;
 import org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller;
 import org.chromium.chrome.browser.compositor.overlays.strip.TabLoadTracker.TabLoadTrackerCallback;
+import org.chromium.chrome.browser.flags.CachedFeatureFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.layouts.animation.CompositorAnimator;
 import org.chromium.chrome.browser.layouts.components.VirtualView;
 import org.chromium.chrome.browser.tab.Tab;
@@ -220,7 +222,10 @@
         mTabMenu.setWidth(menuWidth);
         mTabMenu.setModal(true);
 
-        mShouldCascadeTabs = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context);
+        boolean tabStripImprovementsEnabled =
+                CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS);
+        mShouldCascadeTabs = DeviceFormFactor.isNonMultiDisplayContextOnTablet(context)
+                && !tabStripImprovementsEnabled;
         mStripStacker = mShouldCascadeTabs ? mCascadingStripStacker : mScrollingStripStacker;
         mIsFirstLayoutPass = true;
     }
@@ -373,7 +378,11 @@
 
         if (widthChanged) {
             computeAndUpdateTabWidth(false);
-            setShouldCascadeTabs(width >= DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP);
+            boolean tabStripImprovementsEnabled =
+                    CachedFeatureFlags.isEnabled(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS);
+            boolean shouldCascade = width >= DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP
+                    && !tabStripImprovementsEnabled;
+            setShouldCascadeTabs(shouldCascade);
         }
         if (mStripTabs.length > 0) mUpdateHost.requestUpdate();
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
index 2f0d072..eb5654b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -45,6 +45,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
+import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.components.browser_ui.widget.animation.Interpolators;
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.resources.ResourceManager;
@@ -187,7 +188,7 @@
         }
 
         private void updateScrimVisibility(boolean visibility) {
-            if (!isGridTabSwitcherEnabled()) return;
+            if (!isGridTabSwitcherNonPolishEnabled()) return;
 
             if (mScrimFadeAnimation != null) {
                 mScrimFadeAnimation.cancel();
@@ -355,7 +356,7 @@
     }
 
     private void updateStripScrim() {
-        if (!isGridTabSwitcherEnabled()) return;
+        if (!isGridTabSwitcherNonPolishEnabled()) return;
         // Update width
         float scrimWidth = mModelSelectorButton.isVisible()
                 ? mWidth - getModelSelectorButtonWidthWithPadding()
@@ -662,8 +663,9 @@
         }
     }
 
-    private boolean isGridTabSwitcherEnabled() {
-        return CachedFeatureFlags.isEnabled(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS);
+    private boolean isGridTabSwitcherNonPolishEnabled() {
+        return CachedFeatureFlags.isEnabled(ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS)
+                && !TabUiFeatureUtilities.GRID_TAB_SWITCHER_FOR_TABLETS_POLISH.getValue();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
index 995dc86..3cfa058 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -113,13 +113,13 @@
                 (ChromeTabCreator) getTabCreatorManager().getTabCreator(true);
         TabModelImpl normalModel = new TabModelImpl(Profile.getLastUsedRegularProfile(),
                 mActivityType, regularTabCreator, incognitoTabCreator, mOrderController,
-                mTabContentManager, mNextTabPolicySupplier, mAsyncTabParamsManager, this,
+                tabContentProvider, mNextTabPolicySupplier, mAsyncTabParamsManager, this,
                 mIsUndoSupported);
         regularTabCreator.setTabModel(normalModel, mOrderController);
 
         IncognitoTabModel incognitoModel = new IncognitoTabModelImpl(
                 new IncognitoTabModelImplCreator(mWindowAndroidSupplier, regularTabCreator,
-                        incognitoTabCreator, mOrderController, mTabContentManager,
+                        incognitoTabCreator, mOrderController, tabContentProvider,
                         mNextTabPolicySupplier, mAsyncTabParamsManager, mActivityType, this));
         incognitoTabCreator.setTabModel(incognitoModel, mOrderController);
         onNativeLibraryReadyInternal(tabContentProvider, normalModel, incognitoModel);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
index c98e11a..80fb772 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -5,6 +5,8 @@
 package org.chromium.chrome.browser.compositor.overlays.strip;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -13,7 +15,9 @@
 import android.text.TextUtils;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -25,10 +29,12 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.layouts.components.VirtualView;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModel;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.ui.base.LocalizationUtils;
 
 import java.util.ArrayList;
@@ -36,8 +42,11 @@
 
 /** Tests for {@link StripLayoutHelper}. */
 @RunWith(BaseRobolectricTestRunner.class)
+@Features.EnableFeatures(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS)
 @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.M)
 public class StripLayoutHelperTest {
+    @Rule
+    public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
     @Mock private LayoutUpdateHost mUpdateHost;
     @Mock private LayoutRenderHost mRenderHost;
     private Activity mActivity;
@@ -50,6 +59,7 @@
     private static final String IDENTIFIER_SELECTED = "Selected Tab";
     private static final String INCOGNITO_IDENTIFIER = "Incognito Tab";
     private static final String INCOGNITO_IDENTIFIER_SELECTED = "Selected Incognito Tab";
+    private static final int SCREEN_BUCKET_TABLET = 2;
 
     /** Reset the environment before each test. */
     @Before
@@ -114,6 +124,27 @@
         assertTabStripAndOrder(getExpectedAccessibilityDescriptions(0));
     }
 
+    @Test
+    @Feature("Tab Strip Improvements")
+    @Config(qualifiers = "sw800dp")
+    public void testStripStacker_TabStripImprovementsEnabled_Scroll() {
+        initializeTest(false, true, 0);
+
+        // Assert
+        assertFalse(mStripLayoutHelper.shouldCascadeTabs());
+    }
+
+    @Test
+    @Feature("Tab Strip Improvements")
+    @Config(qualifiers = "sw800dp")
+    @Features.DisableFeatures(ChromeFeatureList.TAB_STRIP_IMPROVEMENTS)
+    public void testStripStacker_TabStripImprovementsDisabled_Cascade() {
+        initializeTest(false, true, 0);
+
+        // Assert
+        assertTrue(mStripLayoutHelper.shouldCascadeTabs());
+    }
+
     private void initializeTest(boolean rtl, boolean incognito, int tabIndex) {
         mStripLayoutHelper = createStripLayoutHelper(rtl, incognito);
         mIncognito = incognito;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 6a90ade7..883ba0bd 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7630,6 +7630,10 @@
         <message name="IDS_TAB_CXMENU_MOVETOANOTHERNEWWINDOW" desc="The label for the Tab context item to move items to a new window from the 'Move tabs to another window' submenu.">
           New window
         </message>
+        <message name="IDS_TAB_CXMENU_FOLLOW_SITE" desc="The label of the tab context menu item
+ for following a site.">
+          Follow site
+        </message>
         <if expr="chromeos_ash or chromeos_lacros">
           <message name="IDS_TAB_CXMENU_GROUPED_BY_DESK_MENU_ITEM_A11Y" desc="The a11y message for menu items in 'Move tabs to another window' when grouped by desk.">
             <ph name="TAB_TITLE">$1<ex>Google News</ex></ph> belongs to desk <ph name="DESK_TITLE">$2<ex>School</ex></ph>
@@ -7716,6 +7720,9 @@
         <message name="IDS_TAB_CXMENU_MOVETOANOTHERNEWWINDOW" desc="In Title Case: The label for the Tab context item to move items to a new window from the 'Move tabs to another window' submenu.">
           New Window
         </message>
+        <message name="IDS_TAB_CXMENU_FOLLOW_SITE" desc="In Title Case: The label of the tab context menu item for following a site.">
+          Follow Site
+        </message>
       </if>
 
       <!-- WebUI Tab Strip -->
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_CXMENU_FOLLOW_SITE.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_CXMENU_FOLLOW_SITE.png.sha1
new file mode 100644
index 0000000..8edc2ff3
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_TAB_CXMENU_FOLLOW_SITE.png.sha1
@@ -0,0 +1 @@
+5a541bd4eacc985e70295b8647cd2a110c66a100
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index c3e1041..48034ae 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1466,7 +1466,7 @@
   <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_EMPTY" translateable="false" desc="Description of the empty state of the removed browser-based interests section of the 'ad personalization' dialog.">
     You haven’t removed any interests
   </message>
-  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_INTERESTS_LABEL" translateable="false" desc="Label of the row to go to the removed browser-based interests section of the 'ad personalization' dialog.">
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_LABEL" translateable="false" desc="Label of the row to go to the removed browser-based interests section of the 'ad personalization' dialog.">
     Interests you removed
   </message>
   <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_TITLE" translateable="false" desc="Title of the website-based interests section of the 'ad personalization' dialog.">
@@ -1478,6 +1478,9 @@
   <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_EMPTY" translateable="false" desc="Description of the empty state of the removed website-based interests section of the 'ad personalization' dialog.">
     You haven’t removed any sites
   </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_LABEL" translateable="false" desc="Label of the row to go to the removed website-based interests section of the 'ad personalization' dialog.">
+    Sites you removed
+  </message>
   <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_TITLE" translateable="false" desc="Title of the 'ad measurement' dialog.">
     Ad measurement
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f588753..f60e683 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -503,6 +503,14 @@
     "feature_engagement/tracker_factory.h",
     "feature_guide/notifications/feature_notification_guide_service_factory.cc",
     "feature_guide/notifications/feature_notification_guide_service_factory.h",
+    "feed/feed_service_factory.cc",
+    "feed/feed_service_factory.h",
+    "feed/rss_links_fetcher.cc",
+    "feed/rss_links_fetcher.h",
+    "feed/web_feed_follow_util.cc",
+    "feed/web_feed_follow_util.h",
+    "feed/web_feed_page_information_fetcher.cc",
+    "feed/web_feed_page_information_fetcher.h",
     "file_select_helper.cc",
     "file_select_helper.h",
     "file_system_access/chrome_file_system_access_permission_context.cc",
@@ -2055,9 +2063,11 @@
     "//components/favicon_base",
     "//components/feature_engagement",
     "//components/feed:buildflags",
+    "//components/feed:feature_list",
     "//components/feed/core/common:feed_core_common",
     "//components/feed/core/shared_prefs:feed_shared_prefs",
     "//components/feed/core/v2:feed_core_v2",
+    "//components/feed/mojom:mojo_bindings",
     "//components/filename_generation",
     "//components/find_in_page",
     "//components/flags_ui",
@@ -3114,16 +3124,12 @@
       "feed/android/feed_reliability_logging_bridge.h",
       "feed/android/feed_service_bridge.cc",
       "feed/android/feed_service_bridge.h",
-      "feed/android/feed_service_factory.cc",
-      "feed/android/feed_service_factory.h",
       "feed/android/feed_stream.cc",
       "feed/android/feed_stream.h",
       "feed/android/jni_translation.cc",
       "feed/android/jni_translation.h",
       "feed/android/refresh_task_scheduler_impl.cc",
       "feed/android/refresh_task_scheduler_impl.h",
-      "feed/android/rss_links_fetcher.cc",
-      "feed/android/rss_links_fetcher.h",
       "feed/android/web_feed_bridge.cc",
       "file_select_helper_contacts_android.cc",
       "file_select_helper_contacts_android.h",
@@ -3450,10 +3456,6 @@
       "//components/external_intents/android",
       "//components/favicon/android",
       "//components/favicon/core:database",
-      "//components/feed:buildflags",
-      "//components/feed:feature_list",
-      "//components/feed/core/v2:feed_core_v2",
-      "//components/feed/mojom:mojo_bindings",
       "//components/image_fetcher:android",
       "//components/image_fetcher/core:metrics",
       "//components/infobars/android",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index b5f4ece3..013b18a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4485,6 +4485,10 @@
     {"arc-enable-usap", flag_descriptions::kArcEnableUsapName,
      flag_descriptions::kArcEnableUsapDesc, kOsCrOS,
      FEATURE_VALUE_TYPE(arc::kEnableUsap)},
+    {"arc-enable-virtio-blk-for-data",
+     flag_descriptions::kArcEnableVirtioBlkForDataName,
+     flag_descriptions::kArcEnableVirtioBlkForDataDesc, kOsCrOS,
+     FEATURE_VALUE_TYPE(arc::kEnableVirtioBlkForData)},
     {"arc-file-picker-experiment",
      flag_descriptions::kArcFilePickerExperimentName,
      flag_descriptions::kArcFilePickerExperimentDescription, kOsCrOS,
@@ -6371,6 +6375,11 @@
      FEATURE_WITH_PARAMS_VALUE_TYPE(features::kBackForwardCache,
                                     kBackForwardCacheVariations,
                                     "BackForwardCache")},
+    {"enable-back-forward-cache-for-screen-reader",
+     flag_descriptions::kEnableBackForwardCacheForScreenReaderName,
+     flag_descriptions::kEnableBackForwardCacheForScreenReaderDescription,
+     kOsAll,
+     FEATURE_VALUE_TYPE(features::kEnableBackForwardCacheForScreenReader)},
 
 #if !BUILDFLAG(IS_ANDROID)
     {"closed-tab-cache", flag_descriptions::kClosedTabCacheName,
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.cc b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
index 2cdffcb..71e3485 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
@@ -165,7 +165,7 @@
 
     app_registry_cache_.ForOneApp(
         data.first, [this](const apps::AppUpdate& update) {
-          if (update.Paused() != apps::mojom::OptionalBool::kTrue) {
+          if (!update.Paused().value_or(false)) {
             pending_pause_requests_.MaybeAddApp(update.AppId());
           }
         });
@@ -294,7 +294,8 @@
   app_registry_cache_.ForOneApp(app_id, [this, uninstall_source, parent_window,
                                          &callback](
                                             const apps::AppUpdate& update) {
-    apps::mojom::IconKeyPtr icon_key = update.IconKey();
+    auto icon_key = update.IconKey();
+    DCHECK(icon_key.has_value());
     auto uninstall_dialog_ptr = std::make_unique<UninstallDialog>(
         profile_, update.AppType(), update.AppId(), update.Name(),
         parent_window,
@@ -305,7 +306,7 @@
     uninstall_dialog_ptr->SetDialogCreatedCallbackForTesting(
         std::move(callback));
     uninstall_dialogs_.emplace(update.AppId(), std::move(uninstall_dialog_ptr));
-    uninstall_dialog->PrepareToShow(std::move(icon_key), this);
+    uninstall_dialog->PrepareToShow(std::move(icon_key.value()), this);
   });
 }
 
@@ -349,7 +350,7 @@
 
   // Return true, and load the icon for the app pause dialog when the app
   // is paused.
-  if (update.Paused() == apps::mojom::OptionalBool::kTrue ||
+  if (update.Paused().value_or(false) ||
       pending_pause_requests_.IsPaused(update.AppId())) {
     ash::app_time::AppTimeLimitInterface* app_limit =
         ash::app_time::AppTimeLimitInterface::Get(profile_);
@@ -376,7 +377,7 @@
 
 void AppServiceProxyAsh::LoadIconForDialog(const apps::AppUpdate& update,
                                            apps::LoadIconCallback callback) {
-  apps::mojom::IconKeyPtr mojom_icon_key = update.IconKey();
+  auto icon_key = update.IconKey();
   constexpr bool kAllowPlaceholderIcon = false;
   constexpr int32_t kIconSize = 48;
   auto app_type = update.AppType();
@@ -390,18 +391,22 @@
   if (!dialog_created_callback_.is_null() || !profile_->IsChild()) {
     if (base::FeatureList::IsEnabled(
             features::kAppServiceLoadIconWithoutMojom)) {
-      if (!mojom_icon_key) {
+      if (!icon_key.has_value()) {
         std::move(callback).Run(std::make_unique<IconValue>());
         return;
       }
-      std::unique_ptr<IconKey> icon_key =
-          ConvertMojomIconKeyToIconKey(mojom_icon_key);
       LoadIconFromIconKey(ConvertMojomAppTypToAppType(app_type), update.AppId(),
-                          *icon_key, icon_type, kIconSize,
+                          icon_key.value(), icon_type, kIconSize,
                           kAllowPlaceholderIcon, std::move(callback));
     } else {
+      if (!icon_key.has_value()) {
+        MojomIconValueToIconValueCallback(std::move(callback))
+            .Run(apps::mojom::IconValue::New());
+        return;
+      }
       LoadIconFromIconKey(
-          app_type, update.AppId(), std::move(mojom_icon_key),
+          app_type, update.AppId(),
+          ConvertIconKeyToMojomIconKey(icon_key.value()),
           apps::mojom::IconType::kStandard, kIconSize, kAllowPlaceholderIcon,
           MojomIconValueToIconValueCallback(std::move(callback)));
     }
@@ -457,7 +462,7 @@
   if (!should_pause_app) {
     app_registry_cache_.ForOneApp(
         app_id, [&should_pause_app](const apps::AppUpdate& update) {
-          if (update.Paused() == apps::mojom::OptionalBool::kTrue) {
+          if (update.Paused().value_or(false)) {
             should_pause_app = true;
           }
         });
@@ -468,8 +473,7 @@
 }
 
 void AppServiceProxyAsh::OnAppUpdate(const apps::AppUpdate& update) {
-  if ((update.PausedChanged() &&
-       update.Paused() == apps::mojom::OptionalBool::kTrue) ||
+  if ((update.PausedChanged() && update.Paused().value_or(false)) ||
       (update.ReadinessChanged() &&
        !apps_util::IsInstalled(update.Readiness()))) {
     pending_pause_requests_.MaybeRemoveApp(update.AppId());
diff --git a/chrome/browser/apps/app_service/app_service_proxy_base.cc b/chrome/browser/apps/app_service/app_service_proxy_base.cc
index 1abd61e3..4cfbbaa 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_base.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_base.cc
@@ -69,7 +69,7 @@
   absl::optional<IconKey> icon_key;
   host_->app_registry_cache_.ForApp(
       app_id,
-      [&icon_key](const AppUpdate& update) { icon_key = update.GetIconKey(); });
+      [&icon_key](const AppUpdate& update) { icon_key = update.IconKey(); });
   return icon_key;
 }
 
diff --git a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
index 795132a..9964195 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
@@ -53,7 +53,7 @@
   absl::optional<IconKey> icon_key;
   host_->app_registry_cache_.ForApp(
       app_id,
-      [&icon_key](const AppUpdate& update) { icon_key = update.GetIconKey(); });
+      [&icon_key](const AppUpdate& update) { icon_key = update.IconKey(); });
   return icon_key;
 }
 
diff --git a/chrome/browser/apps/app_service/uninstall_dialog.cc b/chrome/browser/apps/app_service/uninstall_dialog.cc
index 5312617..35388c6 100644
--- a/chrome/browser/apps/app_service/uninstall_dialog.cc
+++ b/chrome/browser/apps/app_service/uninstall_dialog.cc
@@ -39,7 +39,7 @@
 
 UninstallDialog::~UninstallDialog() = default;
 
-void UninstallDialog::PrepareToShow(apps::mojom::IconKeyPtr mojom_icon_key,
+void UninstallDialog::PrepareToShow(IconKey icon_key,
                                     apps::IconLoader* icon_loader) {
   switch (app_type_) {
     case apps::mojom::AppType::kArc:
@@ -49,10 +49,11 @@
     case apps::mojom::AppType::kCrostini:
       // Crostini icons might be a big image, and not fit the size, so add the
       // resize icon effect, to resize the image.
-      mojom_icon_key->icon_effects = static_cast<apps::IconEffects>(
-          mojom_icon_key->icon_effects | apps::IconEffects::kMdIconStyle);
+      icon_key.icon_effects = static_cast<apps::IconEffects>(
+          icon_key.icon_effects | apps::IconEffects::kMdIconStyle);
       break;
     case apps::mojom::AppType::kChromeApp:
+    case apps::mojom::AppType::kStandaloneBrowserChromeApp:
     case apps::mojom::AppType::kWeb:
       UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallSource",
                                 extensions::UNINSTALL_SOURCE_APP_LIST,
@@ -67,19 +68,17 @@
   // Currently ARC apps only support 48*48 native icon.
   int32_t size_hint_in_dip = kUninstallIconSize;
   if (base::FeatureList::IsEnabled(features::kAppServiceLoadIconWithoutMojom)) {
-    std::unique_ptr<IconKey> icon_key =
-        ConvertMojomIconKeyToIconKey(mojom_icon_key);
     auto icon_type = IconType::kStandard;
     icon_loader->LoadIconFromIconKey(
-        ConvertMojomAppTypToAppType(app_type_), app_id_, *icon_key, icon_type,
+        ConvertMojomAppTypToAppType(app_type_), app_id_, icon_key, icon_type,
         size_hint_in_dip, kAllowPlaceholderIcon,
         base::BindOnce(&UninstallDialog::OnLoadIcon,
                        weak_ptr_factory_.GetWeakPtr()));
   } else {
     auto mojom_icon_type = apps::mojom::IconType::kStandard;
     icon_loader->LoadIconFromIconKey(
-        app_type_, app_id_, std::move(mojom_icon_key), mojom_icon_type,
-        size_hint_in_dip, kAllowPlaceholderIcon,
+        app_type_, app_id_, ConvertIconKeyToMojomIconKey(icon_key),
+        mojom_icon_type, size_hint_in_dip, kAllowPlaceholderIcon,
         MojomIconValueToIconValueCallback(base::BindOnce(
             &UninstallDialog::OnLoadIcon, weak_ptr_factory_.GetWeakPtr())));
   }
diff --git a/chrome/browser/apps/app_service/uninstall_dialog.h b/chrome/browser/apps/app_service/uninstall_dialog.h
index c944b441..eae0d8d 100644
--- a/chrome/browser/apps/app_service/uninstall_dialog.h
+++ b/chrome/browser/apps/app_service/uninstall_dialog.h
@@ -96,8 +96,7 @@
 
   // Loads the app icon to show the icon in the uninstall dialog before creating
   // the dialog view.
-  void PrepareToShow(apps::mojom::IconKeyPtr mojom_icon_key,
-                     apps::IconLoader* icon_loader);
+  void PrepareToShow(IconKey icon_key, apps::IconLoader* icon_loader);
 
   views::Widget* GetWidget();
 
diff --git a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.cc b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.cc
index ce5c3dc..da89a47 100644
--- a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.cc
+++ b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.cc
@@ -18,8 +18,13 @@
 // |kDismissThreshold|+ times.
 constexpr int kDismissThreshold = 2;
 
+// Show the Intent Chip as collapsed after it has been shown expanded
+// |kIntentChipCollapseThreshold| times.
+constexpr int kIntentChipCollapseThreshold = 3;
+
 constexpr char kAutoDisplayKey[] = "picker_auto_display_key";
 constexpr char kPlatformKey[] = "picker_platform_key";
+constexpr char kIntentChipCountKey[] = "intent_chip_display_count";
 
 // Retrieves or creates a new dictionary for the specific |url|.
 base::Value GetAutoDisplayDictForSettings(
@@ -66,6 +71,26 @@
       std::move(pref_dict));
 }
 
+IntentPickerAutoDisplayService::ChipState
+IntentPickerAutoDisplayService::GetChipStateAndIncrementCounter(
+    const GURL& url) {
+  auto* settings_map = HostContentSettingsMapFactory::GetForProfile(profile_);
+  base::Value pref_dict = GetAutoDisplayDictForSettings(settings_map, url);
+
+  int display_count = pref_dict.FindIntKey(kIntentChipCountKey).value_or(0);
+  if (display_count >= kIntentChipCollapseThreshold) {
+    // Exit before updating the counter so we don't keep counting indefinitely.
+    return ChipState::kCollapsed;
+  }
+
+  pref_dict.SetIntKey(kIntentChipCountKey, ++display_count);
+  settings_map->SetWebsiteSettingDefaultScope(
+      url, url, ContentSettingsType::INTENT_PICKER_DISPLAY,
+      std::move(pref_dict));
+
+  return ChipState::kExpanded;
+}
+
 IntentPickerAutoDisplayService::Platform
 IntentPickerAutoDisplayService::GetLastUsedPlatformForTablets(const GURL& url) {
   base::Value pref_dict = GetAutoDisplayDictForSettings(
diff --git a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h
index 8d221e5..9f5bcbf 100644
--- a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h
+++ b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h
@@ -19,6 +19,10 @@
   // form factor.
   enum class Platform { kNone = 0, kArc = 1, kChrome = 2, kMaxValue = kChrome };
 
+  // Whether the Intent Chip displays as Expanded (full chip with label
+  // text) or collapsed (just an icon).
+  enum class ChipState { kExpanded = 0, kCollapsed = 1 };
+
   static IntentPickerAutoDisplayService* Get(Profile* profile);
 
   explicit IntentPickerAutoDisplayService(Profile* profile);
@@ -34,6 +38,11 @@
   // Keep track of the |url| repetitions.
   void IncrementCounter(const GURL& url);
 
+  // Returns a ChipState indicating whether the Intent Chip should be shown as
+  // expanded or collapsed for a given URL. Increments an internal counter to
+  // track the number of times the chip has been shown for that URL.
+  ChipState GetChipStateAndIncrementCounter(const GURL& url);
+
   // Returns the last platform selected by the user to handle |url|.
   // If it has not been checked then it will return |Platform::kNone|
   // for devices of tablet form factor.
diff --git a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service_unittest.cc b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service_unittest.cc
index aec6718..c04f3e0 100644
--- a/chrome/browser/apps/intent_helper/intent_picker_auto_display_service_unittest.cc
+++ b/chrome/browser/apps/intent_helper/intent_picker_auto_display_service_unittest.cc
@@ -108,3 +108,31 @@
   // Should return true for a different host.
   EXPECT_TRUE(service->ShouldAutoDisplayUi(url3));
 }
+
+// Checks that calling GetChipStateAndIncrementCounter tracks views per-URL
+// and collapses the chip after a fixed number of views.
+TEST_F(IntentPickerAutoDisplayServiceTest, GetChipStateAndIncrementCounter) {
+  using ChipState = IntentPickerAutoDisplayService::ChipState;
+
+  GURL url1("https://www.google.com/abcde");
+  GURL url2("https://www.google.com/hi");
+  GURL url3("https://www.boogle.com/a");
+
+  TestingProfile profile;
+  IntentPickerAutoDisplayService* service =
+      IntentPickerAutoDisplayService::Get(&profile);
+
+  EXPECT_EQ(service->GetChipStateAndIncrementCounter(url1),
+            ChipState::kExpanded);
+  EXPECT_EQ(service->GetChipStateAndIncrementCounter(url2),
+            ChipState::kExpanded);
+  EXPECT_EQ(service->GetChipStateAndIncrementCounter(url2),
+            ChipState::kExpanded);
+  // Fourth view for a host should be collapsed.
+  EXPECT_EQ(service->GetChipStateAndIncrementCounter(url1),
+            ChipState::kCollapsed);
+
+  // URL on a different host should still be expanded.
+  EXPECT_EQ(service->GetChipStateAndIncrementCounter(url3),
+            ChipState::kExpanded);
+}
diff --git a/chrome/browser/ash/accessibility/accessibility_common_browsertest.cc b/chrome/browser/ash/accessibility/accessibility_common_browsertest.cc
index e6cd5f2..77cb4306 100644
--- a/chrome/browser/ash/accessibility/accessibility_common_browsertest.cc
+++ b/chrome/browser/ash/accessibility/accessibility_common_browsertest.cc
@@ -11,14 +11,18 @@
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/prefs/pref_service.h"
+#include "components/version_info/channel.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/extension_host_test_helper.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/common/features/feature_channel.h"
 
 namespace ash {
 
-class AccessibilityCommonTest : public InProcessBrowserTest {
+class AccessibilityCommonTest
+    : public InProcessBrowserTest,
+      public testing::WithParamInterface<version_info::Channel> {
  public:
   bool DoesComponentExtensionExist(const std::string& id) {
     return extensions::ExtensionSystem::Get(
@@ -46,7 +50,9 @@
   std::unique_ptr<ExtensionConsoleErrorObserver> console_observer_;
 };
 
-IN_PROC_BROWSER_TEST_F(AccessibilityCommonTest, ToggleFeatures) {
+IN_PROC_BROWSER_TEST_P(AccessibilityCommonTest, ToggleFeatures) {
+  extensions::ScopedCurrentChannel channel(GetParam());
+
   AccessibilityManager* manager = AccessibilityManager::Get();
   const auto& enabled_features =
       manager->GetAccessibilityCommonEnabledFeaturesForTest();
@@ -104,4 +110,12 @@
       DoesComponentExtensionExist(extension_misc::kChromeVoxExtensionId));
 }
 
+INSTANTIATE_TEST_SUITE_P(AllChannels,
+                         AccessibilityCommonTest,
+                         testing::Values(version_info::Channel::STABLE,
+                                         version_info::Channel::BETA,
+                                         version_info::Channel::DEV,
+                                         version_info::Channel::CANARY,
+                                         version_info::Channel::DEFAULT));
+
 }  // namespace ash
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.cc b/chrome/browser/ash/crosapi/test_controller_ash.cc
index fc1c6de..5d0bae3f 100644
--- a/chrome/browser/ash/crosapi/test_controller_ash.cc
+++ b/chrome/browser/ash/crosapi/test_controller_ash.cc
@@ -32,6 +32,8 @@
 #include "ui/events/event_source.h"
 #include "ui/events/types/event_type.h"
 #include "ui/gfx/geometry/point.h"
+#include "ui/views/interaction/element_tracker_views.h"
+#include "ui/views/interaction/interaction_test_util_views.h"
 
 namespace crosapi {
 
@@ -46,9 +48,10 @@
 }
 
 // Returns whether the dispatcher or target was destroyed.
-bool DispatchMouseEvent(aura::Window* window, ui::EventType type) {
-  const gfx::Point center = window->bounds().CenterPoint();
-  ui::MouseEvent press(type, center, center, ui::EventTimeForNow(),
+bool DispatchMouseEvent(aura::Window* window,
+                        ui::EventType type,
+                        gfx::Point location) {
+  ui::MouseEvent press(type, location, location, ui::EventTimeForNow(),
                        ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
   return Dispatch(window->GetHost(), &press);
 }
@@ -78,13 +81,48 @@
 #endif
 }
 
+void TestControllerAsh::ClickElement(const std::string& element_name,
+                                     ClickElementCallback callback) {
+  ui::ElementIdentifier id =
+      ui::ElementIdentifier::FromName(element_name.c_str());
+  if (!id) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+
+  auto views = views::ElementTrackerViews::GetInstance()
+                   ->GetAllMatchingViewsInAnyContext(id);
+  if (views.empty()) {
+    std::move(callback).Run(/*success=*/false);
+    return;
+  }
+
+  // Pick the first view that matches the element name.
+  views::View* view = views[0];
+
+  // We directly send mouse events to the view. It's also possible to use
+  // EventGenerator to move the mouse and send a click. Unfortunately, that
+  // approach has occasional flakiness. This is presumably due to another window
+  // appearing on top of the dialog and taking the mouse events but has not been
+  // explicitly diagnosed.
+  views::TrackedElementViews* tracked_element =
+      views::ElementTrackerViews::GetInstance()->GetElementForView(
+          view, /*assign_temporary_id=*/false);
+  views::test::InteractionTestUtilSimulatorViews simulator;
+  simulator.PressButton(tracked_element,
+                        ui::test::InteractionTestUtil::InputType::kMouse);
+
+  std::move(callback).Run(/*success=*/true);
+}
+
 void TestControllerAsh::ClickWindow(const std::string& window_id) {
   aura::Window* window = GetShellSurfaceWindow(window_id);
   if (!window)
     return;
-  bool destroyed = DispatchMouseEvent(window, ui::ET_MOUSE_PRESSED);
+  const gfx::Point center = window->bounds().CenterPoint();
+  bool destroyed = DispatchMouseEvent(window, ui::ET_MOUSE_PRESSED, center);
   if (!destroyed) {
-    DispatchMouseEvent(window, ui::ET_MOUSE_RELEASED);
+    DispatchMouseEvent(window, ui::ET_MOUSE_RELEASED, center);
   }
 }
 
@@ -95,6 +133,21 @@
   std::move(callback).Run(exists);
 }
 
+void TestControllerAsh::DoesElementExist(const std::string& element_name,
+                                         DoesElementExistCallback callback) {
+  ui::ElementIdentifier id =
+      ui::ElementIdentifier::FromName(element_name.c_str());
+  if (!id) {
+    std::move(callback).Run(/*exists=*/false);
+    return;
+  }
+
+  bool any_elements_exist = !views::ElementTrackerViews::GetInstance()
+                                 ->GetAllMatchingViewsInAnyContext(id)
+                                 .empty();
+  std::move(callback).Run(/*exists=*/any_elements_exist);
+}
+
 void TestControllerAsh::DoesWindowExist(const std::string& window_id,
                                         DoesWindowExistCallback callback) {
   aura::Window* window = GetShellSurfaceWindow(window_id);
@@ -211,6 +264,21 @@
   std::move(callback).Run(/*success=*/true);
 }
 
+void TestControllerAsh::SelectContextMenuForShelfItem(
+    const std::string& item_id,
+    uint32_t index,
+    SelectContextMenuForShelfItemCallback callback) {
+  ash::ShelfItemDelegate* delegate =
+      ash::ShelfModel::Get()->GetShelfItemDelegate(ash::ShelfID(item_id));
+  if (!delegate) {
+    std::move(callback).Run(false);
+    return;
+  }
+  delegate->GetContextMenu(
+      /*display_id=*/0,
+      base::BindOnce(&TestControllerAsh::OnSelectContextMenuForShelfItem,
+                     std::move(callback), item_id, index));
+}
 void TestControllerAsh::SendTouchEvent(const std::string& window_id,
                                        mojom::TouchEventType type,
                                        uint8_t pointer_id,
@@ -299,6 +367,25 @@
   std::move(callback).Run(std::move(items));
 }
 
+void TestControllerAsh::OnSelectContextMenuForShelfItem(
+    SelectContextMenuForShelfItemCallback callback,
+    const std::string& item_id,
+    uint32_t index,
+    std::unique_ptr<ui::SimpleMenuModel> model) {
+  if (index < model->GetItemCount()) {
+    int command_id = model->GetCommandIdAt(index);
+    ash::ShelfItemDelegate* delegate =
+        ash::ShelfModel::Get()->GetShelfItemDelegate(ash::ShelfID(item_id));
+    if (delegate) {
+      delegate->ExecuteCommand(/*from_context_menu=*/true, command_id,
+                               /*event_flags=*/0, /*display_id=*/0);
+      std::move(callback).Run(/*success=*/true);
+      return;
+    }
+  }
+  std::move(callback).Run(/*success=*/false);
+}
+
 void TestControllerAsh::GetOpenAshBrowserWindows(
     GetOpenAshBrowserWindowsCallback callback) {
   std::move(callback).Run(BrowserList::GetInstance()->size());
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.h b/chrome/browser/ash/crosapi/test_controller_ash.h
index 9172fca6..acbe4f5 100644
--- a/chrome/browser/ash/crosapi/test_controller_ash.h
+++ b/chrome/browser/ash/crosapi/test_controller_ash.h
@@ -30,9 +30,13 @@
       mojo::PendingReceiver<mojom::TestController> receiver) override;
 
   // crosapi::mojom::TestController:
+  void ClickElement(const std::string& element_name,
+                    ClickElementCallback callback) override;
   void ClickWindow(const std::string& window_id) override;
   void DoesItemExistInShelf(const std::string& item_id,
                             DoesItemExistInShelfCallback callback) override;
+  void DoesElementExist(const std::string& element_name,
+                        DoesElementExistCallback callback) override;
   void DoesWindowExist(const std::string& window_id,
                        DoesWindowExistCallback callback) override;
   void EnterOverviewMode(EnterOverviewModeCallback callback) override;
@@ -50,6 +54,10 @@
   void PinOrUnpinItemInShelf(const std::string& item_id,
                              bool pin,
                              PinOrUnpinItemInShelfCallback cb) override;
+  void SelectContextMenuForShelfItem(
+      const std::string& item_id,
+      uint32_t index,
+      SelectContextMenuForShelfItemCallback cb) override;
   void SelectItemInShelf(const std::string& item_id,
                          SelectItemInShelfCallback cb) override;
   void SendTouchEvent(const std::string& window_id,
@@ -80,10 +88,18 @@
   // Called when the lacros test controller was disconnected.
   void OnControllerDisconnected();
 
-  // Called when a ShelfItemDelegate returns its context menu.
+  // Called when a ShelfItemDelegate returns its context menu and the follow up
+  // is to return the results.
   static void OnGetContextMenuForShelfItem(
       GetContextMenuForShelfItemCallback callback,
       std::unique_ptr<ui::SimpleMenuModel> model);
+  // Called when a ShelfItemDelegate returns its context menu and the follow up
+  // is to select an item.
+  static void OnSelectContextMenuForShelfItem(
+      SelectContextMenuForShelfItemCallback callback,
+      const std::string& item_id,
+      uint32_t index,
+      std::unique_ptr<ui::SimpleMenuModel> model);
 
   // Each call to EnterOverviewMode or ExitOverviewMode spawns a waiter for the
   // corresponding event. The waiters are stored in this struct and deleted once
diff --git a/chrome/browser/ash/file_manager/extract_io_task.cc b/chrome/browser/ash/file_manager/extract_io_task.cc
new file mode 100644
index 0000000..26987946
--- /dev/null
+++ b/chrome/browser/ash/file_manager/extract_io_task.cc
@@ -0,0 +1,44 @@
+// Copyright (c) 2022 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/ash/file_manager/extract_io_task.h"
+
+namespace file_manager {
+namespace io_task {
+
+ExtractIOTask::ExtractIOTask(
+    std::vector<storage::FileSystemURL> source_urls,
+    storage::FileSystemURL parent_folder,
+    scoped_refptr<storage::FileSystemContext> file_system_context)
+    : file_system_context_(file_system_context) {
+  progress_.type = OperationType::kExtract;
+}
+
+ExtractIOTask::~ExtractIOTask() {}
+
+void ExtractIOTask::Execute(IOTask::ProgressCallback progress_callback,
+                            IOTask::CompleteCallback complete_callback) {
+  progress_callback_ = std::move(progress_callback);
+  complete_callback_ = std::move(complete_callback);
+
+  VLOG(1) << "Executing EXTRACT_ARCHIVE IO task";
+  Complete(State::kSuccess);
+}
+
+void ExtractIOTask::Cancel() {
+  progress_.state = State::kCancelled;
+  // Any inflight operation will be cancelled when the task is destroyed.
+}
+
+// Calls the completion callback for the task. |progress_| should not be
+// accessed after calling this.
+void ExtractIOTask::Complete(State state) {
+  progress_.state = state;
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(complete_callback_), std::move(progress_)));
+}
+
+}  // namespace io_task
+}  // namespace file_manager
diff --git a/chrome/browser/ash/file_manager/extract_io_task.h b/chrome/browser/ash/file_manager/extract_io_task.h
new file mode 100644
index 0000000..fc34943f
--- /dev/null
+++ b/chrome/browser/ash/file_manager/extract_io_task.h
@@ -0,0 +1,50 @@
+// Copyright (c) 2022 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_ASH_FILE_MANAGER_EXTRACT_IO_TASK_H_
+#define CHROME_BROWSER_ASH_FILE_MANAGER_EXTRACT_IO_TASK_H_
+
+#include <vector>
+
+#include "base/files/file_error_or.h"
+#include "base/files/file_path.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ash/file_manager/io_task.h"
+#include "storage/browser/file_system/file_system_context.h"
+#include "storage/browser/file_system/file_system_url.h"
+
+namespace file_manager {
+namespace io_task {
+
+class ExtractIOTask : public IOTask {
+ public:
+  // Create a task to extract any ZIP files in |source_urls|. These
+  // must be under the |parent_folder| directory, and the resulting extraction
+  // will be created there.
+  ExtractIOTask(std::vector<storage::FileSystemURL> source_urls,
+                storage::FileSystemURL parent_folder,
+                scoped_refptr<storage::FileSystemContext> file_system_context);
+  ~ExtractIOTask() override;
+
+  void Execute(ProgressCallback progress_callback,
+               CompleteCallback complete_callback) override;
+
+  void Cancel() override;
+
+ private:
+  void Complete(State state);
+
+  const scoped_refptr<storage::FileSystemContext> file_system_context_;
+
+  ProgressCallback progress_callback_;
+  CompleteCallback complete_callback_;
+
+  base::WeakPtrFactory<ExtractIOTask> weak_ptr_factory_{this};
+};
+
+}  // namespace io_task
+}  // namespace file_manager
+
+#endif  // CHROME_BROWSER_ASH_FILE_MANAGER_EXTRACT_IO_TASK_H_
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
index a2d3cdb..91953a8 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -1924,8 +1924,7 @@
 
     if (options.enable_guest_os_files) {
       // Create some mocks, that show up by default,
-      auto* registry = guest_os::GuestOsService::GetForProfile(
-                           profile()->GetOriginalProfile())
+      auto* registry = guest_os::GuestOsService::GetForProfile(profile())
                            ->MountProviderRegistry();
       registry->Register(std::make_unique<MockGuestOsMountProvider>("Jemima"));
       registry->Register(std::make_unique<MockGuestOsMountProvider>("Electra"));
diff --git a/chrome/browser/ash/file_manager/file_tasks_notifier_unittest.cc b/chrome/browser/ash/file_manager/file_tasks_notifier_unittest.cc
index 43e86f9..7314c72 100644
--- a/chrome/browser/ash/file_manager/file_tasks_notifier_unittest.cc
+++ b/chrome/browser/ash/file_manager/file_tasks_notifier_unittest.cc
@@ -129,13 +129,15 @@
   FileTasksNotifierTest() = default;
 
   void SetUp() override {
-    profile_ = std::make_unique<TestingProfile>();
+    // crbug.com/1301822 Revoke external file systems before use.
+    auto* mount_points = storage::ExternalMountPoints::GetSystemInstance();
+    mount_points->RevokeAllFileSystems();
 
+    profile_ = std::make_unique<TestingProfile>();
     notifier_ = std::make_unique<FileTasksNotifierForTest>(
         profile_.get(), drivefs_receiver_.BindNewPipeAndPassRemote());
     observation_ = std::make_unique<MockFileTasksObserver>(notifier_.get());
 
-    auto* mount_points = storage::ExternalMountPoints::GetSystemInstance();
     my_files_ = util::GetMyFilesFolderForProfile(profile_.get());
     ASSERT_TRUE(base::CreateDirectory(my_files_));
     base::WriteFile(my_files_.Append("file"), "data", 4);
diff --git a/chrome/browser/ash/guest_os/public/guest_os_service_factory.cc b/chrome/browser/ash/guest_os/public/guest_os_service_factory.cc
index 2d21fe30..92538b2 100644
--- a/chrome/browser/ash/guest_os/public/guest_os_service_factory.cc
+++ b/chrome/browser/ash/guest_os/public/guest_os_service_factory.cc
@@ -13,8 +13,14 @@
 // static
 GuestOsService* guest_os::GuestOsServiceFactory::GetForProfile(
     Profile* profile) {
+  // There's only the one service instance per login, instead of a new one for
+  // off-the-record. This is because users expect their Guest OSs to still work
+  // even when off-the-record, and to work with their existing VM instances. For
+  // example, when downloading files in Chrome they can still save their files
+  // to a Guest OS mount.
   return static_cast<GuestOsService*>(
-      GetInstance()->GetServiceForBrowserContext(profile, true));
+      GetInstance()->GetServiceForBrowserContext(profile->GetOriginalProfile(),
+                                                 true));
 }
 
 // static
diff --git a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
index 44ee6c4c..c1c13ba2 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/gaussian_trainer.cc
@@ -9,6 +9,7 @@
 #include <limits>
 
 #include "ash/constants/ash_features.h"
+#include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
index 17655e1..c435268 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
@@ -11,6 +11,7 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/public/cpp/ambient/ambient_client.h"
+#include "ash/public/cpp/ambient/ambient_metrics.h"
 #include "ash/public/cpp/ambient/ambient_prefs.h"
 #include "ash/public/cpp/ambient/common/ambient_settings.h"
 #include "ash/public/cpp/image_downloader.h"
@@ -24,6 +25,7 @@
 #include "base/notreached.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/prefs/pref_service.h"
+#include "mojo/public/cpp/bindings/message.h"
 #include "net/base/backoff_entry.h"
 #include "personalization_app_ambient_provider_impl.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -144,6 +146,58 @@
   }
 }
 
+void PersonalizationAppAmbientProviderImpl::SetAlbumSelected(
+    const std::string& id,
+    ash::AmbientModeTopicSource topic_source,
+    bool selected) {
+  switch (topic_source) {
+    case (ash::AmbientModeTopicSource::kGooglePhotos): {
+      ash::PersonalAlbum* personal_album = FindPersonalAlbumById(id);
+      if (!personal_album) {
+        mojo::ReportBadMessage("Invalid album id.");
+        return;
+      }
+      personal_album->selected = selected;
+
+      // For Google Photos, we will populate the |selected_album_ids| with IDs
+      // of selected albums.
+      settings_->selected_album_ids.clear();
+      for (const auto& personal_album : personal_albums_.albums) {
+        if (personal_album.selected) {
+          settings_->selected_album_ids.emplace_back(personal_album.album_id);
+        }
+      }
+
+      // Update topic source based on selections.
+      if (settings_->selected_album_ids.empty()) {
+        settings_->topic_source = ash::AmbientModeTopicSource::kArtGallery;
+      } else {
+        settings_->topic_source = ash::AmbientModeTopicSource::kGooglePhotos;
+      }
+
+      ash::ambient::RecordAmbientModeTotalNumberOfAlbums(
+          personal_albums_.albums.size());
+      ash::ambient::RecordAmbientModeSelectedNumberOfAlbums(
+          settings_->selected_album_ids.size());
+      break;
+    }
+    case (ash::AmbientModeTopicSource::kArtGallery): {
+      // For Art gallery, we set the corresponding setting to be enabled or not
+      // based on the selections.
+      auto* art_setting = FindArtAlbumById(id);
+      if (!art_setting || !art_setting->visible) {
+        mojo::ReportBadMessage("Invalid album id.");
+        return;
+      }
+      art_setting->enabled = selected;
+      break;
+    }
+  }
+
+  UpdateSettings();
+  OnTopicSourceChanged();
+}
+
 void PersonalizationAppAmbientProviderImpl::OnAmbientModeEnabledChanged() {
   const bool enabled = IsAmbientModeEnabled();
   if (ambient_observer_remote_.is_bound()) {
@@ -380,6 +434,14 @@
 }
 
 void PersonalizationAppAmbientProviderImpl::SyncSettingsAndAlbums() {
+  // Clear the `selected` field, which will be populated with new value below.
+  // It is neceessary if `UpdateSettings()` failed and we need to reset the
+  // cached settings.
+  for (auto it = personal_albums_.albums.begin();
+       it != personal_albums_.albums.end(); ++it) {
+    it->selected = false;
+  }
+
   auto it = settings_->selected_album_ids.begin();
   while (it != settings_->selected_album_ids.end()) {
     const std::string& album_id = *it;
@@ -400,11 +462,11 @@
 void PersonalizationAppAmbientProviderImpl::MaybeUpdateTopicSource(
     ash::AmbientModeTopicSource topic_source) {
   // If the setting is the same, no need to update.
-  if (settings_->topic_source == topic_source)
-    return;
+  if (settings_->topic_source != topic_source) {
+    settings_->topic_source = topic_source;
+    UpdateSettings();
+  }
 
-  settings_->topic_source = topic_source;
-  UpdateSettings();
   OnTopicSourceChanged();
 }
 
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
index 62edcd0..2b9c2ff0 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
@@ -50,6 +50,9 @@
   void SetTopicSource(ash::AmbientModeTopicSource topic_source) override;
   void SetTemperatureUnit(
       ash::AmbientModeTemperatureUnit temperature_unit) override;
+  void SetAlbumSelected(const std::string& id,
+                        ash::AmbientModeTopicSource topic_source,
+                        bool selected) override;
 
   // Notify WebUI the latest values.
   void OnAmbientModeEnabledChanged();
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
index cd738b9..184032d0 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h"
 
+#include <algorithm>
 #include <memory>
 #include <vector>
 
@@ -15,6 +16,7 @@
 #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h"
 #include "base/callback_helpers.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -141,6 +143,10 @@
 
   content::TestWebUI* web_ui() { return &web_ui_; }
 
+  const base::HistogramTester& histogram_tester() const {
+    return histogram_tester_;
+  }
+
   void SetAmbientObserver() {
     ambient_provider_remote_->SetAmbientObserver(
         test_ambient_observer_.pending_remote());
@@ -189,11 +195,21 @@
     ambient_provider_->SetTopicSource(topic_source);
   }
 
+  void SetAlbumSelected(const std::string& id,
+                        ash::AmbientModeTopicSource topic_source,
+                        bool selected) {
+    ambient_provider_->SetAlbumSelected(id, topic_source, selected);
+  }
+
   ash::AmbientModeTopicSource TopicSource() {
     return ambient_provider_->settings_->topic_source;
   }
 
-  void SetSelectedAlbums(const std::vector<std::string>& ids) {
+  std::vector<std::string> SelectedAlbumIds() {
+    return ambient_provider_->settings_->selected_album_ids;
+  }
+
+  void SetSelectedAlbumIds(const std::vector<std::string>& ids) {
     ambient_provider_->settings_->selected_album_ids = ids;
   }
 
@@ -205,6 +221,10 @@
     return ambient_provider_->settings_->temperature_unit;
   }
 
+  std::vector<ash::ArtSetting> ArtSettings() {
+    return ambient_provider_->settings_->art_settings;
+  }
+
   bool HasPendingFetchRequestAtProvider() const {
     return ambient_provider_->has_pending_fetch_request_;
   }
@@ -266,6 +286,7 @@
   std::unique_ptr<ash::AmbientAshTestHelper> ambient_ash_test_helper_;
   std::unique_ptr<ash::FakeAmbientBackendControllerImpl>
       fake_backend_controller_;
+  base::HistogramTester histogram_tester_;
 };
 
 TEST_F(PersonalizationAppAmbientProviderImplTest, IsAmbientModeEnabled) {
@@ -310,7 +331,7 @@
 }
 
 TEST_F(PersonalizationAppAmbientProviderImplTest,
-       ShouldCallOnAmbientModeEnabledChanged) {
+       houldCallOnAmbientModeEnabledChanged) {
   PrefService* pref_service = profile()->GetPrefs();
   EXPECT_TRUE(pref_service);
   pref_service->SetBoolean(ash::ambient::prefs::kAmbientModeEnabled, false);
@@ -373,11 +394,11 @@
   EXPECT_EQ(ash::AmbientModeTopicSource::kGooglePhotos, TopicSource());
 
   // If `settings_->selected_album_ids` is empty, will fallback to kArtGallery.
-  SetSelectedAlbums(/*ids=*/{});
+  SetSelectedAlbumIds(/*ids=*/{});
   SetTopicSource(ash::AmbientModeTopicSource::kGooglePhotos);
   EXPECT_EQ(ash::AmbientModeTopicSource::kArtGallery, TopicSource());
 
-  SetSelectedAlbums(/*ids=*/{"1"});
+  SetSelectedAlbumIds(/*ids=*/{"1"});
   SetTopicSource(ash::AmbientModeTopicSource::kGooglePhotos);
   EXPECT_EQ(ash::AmbientModeTopicSource::kGooglePhotos, TopicSource());
 }
@@ -616,6 +637,92 @@
 }
 
 TEST_F(PersonalizationAppAmbientProviderImplTest,
+       TestSetSelectedGooglePhotosAlbum) {
+  FetchSettings();
+  ReplyFetchSettingsAndAlbums(/*success=*/true);
+
+  // The fake data has album '1' as selected.
+  std::vector<std::string> selected_ids = SelectedAlbumIds();
+  auto it = std::find(selected_ids.begin(), selected_ids.end(), "1");
+  EXPECT_NE(it, selected_ids.end());
+
+  ash::personalization_app::mojom::AmbientModeAlbumPtr album =
+      ash::personalization_app::mojom::AmbientModeAlbum::New();
+  album->id = '1';
+  album->topic_source = ash::AmbientModeTopicSource::kGooglePhotos;
+  album->checked = false;
+  SetAlbumSelected(album->id, album->topic_source, album->checked);
+
+  selected_ids = SelectedAlbumIds();
+  EXPECT_TRUE(selected_ids.empty());
+  // Will fallback to Art topic source if no selected Google Photos.
+  EXPECT_EQ(ash::AmbientModeTopicSource::kArtGallery, TopicSource());
+
+  album = ash::personalization_app::mojom::AmbientModeAlbum::New();
+  album->id = '1';
+  album->topic_source = ash::AmbientModeTopicSource::kGooglePhotos;
+  album->checked = true;
+  SetAlbumSelected(album->id, album->topic_source, album->checked);
+
+  selected_ids = SelectedAlbumIds();
+  EXPECT_EQ(1u, selected_ids.size());
+  it = std::find(selected_ids.begin(), selected_ids.end(), "1");
+  EXPECT_NE(it, selected_ids.end());
+  EXPECT_EQ(ash::AmbientModeTopicSource::kGooglePhotos, TopicSource());
+}
+
+TEST_F(PersonalizationAppAmbientProviderImplTest, TestSetSelectedArtAlbum) {
+  FetchSettings();
+  ReplyFetchSettingsAndAlbums(/*success=*/true);
+
+  // The fake data has art setting '0' as enabled.
+  std::vector<ash::ArtSetting> art_settings = ArtSettings();
+  auto it = std::find_if(art_settings.begin(), art_settings.end(),
+                         [](const auto& setting) { return setting.enabled; });
+  EXPECT_NE(it, art_settings.end());
+  EXPECT_EQ(it->album_id, "0");
+
+  ash::personalization_app::mojom::AmbientModeAlbumPtr album =
+      ash::personalization_app::mojom::AmbientModeAlbum::New();
+  album->id = '0';
+  album->topic_source = ash::AmbientModeTopicSource::kArtGallery;
+  album->checked = false;
+  SetAlbumSelected(album->id, album->topic_source, album->checked);
+
+  art_settings = ArtSettings();
+  it = std::find_if(art_settings.begin(), art_settings.end(),
+                    [](const auto& setting) { return setting.enabled; });
+  EXPECT_EQ(it, art_settings.end());
+
+  album = ash::personalization_app::mojom::AmbientModeAlbum::New();
+  album->id = '1';
+  album->topic_source = ash::AmbientModeTopicSource::kArtGallery;
+  album->checked = true;
+  SetAlbumSelected(album->id, album->topic_source, album->checked);
+
+  art_settings = ArtSettings();
+  it = std::find_if(art_settings.begin(), art_settings.end(),
+                    [](const auto& setting) { return setting.enabled; });
+  EXPECT_NE(it, art_settings.end());
+  EXPECT_EQ(it->album_id, "1");
+}
+
+TEST_F(PersonalizationAppAmbientProviderImplTest, TestAlbumNumbersAreRecorded) {
+  FetchSettings();
+  ReplyFetchSettingsAndAlbums(/*success=*/true);
+
+  ash::personalization_app::mojom::AmbientModeAlbumPtr album =
+      ash::personalization_app::mojom::AmbientModeAlbum::New();
+  album->id = '0';
+  album->topic_source = ash::AmbientModeTopicSource::kGooglePhotos;
+  SetAlbumSelected(album->id, album->topic_source, album->checked);
+  histogram_tester().ExpectTotalCount("Ash.AmbientMode.TotalNumberOfAlbums",
+                                      /*count=*/1);
+  histogram_tester().ExpectTotalCount("Ash.AmbientMode.SelectedNumberOfAlbums",
+                                      /*count=*/1);
+}
+
+TEST_F(PersonalizationAppAmbientProviderImplTest,
        TestEnabledPrefChangeUpdatesSettings) {
   // Simulate initial page request.
   FetchSettings();
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 4e47bb21..ad38fe10 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -94,6 +94,7 @@
 #include "components/crash/core/app/crashpad.h"
 #include "components/custom_handlers/protocol_handler_registry.h"
 #include "components/device_event_log/device_event_log.h"
+#include "components/feed/buildflags.h"
 #include "components/heavy_ad_intervention/heavy_ad_blocklist.h"
 #include "components/heavy_ad_intervention/heavy_ad_service.h"
 #include "components/history/core/browser/history_service.h"
@@ -139,7 +140,7 @@
 #include "chrome/browser/android/explore_sites/explore_sites_service_factory.h"
 #include "chrome/browser/android/oom_intervention/oom_intervention_decider.h"
 #include "chrome/browser/android/webapps/webapp_registry.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/offline_pages/offline_page_model_factory.h"
 #include "chrome/browser/profiles/profile_android.h"
 #include "components/cdm/browser/media_drm_storage_impl.h"  // nogncheck crbug.com/1125897
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
index b6e8fc4..2d49513 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_factory.cc
@@ -33,10 +33,10 @@
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "components/feed/buildflags.h"
 #include "components/feed/feed_feature_list.h"
-#endif  // BUILDFLAG(IS_ANDROID)
+#endif  // BUILDFLAG(IS_ANDROID
 
 // static
 ChromeBrowsingDataRemoverDelegateFactory*
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index b455296fc..315507e 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -1092,7 +1092,7 @@
                                          DiscardsUI>(map);
 #endif
 
-#if BUILDFLAG(ENABLE_FEED_V2)
+#if BUILDFLAG(ENABLE_FEED_V2) && BUILDFLAG(IS_ANDROID)
   RegisterWebUIControllerInterfaceBinder<feed_internals::mojom::PageHandler,
                                          FeedInternalsUI>(map);
 #endif
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index f066a24..cb45758 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -218,6 +218,7 @@
 #include "components/permissions/quota_permission_context_impl.h"
 #include "components/policy/content/policy_blocklist_navigation_throttle.h"
 #include "components/policy/content/policy_blocklist_service.h"
+#include "components/policy/core/common/management/management_service.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -1034,21 +1035,14 @@
   return canceler;
 }
 
-// Encapculates logic to determine if enterprise policies should be honored.
-// This is a copy of the code in policy_loader_win.cc but it's ok to duplicate
-// as a new central class to replace those checks is in the making.
 bool ShouldHonorPolicies() {
 #if BUILDFLAG(IS_WIN)
-  bool is_enterprise_version =
-      base::win::OSInfo::GetInstance()->version_type() != base::win::SUITE_HOME;
-  return base::win::IsEnrolledToDomain() ||
-         (base::win::IsDeviceRegisteredWithManagement() &&
-          is_enterprise_version);
-#else   // BUILDFLAG(IS_WIN)
-  // TODO(pastarmovj): Replace this with check for MacOS and the new management
-  // service once it is ready.
+  return policy::ManagementServiceFactory::GetForPlatform()
+             ->GetManagementAuthorityTrustworthiness() >=
+         policy::ManagementAuthorityTrustworthiness::TRUSTED;
+#else
   return true;
-#endif  // BUILDFLAG(IS_WIN)
+#endif
 }
 
 // Used by Enterprise policy. Disable blocking of navigations toward external
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 4b3d16095..7c138d77 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1499,6 +1499,8 @@
     "../ash/file_manager/delete_io_task.h",
     "../ash/file_manager/documents_provider_root_manager.cc",
     "../ash/file_manager/documents_provider_root_manager.h",
+    "../ash/file_manager/extract_io_task.cc",
+    "../ash/file_manager/extract_io_task.h",
     "../ash/file_manager/file_browser_handlers.cc",
     "../ash/file_manager/file_browser_handlers.h",
     "../ash/file_manager/file_manager_string_util.cc",
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 7ccade4..43ad46c1 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -15,6 +15,7 @@
 
 #include "ash/components/disks/disk.h"
 #include "ash/components/disks/disk_mount_manager.h"
+#include "ash/constants/ash_features.h"
 #include "base/bind.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
@@ -33,6 +34,7 @@
 #include "chrome/browser/ash/drive/file_system_util.h"
 #include "chrome/browser/ash/file_manager/copy_or_move_io_task.h"
 #include "chrome/browser/ash/file_manager/delete_io_task.h"
+#include "chrome/browser/ash/file_manager/extract_io_task.h"
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/io_task.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
@@ -1556,6 +1558,16 @@
       task = std::make_unique<file_manager::io_task::DeleteIOTask>(
           std::move(source_urls), file_system_context);
       break;
+    case file_manager::io_task::OperationType::kExtract:
+      if (base::FeatureList::IsEnabled(
+              chromeos::features::kFilesExtractArchive)) {
+        task = std::make_unique<file_manager::io_task::ExtractIOTask>(
+            std::move(source_urls), std::move(destination_folder_url),
+            file_system_context);
+        break;
+      }
+      // Fall through
+      ABSL_FALLTHROUGH_INTENDED;
     default:
       // TODO(b/199804935): Replace with MoveIOTask when implemented.
       task = std::make_unique<file_manager::io_task::DummyIOTask>(
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_guest_os.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_guest_os.cc
index 7caee24e..0edde1e 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_guest_os.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_guest_os.cc
@@ -20,8 +20,7 @@
 
 ExtensionFunction::ResponseAction
 FileManagerPrivateListMountableGuestsFunction::Run() {
-  Profile* profile =
-      Profile::FromBrowserContext(browser_context())->GetOriginalProfile();
+  Profile* profile = Profile::FromBrowserContext(browser_context());
   auto* registry =
       guest_os::GuestOsService::GetForProfile(profile)->MountProviderRegistry();
   auto entries = base::Value(base::Value::Type::LIST);
diff --git a/chrome/browser/feed/DEPS b/chrome/browser/feed/DEPS
new file mode 100644
index 0000000..a140205
--- /dev/null
+++ b/chrome/browser/feed/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  ".*_[a-z]*test\.cc": [
+    "+mojo/core/embedder",
+  ],
+}
\ No newline at end of file
diff --git a/chrome/browser/feed/android/background_refresh_task.cc b/chrome/browser/feed/android/background_refresh_task.cc
index cf77c712..1633560c 100644
--- a/chrome/browser/feed/android/background_refresh_task.cc
+++ b/chrome/browser/feed/android/background_refresh_task.cc
@@ -8,8 +8,8 @@
 
 #include "base/check.h"
 #include "base/feature_list.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/refresh_task_scheduler_impl.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/feed/core/v2/public/feed_service.h"
 #include "components/feed/feed_feature_list.h"
diff --git a/chrome/browser/feed/android/feed_image_fetch_client.cc b/chrome/browser/feed/android/feed_image_fetch_client.cc
index cf57efa1..5005b96 100644
--- a/chrome/browser/feed/android/feed_image_fetch_client.cc
+++ b/chrome/browser/feed/android/feed_image_fetch_client.cc
@@ -6,8 +6,8 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/FeedImageFetchClient_jni.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/feed/core/v2/public/feed_api.h"
diff --git a/chrome/browser/feed/android/feed_persistent_key_value_cache.cc b/chrome/browser/feed/android/feed_persistent_key_value_cache.cc
index 3f5bfc3..7f2831e 100644
--- a/chrome/browser/feed/android/feed_persistent_key_value_cache.cc
+++ b/chrome/browser/feed/android/feed_persistent_key_value_cache.cc
@@ -7,8 +7,8 @@
 #include "base/android/callback_android.h"
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/FeedPersistentKeyValueCache_jni.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/feed/core/v2/public/feed_api.h"
diff --git a/chrome/browser/feed/android/feed_process_scope_dependency_provider.cc b/chrome/browser/feed/android/feed_process_scope_dependency_provider.cc
index 5ed05ba..0800a62 100644
--- a/chrome/browser/feed/android/feed_process_scope_dependency_provider.cc
+++ b/chrome/browser/feed/android/feed_process_scope_dependency_provider.cc
@@ -6,9 +6,9 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/logging.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/FeedProcessScopeDependencyProvider_jni.h"
 #include "chrome/browser/feed/android/jni_translation.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/feed/core/proto/v2/ui.pb.h"
diff --git a/chrome/browser/feed/android/feed_service_bridge.cc b/chrome/browser/feed/android/feed_service_bridge.cc
index 38a1c0c5..d32499ae 100644
--- a/chrome/browser/feed/android/feed_service_bridge.cc
+++ b/chrome/browser/feed/android/feed_service_bridge.cc
@@ -14,8 +14,8 @@
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/FeedServiceBridge_jni.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/feed/android/feed_stream.cc b/chrome/browser/feed/android/feed_stream.cc
index e51d12b..a0845c0f 100644
--- a/chrome/browser/feed/android/feed_stream.cc
+++ b/chrome/browser/feed/android/feed_stream.cc
@@ -13,9 +13,9 @@
 #include "base/android/jni_string.h"
 #include "base/strings/string_piece.h"
 #include "chrome/browser/feed/android/feed_reliability_logging_bridge.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/FeedStream_jni.h"
 #include "chrome/browser/feed/android/jni_translation.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/feed/core/proto/v2/ui.pb.h"
diff --git a/chrome/browser/feed/android/rss_links_fetcher.h b/chrome/browser/feed/android/rss_links_fetcher.h
deleted file mode 100644
index f2e9dce6..0000000
--- a/chrome/browser/feed/android/rss_links_fetcher.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_FEED_ANDROID_RSS_LINKS_FETCHER_H_
-#define CHROME_BROWSER_FEED_ANDROID_RSS_LINKS_FETCHER_H_
-
-#include <vector>
-
-#include "chrome/browser/feed/android/feed_service_factory.h"
-#include "components/feed/core/v2/public/types.h"
-#include "components/feed/mojom/rss_link_reader.mojom-forward.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "url/gurl.h"
-
-class TabAndroid;
-namespace service_manager {
-class InterfaceProvider;
-}
-namespace feed {
-namespace internal {
-service_manager::InterfaceProvider* GetRenderFrameRemoteInterfaces(
-    TabAndroid* tab);
-}
-
-void FetchRssLinks(const GURL& url,
-                   TabAndroid* page_tab,
-                   base::OnceCallback<void(std::vector<GURL>)> callback);
-
-void FetchRssLinks(const GURL& url,
-                   mojo::Remote<feed::mojom::RssLinkReader> link_reader,
-                   base::OnceCallback<void(std::vector<GURL>)> callback);
-
-}  // namespace feed
-
-#endif  // CHROME_BROWSER_FEED_ANDROID_RSS_LINKS_FETCHER_H_
diff --git a/chrome/browser/feed/android/web_feed_bridge.cc b/chrome/browser/feed/android/web_feed_bridge.cc
index 733934e..06514b79 100644
--- a/chrome/browser/feed/android/web_feed_bridge.cc
+++ b/chrome/browser/feed/android/web_feed_bridge.cc
@@ -8,17 +8,16 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/bind.h"
-#include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
-#include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
 #include "base/notreached.h"
 #include "base/task/cancelable_task_tracker.h"
 #include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
 #include "chrome/browser/feed/android/jni_headers/WebFeedBridge_jni.h"
-#include "chrome/browser/feed/android/rss_links_fetcher.h"
+#include "chrome/browser/feed/feed_service_factory.h"
+#include "chrome/browser/feed/web_feed_follow_util.h"
+#include "chrome/browser/feed/web_feed_page_information_fetcher.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -30,17 +29,14 @@
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/history_types.h"
 #include "components/keyed_service/core/service_access_type.h"
-#include "content/public/browser/web_contents.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/android/gurl_android.h"
 
 namespace feed {
-namespace {
 
-struct PageInformation {
-  GURL url;
-  raw_ptr<TabAndroid> tab = nullptr;
-};
+using PageInformation = WebFeedPageInformationFetcher::PageInformation;
+
+namespace {
 
 base::CancelableTaskTracker& TaskTracker() {
   static base::NoDestructor<base::CancelableTaskTracker> task_tracker;
@@ -56,8 +52,9 @@
   PageInformation result;
   if (gurl)
     result.url = *gurl;
-  result.tab = TabAndroid::GetNativeTab(
+  TabAndroid* tab = TabAndroid::GetNativeTab(
       env, Java_WebFeedPageInformation_getTab(env, pageInfo));
+  result.web_contents = tab ? tab->web_contents() : nullptr;
   return result;
 }
 
@@ -79,91 +76,9 @@
   Profile* profile = ProfileManager::GetLastUsedProfile();
   if (!profile)
     return nullptr;
-  FeedService* service = FeedServiceFactory::GetForBrowserContext(profile);
-  if (!service)
-    return nullptr;
-  return &service->GetStream()->subscriptions();
+  return GetSubscriptionsForProfile(profile);
 }
 
-void FetchPageCanonicalUrl(
-    const PageInformation& page_info,
-    base::OnceCallback<void(const absl::optional<::GURL>&)> callback) {
-  if (page_info.tab && page_info.tab->web_contents()) {
-    content::RenderFrameHost* render_frame_host =
-        page_info.tab->web_contents()->GetMainFrame();
-    if (render_frame_host && render_frame_host->IsRenderFrameCreated()) {
-      render_frame_host->GetCanonicalUrl(std::move(callback));
-      return;
-    }
-  }
-  std::move(callback).Run(absl::nullopt);
-}
-
-// TODO(carlosk): Move this class into its own file and add tests.
-class WebFeedPageInformationFetcher
-    : public base::RefCounted<WebFeedPageInformationFetcher> {
- public:
-  // Fetches the canonical URL and RSS URLs for a web page, and then calls
-  // `callback` with the results.
-  static void Start(const PageInformation& page_info,
-                    const WebFeedPageInformationRequestReason reason,
-                    base::OnceCallback<void(WebFeedPageInformation)> callback) {
-    DVLOG(2) << "PageInformationRequested reason=" << reason;
-    base::UmaHistogramEnumeration(
-        "ContentSuggestions.Feed.WebFeed.PageInformationRequested", reason);
-
-    // Perform two async operations, and call `callback` only after both are
-    // complete. Keep state as RefCounted, owned by the callbacks.
-    auto self = base::MakeRefCounted<WebFeedPageInformationFetcher>(
-        page_info, std::move(callback));
-
-    FetchRssLinks(page_info.url, page_info.tab,
-                  base::BindOnce(&WebFeedPageInformationFetcher::OnRssFetched,
-                                 base::RetainedRef(self.get())));
-    FetchPageCanonicalUrl(
-        page_info,
-        base::BindOnce(&WebFeedPageInformationFetcher::OnCanonicalUrlFetched,
-                       base::RetainedRef(self.get())));
-  }
-
-  // For internal use only.
-  WebFeedPageInformationFetcher(
-      const PageInformation& initial_page_info,
-      base::OnceCallback<void(WebFeedPageInformation)> callback)
-      : callback_(std::move(callback)) {
-    page_info_.SetUrl(initial_page_info.url);
-  }
-
- private:
-  friend class base::RefCounted<WebFeedPageInformationFetcher>;
-  ~WebFeedPageInformationFetcher() = default;
-
-  void CallCallbackIfReady() {
-    if (rss_fetched_ && url_fetched_)
-      std::move(callback_).Run(std::move(page_info_));
-  }
-
-  void OnCanonicalUrlFetched(const absl::optional<::GURL>& url) {
-    if (url) {
-      page_info_.SetCanonicalUrl(*url);
-    }
-
-    url_fetched_ = true;
-    CallCallbackIfReady();
-  }
-
-  void OnRssFetched(std::vector<GURL> rss_urls) {
-    page_info_.SetRssUrls(std::move(rss_urls));
-    rss_fetched_ = true;
-    CallCallbackIfReady();
-  }
-
-  WebFeedPageInformation page_info_;
-  base::OnceCallback<void(WebFeedPageInformation)> callback_;
-  bool rss_fetched_ = false;
-  bool url_fetched_ = false;
-};
-
 // ToJava functions convert C++ types to Java. Used in `AdaptCallbackForJava`.
 
 bool ToJava(JNIEnv* env, WebFeedSubscriptions::RefreshResult value) {
@@ -270,6 +185,12 @@
         subscriptions->FollowWebFeed(page_info, std::move(callback));
       };
   PageInformation page_info = ToNativePageInformation(env, pageInfo);
+  // Make sure web_contents is not NULL since the user might navigate away from
+  // the current tab that is requested to follow.
+  if (!page_info.web_contents) {
+    std::move(callback).Run({});
+    return;
+  }
   WebFeedPageInformationFetcher::Start(
       page_info, WebFeedPageInformationRequestReason::kUserRequestedFollow,
       base::BindOnce(on_page_info_fetched, std::move(callback)));
@@ -328,6 +249,12 @@
         subscriptions->FindWebFeedInfoForPage(page_info, std::move(callback));
       };
   PageInformation page_info = ToNativePageInformation(env, pageInfo);
+  // Make sure web_contents is not NULL since the user might navigate away from
+  // the current tab that is requested to find info.
+  if (!page_info.web_contents) {
+    std::move(callback).Run({});
+    return;
+  }
   WebFeedPageInformationFetcher::Start(
       page_info, static_cast<WebFeedPageInformationRequestReason>(reason),
       base::BindOnce(on_page_info_fetched, std::move(callback)));
diff --git a/chrome/browser/feed/android/feed_service_factory.cc b/chrome/browser/feed/feed_service_factory.cc
similarity index 78%
rename from chrome/browser/feed/android/feed_service_factory.cc
rename to chrome/browser/feed/feed_service_factory.cc
index b799cdb6..5c1084c 100644
--- a/chrome/browser/feed/android/feed_service_factory.cc
+++ b/chrome/browser/feed/feed_service_factory.cc
@@ -2,19 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 
 #include <memory>
 #include <string>
 #include <utility>
 
+#include "base/check.h"
 #include "base/strings/string_piece.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/feed/android/feed_service_bridge.h"
-#include "chrome/browser/feed/android/refresh_task_scheduler_impl.h"
-#include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/profiles/profile.h"
@@ -27,6 +25,7 @@
 #include "components/feed/core/proto/v2/keyvalue_store.pb.h"
 #include "components/feed/core/proto/v2/store.pb.h"
 #include "components/feed/core/v2/public/feed_service.h"
+#include "components/feed/feed_feature_list.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/offline_pages/core/offline_page_feature.h"
 #include "components/version_info/version_info.h"
@@ -34,8 +33,14 @@
 #include "content/public/browser/storage_partition.h"
 #include "google_apis/google_api_keys.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/feed/android/feed_service_bridge.h"
+#include "chrome/browser/feed/android/refresh_task_scheduler_impl.h"
+#include "chrome/browser/flags/android/chrome_feature_list.h"
+#endif
+
 namespace feed {
-const char kFeedv2Folder[] = "feedv2";
+const base::FilePath::CharType kFeedv2Folder[] = FILE_PATH_LITERAL("feedv2");
 namespace internal {
 const base::StringPiece GetFollowingFeedFollowCountGroupName(
     size_t follow_count) {
@@ -51,23 +56,63 @@
     return "13-20";
   return "21+";
 }
+
+#if !BUILDFLAG(IS_ANDROID)
+// TODO(jianli): Need to figure out what to do for desktop version.
+class NoOpRefreshTaskScheduler : public feed::RefreshTaskScheduler {
+ public:
+  NoOpRefreshTaskScheduler() = default;
+  ~NoOpRefreshTaskScheduler() override = default;
+
+  void EnsureScheduled(RefreshTaskId id, base::TimeDelta delay) override {}
+  void Cancel(RefreshTaskId id) override {}
+  void RefreshTaskComplete(RefreshTaskId id) override {}
+};
+#endif
+
 }  // namespace internal
 
 class FeedServiceDelegateImpl : public FeedService::Delegate {
  public:
   ~FeedServiceDelegateImpl() override = default;
   std::string GetLanguageTag() override {
+#if BUILDFLAG(IS_ANDROID)
     return FeedServiceBridge::GetLanguageTag();
+#else
+    // TODO(jianli): Need to figure out what to do for desktop version.
+    return "en";
+#endif
   }
   DisplayMetrics GetDisplayMetrics() override {
+#if BUILDFLAG(IS_ANDROID)
     return FeedServiceBridge::GetDisplayMetrics();
+#else
+    // TODO(jianli): Need to figure out what to do for desktop version.
+    DisplayMetrics metrics;
+    metrics.density = 0;
+    metrics.width_pixels = 0;
+    metrics.height_pixels = 0;
+    return metrics;
+#endif
   }
   bool IsAutoplayEnabled() override {
+#if BUILDFLAG(IS_ANDROID)
     return FeedServiceBridge::IsAutoplayEnabled();
+#else
+    return false;
+#endif
   }
-  void ClearAll() override { FeedServiceBridge::ClearAll(); }
+  void ClearAll() override {
+    // TODO(jianli): Need to figure out what to do for desktop version.
+#if BUILDFLAG(IS_ANDROID)
+    FeedServiceBridge::ClearAll();
+#endif
+  }
   void PrefetchImage(const GURL& url) override {
+    // TODO(jianli): Need to figure out what to do for desktop version.
+#if BUILDFLAG(IS_ANDROID)
     FeedServiceBridge::PrefetchImage(url);
+#endif
   }
   void RegisterExperiments(const Experiments& experiments) override {
     // Note that this does not affect the contents of the X-Client-Data
@@ -124,6 +169,13 @@
 
 KeyedService* FeedServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
+  // Currently feed service is only supported for kWebUiFeed on desktop.
+  // TODO(jianli): Update all other places that depend on FeedServiceFactory
+  // when we want to roll this out.
+#if !BUILDFLAG(IS_ANDROID)
+  CHECK(base::FeatureList::IsEnabled(feed::kWebUiFeed));
+#endif
+
   Profile* profile = Profile::FromBrowserContext(context);
 
   content::StoragePartition* storage_partition =
@@ -148,14 +200,22 @@
   feed::ChromeInfo chrome_info;
   chrome_info.version = base::Version({CHROME_VERSION});
   chrome_info.channel = chrome::GetChannel();
+#if BUILDFLAG(IS_ANDROID)
   chrome_info.start_surface =
       base::FeatureList::IsEnabled(chrome::android::kStartSurfaceAndroid);
+#else
+  chrome_info.start_surface = false;
+#endif
 
   return new FeedService(
       std::make_unique<FeedServiceDelegateImpl>(),
+#if BUILDFLAG(IS_ANDROID)
       std::make_unique<RefreshTaskSchedulerImpl>(
           background_task::BackgroundTaskSchedulerFactory::GetForKey(
               profile->GetProfileKey())),
+#else
+      std::make_unique<internal::NoOpRefreshTaskScheduler>(),
+#endif
       profile->GetPrefs(), g_browser_process->local_state(),
       storage_partition->GetProtoDatabaseProvider()->GetDB<feedstore::Record>(
           leveldb_proto::ProtoDbType::FEED_STREAM_DATABASE,
diff --git a/chrome/browser/feed/android/feed_service_factory.h b/chrome/browser/feed/feed_service_factory.h
similarity index 88%
rename from chrome/browser/feed/android/feed_service_factory.h
rename to chrome/browser/feed/feed_service_factory.h
index 496fad0..a1378d9 100644
--- a/chrome/browser/feed/android/feed_service_factory.h
+++ b/chrome/browser/feed/feed_service_factory.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_FEED_ANDROID_FEED_SERVICE_FACTORY_H_
-#define CHROME_BROWSER_FEED_ANDROID_FEED_SERVICE_FACTORY_H_
+#ifndef CHROME_BROWSER_FEED_FEED_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_FEED_FEED_SERVICE_FACTORY_H_
 
 #include "base/memory/singleton.h"
 #include "base/strings/string_piece_forward.h"
@@ -47,4 +47,4 @@
 
 }  // namespace feed
 
-#endif  // CHROME_BROWSER_FEED_ANDROID_FEED_SERVICE_FACTORY_H_
+#endif  // CHROME_BROWSER_FEED_FEED_SERVICE_FACTORY_H_
diff --git a/chrome/browser/feed/android/feed_service_factory_unittest.cc b/chrome/browser/feed/feed_service_factory_unittest.cc
similarity index 94%
rename from chrome/browser/feed/android/feed_service_factory_unittest.cc
rename to chrome/browser/feed/feed_service_factory_unittest.cc
index 36fbfff7..9c97e7f 100644
--- a/chrome/browser/feed/android/feed_service_factory_unittest.cc
+++ b/chrome/browser/feed/feed_service_factory_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 
 #include "base/strings/string_piece.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/feed/android/rss_links_fetcher.cc b/chrome/browser/feed/rss_links_fetcher.cc
similarity index 68%
rename from chrome/browser/feed/android/rss_links_fetcher.cc
rename to chrome/browser/feed/rss_links_fetcher.cc
index d299c41..f61d9221 100644
--- a/chrome/browser/feed/android/rss_links_fetcher.cc
+++ b/chrome/browser/feed/rss_links_fetcher.cc
@@ -2,10 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/feed/android/rss_links_fetcher.h"
+#include "chrome/browser/feed/rss_links_fetcher.h"
 
 #include "base/callback.h"
-#include "chrome/browser/android/tab_android.h"
 #include "components/feed/mojom/rss_link_reader.mojom.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
@@ -14,22 +13,13 @@
 namespace feed {
 namespace {
 
-service_manager::InterfaceProvider* GetRenderFrameRemoteInterfaces(
-    TabAndroid* tab) {
-  if (!tab || !tab->web_contents() || !tab->web_contents()->GetMainFrame())
-    return nullptr;
-
-  return tab->web_contents()->GetMainFrame()->GetRemoteInterfaces();
-}
-
 mojo::Remote<feed::mojom::RssLinkReader> GetRssLinkReaderRemote(
-    TabAndroid* tab) {
+    content::WebContents* web_contents) {
+  DCHECK(web_contents->GetMainFrame()->IsRenderFrameCreated());
   mojo::Remote<feed::mojom::RssLinkReader> result;
-  service_manager::InterfaceProvider* interface_provider =
-      GetRenderFrameRemoteInterfaces(tab);
-  if (interface_provider) {
-    interface_provider->GetInterface(result.BindNewPipeAndPassReceiver());
-  }
+  // GetRemoteInterfaces() cannot be null if the render frame is created.
+  web_contents->GetMainFrame()->GetRemoteInterfaces()->GetInterface(
+      result.BindNewPipeAndPassReceiver());
   return result;
 }
 
@@ -78,20 +68,32 @@
   base::OnceCallback<void(std::vector<GURL>)> callback_;
 };
 
-}  // namespace
-
-void FetchRssLinks(const GURL& url,
-                   mojo::Remote<feed::mojom::RssLinkReader> link_reader,
-                   base::OnceCallback<void(std::vector<GURL>)> callback) {
+void FetchRssLinksHelper(const GURL& url,
+                         mojo::Remote<feed::mojom::RssLinkReader> link_reader,
+                         base::OnceCallback<void(std::vector<GURL>)> callback) {
   // RssLinksFetcher is self-deleting.
   auto* fetcher = new RssLinksFetcher();
   fetcher->Start(url, std::move(link_reader), std::move(callback));
 }
 
+}  // namespace
+
+void FetchRssLinksForTesting(
+    const GURL& url,
+    mojo::Remote<feed::mojom::RssLinkReader> link_reader,
+    base::OnceCallback<void(std::vector<GURL>)> callback) {
+  FetchRssLinksHelper(url, std::move(link_reader), std::move(callback));
+}
+
 void FetchRssLinks(const GURL& url,
-                   TabAndroid* page_tab,
+                   content::WebContents* web_contents,
                    base::OnceCallback<void(std::vector<GURL>)> callback) {
-  FetchRssLinks(url, GetRssLinkReaderRemote(page_tab), std::move(callback));
+  if (!web_contents) {
+    std::move(callback).Run(std::vector<GURL>());
+    return;
+  }
+  FetchRssLinksHelper(url, GetRssLinkReaderRemote(web_contents),
+                      std::move(callback));
 }
 
 }  // namespace feed
diff --git a/chrome/browser/feed/rss_links_fetcher.h b/chrome/browser/feed/rss_links_fetcher.h
new file mode 100644
index 0000000..6880000
--- /dev/null
+++ b/chrome/browser/feed/rss_links_fetcher.h
@@ -0,0 +1,33 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_FEED_RSS_LINKS_FETCHER_H_
+#define CHROME_BROWSER_FEED_RSS_LINKS_FETCHER_H_
+
+#include <vector>
+
+#include "components/feed/core/v2/public/types.h"
+#include "components/feed/mojom/rss_link_reader.mojom.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "url/gurl.h"
+
+namespace content {
+class WebContents;
+}
+namespace feed {
+
+// Fetch all RSS links associated with the main frame of the specified web
+// contents.
+void FetchRssLinks(const GURL& url,
+                   content::WebContents* web_contents,
+                   base::OnceCallback<void(std::vector<GURL>)> callback);
+
+void FetchRssLinksForTesting(
+    const GURL& url,
+    mojo::Remote<feed::mojom::RssLinkReader> link_reader,
+    base::OnceCallback<void(std::vector<GURL>)> callback);
+
+}  // namespace feed
+
+#endif  // CHROME_BROWSER_FEED_RSS_LINKS_FETCHER_H_
diff --git a/chrome/browser/feed/android/rss_links_fetcher_browsertest.cc b/chrome/browser/feed/rss_links_fetcher_browsertest.cc
similarity index 81%
rename from chrome/browser/feed/android/rss_links_fetcher_browsertest.cc
rename to chrome/browser/feed/rss_links_fetcher_browsertest.cc
index d5a8c23..5aa0797d 100644
--- a/chrome/browser/feed/android/rss_links_fetcher_browsertest.cc
+++ b/chrome/browser/feed/rss_links_fetcher_browsertest.cc
@@ -2,31 +2,35 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/feed/android/rss_links_fetcher.h"
+#include "chrome/browser/feed/rss_links_fetcher.h"
 
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/sync/session_sync_service_factory.h"
-#include "chrome/test/base/android/android_browser_test.h"
 #include "chrome/test/base/chrome_test_utils.h"
 #include "components/feed/core/v2/public/types.h"
 #include "components/feed/core/v2/test/callback_receiver.h"
 #include "components/feed/feed_feature_list.h"
 #include "components/feed/mojom/rss_link_reader.mojom.h"
 #include "components/metrics/content/subprocess_metrics_provider.h"
-#include "components/sync_sessions/session_sync_service_impl.h"
-#include "components/sync_sessions/sync_sessions_client.h"
-#include "components/sync_sessions/synced_tab_delegate.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "chrome/test/base/android/android_browser_test.h"
+#else
+#include "chrome/test/base/in_process_browser_test.h"
+#endif
+
 namespace feed {
 namespace {
 
+#if BUILDFLAG(IS_ANDROID)
 class RssLinksFetcherTest : public AndroidBrowserTest {
+#else
+class RssLinksFetcherTest : public InProcessBrowserTest {
+#endif
  public:
   RssLinksFetcherTest() { features_.InitAndEnableFeature(kWebFeed); }
   // AndroidBrowserTest:
@@ -38,15 +42,14 @@
 };
 
 IN_PROC_BROWSER_TEST_F(RssLinksFetcherTest, FetchSuccessfulFromHead) {
-  auto* tab = TabAndroid::FromWebContents(
-      chrome_test_utils::GetActiveWebContents(this));
+  auto* web_contents = chrome_test_utils::GetActiveWebContents(this);
   const GURL url =
       embedded_test_server()->GetURL("localhost", "/page_with_rss.html");
-  ASSERT_TRUE(content::NavigateToURL(tab->web_contents(), url));
+  ASSERT_TRUE(content::NavigateToURL(web_contents, url));
 
   base::HistogramTester histogram_tester;
   CallbackReceiver<std::vector<GURL>> rss_links;
-  FetchRssLinks(url, tab, rss_links.Bind());
+  FetchRssLinks(url, web_contents, rss_links.Bind());
   std::vector<GURL> result = rss_links.RunAndGetResult();
   // Only valid RSS links in the head section should be returned.
   // Just check path on URLs relative to the local server, since its port
@@ -66,15 +69,14 @@
 }
 
 IN_PROC_BROWSER_TEST_F(RssLinksFetcherTest, FetchSuccessfulFromBody) {
-  auto* tab = TabAndroid::FromWebContents(
-      chrome_test_utils::GetActiveWebContents(this));
+  auto* web_contents = chrome_test_utils::GetActiveWebContents(this);
   const GURL url = embedded_test_server()->GetURL(
       "localhost", "/page_with_rss_in_body.html");
-  ASSERT_TRUE(content::NavigateToURL(tab->web_contents(), url));
+  ASSERT_TRUE(content::NavigateToURL(web_contents, url));
 
   base::HistogramTester histogram_tester;
   CallbackReceiver<std::vector<GURL>> rss_links;
-  FetchRssLinks(url, tab, rss_links.Bind());
+  FetchRssLinks(url, web_contents, rss_links.Bind());
   std::vector<GURL> result = rss_links.RunAndGetResult();
   // As there's no valid RSS links in the head, the ones from the body should be
   // returned.
diff --git a/chrome/browser/feed/android/rss_links_fetcher_unittest.cc b/chrome/browser/feed/rss_links_fetcher_unittest.cc
similarity index 79%
rename from chrome/browser/feed/android/rss_links_fetcher_unittest.cc
rename to chrome/browser/feed/rss_links_fetcher_unittest.cc
index 697056f..e139787 100644
--- a/chrome/browser/feed/android/rss_links_fetcher_unittest.cc
+++ b/chrome/browser/feed/rss_links_fetcher_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/feed/android/rss_links_fetcher.h"
+#include "chrome/browser/feed/rss_links_fetcher.h"
 
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
@@ -28,6 +28,12 @@
   StubRssLinkReader() {}
   ~StubRssLinkReader() override {}
 
+  mojo::PendingRemote<mojom::RssLinkReader> BindAndPassRemote() {
+    return receiver_.BindNewPipeAndPassRemote();
+  }
+
+  void ResetReceiver() { receiver_.reset(); }
+
   // mojom::RssLinkReader
   void GetRssLinks(GetRssLinksCallback callback) override {
     if (on_call_)
@@ -54,6 +60,7 @@
  private:
   GetRssLinksCallback callback_;
   base::RepeatingClosure on_call_;
+  mojo::Receiver<mojom::RssLinkReader> receiver_{this};
 };
 
 class RssLinksFetcherUnitTest : public ::testing::Test {
@@ -68,11 +75,10 @@
 TEST_F(RssLinksFetcherUnitTest, Success) {
   CallbackReceiver<std::vector<GURL>> rss_links;
   StubRssLinkReader link_reader;
-  auto receiver = link_reader.MakeReceiver();
-  FetchRssLinks(TestPageUrl(),
-                mojo::Remote<feed::mojom::RssLinkReader>(
-                    receiver->BindNewPipeAndPassRemote()),
-                rss_links.Bind());
+  FetchRssLinksForTesting(
+      TestPageUrl(),
+      mojo::Remote<feed::mojom::RssLinkReader>(link_reader.BindAndPassRemote()),
+      rss_links.Bind());
   link_reader.WaitForCall();
 
   {
@@ -91,13 +97,12 @@
 TEST_F(RssLinksFetcherUnitTest, Disconnected) {
   CallbackReceiver<std::vector<GURL>> rss_links;
   StubRssLinkReader link_reader;
-  auto receiver = link_reader.MakeReceiver();
-  FetchRssLinks(TestPageUrl(),
-                mojo::Remote<feed::mojom::RssLinkReader>(
-                    receiver->BindNewPipeAndPassRemote()),
-                rss_links.Bind());
+  FetchRssLinksForTesting(
+      TestPageUrl(),
+      mojo::Remote<feed::mojom::RssLinkReader>(link_reader.BindAndPassRemote()),
+      rss_links.Bind());
   link_reader.WaitForCall();
-  receiver.reset();
+  link_reader.ResetReceiver();
   link_reader.Respond(feed::mojom::RssLinks::New(TestPageUrl(), TestRssUrls()));
   EXPECT_EQ(std::vector<GURL>(), rss_links.RunAndGetResult());
 }
@@ -105,11 +110,10 @@
 TEST_F(RssLinksFetcherUnitTest, PageUrlMismatch) {
   CallbackReceiver<std::vector<GURL>> rss_links;
   StubRssLinkReader link_reader;
-  auto receiver = link_reader.MakeReceiver();
-  FetchRssLinks(TestPageUrl(),
-                mojo::Remote<feed::mojom::RssLinkReader>(
-                    receiver->BindNewPipeAndPassRemote()),
-                rss_links.Bind());
+  FetchRssLinksForTesting(
+      TestPageUrl(),
+      mojo::Remote<feed::mojom::RssLinkReader>(link_reader.BindAndPassRemote()),
+      rss_links.Bind());
   link_reader.WaitForCall();
   link_reader.Respond(
       feed::mojom::RssLinks::New(GURL("https://someotherpage"), TestRssUrls()));
diff --git a/chrome/browser/feed/web_feed_follow_util.cc b/chrome/browser/feed/web_feed_follow_util.cc
new file mode 100644
index 0000000..298cd67
--- /dev/null
+++ b/chrome/browser/feed/web_feed_follow_util.cc
@@ -0,0 +1,54 @@
+// Copyright 2022 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/feed/web_feed_follow_util.h"
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "chrome/browser/feed/feed_service_factory.h"
+#include "chrome/browser/feed/web_feed_page_information_fetcher.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "components/feed/core/v2/public/feed_service.h"
+#include "components/feed/core/v2/public/types.h"
+#include "components/feed/core/v2/public/web_feed_subscriptions.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/web_contents.h"
+
+namespace feed {
+
+WebFeedSubscriptions* GetSubscriptionsForProfile(Profile* profile) {
+  FeedService* service = FeedServiceFactory::GetForBrowserContext(profile);
+  if (!service)
+    return nullptr;
+  return &service->GetStream()->subscriptions();
+}
+
+void FollowSite(content::WebContents* web_contents) {
+  auto on_page_info_fetched = [](WebFeedPageInformation page_info) {
+    Profile* profile = ProfileManager::GetLastUsedProfile();
+    if (!profile)
+      return;
+
+    WebFeedSubscriptions* subscriptions = GetSubscriptionsForProfile(profile);
+    if (!subscriptions) {
+      return;
+    }
+    auto on_followed = [](WebFeedSubscriptions::FollowWebFeedResult result) {
+      // TODO(jianli): More UI hookup.
+    };
+    subscriptions->FollowWebFeed(page_info, base::BindOnce(on_followed));
+  };
+
+  WebFeedPageInformationFetcher::PageInformation page_info;
+  page_info.url =
+      web_contents->GetController().GetLastCommittedEntry()->GetURL();
+  page_info.web_contents = web_contents;
+
+  WebFeedPageInformationFetcher::Start(
+      page_info, WebFeedPageInformationRequestReason::kUserRequestedFollow,
+      base::BindOnce(on_page_info_fetched));
+}
+
+}  // namespace feed
diff --git a/chrome/browser/feed/web_feed_follow_util.h b/chrome/browser/feed/web_feed_follow_util.h
new file mode 100644
index 0000000..98a852c6
--- /dev/null
+++ b/chrome/browser/feed/web_feed_follow_util.h
@@ -0,0 +1,23 @@
+// Copyright 2022 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_FEED_WEB_FEED_FOLLOW_UTIL_H_
+#define CHROME_BROWSER_FEED_WEB_FEED_FOLLOW_UTIL_H_
+
+class Profile;
+namespace content {
+class WebContents;
+}
+
+namespace feed {
+
+class WebFeedSubscriptions;
+
+WebFeedSubscriptions* GetSubscriptionsForProfile(Profile* profile);
+
+void FollowSite(content::WebContents* web_contents);
+
+}  // namespace feed
+
+#endif  // CHROME_BROWSER_FEED_WEB_FEED_FOLLOW_CONTROLLER_H_
diff --git a/chrome/browser/feed/web_feed_page_information_fetcher.cc b/chrome/browser/feed/web_feed_page_information_fetcher.cc
new file mode 100644
index 0000000..1e32150
--- /dev/null
+++ b/chrome/browser/feed/web_feed_page_information_fetcher.cc
@@ -0,0 +1,88 @@
+// Copyright 2022 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/feed/web_feed_page_information_fetcher.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "chrome/browser/feed/rss_links_fetcher.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+
+namespace feed {
+
+using PageInformation = WebFeedPageInformationFetcher::PageInformation;
+
+namespace {
+
+void FetchPageCanonicalUrl(
+    const PageInformation& page_info,
+    base::OnceCallback<void(const absl::optional<::GURL>&)> callback) {
+  DCHECK(page_info.web_contents->GetMainFrame()->IsRenderFrameCreated());
+  page_info.web_contents->GetMainFrame()->GetCanonicalUrl(std::move(callback));
+}
+
+}  // namespace
+
+// static
+void WebFeedPageInformationFetcher::Start(
+    const PageInformation& page_info,
+    const WebFeedPageInformationRequestReason reason,
+    base::OnceCallback<void(WebFeedPageInformation)> callback) {
+  DVLOG(2) << "PageInformationRequested reason=" << reason;
+  base::UmaHistogramEnumeration(
+      "ContentSuggestions.Feed.WebFeed.PageInformationRequested", reason);
+
+  // Make sure the renderer still exists, i.e., not crashed, since this may
+  // be triggered asynchronously.
+  if (!page_info.web_contents->GetMainFrame()->IsRenderFrameCreated()) {
+    std::move(callback).Run(WebFeedPageInformation());
+    return;
+  }
+
+  // Perform two async operations, and call `callback` only after both are
+  // complete. Keep state as RefCounted, owned by the callbacks.
+  auto self = base::MakeRefCounted<WebFeedPageInformationFetcher>(
+      page_info, std::move(callback));
+
+  FetchRssLinks(page_info.url, page_info.web_contents,
+                base::BindOnce(&WebFeedPageInformationFetcher::OnRssFetched,
+                               base::RetainedRef(self.get())));
+  FetchPageCanonicalUrl(
+      page_info,
+      base::BindOnce(&WebFeedPageInformationFetcher::OnCanonicalUrlFetched,
+                     base::RetainedRef(self.get())));
+}
+
+WebFeedPageInformationFetcher::WebFeedPageInformationFetcher(
+    const PageInformation& initial_page_info,
+    base::OnceCallback<void(WebFeedPageInformation)> callback)
+    : callback_(std::move(callback)) {
+  page_info_.SetUrl(initial_page_info.url);
+}
+
+WebFeedPageInformationFetcher::~WebFeedPageInformationFetcher() = default;
+
+void WebFeedPageInformationFetcher::CallCallbackIfReady() {
+  if (rss_fetched_ && url_fetched_)
+    std::move(callback_).Run(std::move(page_info_));
+}
+
+void WebFeedPageInformationFetcher::OnCanonicalUrlFetched(
+    const absl::optional<::GURL>& url) {
+  if (url) {
+    page_info_.SetCanonicalUrl(*url);
+  }
+
+  url_fetched_ = true;
+  CallCallbackIfReady();
+}
+
+void WebFeedPageInformationFetcher::OnRssFetched(std::vector<GURL> rss_urls) {
+  page_info_.SetRssUrls(std::move(rss_urls));
+  rss_fetched_ = true;
+  CallCallbackIfReady();
+}
+
+}  // namespace feed
diff --git a/chrome/browser/feed/web_feed_page_information_fetcher.h b/chrome/browser/feed/web_feed_page_information_fetcher.h
new file mode 100644
index 0000000..be8fd66
--- /dev/null
+++ b/chrome/browser/feed/web_feed_page_information_fetcher.h
@@ -0,0 +1,59 @@
+// Copyright 2022 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_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_
+#define CHROME_BROWSER_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/metrics/histogram_functions.h"
+#include "components/feed/core/v2/public/types.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace feed {
+
+// TODO(carlosk): Add tests.
+class WebFeedPageInformationFetcher
+    : public base::RefCounted<WebFeedPageInformationFetcher> {
+ public:
+  struct PageInformation {
+    GURL url;
+    // web_contents should be set.
+    content::WebContents* web_contents = nullptr;
+  };
+
+  // Fetches the canonical URL and RSS URLs for a web page, and then calls
+  // `callback` with the results.
+  static void Start(const PageInformation& page_info,
+                    const WebFeedPageInformationRequestReason reason,
+                    base::OnceCallback<void(WebFeedPageInformation)> callback);
+
+  // For internal use only.
+  WebFeedPageInformationFetcher(
+      const PageInformation& initial_page_info,
+      base::OnceCallback<void(WebFeedPageInformation)> callback);
+
+ private:
+  friend class base::RefCounted<WebFeedPageInformationFetcher>;
+
+  ~WebFeedPageInformationFetcher();
+
+  void CallCallbackIfReady();
+  void OnCanonicalUrlFetched(const absl::optional<::GURL>& url);
+  void OnRssFetched(std::vector<GURL> rss_urls);
+
+  WebFeedPageInformation page_info_;
+  base::OnceCallback<void(WebFeedPageInformation)> callback_;
+  bool rss_fetched_ = false;
+  bool url_fetched_ = false;
+};
+
+}  // namespace feed
+
+#endif  // CHROME_BROWSER_FEED_WEB_FEED_PAGE_INFORMATION_FETCHER_H_
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index caea53c6..2667e99 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -205,6 +205,11 @@
     "expiry_milestone": 92
   },
   {
+    "name": "arc-enable-virtio-blk-for-data",
+    "owners": [ "niwa" ],
+    "expiry_milestone": 110
+  },
+  {
     "name": "arc-file-picker-experiment",
     "owners": [ "youkichihosoi", "risan", "niwa" ],
     "expiry_milestone": 100
@@ -1588,6 +1593,11 @@
     "expiry_milestone": 101
   },
   {
+    "name": "enable-back-forward-cache-for-screen-reader",
+    "owners": [ "bfcache-dev@chromium.org", "yuzus" ],
+    "expiry_milestone": 108
+  },
+  {
     "name": "enable-background-blur",
     "owners": [ "newcomer" ],
     "expiry_milestone": 86
@@ -5019,7 +5029,7 @@
   {
     "name": "quick-dim",
     "owners": [ "charleszhao", "martis", "napper" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 102
   },
   {
     "name": "quick-settings-network-revamp",
@@ -5515,7 +5525,7 @@
   {
     "name": "snooping-protection",
     "owners": [ "martis", "charleszhao", "napper" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 102
   },
   {
     "name": "spectre-v2-mitigation",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 084358f1..912ebc94 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -458,6 +458,12 @@
     "To enable caching pages on same-site navigations too, choose 'enabled "
     "same-site support'.";
 
+const char kEnableBackForwardCacheForScreenReaderName[] =
+    "Enable Back-forward cache for screen readers";
+const char kEnableBackForwardCacheForScreenReaderDescription[] =
+    "If enabled, allow pages to enter back/forward cache even if a screen "
+    "reader is in use. The page might still not be cached for other reasons.";
+
 const char kBentoBarName[] = "Persistent desks bar";
 const char kBentoBarDescription[] =
     "Showing a persistent desks bar at the top of the screen in clamshell mode "
@@ -4181,6 +4187,11 @@
     "Enable ARC Unspecialized Application Processes when applicable for "
     "high-memory devices.";
 
+const char kArcEnableVirtioBlkForDataName[] =
+    "Enable virtio-blk for ARCVM /data";
+const char kArcEnableVirtioBlkForDataDesc[] =
+    "If enabled, ARCVM uses virtio-blk for /data in Android storage.";
+
 const char kAshEnablePipRoundedCornersName[] =
     "Enable Picture-in-Picture rounded corners.";
 const char kAshEnablePipRoundedCornersDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index d7b9a63..b1c8e33 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -253,6 +253,9 @@
 extern const char kBackForwardCacheName[];
 extern const char kBackForwardCacheDescription[];
 
+extern const char kEnableBackForwardCacheForScreenReaderName[];
+extern const char kEnableBackForwardCacheForScreenReaderDescription[];
+
 extern const char kBentoBarName[];
 extern const char kBentoBarDescription[];
 
@@ -2403,6 +2406,9 @@
 extern const char kArcEnableUsapName[];
 extern const char kArcEnableUsapDesc[];
 
+extern const char kArcEnableVirtioBlkForDataName[];
+extern const char kArcEnableVirtioBlkForDataDesc[];
+
 extern const char kAshEnablePipRoundedCornersName[];
 extern const char kAshEnablePipRoundedCornersDescription[];
 
diff --git a/chrome/browser/history/history_tab_helper.cc b/chrome/browser/history/history_tab_helper.cc
index 70c25d43..c014951 100644
--- a/chrome/browser/history/history_tab_helper.cc
+++ b/chrome/browser/history/history_tab_helper.cc
@@ -25,7 +25,7 @@
 
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/android/background_tab_manager.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "components/feed/core/v2/public/feed_api.h"
 #include "components/feed/core/v2/public/feed_service.h"
 #else
diff --git a/chrome/browser/history/history_tab_helper_unittest.cc b/chrome/browser/history/history_tab_helper_unittest.cc
index 50abda4d..c05b09e 100644
--- a/chrome/browser/history/history_tab_helper_unittest.cc
+++ b/chrome/browser/history/history_tab_helper_unittest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/feed/buildflags.h"
 #include "components/history/core/browser/history_constants.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/history_types.h"
@@ -35,7 +36,7 @@
 #include "ui/base/page_transition_types.h"
 
 #if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "components/feed/core/v2/public/feed_service.h"
 #include "components/feed/core/v2/public/test/stub_feed_api.h"
 #endif
diff --git a/chrome/browser/lacros/browser_test_util.cc b/chrome/browser/lacros/browser_test_util.cc
index 5af8d55..f8592cf5 100644
--- a/chrome/browser/lacros/browser_test_util.cc
+++ b/chrome/browser/lacros/browser_test_util.cc
@@ -74,6 +74,37 @@
   outer_loop.Run();
 }
 
+void WaitForElement(const std::string& id, bool exists) {
+  base::RunLoop outer_loop;
+  auto wait_for_element = base::BindRepeating(
+      [](base::RunLoop* outer_loop, const std::string& id,
+         bool expected_exists) {
+        auto* lacros_service = chromeos::LacrosService::Get();
+        CHECK(lacros_service->IsAvailable<crosapi::mojom::TestController>());
+
+        base::RunLoop inner_loop(base::RunLoop::Type::kNestableTasksAllowed);
+        bool exists = false;
+        lacros_service->GetRemote<crosapi::mojom::TestController>()
+            ->DoesElementExist(
+                id, base::BindOnce(
+                        [](base::RunLoop* loop, bool* out_exist, bool exist) {
+                          *out_exist = std::move(exist);
+                          loop->Quit();
+                        },
+                        &inner_loop, &exists));
+        inner_loop.Run();
+
+        if (exists == expected_exists)
+          outer_loop->Quit();
+      },
+      &outer_loop, id, exists);
+
+  // Wait for the element to be available.
+  base::RepeatingTimer timer;
+  timer.Start(FROM_HERE, base::Milliseconds(1), std::move(wait_for_element));
+  outer_loop.Run();
+}
+
 }  // namespace
 
 std::string GetWindowId(aura::Window* window) {
@@ -89,6 +120,10 @@
   return desktop_window_tree_host_linux->platform_window()->GetWindowUniqueId();
 }
 
+void WaitForElementCreation(const std::string& element_name) {
+  WaitForElement(element_name, /*exists=*/true);
+}
+
 void WaitForWindowCreation(const std::string& id) {
   WaitForWindow(id, /*exists=*/true);
 }
diff --git a/chrome/browser/lacros/browser_test_util.h b/chrome/browser/lacros/browser_test_util.h
index a457f28..0da97565 100644
--- a/chrome/browser/lacros/browser_test_util.h
+++ b/chrome/browser/lacros/browser_test_util.h
@@ -19,6 +19,9 @@
 // and shared with ash.
 std::string GetWindowId(aura::Window* window);
 
+// Waits for an element to be created.
+void WaitForElementCreation(const std::string& element_name);
+
 // Some crosapi methods rely on the assumption that ash/exo are aware of the
 // existence of a Lacros Window. Wayland is an async protocol that uses a
 // different communication channel than crosapi. This method provides a
diff --git a/chrome/browser/lacros/lacros_extension_apps_controller_lacros_browsertest.cc b/chrome/browser/lacros/lacros_extension_apps_controller_lacros_browsertest.cc
index 1f256ced..2eb8a6a 100644
--- a/chrome/browser/lacros/lacros_extension_apps_controller_lacros_browsertest.cc
+++ b/chrome/browser/lacros/lacros_extension_apps_controller_lacros_browsertest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/lacros/browser_test_util.h"
 #include "chrome/browser/lacros/lacros_extension_apps_publisher.h"
 #include "chrome/browser/lacros/lacros_extensions_util.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom.h"
@@ -88,7 +89,7 @@
   if (chromeos::LacrosService::Get()->GetInterfaceVersion(
           crosapi::mojom::TestController::Uuid_) <
       static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
-                           kSelectItemInShelfMinVersion)) {
+                           kSelectContextMenuForShelfItemMinVersion)) {
     LOG(WARNING) << "Unsupported ash version.";
     return;
   }
@@ -210,4 +211,65 @@
   EXPECT_EQ(items[3], "App info");
 }
 
+// Uninstalls an app via the context menu.
+IN_PROC_BROWSER_TEST_F(LacrosExtensionAppsControllerTest,
+                       UninstallContextMenu) {
+  // If ash does not contain the relevant test controller functionality, then
+  // there's nothing to do for this test.
+  if (chromeos::LacrosService::Get()->GetInterfaceVersion(
+          crosapi::mojom::TestController::Uuid_) <
+      static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
+                           kSelectContextMenuForShelfItemMinVersion)) {
+    LOG(WARNING) << "Unsupported ash version.";
+    return;
+  }
+
+  // Create the controller and publisher.
+  LacrosExtensionAppsPublisher publisher;
+  publisher.Initialize();
+  LacrosExtensionAppsController controller;
+  controller.Initialize(publisher.publisher());
+
+  // No item should exist in the shelf before the window is launched.
+  const extensions::Extension* extension =
+      LoadExtension(test_data_dir_.AppendASCII("platform_apps/minimal"));
+  std::string app_id = lacros_extensions_util::MuxId(profile(), extension);
+  LOG(INFO) << "No item starts in shelf";
+  browser_test_util::WaitForShelfItem(app_id, /*exists=*/false);
+
+  // Launch the app via LacrosExtensionAppsController.
+  crosapi::mojom::LaunchParamsPtr launch_params =
+      crosapi::mojom::LaunchParams::New();
+  launch_params->app_id = app_id;
+  launch_params->launch_source = apps::mojom::LaunchSource::kFromTest;
+  controller.Launch(std::move(launch_params), base::DoNothing());
+
+  // Wait for item to exist in shelf.
+  LOG(INFO) << "Wait for item to appear in shelf after install";
+  browser_test_util::WaitForShelfItem(app_id, /*exists=*/true);
+
+  // Select index 2, which corresponds to Uninstall.
+  base::HistogramTester tester;
+  crosapi::mojom::TestControllerAsyncWaiter waiter(
+      chromeos::LacrosService::Get()
+          ->GetRemote<crosapi::mojom::TestController>()
+          .get());
+  std::vector<std::string> items;
+  bool success = false;
+  waiter.SelectContextMenuForShelfItem(app_id, /*index=*/2, &success);
+  ASSERT_TRUE(success);
+
+  // This pops up an ash dialog to confirm uninstall. First we wait fo the
+  // dialog to appear, and then we click the confirm button.
+  std::string element_name = kAppUninstallDialogOkButtonId.GetName();
+  browser_test_util::WaitForElementCreation(element_name);
+  waiter.ClickElement(element_name, &success);
+  ASSERT_TRUE(success);
+
+  // Wait for the item to be no longer visible in the shelf as it's uninstalled
+  // which implicitly closes the window.
+  LOG(INFO) << "Wait for item to disappear from shelf after uninstall";
+  browser_test_util::WaitForShelfItem(app_id, /*exists=*/false);
+}
+
 }  // namespace
diff --git a/chrome/browser/lacros/lacros_extension_apps_publisher.cc b/chrome/browser/lacros/lacros_extension_apps_publisher.cc
index 5e5d995..62049b8 100644
--- a/chrome/browser/lacros/lacros_extension_apps_publisher.cc
+++ b/chrome/browser/lacros/lacros_extension_apps_publisher.cc
@@ -211,10 +211,11 @@
     DCHECK(it != app_window_id_cache_.end());
 
     std::string muxed_id =
-        lacros_extensions_util::MuxId(profile_, app_window->GetExtension());
+        lacros_extensions_util::MuxId(profile_, app_window->extension_id());
     std::string window_id = it->second;
-
     publisher_->OnAppWindowRemoved(muxed_id, window_id);
+
+    app_window_id_cache_.erase(app_window);
   }
 
   // Publishes a differential update to the app service.
diff --git a/chrome/browser/lacros/lacros_extensions_util.cc b/chrome/browser/lacros/lacros_extensions_util.cc
index ec5861c..5a3fd145 100644
--- a/chrome/browser/lacros/lacros_extensions_util.cc
+++ b/chrome/browser/lacros/lacros_extensions_util.cc
@@ -62,7 +62,11 @@
 
 std::string MuxId(const Profile* profile,
                   const extensions::Extension* extension) {
-  return profile->GetBaseName().value() + kDelimiter + extension->id();
+  return MuxId(profile, extension->id());
+}
+
+std::string MuxId(const Profile* profile, const std::string& extension_id) {
+  return profile->GetBaseName().value() + kDelimiter + extension_id;
 }
 
 bool DemuxPlatformAppId(const std::string& muxed_id,
diff --git a/chrome/browser/lacros/lacros_extensions_util.h b/chrome/browser/lacros/lacros_extensions_util.h
index 4c3fbb7..0852cea 100644
--- a/chrome/browser/lacros/lacros_extensions_util.h
+++ b/chrome/browser/lacros/lacros_extensions_util.h
@@ -26,6 +26,7 @@
 // extension id.
 std::string MuxId(const Profile* profile,
                   const extensions::Extension* extension);
+std::string MuxId(const Profile* profile, const std::string& extension_id);
 
 // Takes |muxed_id| and extracts the corresponding Profile* and Extension*,
 // while requiring the Extension* to be a v2 platform app. On success, returns
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index 07152f91a..70dd329 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -82,6 +82,7 @@
 #include "components/metrics/demographics/demographic_metrics_provider.h"
 #include "components/metrics/drive_metrics_provider.h"
 #include "components/metrics/entropy_state_provider.h"
+#include "components/metrics/form_factor_metrics_provider.h"
 #include "components/metrics/metrics_log_uploader.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_reporting_default_state.h"
@@ -718,6 +719,9 @@
   metrics_service_->RegisterMetricsProvider(
       std::make_unique<metrics::ScreenInfoMetricsProvider>());
 
+  metrics_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
+
   metrics_service_->RegisterMetricsProvider(CreateFileMetricsProvider(
       metrics_state_manager_->IsMetricsReportingEnabled()));
 
@@ -898,6 +902,9 @@
   ukm_service_->RegisterMetricsProvider(
       std::make_unique<metrics::ScreenInfoMetricsProvider>());
 
+  ukm_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
+
   ukm_service_->RegisterMetricsProvider(ukm::CreateFieldTrialsProviderForUkm());
 
   ukm_service_->RegisterMetricsProvider(
diff --git a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
index 29569ba..8c4d765 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
@@ -127,14 +127,14 @@
 
 TEST_F(ChromeMetricsServiceClientTest, TestRegisterUKMProviders) {
   // Test that UKM service has initialized its metrics providers. Currently
-  // there are 6 providers for all platform except ChromeOS.
+  // there are 7 providers for all platform except ChromeOS.
   // NetworkMetricsProvider, GPUMetricsProvider, CPUMetricsProvider
-  // ScreenInfoMetricsProvider, FieldTrialsProvider, and
-  // PrivacyBudgetMetricsProvider.
+  // ScreenInfoMetricsProvider, FormFactorMetricsProvider, FieldTrialsProvider,
+  // and PrivacyBudgetMetricsProvider.
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  const size_t expected_providers = 7;  // ChromeOSMetricsProvider
+  const size_t expected_providers = 8;  // ChromeOSMetricsProvider
 #else
-  const size_t expected_providers = 6;
+  const size_t expected_providers = 7;
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   std::unique_ptr<ChromeMetricsServiceClient> chrome_metrics_service_client =
@@ -155,7 +155,7 @@
   size_t expected_providers = 2;
 
   // This is the number of metrics providers that are outside any #if macros.
-  expected_providers += 21;
+  expected_providers += 22;
 
   int sample_rate;
   if (ChromeMetricsServicesManagerClient::GetSamplingRatePerMille(
diff --git a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.cc b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.cc
index 3b0ccc2..99601b9 100644
--- a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.cc
+++ b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.cc
@@ -6,11 +6,73 @@
 
 #include "ash/services/nearby/public/cpp/tcp_server_socket_port.h"
 #include "base/bind.h"
-#include "net/base/address_list.h"
+#include "base/containers/contains.h"
+#include "base/metrics/histogram_functions.h"
 #include "net/base/ip_address.h"
 #include "net/base/net_errors.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
+NearbyConnectionsTcpSocketFactory::ConnectTask::ConnectTask(
+    network::mojom::NetworkContext* network_context,
+    const absl::optional<net::IPEndPoint>& local_addr,
+    const net::AddressList& remote_addr_list,
+    network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+    mojo::PendingReceiver<network::mojom::TCPConnectedSocket> receiver,
+    mojo::PendingRemote<network::mojom::SocketObserver> observer,
+    CreateTCPConnectedSocketCallback callback)
+    : callback_(std::move(callback)) {
+  DCHECK(network_context);
+  task_ = base::BindOnce(
+      &network::mojom::NetworkContext::CreateTCPConnectedSocket,
+      base::Unretained(network_context), local_addr, remote_addr_list,
+      std::move(tcp_connected_socket_options), traffic_annotation,
+      std::move(receiver), std::move(observer),
+      base::BindOnce(&ConnectTask::OnFinished, weak_ptr_factory_.GetWeakPtr()));
+}
+
+NearbyConnectionsTcpSocketFactory::ConnectTask::~ConnectTask() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+void NearbyConnectionsTcpSocketFactory::ConnectTask::Run(
+    base::TimeDelta timeout) {
+  timer_.Start(FROM_HERE, timeout,
+               base::BindOnce(&ConnectTask::OnTimeout, base::Unretained(this)));
+  start_time_ = base::TimeTicks::Now();
+  std::move(task_).Run();
+}
+
+void NearbyConnectionsTcpSocketFactory::ConnectTask::OnFinished(
+    int32_t result,
+    const absl::optional<net::IPEndPoint>& local_addr,
+    const absl::optional<net::IPEndPoint>& peer_addr,
+    mojo::ScopedDataPipeConsumerHandle receive_stream,
+    mojo::ScopedDataPipeProducerHandle send_stream) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  timer_.Stop();
+  if (result == net::OK) {
+    base::UmaHistogramTimes("Nearby.Connections.WifiLan.TimeToConnect",
+                            base::TimeTicks::Now() - start_time_);
+  }
+
+  // Just to be safe, protect against finish/timeout race conditions.
+  if (!callback_)
+    return;
+
+  std::move(callback_).Run(result, local_addr, peer_addr,
+                           std::move(receive_stream), std::move(send_stream));
+}
+
+void NearbyConnectionsTcpSocketFactory::ConnectTask::OnTimeout() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  weak_ptr_factory_.InvalidateWeakPtrs();
+  OnFinished(net::ERR_TIMED_OUT, /*local_addr=*/absl::nullopt,
+             /*peer_addr=*/absl::nullopt,
+             /*receive_stream=*/mojo::ScopedDataPipeConsumerHandle(),
+             /*send_stream=*/mojo::ScopedDataPipeProducerHandle());
+}
+
 NearbyConnectionsTcpSocketFactory::NearbyConnectionsTcpSocketFactory(
     NetworkContextGetter network_context_getter)
     : network_context_getter_(std::move(network_context_getter)) {}
@@ -28,7 +90,7 @@
   network::mojom::NetworkContext* network_context =
       network_context_getter_.Run();
   if (!network_context) {
-    std::move(callback).Run(net::ERR_FAILED, /*local_addr_out=*/absl::nullopt);
+    std::move(callback).Run(net::ERR_FAILED, /*local_addr=*/absl::nullopt);
     return;
   }
 
@@ -41,6 +103,7 @@
 }
 
 void NearbyConnectionsTcpSocketFactory::CreateTCPConnectedSocket(
+    base::TimeDelta timeout,
     const absl::optional<net::IPEndPoint>& local_addr,
     const net::AddressList& remote_addr_list,
     network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
@@ -59,12 +122,17 @@
     return;
   }
 
-  network_context->CreateTCPConnectedSocket(
-      local_addr, remote_addr_list, std::move(tcp_connected_socket_options),
-      traffic_annotation, std::move(receiver), std::move(observer),
-      base::BindOnce(
-          &NearbyConnectionsTcpSocketFactory::OnTcpConnectedSocketCreated,
-          weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  base::UnguessableToken task_id = base::UnguessableToken::Create();
+  connect_tasks_.insert_or_assign(
+      task_id,
+      std::make_unique<ConnectTask>(
+          network_context, local_addr, remote_addr_list,
+          std::move(tcp_connected_socket_options), traffic_annotation,
+          std::move(receiver), std::move(observer),
+          base::BindOnce(
+              &NearbyConnectionsTcpSocketFactory::OnTcpConnectedSocketCreated,
+              base::Unretained(this), task_id, std::move(callback))));
+  connect_tasks_[task_id]->Run(timeout);
 }
 
 void NearbyConnectionsTcpSocketFactory::OnTcpServerSocketCreated(
@@ -75,6 +143,7 @@
 }
 
 void NearbyConnectionsTcpSocketFactory::OnTcpConnectedSocketCreated(
+    base::UnguessableToken task_id,
     CreateTCPConnectedSocketCallback callback,
     int32_t result,
     const absl::optional<net::IPEndPoint>& local_addr,
@@ -83,4 +152,6 @@
     mojo::ScopedDataPipeProducerHandle send_stream) {
   std::move(callback).Run(result, local_addr, peer_addr,
                           std::move(receive_stream), std::move(send_stream));
+  DCHECK(base::Contains(connect_tasks_, task_id));
+  connect_tasks_.erase(task_id);
 }
diff --git a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.h b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.h
index 7c4e14b..df5e0309 100644
--- a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.h
+++ b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory.h
@@ -8,9 +8,14 @@
 #include "ash/services/nearby/public/mojom/tcp_socket_factory.mojom.h"
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "base/unguessable_token.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/system/data_pipe.h"
+#include "net/base/address_list.h"
 #include "net/base/ip_endpoint.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 #include "services/network/public/mojom/tcp_socket.mojom.h"
@@ -37,6 +42,44 @@
   using NetworkContextGetter =
       base::RepeatingCallback<network::mojom::NetworkContext*()>;
 
+  // A class used to run NetworkContext::CreateTCPConnectedSocket with a
+  // user-defined |timeout|. There is timeout logic in the networking stack, but
+  // it is not configurable and can be too long in practice (over 2 minutes).
+  // The networking stack timeout can still be triggered if |timeout| is too
+  // long.
+  class ConnectTask {
+   public:
+    ConnectTask(
+        network::mojom::NetworkContext* network_context,
+        const absl::optional<net::IPEndPoint>& local_addr,
+        const net::AddressList& remote_addr_list,
+        network::mojom::TCPConnectedSocketOptionsPtr
+            tcp_connected_socket_options,
+        const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
+        mojo::PendingReceiver<network::mojom::TCPConnectedSocket> receiver,
+        mojo::PendingRemote<network::mojom::SocketObserver> observer,
+        CreateTCPConnectedSocketCallback callback);
+    ~ConnectTask();
+
+    // Can only be called once.
+    void Run(base::TimeDelta timeout);
+
+   private:
+    void OnFinished(int32_t result,
+                    const absl::optional<net::IPEndPoint>& local_addr,
+                    const absl::optional<net::IPEndPoint>& peer_addr,
+                    mojo::ScopedDataPipeConsumerHandle receive_stream,
+                    mojo::ScopedDataPipeProducerHandle send_stream);
+    void OnTimeout();
+
+    CreateTCPConnectedSocketCallback callback_;
+    base::OnceClosure task_;
+    base::OneShotTimer timer_;
+    base::TimeTicks start_time_;
+    SEQUENCE_CHECKER(sequence_checker_);
+    base::WeakPtrFactory<ConnectTask> weak_ptr_factory_{this};
+  };
+
   explicit NearbyConnectionsTcpSocketFactory(
       NetworkContextGetter network_context_getter);
   NearbyConnectionsTcpSocketFactory(const NearbyConnectionsTcpSocketFactory&) =
@@ -54,6 +97,7 @@
       mojo::PendingReceiver<network::mojom::TCPServerSocket> receiver,
       CreateTCPServerSocketCallback callback) override;
   void CreateTCPConnectedSocket(
+      base::TimeDelta timeout,
       const absl::optional<net::IPEndPoint>& local_addr,
       const net::AddressList& remote_addr_list,
       network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
@@ -70,6 +114,7 @@
       int32_t result,
       const absl::optional<net::IPEndPoint>& local_addr);
   void OnTcpConnectedSocketCreated(
+      base::UnguessableToken task_id,
       CreateTCPConnectedSocketCallback callback,
       int32_t result,
       const absl::optional<net::IPEndPoint>& local_addr,
@@ -78,6 +123,8 @@
       mojo::ScopedDataPipeProducerHandle send_stream);
 
   NetworkContextGetter network_context_getter_;
+  base::flat_map<base::UnguessableToken, std::unique_ptr<ConnectTask>>
+      connect_tasks_;
   base::WeakPtrFactory<NearbyConnectionsTcpSocketFactory> weak_ptr_factory_{
       this};
 };
diff --git a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory_unittest.cc b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory_unittest.cc
index 200eae3..2b4d9efe 100644
--- a/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory_unittest.cc
+++ b/chrome/browser/nearby_sharing/tcp_socket/nearby_connections_tcp_socket_factory_unittest.cc
@@ -8,7 +8,9 @@
 
 #include "ash/services/nearby/public/cpp/tcp_server_socket_port.h"
 #include "base/bind.h"
+#include "base/run_loop.h"
 #include "base/test/bind.h"
+#include "base/test/task_environment.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
@@ -37,6 +39,8 @@
     FakeNetworkContext() = default;
     ~FakeNetworkContext() override = default;
 
+    bool should_invoke_connect_callback_ = true;
+
    private:
     // network::TestNetworkContext:
     void CreateTCPServerSocket(
@@ -64,10 +68,12 @@
       EXPECT_EQ(1, remote_addr_list.size());
       EXPECT_EQ(kRemoteAddress, remote_addr_list[0]);
       EXPECT_EQ(kAnnotation, traffic_annotation);
-      std::move(callback).Run(
-          net::OK, local_addr, remote_addr_list[0],
-          /*receive_stream=*/mojo::ScopedDataPipeConsumerHandle(),
-          /*send_stream=*/mojo::ScopedDataPipeProducerHandle());
+      if (should_invoke_connect_callback_) {
+        std::move(callback).Run(
+            net::OK, local_addr, remote_addr_list[0],
+            /*receive_stream=*/mojo::ScopedDataPipeConsumerHandle(),
+            /*send_stream=*/mojo::ScopedDataPipeProducerHandle());
+      }
     }
   };
 
@@ -87,65 +93,148 @@
     return fake_network_context_.get();
   }
 
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   std::unique_ptr<FakeNetworkContext> fake_network_context_;
   std::unique_ptr<NearbyConnectionsTcpSocketFactory> factory_;
 };
 
 TEST_F(NearbyConnectionsTcpSocketFactoryTest, NetworkContextExists) {
-  factory_->CreateTCPServerSocket(
-      kLocalAddress.address(),
-      *ash::nearby::TcpServerSocketPort::FromUInt16(kLocalAddress.port()),
-      kBacklog, kAnnotation, /*receiver=*/mojo::NullReceiver(),
-      base::BindLambdaForTesting(
-          [](int32_t result,
-             const absl::optional<net::IPEndPoint>& local_addr) {
-            EXPECT_EQ(net::OK, result);
-            EXPECT_EQ(kLocalAddress, local_addr);
-          }));
-  factory_->CreateTCPConnectedSocket(
-      kLocalAddress, net::AddressList(kRemoteAddress),
-      /*tcp_connected_socket_options=*/nullptr, kAnnotation,
-      /*receiver=*/mojo::NullReceiver(),
-      /*observer=*/mojo::NullRemote(),
-      base::BindLambdaForTesting(
-          [](int32_t result, const absl::optional<net::IPEndPoint>& local_addr,
-             const absl::optional<net::IPEndPoint>& peer_addr,
-             mojo::ScopedDataPipeConsumerHandle receive_stream,
-             mojo::ScopedDataPipeProducerHandle send_stream) {
-            EXPECT_EQ(net::OK, result);
-            EXPECT_EQ(kLocalAddress, local_addr);
-            EXPECT_EQ(kRemoteAddress, peer_addr);
-          }));
+  {
+    base::RunLoop run_loop;
+    factory_->CreateTCPServerSocket(
+        kLocalAddress.address(),
+        *ash::nearby::TcpServerSocketPort::FromUInt16(kLocalAddress.port()),
+        kBacklog, kAnnotation, /*receiver=*/mojo::NullReceiver(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr) {
+              EXPECT_EQ(net::OK, result);
+              EXPECT_EQ(kLocalAddress, local_addr);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop;
+    factory_->CreateTCPConnectedSocket(
+        /*timeout=*/base::Seconds(5), kLocalAddress,
+        net::AddressList(kRemoteAddress),
+        /*tcp_connected_socket_options=*/nullptr, kAnnotation,
+        /*receiver=*/mojo::NullReceiver(),
+        /*observer=*/mojo::NullRemote(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr,
+                        const absl::optional<net::IPEndPoint>& peer_addr,
+                        mojo::ScopedDataPipeConsumerHandle receive_stream,
+                        mojo::ScopedDataPipeProducerHandle send_stream) {
+              EXPECT_EQ(net::OK, result);
+              EXPECT_EQ(kLocalAddress, local_addr);
+              EXPECT_EQ(kRemoteAddress, peer_addr);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
 }
 
 TEST_F(NearbyConnectionsTcpSocketFactoryTest, NetworkContextDoesNotExist) {
   fake_network_context_.reset();
 
   // Expect trivial data in callback when the network context is null.
-  factory_->CreateTCPServerSocket(
-      kLocalAddress.address(),
-      *ash::nearby::TcpServerSocketPort::FromUInt16(kLocalAddress.port()),
-      kBacklog, kAnnotation, /*receiver=*/mojo::NullReceiver(),
-      base::BindLambdaForTesting(
-          [](int32_t result,
-             const absl::optional<net::IPEndPoint>& local_addr) {
-            EXPECT_EQ(net::ERR_FAILED, result);
-            EXPECT_EQ(absl::nullopt, local_addr);
-          }));
-  factory_->CreateTCPConnectedSocket(
-      kLocalAddress, net::AddressList(kRemoteAddress),
-      /*tcp_connected_socket_options=*/nullptr, kAnnotation,
-      /*receiver=*/mojo::NullReceiver(),
-      /*observer=*/mojo::NullRemote(),
-      base::BindLambdaForTesting(
-          [](int32_t result, const absl::optional<net::IPEndPoint>& local_addr,
-             const absl::optional<net::IPEndPoint>& peer_addr,
-             mojo::ScopedDataPipeConsumerHandle receive_stream,
-             mojo::ScopedDataPipeProducerHandle send_stream) {
-            EXPECT_EQ(net::ERR_FAILED, result);
-            EXPECT_EQ(absl::nullopt, local_addr);
-            EXPECT_EQ(absl::nullopt, peer_addr);
-            EXPECT_EQ(mojo::ScopedDataPipeConsumerHandle(), receive_stream);
-            EXPECT_EQ(mojo::ScopedDataPipeProducerHandle(), send_stream);
-          }));
+  {
+    base::RunLoop run_loop;
+    factory_->CreateTCPServerSocket(
+        kLocalAddress.address(),
+        *ash::nearby::TcpServerSocketPort::FromUInt16(kLocalAddress.port()),
+        kBacklog, kAnnotation, /*receiver=*/mojo::NullReceiver(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr) {
+              EXPECT_EQ(net::ERR_FAILED, result);
+              EXPECT_EQ(absl::nullopt, local_addr);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop;
+    factory_->CreateTCPConnectedSocket(
+        /*timeout=*/base::Seconds(5), kLocalAddress,
+        net::AddressList(kRemoteAddress),
+        /*tcp_connected_socket_options=*/nullptr, kAnnotation,
+        /*receiver=*/mojo::NullReceiver(),
+        /*observer=*/mojo::NullRemote(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr,
+                        const absl::optional<net::IPEndPoint>& peer_addr,
+                        mojo::ScopedDataPipeConsumerHandle receive_stream,
+                        mojo::ScopedDataPipeProducerHandle send_stream) {
+              EXPECT_EQ(net::ERR_FAILED, result);
+              EXPECT_EQ(absl::nullopt, local_addr);
+              EXPECT_EQ(absl::nullopt, peer_addr);
+              EXPECT_EQ(mojo::ScopedDataPipeConsumerHandle(), receive_stream);
+              EXPECT_EQ(mojo::ScopedDataPipeProducerHandle(), send_stream);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+}
+
+TEST_F(NearbyConnectionsTcpSocketFactoryTest, ConnectTimeout) {
+  // Finishes in time.
+  {
+    base::RunLoop run_loop;
+    factory_->CreateTCPConnectedSocket(
+        /*timeout=*/base::Seconds(5), kLocalAddress,
+        net::AddressList(kRemoteAddress),
+        /*tcp_connected_socket_options=*/nullptr, kAnnotation,
+        /*receiver=*/mojo::NullReceiver(),
+        /*observer=*/mojo::NullRemote(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr,
+                        const absl::optional<net::IPEndPoint>& peer_addr,
+                        mojo::ScopedDataPipeConsumerHandle receive_stream,
+                        mojo::ScopedDataPipeProducerHandle send_stream) {
+              EXPECT_EQ(net::OK, result);
+              EXPECT_EQ(kLocalAddress, local_addr);
+              EXPECT_EQ(kRemoteAddress, peer_addr);
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+
+  // Does not finish in time.
+  {
+    base::RunLoop run_loop;
+
+    // Make NetworkContext never finish.
+    fake_network_context_->should_invoke_connect_callback_ = false;
+
+    factory_->CreateTCPConnectedSocket(
+        /*timeout=*/base::Seconds(5), kLocalAddress,
+        net::AddressList(kRemoteAddress),
+        /*tcp_connected_socket_options=*/nullptr, kAnnotation,
+        /*receiver=*/mojo::NullReceiver(),
+        /*observer=*/mojo::NullRemote(),
+        base::BindLambdaForTesting(
+            [&run_loop](int32_t result,
+                        const absl::optional<net::IPEndPoint>& local_addr,
+                        const absl::optional<net::IPEndPoint>& peer_addr,
+                        mojo::ScopedDataPipeConsumerHandle receive_stream,
+                        mojo::ScopedDataPipeProducerHandle send_stream) {
+              EXPECT_EQ(net::ERR_TIMED_OUT, result);
+              EXPECT_EQ(absl::nullopt, local_addr);
+              EXPECT_EQ(absl::nullopt, peer_addr);
+              EXPECT_EQ(mojo::ScopedDataPipeConsumerHandle(), receive_stream);
+              EXPECT_EQ(mojo::ScopedDataPipeProducerHandle(), send_stream);
+              run_loop.Quit();
+            }));
+    // Note: We do not need to call TaskEnvironment::FastForwardBy();
+    // RunLoop::Run() auto-advances to the soonest delayed task when all managed
+    // threads are idle.
+    run_loop.Run();
+  }
 }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 050fa80e..819c39e 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -124,6 +124,7 @@
 #include "components/permissions/permission_actions_history.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/browser/url_blocklist_manager.h"
+#include "components/policy/core/common/management/management_service.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/policy/core/common/policy_statistics_collector.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -213,6 +214,10 @@
 #include "chrome/browser/supervised_user/supervised_user_service.h"
 #endif
 
+#include "components/feed/buildflags.h"
+#include "components/feed/core/common/pref_names.h"
+#include "components/feed/core/shared_prefs/pref_names.h"
+
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/android/bookmarks/partner_bookmarks_shim.h"
 #include "chrome/browser/android/explore_sites/history_statistics_reporter.h"
@@ -227,9 +232,6 @@
 #include "chrome/browser/video_tutorials/prefs.h"
 #include "components/cdm/browser/media_drm_storage_impl.h"  // nogncheck crbug.com/1125897
 #include "components/content_creation/notes/core/note_prefs.h"
-#include "components/feed/buildflags.h"
-#include "components/feed/core/common/pref_names.h"
-#include "components/feed/core/shared_prefs/pref_names.h"
 #include "components/ntp_tiles/popular_sites_impl.h"
 #include "components/permissions/contexts/geolocation_permission_context_android.h"
 #include "components/query_tiles/tile_service_prefs.h"
@@ -990,6 +992,7 @@
   network_time::NetworkTimeTracker::RegisterPrefs(registry);
   password_manager::PasswordManager::RegisterLocalPrefs(registry);
   policy::BrowserPolicyConnector::RegisterPrefs(registry);
+  policy::ManagementService::RegisterLocalStatePrefs(registry);
   policy::PolicyStatisticsCollector::RegisterPrefs(registry);
   PrefProxyConfigTrackerImpl::RegisterPrefs(registry);
   ProfileAttributesEntry::RegisterLocalStatePrefs(registry);
@@ -1319,6 +1322,11 @@
   SupervisedUserService::RegisterProfilePrefs(registry);
 #endif
 
+#if BUILDFLAG(ENABLE_FEED_V2)
+  feed::prefs::RegisterFeedSharedProfilePrefs(registry);
+  feed::RegisterProfilePrefs(registry);
+#endif
+
 #if BUILDFLAG(IS_ANDROID)
   cdm::MediaDrmStorageImpl::RegisterProfilePrefs(registry);
   content_creation::prefs::RegisterProfilePrefs(registry);
@@ -1336,8 +1344,6 @@
   usage_stats::UsageStatsBridge::RegisterProfilePrefs(registry);
   variations::VariationsService::RegisterProfilePrefs(registry);
   video_tutorials::RegisterPrefs(registry);
-  feed::prefs::RegisterFeedSharedProfilePrefs(registry);
-  feed::RegisterProfilePrefs(registry);
 #else   // BUILDFLAG(IS_ANDROID)
   AppShortcutManager::RegisterProfilePrefs(registry);
   browser_sync::ForeignSessionHandler::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc
index 19690a1..596c96d 100644
--- a/chrome/browser/printing/print_backend_service_manager.cc
+++ b/chrome/browser/printing/print_backend_service_manager.cc
@@ -44,14 +44,19 @@
 // For fetching remote IDs when there is no printer name.
 constexpr char kEmptyPrinterName[] = "";
 
-// Amount of idle time to wait before resetting the connection to the service.
-constexpr base::TimeDelta kNoClientsRegisteredResetOnIdleTimeout =
-    base::Seconds(10);
-constexpr base::TimeDelta kClientsRegisteredResetOnIdleTimeout =
-    base::Seconds(120);
-
 PrintBackendServiceManager* g_print_backend_service_manager_singleton = nullptr;
 
+size_t GetClientsCountForRemoteId(
+    const PrintBackendServiceManager::PrintClientsMap& clients,
+    const std::string& remote_id) {
+  auto iter = clients.find(remote_id);
+  if (iter != clients.end()) {
+    DCHECK(!iter->second.empty());
+    return iter->second.size();
+  }
+  return 0;
+}
+
 }  // namespace
 
 PrintBackendServiceManager::PrintBackendServiceManager() = default;
@@ -104,15 +109,17 @@
 void PrintBackendServiceManager::UnregisterClient(uint32_t id) {
   // Determine which client type has this ID, and remove it once found.
   absl::optional<ClientType> client_type;
+  std::string remote_id = GetRemoteIdForPrinterName(kEmptyPrinterName);
   if (query_clients_.erase(id) != 0) {
     client_type = ClientType::kQuery;
   } else if (query_with_ui_clients_.erase(id) != 0) {
     client_type = ClientType::kQueryWithUi;
   } else {
     for (auto& item : print_document_clients_) {
-      base::flat_set<uint32_t>& clients = item.second;
+      ClientsSet& clients = item.second;
       if (clients.erase(id) != 0) {
         client_type = ClientType::kPrintDocument;
+        remote_id = item.first;
         if (clients.empty())
           print_document_clients_.erase(item);
         break;
@@ -127,31 +134,18 @@
   VLOG(1) << "Unregistering client with ID " << id
           << " from print backend service.";
 
-  // TODO(crbug.com/809738)  Choose a new timeout value based upon which types
-  // of clients remain.
-  if (GetClientsRegisteredCount() > 0)
-    return;
-
-  // No more clients means that there is an opportunity to more aggressively
-  // reclaim resources by letting service processes terminate.  Register a
-  // short idle timeout with services.  This is preferred to just resetting
-  // them immediately here, in case a user immediately reopens a Print Preview.
-  for (auto& iter : sandboxed_remotes_bundles_) {
-    const std::string& remote_id = iter.first;
-    UpdateServiceToShortIdleTimeout(iter.second->service, /*sandboxed=*/true,
-                                    remote_id);
-  }
-  for (auto& iter : unsandboxed_remotes_bundles_) {
-    const std::string& remote_id = iter.first;
-    UpdateServiceToShortIdleTimeout(iter.second->service, /*sandboxed=*/false,
-                                    remote_id);
-  }
+  absl::optional<base::TimeDelta> new_timeout =
+      DetermineIdleTimeoutUpdateOnUnregisteredClient(client_type.value(),
+                                                     remote_id);
+  if (new_timeout.has_value())
+    UpdateServiceIdleTimeoutByRemoteId(remote_id, new_timeout.value());
 }
 
 void PrintBackendServiceManager::EnumeratePrinters(
     mojom::PrintBackendService::EnumeratePrintersCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(kEmptyPrinterName, context);
+  auto& service = GetServiceAndCallbackContext(kEmptyPrinterName,
+                                               ClientType::kQuery, context);
 
   SaveCallback(GetRemoteSavedEnumeratePrintersCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -167,7 +161,8 @@
     const std::string& printer_name,
     mojom::PrintBackendService::FetchCapabilitiesCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service =
+      GetServiceAndCallbackContext(printer_name, ClientType::kQuery, context);
 
   SaveCallback(GetRemoteSavedFetchCapabilitiesCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -185,7 +180,8 @@
 void PrintBackendServiceManager::GetDefaultPrinterName(
     mojom::PrintBackendService::GetDefaultPrinterNameCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(kEmptyPrinterName, context);
+  auto& service = GetServiceAndCallbackContext(kEmptyPrinterName,
+                                               ClientType::kQuery, context);
 
   SaveCallback(
       GetRemoteSavedGetDefaultPrinterNameCallbacks(context.is_sandboxed),
@@ -202,7 +198,8 @@
     mojom::PrintBackendService::GetPrinterSemanticCapsAndDefaultsCallback
         callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service =
+      GetServiceAndCallbackContext(printer_name, ClientType::kQuery, context);
 
   SaveCallback(GetRemoteSavedGetPrinterSemanticCapsAndDefaultsCallbacks(
                    context.is_sandboxed),
@@ -222,8 +219,14 @@
 void PrintBackendServiceManager::UseDefaultSettings(
     const std::string& printer_name,
     mojom::PrintBackendService::UseDefaultSettingsCallback callback) {
+  // Even though this call does not require a UI, it is used exclusively as
+  // part of preparation for system print.  It is called immediately before a
+  // call to `AskDefaultSettings()`.  Since that call requires `kQueryWithUi`,
+  // it will behave better to ensure this uses the same type to reuse the same
+  // process.
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service = GetServiceAndCallbackContext(
+      printer_name, ClientType::kQueryWithUi, context);
 
   SaveCallback(GetRemoteSavedUseDefaultSettingsCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -242,7 +245,8 @@
     base::flat_map<std::string, base::Value> job_settings,
     mojom::PrintBackendService::UpdatePrintSettingsCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service =
+      GetServiceAndCallbackContext(printer_name, ClientType::kQuery, context);
 
   SaveCallback(GetRemoteSavedUpdatePrintSettingsCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -265,7 +269,8 @@
     const PrintSettings& settings,
     mojom::PrintBackendService::StartPrintingCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service = GetServiceAndCallbackContext(
+      printer_name, ClientType::kPrintDocument, context);
 
   SaveCallback(GetRemoteSavedStartPrintingCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -289,7 +294,8 @@
     base::ReadOnlySharedMemoryRegion serialized_page_data,
     mojom::PrintBackendService::RenderPrintedPageCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service = GetServiceAndCallbackContext(
+      printer_name, ClientType::kPrintDocument, context);
 
   SaveCallback(GetRemoteSavedRenderPrintedPageCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -315,7 +321,8 @@
     int document_cookie,
     mojom::PrintBackendService::DocumentDoneCallback callback) {
   CallbackContext context;
-  auto& service = GetServiceAndCallbackContext(printer_name, context);
+  auto& service = GetServiceAndCallbackContext(
+      printer_name, ClientType::kPrintDocument, context);
 
   SaveCallback(GetRemoteSavedDocumentDoneCallbacks(context.is_sandboxed),
                context.remote_id, context.saved_callback_id,
@@ -430,36 +437,23 @@
   // indefinitely).  We use a long timeout against idleness for that scenario,
   // so we want to perform this optimization check every time regardless of
   // number of clients registered.
-  // TODO(crbug.com/809738)  System print is a special case because it can
-  // display a system dialog and is window modal.  Include support to allow the
-  // service to remain indefinitely for such a client.
+  // System print is a special case because it can display a system dialog and
+  // is window modal.  In this scenario we do not want the print backend to
+  // self-terminate even if the user is idle for a long period of time.
   auto iter = sandboxed_remotes_bundles_.find(remote_id);
   if (iter == sandboxed_remotes_bundles_.end()) {
     // Service not already available, so launch it now so that it will be
     // ready by the time the client gets to point of invoking a Mojo call.
     bool is_sandboxed;
-    GetService(printer_name, &is_sandboxed);
+    GetService(printer_name, client_type, &is_sandboxed);
   } else {
     // Service already existed, possibly was recently marked for being reset
-    // with a short timeout.  Ensure it has the long timeout to be available
-    // across user interactions but to also get reclaimed should the user leave
-    // it unused indefinitely.
-    // Safe to use base::Unretained(this) since `this` is a global singleton
-    // which never goes away.
-    // TODO(crbug.com/809738)  Modify timeout handling to be different timeout
-    // durations depending upon client type.
-    DVLOG(1) << "Updating to long idle timeout for print backend service id `"
-             << remote_id << "`";
-    mojo::Remote<mojom::PrintBackendService>& service = iter->second->service;
-    service.set_idle_handler(
-        kClientsRegisteredResetOnIdleTimeout,
-        base::BindRepeating(&PrintBackendServiceManager::OnIdleTimeout,
-                            base::Unretained(this), /*sandboxed=*/true,
-                            remote_id));
-
-    // TODO(crbug.com/1225111)  Maybe need to issue a quick call here to get
-    // adjusted timeout to take effect?  Ideally not, since there is supposed
-    // to be an expected call "soon" after having registered.
+    // with a short timeout or is already in use for other client types.
+    // Determine if any adjustment to the timeout is actually necessary.
+    absl::optional<base::TimeDelta> new_timeout =
+        DetermineIdleTimeoutUpdateOnRegisteredClient(client_type, remote_id);
+    if (new_timeout.has_value())
+      UpdateServiceIdleTimeoutByRemoteId(remote_id, new_timeout.value());
   }
 
   return client_id;
@@ -474,6 +468,7 @@
 
 const mojo::Remote<mojom::PrintBackendService>&
 PrintBackendServiceManager::GetService(const std::string& printer_name,
+                                       ClientType client_type,
                                        bool* is_sandboxed) {
   bool should_sandbox = !PrinterDriverRequiresElevatedPrivilege(printer_name);
   *is_sandboxed = should_sandbox;
@@ -503,10 +498,10 @@
 
   std::string remote_id = GetRemoteIdForPrinterName(printer_name);
   if (should_sandbox) {
-    return GetServiceFromBundle(remote_id, /*sandboxed=*/true,
+    return GetServiceFromBundle(remote_id, client_type, /*sandboxed=*/true,
                                 sandboxed_remotes_bundles_);
   }
-  return GetServiceFromBundle(remote_id, /*sandboxed=*/false,
+  return GetServiceFromBundle(remote_id, client_type, /*sandboxed=*/false,
                               unsandboxed_remotes_bundles_);
 }
 
@@ -514,6 +509,7 @@
 mojo::Remote<mojom::PrintBackendService>&
 PrintBackendServiceManager::GetServiceFromBundle(
     const std::string& remote_id,
+    ClientType client_type,
     bool sandboxed,
     RemotesBundleMap<T>& bundle_map) {
   auto iter = bundle_map.find(remote_id);
@@ -547,19 +543,9 @@
         base::BindOnce(&PrintBackendServiceManager::OnRemoteDisconnected,
                        base::Unretained(this), sandboxed, remote_id));
 
-    // Beware of case where a user leaves a tab with a Print Preview open
-    // indefinitely.  Use a long timeout against idleness to reclaim the unused
-    // resources of an idle print backend service for this case.
-    // Safe to use base::Unretained(this) since `this` is a global singleton
-    // which never goes away.
-    // TODO(crbug.com/809738)  Modify timeout handling to be different timeout
-    // durations depending upon client type.
-    DVLOG(1) << "Updating to long idle timeout for print backend service id `"
-             << remote_id << "`";
-    service.set_idle_handler(
-        kClientsRegisteredResetOnIdleTimeout,
-        base::BindRepeating(&PrintBackendServiceManager::OnIdleTimeout,
-                            base::Unretained(this), sandboxed, remote_id));
+    // We may want to have the service terminated when idle.
+    SetServiceIdleHandler(service, sandboxed, remote_id,
+                          GetClientTypeIdleTimeout(client_type));
 
     // Initialize the new service for the desired locale.
     service->Init(g_browser_process->GetApplicationLocale());
@@ -568,13 +554,160 @@
   return service;
 }
 
-void PrintBackendServiceManager::UpdateServiceToShortIdleTimeout(
-    mojo::Remote<mojom::PrintBackendService>& service,
+// static
+constexpr base::TimeDelta PrintBackendServiceManager::GetClientTypeIdleTimeout(
+    ClientType client_type) {
+  switch (client_type) {
+    case ClientType::kQuery:
+      // Want a long timeout so that the service is available across typical
+      // user interactions but will get reclaimed should the user leave it
+      // unused indefinitely.  E.g., a Print Preview left open in a tab while
+      // user has moved on to other tabs.
+      return kClientsRegisteredResetOnIdleTimeout;
+
+    case ClientType::kQueryWithUi:
+      // Want the service to remain indefinitely, since this case supports a
+      // window-modal system dialog being invoked from the service.
+      return base::TimeDelta::Max();
+
+    case ClientType::kPrintDocument:
+      // Some print jobs can take a very long time to print.  Choosing some
+      // threshold for reclaiming is hard to make and still have the effect
+      // of service reclamation meaningful.  Err towards not accidentally
+      // terminating an in-progress print job and let the service remain open
+      // indefinitely, instead relying upon the registered clients mechanism
+      // to reinstate a short timeout once a print job has completed.
+      // For Windows there is the additional case where the driver might need
+      // to display a file save system dialog (e.g., if the driver sends to
+      // port FILE:), which is another window-modal system dialog invoked from
+      // the service for which we would want to wait indefinitely.
+      return base::TimeDelta::Max();
+  }
+}
+
+absl::optional<base::TimeDelta>
+PrintBackendServiceManager::DetermineIdleTimeoutUpdateOnRegisteredClient(
+    ClientType registered_client_type,
+    const std::string& remote_id) const {
+  switch (registered_client_type) {
+    case ClientType::kQuery:
+      DCHECK(!query_clients_.empty());
+
+      // Other query types have longer timeouts, so no need to update if
+      // any of them have clients.
+      if (!query_with_ui_clients_.empty() ||
+          GetClientsCountForRemoteId(print_document_clients_, remote_id) > 0) {
+        return absl::nullopt;
+      }
+
+      if (query_clients_.size() > 1)
+        return absl::nullopt;
+
+      // First client of type and no others will need an update.
+      break;
+
+    case ClientType::kQueryWithUi:
+#if BUILDFLAG(IS_LINUX)
+      // No need to update if there were other query with UI clients.
+      if (query_with_ui_clients_.size() > 1)
+        return absl::nullopt;
+#else
+      // A modal system dialog, of which there should only ever be at most one
+      // of these.
+      DCHECK_EQ(query_with_ui_clients_.size(), 1u);
+#endif
+
+      // This is the longest timeout.  No need to update if there is a similarly
+      // long timeout due to a printing client.
+      if (GetClientsCountForRemoteId(print_document_clients_, remote_id) > 0)
+        return absl::nullopt;
+      break;
+
+    case ClientType::kPrintDocument:
+      size_t clients_count =
+          GetClientsCountForRemoteId(print_document_clients_, remote_id);
+      DCHECK_GT(clients_count, 0u);
+
+      // No need to update if there were other printing clients for same remote
+      // ID.
+      if (clients_count > 1)
+        return absl::nullopt;
+
+      // This is the longest timeout.  No need to update if there is a similarly
+      // long timeout due to query with UI.
+      if (!query_with_ui_clients_.empty())
+        return absl::nullopt;
+      break;
+  }
+
+  return GetClientTypeIdleTimeout(registered_client_type);
+}
+
+absl::optional<base::TimeDelta>
+PrintBackendServiceManager::DetermineIdleTimeoutUpdateOnUnregisteredClient(
+    ClientType unregistered_client_type,
+    const std::string& remote_id) const {
+  switch (unregistered_client_type) {
+    case ClientType::kQuery:
+      // Other query types have longer timeouts, so no need to update if
+      // any of them have clients.
+      if (!query_with_ui_clients_.empty() ||
+          GetClientsCountForRemoteId(print_document_clients_, remote_id) > 0) {
+        return absl::nullopt;
+      }
+
+      if (!query_clients_.empty())
+        return absl::nullopt;
+
+      // No remaining clients, can switch to short timeout for quick
+      // reclamation.
+      return kNoClientsRegisteredResetOnIdleTimeout;
+
+    case ClientType::kQueryWithUi:
+#if BUILDFLAG(IS_LINUX)
+      // No need to update if there were other query with UI clients.
+      if (!query_with_ui_clients_.empty())
+        return absl::nullopt;
+#else
+      // A modal system dialog, of which there should only ever be at most one
+      // of these. If one was dropped, it should now be empty.
+      DCHECK(query_with_ui_clients_.empty());
+#endif
+
+      // This is the longest timeout, so no need to update if there is a
+      // printing client for this `remote_id`.
+      if (GetClientsCountForRemoteId(print_document_clients_, remote_id) > 0)
+        return absl::nullopt;
+
+      // New timeout depends upon existence of other queries.
+      return query_clients_.empty() ? kNoClientsRegisteredResetOnIdleTimeout
+                                    : kClientsRegisteredResetOnIdleTimeout;
+
+    case ClientType::kPrintDocument:
+      // No need to update if there were other printing clients for same remote
+      // ID.
+      if (GetClientsCountForRemoteId(print_document_clients_, remote_id) > 0)
+        return absl::nullopt;
+
+      // This is the longest timeout, so no need to update if there is still a
+      // query with UI.
+      if (!query_with_ui_clients_.empty())
+        return absl::nullopt;
+
+      // New timeout depends upon existence of other queries.
+      return query_clients_.empty() ? kNoClientsRegisteredResetOnIdleTimeout
+                                    : kClientsRegisteredResetOnIdleTimeout;
+  }
+}
+
+void PrintBackendServiceManager::SetServiceIdleHandler(
+    mojo::Remote<printing::mojom::PrintBackendService>& service,
     bool sandboxed,
-    const std::string& remote_id) {
-  DVLOG(1) << "Updating to short idle timeout for "
+    const std::string& remote_id,
+    const base::TimeDelta& timeout) {
+  DVLOG(1) << "Updating idle timeout for "
            << (sandboxed ? "sandboxed" : "unsandboxed")
-           << " print backend service id `" << remote_id << "`";
+           << " print backend service id `" << remote_id << "` to " << timeout;
   service.set_idle_handler(
       kNoClientsRegisteredResetOnIdleTimeout,
       base::BindRepeating(&PrintBackendServiceManager::OnIdleTimeout,
@@ -586,6 +719,25 @@
   service->Poke();
 }
 
+void PrintBackendServiceManager::UpdateServiceIdleTimeoutByRemoteId(
+    const std::string& remote_id,
+    const base::TimeDelta& timeout) {
+  auto sandboxed_iter = sandboxed_remotes_bundles_.find(remote_id);
+  if (sandboxed_iter != sandboxed_remotes_bundles_.end()) {
+    RemotesBundle<mojom::SandboxedPrintBackendHost>* bundle =
+        sandboxed_iter->second.get();
+    SetServiceIdleHandler(bundle->service, /*sandboxed=*/true, remote_id,
+                          timeout);
+  }
+  auto unsandboxed_iter = unsandboxed_remotes_bundles_.find(remote_id);
+  if (unsandboxed_iter != unsandboxed_remotes_bundles_.end()) {
+    RemotesBundle<mojom::UnsandboxedPrintBackendHost>* bundle =
+        unsandboxed_iter->second.get();
+    SetServiceIdleHandler(bundle->service, /*sandboxed=*/false, remote_id,
+                          timeout);
+  }
+}
+
 void PrintBackendServiceManager::OnIdleTimeout(bool sandboxed,
                                                const std::string& remote_id) {
   DVLOG(1) << "Print Backend service idle timeout for "
@@ -712,10 +864,11 @@
 const mojo::Remote<mojom::PrintBackendService>&
 PrintBackendServiceManager::GetServiceAndCallbackContext(
     const std::string& printer_name,
+    ClientType client_type,
     CallbackContext& context) {
   context.remote_id = GetRemoteIdForPrinterName(printer_name);
   context.saved_callback_id = base::UnguessableToken::Create();
-  return GetService(printer_name, &context.is_sandboxed);
+  return GetService(printer_name, client_type, &context.is_sandboxed);
 }
 
 template <class T, class X>
@@ -882,4 +1035,16 @@
   callbacks_map.clear();
 }
 
+// static
+void PrintBackendServiceManager::SetClientsForTesting(
+    const ClientsSet& query_clients,
+    const ClientsSet& query_with_ui_clients,
+    const PrintClientsMap& print_document_clients) {
+  g_print_backend_service_manager_singleton->query_clients_ = query_clients;
+  g_print_backend_service_manager_singleton->query_with_ui_clients_ =
+      query_with_ui_clients;
+  g_print_backend_service_manager_singleton->print_document_clients_ =
+      print_document_clients;
+}
+
 }  // namespace printing
diff --git a/chrome/browser/printing/print_backend_service_manager.h b/chrome/browser/printing/print_backend_service_manager.h
index dc4b4bc..05c99e7f 100644
--- a/chrome/browser/printing/print_backend_service_manager.h
+++ b/chrome/browser/printing/print_backend_service_manager.h
@@ -34,6 +34,15 @@
 
 class PrintBackendServiceManager {
  public:
+  using ClientsSet = base::flat_set<uint32_t>;
+  using PrintClientsMap = base::flat_map<std::string, ClientsSet>;
+
+  // Amount of idle time to wait before resetting the connection to the service.
+  static constexpr base::TimeDelta kNoClientsRegisteredResetOnIdleTimeout =
+      base::Seconds(10);
+  static constexpr base::TimeDelta kClientsRegisteredResetOnIdleTimeout =
+      base::Seconds(120);
+
   PrintBackendServiceManager(const PrintBackendServiceManager&) = delete;
   PrintBackendServiceManager& operator=(const PrintBackendServiceManager&) =
       delete;
@@ -125,6 +134,10 @@
 
  private:
   friend base::NoDestructor<PrintBackendServiceManager>;
+  FRIEND_TEST_ALL_PREFIXES(PrintBackendServiceManagerTest,
+                           IsIdleTimeoutUpdateNeededForRegisteredClient);
+  FRIEND_TEST_ALL_PREFIXES(PrintBackendServiceManagerTest,
+                           IsIdleTimeoutUpdateNeededForUnregisteredClient);
 
   enum class ClientType {
     // Print Preview scenario, where printer might not be known.  Only performs
@@ -230,20 +243,42 @@
   // if the service was launched within a sandbox.
   const mojo::Remote<mojom::PrintBackendService>& GetService(
       const std::string& printer_name,
+      ClientType client_type,
       bool* is_sandboxed);
 
   // Helper to `GetService` for a particular remotes bundle type.
   template <class T>
   mojo::Remote<mojom::PrintBackendService>& GetServiceFromBundle(
       const std::string& remote_id,
+      ClientType client_type,
       bool sandboxed,
       RemotesBundleMap<T>& bundle_map);
 
-  // Help function to reset idle timeout duration to a short value.
-  void UpdateServiceToShortIdleTimeout(
-      mojo::Remote<mojom::PrintBackendService>& service,
+  // Get the idle timeout value to user for a particular client type.
+  static constexpr base::TimeDelta GetClientTypeIdleTimeout(
+      ClientType client_type);
+
+  // Determine if idle timeout should be modified based upon there having been
+  // a new client registered for `registered_client_type`.
+  absl::optional<base::TimeDelta> DetermineIdleTimeoutUpdateOnRegisteredClient(
+      ClientType registered_client_type,
+      const std::string& remote_id) const;
+
+  // Determine if idle timeout should be modified after a client of type
+  // `unregistered_client_type` has been unregistered.
+  absl::optional<base::TimeDelta>
+  DetermineIdleTimeoutUpdateOnUnregisteredClient(
+      ClientType unregistered_client_type,
+      const std::string& remote_id) const;
+
+  // Helper functions to adjust service idle timeout duration.
+  void SetServiceIdleHandler(
+      mojo::Remote<printing::mojom::PrintBackendService>& service,
       bool sandboxed,
-      const std::string& remote_id);
+      const std::string& remote_id,
+      const base::TimeDelta& timeout);
+  void UpdateServiceIdleTimeoutByRemoteId(const std::string& remote_id,
+                                          const base::TimeDelta& timeout);
 
   // Callback when predetermined idle timeout occurs indicating no in-flight
   // messages for a short period of time.  `sandboxed` is used to distinguish
@@ -281,6 +316,7 @@
   // `printer_name`.
   const mojo::Remote<mojom::PrintBackendService>& GetServiceAndCallbackContext(
       const std::string& printer_name,
+      ClientType client_type,
       CallbackContext& context);
 
   // Helper function to save outstanding callbacks.
@@ -334,6 +370,12 @@
                                const std::string& remote_id,
                                T result);
 
+  // Test support for client ID management.
+  static void SetClientsForTesting(
+      const ClientsSet& query_clients,
+      const ClientsSet& query_with_ui_clients,
+      const PrintClientsMap& print_document_clients);
+
   // Bundles of remotes for the Print Backend Service and their corresponding
   // wrapping hosts, to manage these sets until they disconnect.  The sandboxed
   // and unsandboxed services are kept separate.
@@ -345,16 +387,16 @@
 
   // Set of IDs for clients actively engaged in printing queries.  This could
   // include any tab which has triggered Print Preview.
-  base::flat_set<uint32_t> query_clients_;
+  ClientsSet query_clients_;
 
   // Set of IDs for clients actively engaged in a printing query which requires
   // the use of a UI.  Such a UI corresponds to a modal system dialog.  For
   // Linux there can be multiple of these, but for other platforms there can be
   // at most one such client.
-  base::flat_set<uint32_t> query_with_ui_clients_;
+  ClientsSet query_with_ui_clients_;
 
   // Map of remote ID to the set of clients printing documents to it.
-  base::flat_map<std::string, base::flat_set<uint32_t>> print_document_clients_;
+  PrintClientsMap print_document_clients_;
 
   uint32_t last_client_id_ = 0;
 
diff --git a/chrome/browser/printing/print_backend_service_manager_unittest.cc b/chrome/browser/printing/print_backend_service_manager_unittest.cc
new file mode 100644
index 0000000..6992d96
--- /dev/null
+++ b/chrome/browser/printing/print_backend_service_manager_unittest.cc
@@ -0,0 +1,333 @@
+// Copyright 2022 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/printing/print_backend_service_manager.h"
+
+#include <string>
+
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
+#include "base/time/time.h"
+#include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace printing {
+
+using ClientsSet = PrintBackendServiceManager::ClientsSet;
+using PrintClientsMap = PrintBackendServiceManager::PrintClientsMap;
+
+namespace {
+
+constexpr char kRemoteIdEmpty[] = "";
+constexpr char kRemoteIdTestPrinter[] = "test-printer";
+
+const ClientsSet kTestQueryNoClients;
+const ClientsSet kTestQueryWithOneClient{1};
+const ClientsSet kTestQueryWithTwoClients{1, 2};
+
+const ClientsSet kTestQueryWithUiNoClients;
+const ClientsSet kTestQueryWithUiOneClient{5};
+#if BUILDFLAG(IS_LINUX)
+const ClientsSet kTestQueryWithUiTwoClients{5, 6};
+#endif
+
+const PrintClientsMap kTestPrintDocumentNoClients;
+const PrintClientsMap kTestPrintDocumentOnePrinterWithOneClient{
+    {kRemoteIdEmpty, {10}},
+};
+const PrintClientsMap kTestPrintDocumentOnePrinterWithTwoClients{
+    {kRemoteIdEmpty, {10, 11}},
+};
+const PrintClientsMap kTestPrintDocumentTwoPrintersWithOneClientEach{
+    {kRemoteIdEmpty, {10}},
+    {kRemoteIdTestPrinter, {20}},
+};
+
+constexpr absl::optional<base::TimeDelta> kNoNewTimeoutNeeded;
+constexpr absl::optional<base::TimeDelta> kMaxTimeout = base::TimeDelta::Max();
+
+}  // namespace
+
+TEST(PrintBackendServiceManagerTest,
+     IsIdleTimeoutUpdateNeededForRegisteredClient) {
+  const struct TestData {
+    ClientsSet query_clients;
+    ClientsSet query_with_ui_client;
+    PrintClientsMap print_document_clients;
+    PrintBackendServiceManager::ClientType modified_client_type;
+    absl::optional<base::TimeDelta> new_timeout;
+  } kTestData[] = {
+    // == PrintBackendServiceManager::ClientType::kQuery
+
+    // A single query client should yield a new clients-registered timeout.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        PrintBackendServiceManager::kClientsRegisteredResetOnIdleTimeout,
+    },
+    // An extra query client should yield no new timeout needed.
+    {
+        kTestQueryWithTwoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+    // A single query client should yield no new timeout needed if a query
+    // with UI is present.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+    // A single query client should yield no new timeout needed if a print
+    // document is present.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+
+    // == PrintBackendServiceManager::ClientType::kQueryWithUi
+
+    // A lone query with UI client should yield a new maximum timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kMaxTimeout,
+    },
+    // A new query with UI client with existing regular queries should yield a
+    // new maximum timeout.
+    {
+        kTestQueryWithTwoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kMaxTimeout,
+    },
+#if BUILDFLAG(IS_LINUX)
+    // A new query with UI client with an existing query with UI client
+    // should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiTwoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kNoNewTimeoutNeeded,
+    },
+#endif
+    // A new query with UI client with an existing printing client should
+    // yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kNoNewTimeoutNeeded,
+    },
+
+    // == PrintBackendServiceManager::ClientType::kPrintDocument
+
+    // A lone print document client should yield a new maximum timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kMaxTimeout,
+    },
+    // An extra print document client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithTwoClients,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kNoNewTimeoutNeeded,
+    },
+    // A new print document client with existing regular queries should yield
+    // a new maximum timeout.
+    {
+        kTestQueryWithTwoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kMaxTimeout,
+    },
+    // A new print document client with existing query with UI should yield no
+    // new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kNoNewTimeoutNeeded,
+    },
+    // A new print document client with existing print document for alternate
+    // remote ID should yield a new maximum timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentTwoPrintersWithOneClientEach,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kMaxTimeout,
+    },
+  };
+
+  for (const auto& test_data : kTestData) {
+    PrintBackendServiceManager::ResetForTesting();
+    PrintBackendServiceManager::GetInstance().SetClientsForTesting(
+        test_data.query_clients, test_data.query_with_ui_client,
+        test_data.print_document_clients);
+
+    absl::optional<base::TimeDelta> new_timeout =
+        PrintBackendServiceManager::GetInstance()
+            .DetermineIdleTimeoutUpdateOnRegisteredClient(
+                test_data.modified_client_type, kRemoteIdEmpty);
+    EXPECT_EQ(new_timeout, test_data.new_timeout);
+  }
+}
+
+TEST(PrintBackendServiceManagerTest,
+     IsIdleTimeoutUpdateNeededForUnregisteredClient) {
+  const struct TestData {
+    ClientsSet query_clients;
+    ClientsSet query_with_ui_client;
+    PrintClientsMap print_document_clients;
+    PrintBackendServiceManager::ClientType modified_client_type;
+    absl::optional<base::TimeDelta> new_timeout;
+  } kTestData[] = {
+    // == PrintBackendServiceManager::ClientType::kQuery
+
+    // No remaining clients should yield a new no-clients-registered timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        PrintBackendServiceManager::kNoClientsRegisteredResetOnIdleTimeout,
+    },
+    // Any remaining query client should yield no new timeout needed.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+    // A query with UI client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+    // Any print document client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kQuery,
+        kNoNewTimeoutNeeded,
+    },
+
+    // == PrintBackendServiceManager::ClientType::kQueryWithUi
+
+    // No remaining clients should yield a new no-clients-registered timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        PrintBackendServiceManager::kNoClientsRegisteredResetOnIdleTimeout,
+    },
+    // Any remaining query client should yield a new clients-registered
+    // timeout.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        PrintBackendServiceManager::kClientsRegisteredResetOnIdleTimeout,
+    },
+#if BUILDFLAG(IS_LINUX)
+    // Any remaining query with UI client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kNoNewTimeoutNeeded,
+    },
+#endif
+    // Any print document client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kQueryWithUi,
+        kNoNewTimeoutNeeded,
+    },
+
+    // == PrintBackendServiceManager::ClientType::kPrintDocument
+
+    // No remaining clients should yield a new no-clients-registered timeout.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        PrintBackendServiceManager::kNoClientsRegisteredResetOnIdleTimeout,
+    },
+    // Any remaining print document client should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentOnePrinterWithOneClient,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kNoNewTimeoutNeeded,
+    },
+    // Any remaining query client should yield a new clients-registered
+    // timeout.
+    {
+        kTestQueryWithOneClient,
+        kTestQueryWithUiNoClients,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        PrintBackendServiceManager::kClientsRegisteredResetOnIdleTimeout,
+    },
+    // A remaining query with UI should yield no new timeout needed.
+    {
+        kTestQueryNoClients,
+        kTestQueryWithUiOneClient,
+        kTestPrintDocumentNoClients,
+        PrintBackendServiceManager::ClientType::kPrintDocument,
+        kNoNewTimeoutNeeded,
+    },
+  };
+
+  for (const auto& test_data : kTestData) {
+    PrintBackendServiceManager::ResetForTesting();
+    PrintBackendServiceManager::GetInstance().SetClientsForTesting(
+        test_data.query_clients, test_data.query_with_ui_client,
+        test_data.print_document_clients);
+
+    absl::optional<base::TimeDelta> new_timeout =
+        PrintBackendServiceManager::GetInstance()
+            .DetermineIdleTimeoutUpdateOnUnregisteredClient(
+                test_data.modified_client_type, kRemoteIdEmpty);
+    EXPECT_EQ(new_timeout, test_data.new_timeout);
+  }
+}
+
+}  // namespace printing
diff --git a/chrome/browser/resources/app_settings/OWNERS b/chrome/browser/resources/app_settings/OWNERS
index c1d8254..efc2980a 100644
--- a/chrome/browser/resources/app_settings/OWNERS
+++ b/chrome/browser/resources/app_settings/OWNERS
@@ -1,2 +1,3 @@
 file://chrome/browser/web_applications/OWNERS
+file://ui/webui/resources/cr_components/app_management/OWNERS
 phillis@chromium.org
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 1b5e09f..aa297d7 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -256,7 +256,7 @@
   out_folder = "$target_gen_dir/$preprocess_folder_v3"
   out_manifest = "$target_gen_dir/$preprocess_v3_manifest"
   in_files = [
-    "chromeos/deep_linking_behavior.m.js",
+    "chromeos/deep_linking_behavior.js",
     "chromeos/metrics_recorder.m.js",
     "chromeos/os_settings_routes.m.js",
     "chromeos/route_origin_behavior.m.js",
@@ -686,7 +686,6 @@
 }
 
 js_library("deep_linking_behavior") {
-  sources = [ "deep_linking_behavior.m.js" ]
   deps = [
     "..:router",
     "..:setting_id_param_util",
diff --git a/chrome/browser/resources/settings/chromeos/OWNERS b/chrome/browser/resources/settings/chromeos/OWNERS
index aa9bd85..87e85e0 100644
--- a/chrome/browser/resources/settings/chromeos/OWNERS
+++ b/chrome/browser/resources/settings/chromeos/OWNERS
@@ -1,10 +1,20 @@
+# For changes to specific OS Settings sections in subfolders, prefer have
+# subfolder OWNERS review.
+
+# For changes to general OS Settings app, framework/infra changes, or anything
+# that does not have a more specific OWNERS, please select a "main" reviewer,
+# if none available, please select a "backup" reviewer.
+
+# Main reviewers
+xiaohuic@chromium.org
+
+# Backup reviewers
+cowmoo@chromium.org
 hsuregan@chromium.org
-jamescook@chromium.org
 jimmyxgong@chromium.org
 jonmann@chromium.org
 khorimoto@chromium.org
 michaelpg@chromium.org
-xiaohuic@chromium.org
 zentaro@chromium.org
 
 # For APAC timezone build file related changes only.
diff --git a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.js b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.js
index f0c8434a..98008949 100644
--- a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.js
+++ b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.js
@@ -21,7 +21,7 @@
 import {afterNextRender, flush, html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_page.js b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_page.js
index 22bbeb6d..ae5d9fd 100644
--- a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_page.js
+++ b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_page.js
@@ -33,7 +33,7 @@
 import {loadTimeData} from '../../i18n_setup.js';
 import '../../prefs/prefs.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordSettingChange} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {Router, Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.js b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.js
index e5658f1..87937dd 100644
--- a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.js
@@ -28,7 +28,7 @@
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 import '//resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 import {loadTimeData} from '../../i18n_setup.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {Router, Route} from '../../router.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
index 4321261c..037fba4 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
@@ -20,7 +20,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
index 8200fc5..73e2f58 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
@@ -17,7 +17,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
index a473c072..04c24ab4 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
@@ -30,7 +30,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
index 1be9f45..70b42c2 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
@@ -28,7 +28,7 @@
 import {DEFAULT_CROSTINI_VM, DEFAULT_CROSTINI_CONTAINER, CrostiniPortProtocol, CrostiniPortSetting, CrostiniDiskInfo, CrostiniPortActiveSetting, CrostiniBrowserProxy, CrostiniBrowserProxyImpl, PortState, MIN_VALID_PORT_NUMBER, MAX_VALID_PORT_NUMBER} from './crostini_browser_proxy.js';
 import './crostini_confirmation_dialog.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {Router, Route} from '../../router.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.js b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.js
index 883b8bf3..bd1b0037 100644
--- a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.js
+++ b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.js
@@ -25,7 +25,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/date_time_page/timezone_subpage.js b/chrome/browser/resources/settings/chromeos/date_time_page/timezone_subpage.js
index 1b736f1..0345d5cf 100644
--- a/chrome/browser/resources/settings/chromeos/date_time_page/timezone_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/date_time_page/timezone_subpage.js
@@ -18,7 +18,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/deep_linking_behavior.html b/chrome/browser/resources/settings/chromeos/deep_linking_behavior.html
deleted file mode 100644
index 0c665f4b..0000000
--- a/chrome/browser/resources/settings/chromeos/deep_linking_behavior.html
+++ /dev/null
@@ -1 +0,0 @@
-<!-- This file is used only for Polymer 3 autogeneration. -->
diff --git a/chrome/browser/resources/settings/chromeos/deep_linking_behavior.m.js b/chrome/browser/resources/settings/chromeos/deep_linking_behavior.js
similarity index 100%
rename from chrome/browser/resources/settings/chromeos/deep_linking_behavior.m.js
rename to chrome/browser/resources/settings/chromeos/deep_linking_behavior.js
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display.js b/chrome/browser/resources/settings/chromeos/device_page/display.js
index 6331d6c..d45a143 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/display.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/display.js
@@ -29,7 +29,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
index b256b751a..33035ef 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
@@ -16,7 +16,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/pointers.js b/chrome/browser/resources/settings/chromeos/device_page/pointers.js
index 807e7d4d..be06bbee 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/pointers.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/pointers.js
@@ -18,7 +18,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/power.js b/chrome/browser/resources/settings/chromeos/device_page/power.js
index 9cfa6f42..8456a99 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/power.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/power.js
@@ -22,7 +22,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/stylus.js b/chrome/browser/resources/settings/chromeos/device_page/stylus.js
index 6f006559..27168ad 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/stylus.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/stylus.js
@@ -28,7 +28,7 @@
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 import {routes} from '../os_route.m.js';
 import {recordSettingChange, recordSearch, setUserActionRecorderForTesting, recordPageFocus, recordPageBlur, recordClick, recordNavigation} from '../metrics_recorder.m.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 
 Polymer({
   _template: html`{__html_template__}`,
diff --git a/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.js b/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.js
index 804de4b9..906fb0c 100644
--- a/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.js
+++ b/chrome/browser/resources/settings/chromeos/google_assistant_page/google_assistant_page.js
@@ -55,7 +55,7 @@
 import {Router, Route} from '../../router.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 import '../../settings_shared_css.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordSettingChange, recordSearch, setUserActionRecorderForTesting, recordPageFocus, recordPageBlur, recordClick, recordNavigation} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {GoogleAssistantBrowserProxy, GoogleAssistantBrowserProxyImpl} from './google_assistant_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
index 03ff0567..cbc7ffa 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
@@ -20,7 +20,7 @@
 import {afterNextRender, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
index 611f122..c6f5880 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -47,7 +47,7 @@
 
 import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {OsSyncBrowserProxy, OsSyncBrowserProxyImpl, OsSyncPrefs} from '../os_people_page/os_sync_browser_proxy.m.js';
 import {routes} from '../os_route.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
index 4c6ad1b..a109c4d 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
@@ -24,7 +24,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
index 2539d53..61476ca 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -38,7 +38,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
index adfda9b..28e02974 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
@@ -32,7 +32,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
index 11401d0..a5933ebe 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
@@ -27,7 +27,7 @@
 import {Router, Route} from '../../router.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 import '../../settings_shared_css.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordSettingChange, recordSearch, setUserActionRecorderForTesting, recordPageFocus, recordPageBlur, recordClick, recordNavigation} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {KerberosAccount, KerberosAccountsBrowserProxyImpl, KerberosAccountsBrowserProxy, KerberosErrorType, KerberosConfigErrorCode, ValidateKerberosConfigResult} from './kerberos_accounts_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
index d2918e6..ef8db23c 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
@@ -25,7 +25,7 @@
 import {Route, Router} from '../../router.js';
 import {getContactManager} from '../../shared/nearby_contact_manager.m.js';
 import {NearbySettings} from '../../shared/nearby_share_settings_behavior.m.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index 0c51783..503de0c 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -21,7 +21,7 @@
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import '../../controls/settings_slider.js';
 import '../../controls/settings_toggle_button.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {Router, Route} from '../../router.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
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 7d9fea6a..01cdfe9 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
@@ -22,7 +22,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
index 85ad603..bbb15ff 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
@@ -22,7 +22,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
index c097ca29..16b1560 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
@@ -21,7 +21,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {LanguagesBrowserProxy, LanguagesBrowserProxyImpl} from '../os_languages_page/languages_browser_proxy.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js b/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js
index f6b224fc..f00090d 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/detailed_build_info.js
@@ -24,7 +24,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
index 355ae2e..7804bae 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -35,7 +35,7 @@
 import {loadTimeData} from '../../i18n_setup.js';
 import {LifetimeBrowserProxyImpl} from '../../lifetime_browser_proxy.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {MainPageBehavior} from '../os_settings_page/main_page_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/OWNERS b/chrome/browser/resources/settings/chromeos/os_apps_page/OWNERS
index b784206..75ba0e3 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/OWNERS
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/OWNERS
@@ -1,2 +1 @@
-dominickn@chromium.org
-jshikaram@chromium.org
+file://ui/webui/resources/cr_components/app_management/OWNERS
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
index 5cc1f844..a03cce14 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
@@ -19,7 +19,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
index d31f64a..6056d4e 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
@@ -2,25 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import './supported_links_overlapping_apps_dialog.js';
-import './supported_links_dialog.js';
 import '//resources/cr_components/chromeos/localized_link/localized_link.js';
-import '//resources/cr_elements/cr_radio_button/cr_radio_button.m.js';
-import '//resources/cr_elements/cr_radio_group/cr_radio_group.m.js';
 
-import {AppManagementUserAction, AppType} from '//resources/cr_components/app_management/constants.js';
-import {assert} from '//resources/js/assert.m.js';
-import {focusWithoutInk} from '//resources/js/cr/ui/focus_without_ink.m.js';
+import {AppType} from '//resources/cr_components/app_management/constants.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {recordAppManagementUserAction} from 'chrome://resources/cr_components/app_management/util.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 
-import {recordSettingChange} from '../../metrics_recorder.m.js';
-
-import {BrowserProxy} from './browser_proxy.js';
-import {AppManagementStoreClient} from './store_client.js';
-
 /**
  * @constructor
  * @extends {PolymerElement}
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
index 4568f36..e0dbcc5 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
@@ -17,7 +17,7 @@
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../../router.js';
-import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../../deep_linking_behavior.js';
 import {recordSettingChange} from '../../metrics_recorder.m.js';
 import {routes} from '../../os_route.m.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
index 51bd3a62..04404f7 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
@@ -33,7 +33,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
index 09785a4d..a6277f1 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
@@ -20,7 +20,7 @@
 import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
 import {OsBluetoothDevicesSubpageBrowserProxy, OsBluetoothDevicesSubpageBrowserProxyImpl} from './os_bluetooth_devices_subpage_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.js b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.js
index 12f078b..4108e88a 100644
--- a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.js
@@ -17,7 +17,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
index 460d270..1b44d9f 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
@@ -26,7 +26,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
index 4d897ca3..d68f1ae 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
@@ -34,7 +34,7 @@
 import '//resources/cr_components/chromeos/localized_link/localized_link.js';
 import '../../controls/settings_toggle_button.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {loadTimeData} from '../../i18n_setup.js';
 import {Router, Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
index 24789b7..4b867b11 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
@@ -16,7 +16,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
index 846e6f2..0d0c2ae 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
@@ -24,7 +24,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordSettingChange} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {ParentalControlsBrowserProxy, ParentalControlsBrowserProxyImpl} from '../parental_controls_page/parental_controls_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
index 6308c0d..3b5d256 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
@@ -26,7 +26,7 @@
 import {FingerprintInfo, FingerprintBrowserProxy, FingerprintResultType, FingerprintBrowserProxyImpl} from './fingerprint_browser_proxy.js';
 import './setup_fingerprint_dialog.js';
 import {loadTimeData} from '../../i18n_setup.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import '//resources/cr_components/chromeos/localized_link/localized_link.js';
 import {routes} from '../os_route.m.js';
 import {Router, Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
index bed881a..44965bd2 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
@@ -37,7 +37,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
index 192dc10b..22eff39 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
@@ -40,7 +40,7 @@
 import {ProfileInfoBrowserProxyImpl} from '../../people_page/profile_info_browser_proxy.js';
 import {StatusAction, SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {OSPageVisibility, osPageVisibility} from '../os_page_visibility.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
index 05c89a89..d27e869 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
@@ -16,7 +16,7 @@
 
 import {StatusAction, SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/users_page.js b/chrome/browser/resources/settings/chromeos/os_people_page/users_page.js
index 68cf2df..228b435 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/users_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/users_page.js
@@ -21,7 +21,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
index 8252d47..f317242b 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
@@ -37,7 +37,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.js b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.js
index b9fa076..d2cdf0c8 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.js
@@ -12,7 +12,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
index cf88b8d..e66338a 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
@@ -25,7 +25,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {LockScreenUnlockType, LockStateBehavior, LockStateBehaviorImpl} from '../os_people_page/lock_state_behavior.m.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
index 27016af..b5f462dc 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
@@ -20,7 +20,7 @@
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js
index 7ed2926..13a9646 100644
--- a/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.js
@@ -16,7 +16,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js
index 81757f6d..f9c0ce3 100644
--- a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.js
@@ -29,7 +29,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/search_subpage.js b/chrome/browser/resources/settings/chromeos/os_search_page/search_subpage.js
index dcff6e33..bcf9732 100644
--- a/chrome/browser/resources/settings/chromeos/os_search_page/search_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_search_page/search_subpage.js
@@ -28,7 +28,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 18ce95f..a421a1f 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -542,7 +542,7 @@
                                  "chrome/browser/resources/settings/controls/settings_slider.html",
                                  "chrome/browser/resources/settings/controls/settings_textarea.html",
                                  "chrome/browser/resources/settings/controls/settings_toggle_button.html",
-                                 "chrome/browser/resources/settings/deep_linking_behavior.html",
+                                 "chrome/browser/resources/settings/chromeos/deep_linking_behavior.html",
                                  "chrome/browser/resources/settings/ensure_lazy_loaded.html",
                                  "chrome/browser/resources/settings/extension_control_browser_proxy.html",
                                  "chrome/browser/resources/settings/chromeos/global_scroll_target_behavior.html",
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.js b/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.js
index 648b5fa..e352c0f 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.js
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.js
@@ -21,7 +21,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {recordClick, recordNavigation, recordPageBlur, recordPageFocus, recordSearch, recordSettingChange, setUserActionRecorderForTesting} from '../metrics_recorder.m.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/dark_mode_subpage.js b/chrome/browser/resources/settings/chromeos/personalization_page/dark_mode_subpage.js
index 984b129..9555ca11 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/dark_mode_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/dark_mode_subpage.js
@@ -16,7 +16,7 @@
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {PrefsBehavior} from '../prefs_behavior.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js
index eb4493251..e3a326f 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.js
@@ -20,7 +20,7 @@
 
 import {loadTimeData} from '../../i18n_setup.js';
 import {Route, Router} from '../../router.js';
-import {DeepLinkingBehavior} from '../deep_linking_behavior.m.js';
+import {DeepLinkingBehavior} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.m.js';
 import {RouteObserverBehavior} from '../route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.html b/chrome/browser/resources/settings/privacy_sandbox/app.html
index c4f824ba..ed173829 100644
--- a/chrome/browser/resources/settings/privacy_sandbox/app.html
+++ b/chrome/browser/resources/settings/privacy_sandbox/app.html
@@ -133,7 +133,7 @@
     margin-inline-start: 0;
   }
 
-  #adPersonalizationRemovedRow {
+  .ad-personalization-removed-row {
     border-top: var(--cr-separator-line);
     color: var(--cr-primary-text-color);
     margin-top: 8px;
@@ -274,8 +274,10 @@
                     on-interest-changed="onInterestChanged_">
                 </privacy-sandbox-interest-item>
               </template>
-              <cr-link-row id="adPersonalizationRemovedRow"
-                  label="$i18n{privacySandboxAdPersonalizationDialogRemovedInterestsLabel}"
+              <cr-link-row class="ad-personalization-removed-row"
+                  hidden="[[!showInterestsList_(blockedTopics_,
+                                                blockedTopics_.length)]]"
+                  label="$i18n{privacySandboxAdPersonalizationDialogRemovedTopicsLabel}"
                   on-click="onAdPersonalizationRemovedRowClick_">
               </cr-link-row>
             </div>
@@ -293,6 +295,12 @@
                     on-interest-changed="onInterestChanged_">
                 </privacy-sandbox-interest-item>
               </template>
+              <cr-link-row class="ad-personalization-removed-row"
+                  hidden="[[!showInterestsList_(blockedSites_,
+                                                blockedSites_.length)]]"
+                  label="$i18n{privacySandboxAdPersonalizationDialogRemovedFledgeLabel}"
+                  on-click="onAdPersonalizationRemovedRowClick_">
+              </cr-link-row>
             </div>
           </div>
         </template>
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
index fa043c2..ca8f2dc 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
@@ -147,7 +147,7 @@
       app_update.PausedChanged()) {
     if (app_update.Readiness() == apps::Readiness::kDisabledByPolicy) {
       SetAppStatus(ash::AppStatus::kBlocked);
-    } else if (app_update.Paused() == apps::mojom::OptionalBool::kTrue) {
+    } else if (app_update.Paused().value_or(false)) {
       SetAppStatus(ash::AppStatus::kPaused);
     } else {
       SetAppStatus(ash::AppStatus::kReady);
diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc
index 3b48cf5a..0bca91e 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider.cc
@@ -347,7 +347,7 @@
           update.InstalledInternally() == apps::mojom::OptionalBool::kTrue));
       apps_vector->back()->set_recommendable(
           update.Recommendable().value_or(false) &&
-          update.Paused() != apps::mojom::OptionalBool::kTrue &&
+          !update.Paused().value_or(false) &&
           update.Readiness() != apps::Readiness::kDisabledByPolicy);
       apps_vector->back()->set_searchable(update.Searchable().value_or(false));
 
diff --git a/chrome/browser/ui/app_list/search/app_service_app_result.cc b/chrome/browser/ui/app_list/search/app_service_app_result.cc
index dd3af17d..6690f33 100644
--- a/chrome/browser/ui/app_list/search/app_service_app_result.cc
+++ b/chrome/browser/ui/app_list/search/app_service_app_result.cc
@@ -61,7 +61,7 @@
           SetAccessibleName(l10n_util::GetStringFUTF16(
               IDS_APP_ACCESSIBILITY_BLOCKED_INSTALLED_APP_ANNOUNCEMENT,
               base::UTF8ToUTF16(update.ShortName())));
-        } else if (update.Paused() == apps::mojom::OptionalBool::kTrue) {
+        } else if (update.Paused().value_or(false)) {
           SetAccessibleName(l10n_util::GetStringFUTF16(
               IDS_APP_ACCESSIBILITY_PAUSED_INSTALLED_APP_ANNOUNCEMENT,
               base::UTF8ToUTF16(update.ShortName())));
diff --git a/chrome/browser/ui/ash/shelf/shelf_controller_helper.cc b/chrome/browser/ui/ash/shelf/shelf_controller_helper.cc
index dabbd4ef..355afc1 100644
--- a/chrome/browser/ui/ash/shelf/shelf_controller_helper.cc
+++ b/chrome/browser/ui/ash/shelf/shelf_controller_helper.cc
@@ -113,7 +113,7 @@
       .ForOneApp(app_id, [&status](const apps::AppUpdate& update) {
         if (update.Readiness() == apps::Readiness::kDisabledByPolicy)
           status = ash::AppStatus::kBlocked;
-        else if (update.Paused() == apps::mojom::OptionalBool::kTrue)
+        else if (update.Paused().value_or(false))
           status = ash::AppStatus::kPaused;
       });
 
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 8edbd92..137d712 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/dom_distiller/tab_utils.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/favicon/favicon_utils.h"
+#include "chrome/browser/feed/web_feed_follow_util.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
@@ -1862,4 +1863,9 @@
   }
 }
 
+void FollowSite(Browser* browser, content::WebContents* web_contents) {
+  DCHECK(browser && !browser->profile()->IsIncognitoProfile());
+  feed::FollowSite(web_contents);
+}
+
 }  // namespace chrome
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h
index 71b3d8d..5bac947 100644
--- a/chrome/browser/ui/browser_commands.h
+++ b/chrome/browser/ui/browser_commands.h
@@ -247,6 +247,9 @@
 void ProcessInterceptedChromeURLNavigationInIncognito(Browser* browser,
                                                       const GURL& url);
 
+// Follows a web feed associated with the main frame of specified web contents.
+void FollowSite(Browser* browser, content::WebContents* web_contents);
+
 }  // namespace chrome
 
 #endif  // CHROME_BROWSER_UI_BROWSER_COMMANDS_H_
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index dcfeaee..58fba19 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -8,6 +8,7 @@
 #include "ui/base/interaction/element_tracker.h"
 
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kAppMenuButtonElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kAppUninstallDialogOkButtonId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kAutofillCreditCardSuggestionEntryElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kAvatarButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index eb00763..4b66963 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -17,6 +17,7 @@
 
 // These should gradually replace values in view_ids.h.
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kAppMenuButtonElementId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kAppUninstallDialogOkButtonId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kAutofillCreditCardSuggestionEntryElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kAvatarButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kBookmarkStarViewElementId);
diff --git a/chrome/browser/ui/browser_tab_strip_model_delegate.cc b/chrome/browser/ui/browser_tab_strip_model_delegate.cc
index 2faa7c4..f0bd748 100644
--- a/chrome/browser/ui/browser_tab_strip_model_delegate.cc
+++ b/chrome/browser/ui/browser_tab_strip_model_delegate.cc
@@ -262,6 +262,11 @@
   cache.CacheWebContents(std::move(cached));
 }
 
+void BrowserTabStripModelDelegate::FollowSite(
+    content::WebContents* web_contents) {
+  chrome::FollowSite(browser_, web_contents);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserTabStripModelDelegate, private:
 
diff --git a/chrome/browser/ui/browser_tab_strip_model_delegate.h b/chrome/browser/ui/browser_tab_strip_model_delegate.h
index 4212d21..c2c099d 100644
--- a/chrome/browser/ui/browser_tab_strip_model_delegate.h
+++ b/chrome/browser/ui/browser_tab_strip_model_delegate.h
@@ -59,6 +59,7 @@
   void CacheWebContents(
       const std::vector<std::unique_ptr<TabStripModel::DetachedWebContents>>&
           web_contents) override;
+  void FollowSite(content::WebContents* web_contents) override;
 
   void CloseFrame();
 
diff --git a/chrome/browser/ui/intent_picker_tab_helper.cc b/chrome/browser/ui/intent_picker_tab_helper.cc
index 6510b95..5bb52a2 100644
--- a/chrome/browser/ui/intent_picker_tab_helper.cc
+++ b/chrome/browser/ui/intent_picker_tab_helper.cc
@@ -7,9 +7,11 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h"
 #include "chrome/browser/apps/intent_helper/intent_picker_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -88,6 +90,11 @@
 #endif
 
   tab_helper->should_show_icon_ = should_show_icon;
+
+  if (base::FeatureList::IsEnabled(features::kLinkCapturingUiUpdate)) {
+    tab_helper->UpdateCollapsedState();
+  }
+
   Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
   if (!browser)
     return;
@@ -166,6 +173,29 @@
   }
 }
 
+void IntentPickerTabHelper::UpdateCollapsedState() {
+  if (!should_show_icon_) {
+    should_show_collapsed_chip_ = false;
+    last_shown_origin_ = url::Origin();
+    return;
+  }
+
+  GURL url = web_contents()->GetLastCommittedURL();
+  url::Origin origin = url::Origin::Create(url);
+
+  // Determine whether to show the Chip as expanded/collapsed whenever the
+  // origin changes.
+  if (!origin.IsSameOriginWith(last_shown_origin_)) {
+    last_shown_origin_ = origin;
+    Profile* profile =
+        Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+    auto chip_state = IntentPickerAutoDisplayService::Get(profile)
+                          ->GetChipStateAndIncrementCounter(url);
+    should_show_collapsed_chip_ =
+        chip_state == IntentPickerAutoDisplayService::ChipState::kCollapsed;
+  }
+}
+
 void IntentPickerTabHelper::DidFinishNavigation(
     content::NavigationHandle* navigation_handle) {
   // For a http/https scheme URL navigation, we will check if the
diff --git a/chrome/browser/ui/intent_picker_tab_helper.h b/chrome/browser/ui/intent_picker_tab_helper.h
index a11d30a..27924a5 100644
--- a/chrome/browser/ui/intent_picker_tab_helper.h
+++ b/chrome/browser/ui/intent_picker_tab_helper.h
@@ -19,6 +19,7 @@
 #include "components/services/app_service/public/mojom/types.mojom-forward.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
+#include "url/origin.h"
 
 // Controls the visibility of IntentPickerView by updating the visibility based
 // on stored state. This class is instantiated for both web apps and SWAs.
@@ -37,6 +38,10 @@
 
   bool should_show_icon() const { return should_show_icon_; }
 
+  bool should_show_collapsed_chip() const {
+    return should_show_collapsed_chip_;
+  }
+
   using IntentPickerIconLoaderCallback =
       base::OnceCallback<void(std::vector<apps::IntentPickerAppInfo> apps)>;
 
@@ -60,6 +65,8 @@
                    IntentPickerIconLoaderCallback callback,
                    size_t index);
 
+  void UpdateCollapsedState();
+
   void DidFinishNavigation(
       content::NavigationHandle* navigation_handle) override;
 
@@ -71,6 +78,8 @@
   const raw_ptr<web_app::WebAppInstallManager> install_manager_;
 
   bool should_show_icon_ = false;
+  url::Origin last_shown_origin_;
+  bool should_show_collapsed_chip_ = false;
 
   base::ScopedObservation<web_app::WebAppInstallManager,
                           web_app::WebAppInstallManagerObserver>
diff --git a/chrome/browser/ui/tabs/tab_menu_model.cc b/chrome/browser/ui/tabs/tab_menu_model.cc
index 3c1d272..08b078d 100644
--- a/chrome/browser/ui/tabs/tab_menu_model.cc
+++ b/chrome/browser/ui/tabs/tab_menu_model.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/feed/feed_feature_list.h"
 #include "components/reading_list/features/reading_list_switches.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -117,6 +118,10 @@
                           IDS_TAB_CXMENU_SOUND_MUTE_SITE, num_tabs)
                     : l10n_util::GetPluralStringFUTF16(
                           IDS_TAB_CXMENU_SOUND_UNMUTE_SITE, num_tabs));
+  if (base::FeatureList::IsEnabled(feed::kWebUiFeed)) {
+    AddItemWithStringId(TabStripModel::CommandFollowSite,
+                        IDS_TAB_CXMENU_FOLLOW_SITE);
+  }
   if (send_tab_to_self::ShouldOfferFeature(
           tab_strip->GetWebContentsAt(index))) {
     AddSeparator(ui::NORMAL_SEPARATOR);
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index afa7d12c..f6ddeb96 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -1322,6 +1322,12 @@
     observer.OnTabGroupChanged(change);
 }
 
+void TabStripModel::FollowSites(const std::vector<int>& indices) {
+  ReentrancyCheck reentrancy_check(&reentrancy_guard_);
+  for (int index : indices)
+    delegate_->FollowSite(GetWebContentsAt(index));
+}
+
 int TabStripModel::GetTabCount() const {
   return static_cast<int>(contents_data_.size());
 }
@@ -1396,6 +1402,16 @@
              delegate()->CanMoveTabsToWindow(indices);
     }
 
+    case CommandFollowSite: {
+      std::vector<int> indices = GetIndicesForCommand(context_index);
+      // Since all tabs should belong to same profile, it is enough to do the
+      // check based on the first tab.
+      content::WebContents* web_contents = GetWebContentsAt(indices[0]);
+      Profile* profile =
+          Profile::FromBrowserContext(web_contents->GetBrowserContext());
+      return !profile->IsIncognitoProfile();
+    }
+
     default:
       NOTREACHED();
   }
@@ -1580,6 +1596,12 @@
       break;
     }
 
+    case CommandFollowSite: {
+      base::RecordAction(UserMetricsAction("DesktopFeed.FollowSite"));
+      FollowSites(GetIndicesForCommand(context_index));
+      break;
+    }
+
     default:
       NOTREACHED();
   }
diff --git a/chrome/browser/ui/tabs/tab_strip_model.h b/chrome/browser/ui/tabs/tab_strip_model.h
index 13576cd..12f958e 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.h
+++ b/chrome/browser/ui/tabs/tab_strip_model.h
@@ -556,6 +556,9 @@
   // Saves tabs with url supported by Read Later.
   void AddToReadLater(const std::vector<int>& indices);
 
+  // Follows a web feed for a set of website.
+  void FollowSites(const std::vector<int>& indices);
+
   // TabGroupController:
   Profile* GetProfile() override;
   void CreateTabGroup(const tab_groups::TabGroupId& group) override;
@@ -592,6 +595,7 @@
     CommandRemoveFromGroup,
     CommandMoveToExistingWindow,
     CommandMoveTabsToNewWindow,
+    CommandFollowSite,
     CommandLast
   };
 
diff --git a/chrome/browser/ui/tabs/tab_strip_model_delegate.h b/chrome/browser/ui/tabs/tab_strip_model_delegate.h
index 548597f..2d23d22 100644
--- a/chrome/browser/ui/tabs/tab_strip_model_delegate.h
+++ b/chrome/browser/ui/tabs/tab_strip_model_delegate.h
@@ -164,6 +164,9 @@
   virtual void CacheWebContents(
       const std::vector<std::unique_ptr<TabStripModel::DetachedWebContents>>&
           web_contents) = 0;
+
+  // Follows a web feed for the specified WebContents.
+  virtual void FollowSite(content::WebContents* web_contents) = 0;
 };
 
 #endif  // CHROME_BROWSER_UI_TABS_TAB_STRIP_MODEL_DELEGATE_H_
diff --git a/chrome/browser/ui/tabs/test_tab_strip_model_delegate.cc b/chrome/browser/ui/tabs/test_tab_strip_model_delegate.cc
index a9d8caa..35973d7 100644
--- a/chrome/browser/ui/tabs/test_tab_strip_model_delegate.cc
+++ b/chrome/browser/ui/tabs/test_tab_strip_model_delegate.cc
@@ -101,3 +101,6 @@
 void TestTabStripModelDelegate::CacheWebContents(
     const std::vector<std::unique_ptr<TabStripModel::DetachedWebContents>>&
         web_contents) {}
+
+void TestTabStripModelDelegate::FollowSite(content::WebContents* web_contents) {
+}
diff --git a/chrome/browser/ui/tabs/test_tab_strip_model_delegate.h b/chrome/browser/ui/tabs/test_tab_strip_model_delegate.h
index 1dcca589..442203d8 100644
--- a/chrome/browser/ui/tabs/test_tab_strip_model_delegate.h
+++ b/chrome/browser/ui/tabs/test_tab_strip_model_delegate.h
@@ -53,6 +53,7 @@
   void CacheWebContents(
       const std::vector<std::unique_ptr<TabStripModel::DetachedWebContents>>&
           web_contents) override;
+  void FollowSite(content::WebContents* web_contents) override;
 };
 
 #endif  // CHROME_BROWSER_UI_TABS_TEST_TAB_STRIP_MODEL_DELEGATE_H_
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view_browsertest.cc b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view_browsertest.cc
index e4fbca2..58b3355f 100644
--- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view_browsertest.cc
@@ -79,7 +79,7 @@
     bool is_app_paused = false;
     app_service_proxy()->AppRegistryCache().ForOneApp(
         app_id(), [&is_app_paused](const apps::AppUpdate& update) {
-          is_app_paused = (update.Paused() == apps::mojom::OptionalBool::kTrue);
+          is_app_paused = (update.Paused().value_or(false));
         });
     return is_app_paused;
   }
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
index 49c24295..3221f33e 100644
--- a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/extensions/extension_management.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
@@ -39,6 +40,7 @@
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/styled_label.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/view_class_properties.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
@@ -152,10 +154,12 @@
     case apps::mojom::AppType::kMacOs:
     case apps::mojom::AppType::kStandaloneBrowser:
     case apps::mojom::AppType::kRemote:
-    case apps::mojom::AppType::kStandaloneBrowserChromeApp:
     case apps::mojom::AppType::kExtension:
       NOTREACHED();
       break;
+    case apps::mojom::AppType::kStandaloneBrowserChromeApp:
+      // Do nothing special for kStandaloneBrowserChromeApp.
+      break;
     case apps::mojom::AppType::kArc:
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       InitializeViewForArcApp(profile, app_id);
@@ -339,3 +343,9 @@
   uninstall_dialog()->OnDialogClosed(true /* uninstall */, clear_site_data,
                                      report_abuse_checkbox);
 }
+
+void AppUninstallDialogView::OnWidgetInitialized() {
+  AppDialogView::OnWidgetInitialized();
+  GetOkButton()->SetProperty(views::kElementIdentifierKey,
+                             kAppUninstallDialogOkButtonId);
+}
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h
index 3e4b11c..8500bc2e 100644
--- a/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h
+++ b/chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h
@@ -63,6 +63,8 @@
   void OnDialogCancelled();
   void OnDialogAccepted();
 
+  void OnWidgetInitialized() override;
+
   raw_ptr<Profile> profile_;
 
   raw_ptr<views::Checkbox> report_abuse_checkbox_ = nullptr;
diff --git a/chrome/browser/ui/views/location_bar/intent_chip_button.cc b/chrome/browser/ui/views/location_bar/intent_chip_button.cc
index 2915edb..c2751a98 100644
--- a/chrome/browser/ui/views/location_bar/intent_chip_button.cc
+++ b/chrome/browser/ui/views/location_bar/intent_chip_button.cc
@@ -28,7 +28,8 @@
       browser_(browser),
       delegate_(delegate) {
   SetTheme(Theme::kLowVisibility);
-  ResetAnimation(1);
+  SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY);
+  SetTooltipText(l10n_util::GetStringUTF16(IDS_INTENT_CHIP_LABEL));
 }
 
 IntentChipButton::~IntentChipButton() = default;
@@ -38,6 +39,10 @@
   bool is_visible = GetShowChip();
   SetVisible(is_visible);
 
+  if (is_visible) {
+    ResetAnimation(!GetChipCollapsed());
+  }
+
   if (was_visible && !is_visible)
     IntentPickerBubbleView::CloseCurrentBubble();
 }
@@ -50,6 +55,11 @@
   return tab_helper && tab_helper->should_show_icon();
 }
 
+bool IntentChipButton::GetChipCollapsed() const {
+  auto* tab_helper = GetTabHelper();
+  return tab_helper && tab_helper->should_show_collapsed_chip();
+}
+
 void IntentChipButton::HandlePressed() {
   content::WebContents* web_contents =
       delegate_->GetWebContentsForPageActionIconView();
diff --git a/chrome/browser/ui/views/location_bar/intent_chip_button.h b/chrome/browser/ui/views/location_bar/intent_chip_button.h
index da80a6c..82663f0 100644
--- a/chrome/browser/ui/views/location_bar/intent_chip_button.h
+++ b/chrome/browser/ui/views/location_bar/intent_chip_button.h
@@ -30,6 +30,7 @@
 
  private:
   bool GetShowChip() const;
+  bool GetChipCollapsed() const;
   void HandlePressed();
 
   IntentPickerTabHelper* GetTabHelper() const;
diff --git a/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc b/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc
index c8cc2c7..23df63b 100644
--- a/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/intent_chip_button_browsertest.cc
@@ -175,3 +175,50 @@
   waiter.WaitIfNeededAndGet();
   ASSERT_TRUE(IntentPickerBubbleView::intent_picker_bubble());
 }
+
+IN_PROC_BROWSER_TEST_F(IntentChipButtonBrowserTest, ShowsIntentChipCollapsed) {
+  if (!HasRequiredAshVersionForLacros())
+    return;
+
+  InstallTestWebApp();
+
+  const GURL in_scope_url =
+      https_server().GetURL(GetAppUrlHost(), GetInScopeUrlPath());
+  const GURL out_of_scope_url =
+      https_server().GetURL(GetAppUrlHost(), GetOutOfScopeUrlPath());
+  const GURL separate_host_url =
+      https_server().GetURL(GetLaunchingPageHost(), GetLaunchingPagePath());
+
+  NavigateToLaunchingPage(browser());
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  // 1st appearance: Expanded.
+  ClickLinkAndWait(web_contents, in_scope_url, LinkTarget::SELF, "");
+  EXPECT_TRUE(GetIntentChip()->GetVisible());
+  EXPECT_FALSE(GetIntentChip()->is_fully_collapsed());
+
+  ClickLinkAndWait(web_contents, separate_host_url, LinkTarget::SELF, "");
+  EXPECT_FALSE(GetIntentChip()->GetVisible());
+
+  // 2nd appearance: Expanded.
+  ClickLinkAndWait(web_contents, in_scope_url, LinkTarget::SELF, "");
+  EXPECT_TRUE(GetIntentChip()->GetVisible());
+  EXPECT_FALSE(GetIntentChip()->is_fully_collapsed());
+
+  ClickLinkAndWait(web_contents, out_of_scope_url, LinkTarget::SELF, "");
+  EXPECT_FALSE(GetIntentChip()->GetVisible());
+
+  // 3rd appearance: Expanded.
+  ClickLinkAndWait(web_contents, in_scope_url, LinkTarget::SELF, "");
+  EXPECT_TRUE(GetIntentChip()->GetVisible());
+  EXPECT_FALSE(GetIntentChip()->is_fully_collapsed());
+
+  ClickLinkAndWait(web_contents, out_of_scope_url, LinkTarget::SELF, "");
+  EXPECT_FALSE(GetIntentChip()->GetVisible());
+
+  // 4th appearance: Collapsed.
+  ClickLinkAndWait(web_contents, in_scope_url, LinkTarget::SELF, "");
+  EXPECT_TRUE(GetIntentChip()->GetVisible());
+  EXPECT_TRUE(GetIntentChip()->is_fully_collapsed());
+}
diff --git a/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc b/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc
index ca52ffe..a5e546d2 100644
--- a/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc
+++ b/chrome/browser/ui/views/location_bar/omnibox_chip_button.cc
@@ -70,6 +70,7 @@
 }
 
 void OmniboxChipButton::ResetAnimation(double value) {
+  fully_collapsed_ = value == 0.0;
   animation_->Reset(value);
 }
 
diff --git a/chrome/browser/ui/webui/app_management/OWNERS b/chrome/browser/ui/webui/app_management/OWNERS
index 3e5930ef..75ba0e3 100644
--- a/chrome/browser/ui/webui/app_management/OWNERS
+++ b/chrome/browser/ui/webui/app_management/OWNERS
@@ -1,7 +1 @@
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
-
-jshikaram@chromium.org
-
-# For backup
-dominickn@chromium.org
+file://ui/webui/resources/cr_components/app_management/OWNERS
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc
index 17dd716d..8acf9d5 100644
--- a/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -291,70 +291,70 @@
 }
 
 void CertificatesHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "viewCertificate",
       base::BindRepeating(&CertificatesHandler::HandleViewCertificate,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getCaCertificateTrust",
       base::BindRepeating(&CertificatesHandler::HandleGetCATrust,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "editCaCertificateTrust",
       base::BindRepeating(&CertificatesHandler::HandleEditCATrust,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "cancelImportExportCertificate",
       base::BindRepeating(&CertificatesHandler::HandleCancelImportExportProcess,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "exportPersonalCertificate",
       base::BindRepeating(&CertificatesHandler::HandleExportPersonal,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "exportPersonalCertificatePasswordSelected",
       base::BindRepeating(
           &CertificatesHandler::HandleExportPersonalPasswordSelected,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importPersonalCertificate",
       base::BindRepeating(&CertificatesHandler::HandleImportPersonal,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importPersonalCertificatePasswordSelected",
       base::BindRepeating(
           &CertificatesHandler::HandleImportPersonalPasswordSelected,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importCaCertificate",
       base::BindRepeating(&CertificatesHandler::HandleImportCA,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importCaCertificateTrustSelected",
       base::BindRepeating(&CertificatesHandler::HandleImportCATrustSelected,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importServerCertificate",
       base::BindRepeating(&CertificatesHandler::HandleImportServer,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "exportCertificate",
       base::BindRepeating(&CertificatesHandler::HandleExportCertificate,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "deleteCertificate",
       base::BindRepeating(&CertificatesHandler::HandleDeleteCertificate,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "refreshCertificates",
       base::BindRepeating(&CertificatesHandler::HandleRefreshCertificates,
                           base::Unretained(this)));
@@ -404,8 +404,7 @@
   }
 }
 
-void CertificatesHandler::HandleViewCertificate(
-    base::Value::ConstListView args) {
+void CertificatesHandler::HandleViewCertificate(const base::Value::List& args) {
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 0 /* arg_index */);
   if (!cert_info)
@@ -416,14 +415,13 @@
       std::move(certs), web_ui()->GetWebContents(), GetParentWindow());
 }
 
-void CertificatesHandler::AssignWebUICallbackId(
-    base::Value::ConstListView args) {
+void CertificatesHandler::AssignWebUICallbackId(const base::Value::List& args) {
   CHECK_LE(1U, args.size());
   CHECK(webui_callback_id_.empty());
   webui_callback_id_ = args[0].GetString();
 }
 
-void CertificatesHandler::HandleGetCATrust(base::Value::ConstListView args) {
+void CertificatesHandler::HandleGetCATrust(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -451,7 +449,7 @@
   ResolveCallback(*ca_trust_info);
 }
 
-void CertificatesHandler::HandleEditCATrust(base::Value::ConstListView args) {
+void CertificatesHandler::HandleEditCATrust(const base::Value::List& args) {
   CHECK_EQ(5U, args.size());
   AssignWebUICallbackId(args);
 
@@ -490,8 +488,7 @@
   }
 }
 
-void CertificatesHandler::HandleExportPersonal(
-    base::Value::ConstListView args) {
+void CertificatesHandler::HandleExportPersonal(const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   AssignWebUICallbackId(args);
 
@@ -526,7 +523,7 @@
 }
 
 void CertificatesHandler::HandleExportPersonalPasswordSelected(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   AssignWebUICallbackId(args);
   password_ = UTF8ToUTF16(args[1].GetString());  // CHECKs if non-string.
@@ -580,8 +577,7 @@
   }
 }
 
-void CertificatesHandler::HandleImportPersonal(
-    base::Value::ConstListView args) {
+void CertificatesHandler::HandleImportPersonal(const base::Value::List& args) {
   // When the "allowed" value changes while user on the certificate manager
   // page, the UI doesn't update without page refresh and user can still see and
   // use import button. Because of this 'return' the button will do nothing.
@@ -669,7 +665,7 @@
 }
 
 void CertificatesHandler::HandleImportPersonalPasswordSelected(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   AssignWebUICallbackId(args);
   password_ = UTF8ToUTF16(args[1].GetString());  // CHECKs if non-string.
@@ -729,7 +725,7 @@
 }
 
 void CertificatesHandler::HandleCancelImportExportProcess(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   ImportExportCleanup();
 }
 
@@ -749,7 +745,7 @@
   select_file_dialog_ = nullptr;
 }
 
-void CertificatesHandler::HandleImportServer(base::Value::ConstListView args) {
+void CertificatesHandler::HandleImportServer(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   AssignWebUICallbackId(args);
 
@@ -816,7 +812,7 @@
   ImportExportCleanup();
 }
 
-void CertificatesHandler::HandleImportCA(base::Value::ConstListView args) {
+void CertificatesHandler::HandleImportCA(const base::Value::List& args) {
   // When the "allowed" value changes while user on the certificate manager
   // page, the UI doesn't update without page refresh and user can still see and
   // use import button. Because of this 'return' the button will do nothing.
@@ -881,7 +877,7 @@
 }
 
 void CertificatesHandler::HandleImportCATrustSelected(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(4U, args.size());
   AssignWebUICallbackId(args);
 
@@ -916,7 +912,7 @@
 }
 
 void CertificatesHandler::HandleExportCertificate(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 0 /* arg_index */);
   if (!cert_info)
@@ -929,7 +925,7 @@
 }
 
 void CertificatesHandler::HandleDeleteCertificate(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   AssignWebUICallbackId(args);
 
@@ -979,7 +975,7 @@
 }
 
 void CertificatesHandler::HandleRefreshCertificates(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   if (certificate_manager_model_) {
@@ -1140,9 +1136,8 @@
 }
 
 CertificateManagerModel::CertInfo*
-CertificatesHandler::GetCertInfoFromCallbackArgs(
-    base::Value::ConstListView args,
-    size_t arg_index) {
+CertificatesHandler::GetCertInfoFromCallbackArgs(const base::Value::List& args,
+                                                 size_t arg_index) {
   if (arg_index >= args.size())
     return nullptr;
   const auto& arg = args[arg_index];
diff --git a/chrome/browser/ui/webui/certificates_handler.h b/chrome/browser/ui/webui/certificates_handler.h
index 39e2ab4..624c1b0 100644
--- a/chrome/browser/ui/webui/certificates_handler.h
+++ b/chrome/browser/ui/webui/certificates_handler.h
@@ -84,18 +84,18 @@
 
  private:
   // View certificate.
-  void HandleViewCertificate(base::Value::ConstListView args);
+  void HandleViewCertificate(const base::Value::List& args);
 
   // Edit certificate authority trust values.  The sequence goes like:
   //  1. user clicks edit button -> Edit dialog is shown ->
   //  HandleGetCATrust -> Edit dialog is populated.
   //  2. User checks/unchecks boxes, and clicks ok -> HandleEditCATrust ->
   //  edit dialog is dismissed upon success.
-  void HandleGetCATrust(base::Value::ConstListView args);
-  void HandleEditCATrust(base::Value::ConstListView args);
+  void HandleGetCATrust(const base::Value::List& args);
+  void HandleEditCATrust(const base::Value::List& args);
 
   // Cleanup state stored during import or export process.
-  void HandleCancelImportExportProcess(base::Value::ConstListView args);
+  void HandleCancelImportExportProcess(const base::Value::List& args);
   void ImportExportCleanup();
 
   // Export to PKCS #12 file.  The sequence goes like:
@@ -108,9 +108,9 @@
   //  4. slots unlocked -> ExportPersonalSlotsUnlocked -> exports to memory
   //  buffer -> starts async write operation
   //  5. write finishes (or fails) -> ExportPersonalFileWritten
-  void HandleExportPersonal(base::Value::ConstListView args);
+  void HandleExportPersonal(const base::Value::List& args);
   void ExportPersonalFileSelected(const base::FilePath& path);
-  void HandleExportPersonalPasswordSelected(base::Value::ConstListView args);
+  void HandleExportPersonalPasswordSelected(const base::Value::List& args);
   void ExportPersonalSlotsUnlocked();
   void ExportPersonalFileWritten(const int* write_errno,
                                  const int* bytes_written);
@@ -130,10 +130,10 @@
   //  6a. if import succeeds -> ImportExportCleanup
   //  6b. if import fails -> show error, ImportExportCleanup
   //  TODO(mattm): allow retrying with different password
-  void HandleImportPersonal(base::Value::ConstListView args);
+  void HandleImportPersonal(const base::Value::List& args);
   void ImportPersonalFileSelected(const base::FilePath& path);
   void ImportPersonalFileRead(const int* read_errno, const std::string* data);
-  void HandleImportPersonalPasswordSelected(base::Value::ConstListView args);
+  void HandleImportPersonalPasswordSelected(const base::Value::List& args);
   void ImportPersonalSlotUnlocked();
 
   // Import Server certificates from file.  Sequence goes like:
@@ -143,7 +143,7 @@
   //  3. read completes -> ImportServerFileRead -> parse certs -> attempt import
   //  4a. if import succeeds -> ImportExportCleanup
   //  4b. if import fails -> show error, ImportExportCleanup
-  void HandleImportServer(base::Value::ConstListView args);
+  void HandleImportServer(const base::Value::List& args);
   void ImportServerFileSelected(const base::FilePath& path);
   void ImportServerFileRead(const int* read_errno, const std::string* data);
 
@@ -156,16 +156,16 @@
   //  4. user clicks ok -> HandleImportCATrustSelected -> attempt import
   //  5a. if import succeeds -> ImportExportCleanup
   //  5b. if import fails -> show error, ImportExportCleanup
-  void HandleImportCA(base::Value::ConstListView args);
+  void HandleImportCA(const base::Value::List& args);
   void ImportCAFileSelected(const base::FilePath& path);
   void ImportCAFileRead(const int* read_errno, const std::string* data);
-  void HandleImportCATrustSelected(base::Value::ConstListView args);
+  void HandleImportCATrustSelected(const base::Value::List& args);
 
   // Export a certificate.
-  void HandleExportCertificate(base::Value::ConstListView args);
+  void HandleExportCertificate(const base::Value::List& args);
 
   // Delete certificate and private key (if any).
-  void HandleDeleteCertificate(base::Value::ConstListView args);
+  void HandleDeleteCertificate(const base::Value::List& args);
 
   // Model initialization methods.
   void OnCertificateManagerModelCreated(
@@ -173,7 +173,7 @@
   void CertificateManagerModelReady();
 
   // Populate the trees in all the tabs.
-  void HandleRefreshCertificates(base::Value::ConstListView args);
+  void HandleRefreshCertificates(const base::Value::List& args);
 
   // Populate the given tab's tree.
   void PopulateTree(const std::string& tab_name, net::CertType type);
@@ -192,7 +192,7 @@
 
   // Assigns a new |webui_callback_id_|. Ensures that previous in-flight request
   // has been fulfilled.
-  void AssignWebUICallbackId(base::Value::ConstListView args);
+  void AssignWebUICallbackId(const base::Value::List& args);
 
   gfx::NativeWindow GetParentWindow();
 
@@ -200,7 +200,7 @@
   // |cert_info_id_map_| and looks up the corresponding CertInfo. If there is
   // an error parsing the list, returns nullptr.
   CertificateManagerModel::CertInfo* GetCertInfoFromCallbackArgs(
-      base::Value::ConstListView args,
+      const base::Value::List& args,
       size_t arg_index);
 
   // Returns true if it is allowed to display the list of client certificates
diff --git a/chrome/browser/ui/webui/crashes_ui.cc b/chrome/browser/ui/webui/crashes_ui.cc
index f272bed..072e82a 100644
--- a/chrome/browser/ui/webui/crashes_ui.cc
+++ b/chrome/browser/ui/webui/crashes_ui.cc
@@ -97,18 +97,18 @@
   void OnUploadListAvailable();
 
   // Asynchronously fetches the list of crashes. Called from JS.
-  void HandleRequestCrashes(base::Value::ConstListView args);
+  void HandleRequestCrashes(const base::Value::List& args);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Asynchronously triggers crash uploading. Called from JS.
-  void HandleRequestUploads(base::Value::ConstListView args);
+  void HandleRequestUploads(const base::Value::List& args);
 #endif
 
   // Sends the recent crashes list JS.
   void UpdateUI();
 
   // Asynchronously requests a user triggered upload. Called from JS.
-  void HandleRequestSingleCrashUpload(base::Value::ConstListView args);
+  void HandleRequestSingleCrashUpload(const base::Value::List& args);
 
   scoped_refptr<UploadList> upload_list_;
   bool list_available_;
@@ -127,25 +127,25 @@
 void CrashesDOMHandler::RegisterMessages() {
   upload_list_->Load(base::BindOnce(&CrashesDOMHandler::OnUploadListAvailable,
                                     base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       crash_reporter::kCrashesUIRequestCrashList,
       base::BindRepeating(&CrashesDOMHandler::HandleRequestCrashes,
                           base::Unretained(this)));
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       crash_reporter::kCrashesUIRequestCrashUpload,
       base::BindRepeating(&CrashesDOMHandler::HandleRequestUploads,
                           base::Unretained(this)));
 #endif
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       crash_reporter::kCrashesUIRequestSingleCrashUpload,
       base::BindRepeating(&CrashesDOMHandler::HandleRequestSingleCrashUpload,
                           base::Unretained(this)));
 }
 
-void CrashesDOMHandler::HandleRequestCrashes(base::Value::ConstListView args) {
+void CrashesDOMHandler::HandleRequestCrashes(const base::Value::List& args) {
   AllowJavascript();
   if (first_load_) {
     first_load_ = false;
@@ -159,7 +159,7 @@
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-void CrashesDOMHandler::HandleRequestUploads(base::Value::ConstListView args) {
+void CrashesDOMHandler::HandleRequestUploads(const base::Value::List& args) {
   chromeos::DebugDaemonClient* debugd_client =
       chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
   DCHECK(debugd_client);
@@ -235,7 +235,7 @@
 }
 
 void CrashesDOMHandler::HandleRequestSingleCrashUpload(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   // Only allow manual uploads if crash uploads aren’t disabled by policy.
   if (!ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled() &&
       IsMetricsReportingPolicyManaged()) {
diff --git a/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc b/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
index cb9de3f..9c6bfa37c 100644
--- a/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
+++ b/chrome/browser/ui/webui/feed_internals/feed_internals_ui.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/feature_list.h"
-#include "chrome/browser/feed/android/feed_service_factory.h"
+#include "chrome/browser/feed/feed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h"
 #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index df749a3d..562caa4 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -178,21 +178,21 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  void HandleInitUICommand(base::Value::ConstListView args);
-  void HandleInspectCommand(base::Value::ConstListView args);
-  void HandleInspectFallbackCommand(base::Value::ConstListView args);
-  void HandleActivateCommand(base::Value::ConstListView args);
-  void HandleCloseCommand(base::Value::ConstListView args);
-  void HandleReloadCommand(base::Value::ConstListView args);
-  void HandleOpenCommand(base::Value::ConstListView args);
-  void HandlePauseCommand(base::Value::ConstListView args);
-  void HandleInspectBrowserCommand(base::Value::ConstListView args);
+  void HandleInitUICommand(const base::Value::List& args);
+  void HandleInspectCommand(const base::Value::List& args);
+  void HandleInspectFallbackCommand(const base::Value::List& args);
+  void HandleActivateCommand(const base::Value::List& args);
+  void HandleCloseCommand(const base::Value::List& args);
+  void HandleReloadCommand(const base::Value::List& args);
+  void HandleOpenCommand(const base::Value::List& args);
+  void HandlePauseCommand(const base::Value::List& args);
+  void HandleInspectBrowserCommand(const base::Value::List& args);
   void HandleBooleanPrefChanged(const char* pref_name,
-                                base::Value::ConstListView args);
-  void HandlePortForwardingConfigCommand(base::Value::ConstListView args);
-  void HandleTCPDiscoveryConfigCommand(base::Value::ConstListView args);
-  void HandleOpenNodeFrontendCommand(base::Value::ConstListView args);
-  void HandleLaunchUIDevToolsCommand(base::Value::ConstListView args);
+                                const base::Value::List& args);
+  void HandlePortForwardingConfigCommand(const base::Value::List& args);
+  void HandleTCPDiscoveryConfigCommand(const base::Value::List& args);
+  void HandleOpenNodeFrontendCommand(const base::Value::List& args);
+  void HandleLaunchUIDevToolsCommand(const base::Value::List& args);
 
   void CreateNativeUIInspectionSession(const std::string& url);
   void OnFrontEndFinished();
@@ -203,82 +203,82 @@
 };
 
 void InspectMessageHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiInitUICommand,
       base::BindRepeating(&InspectMessageHandler::HandleInitUICommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiInspectCommand,
       base::BindRepeating(&InspectMessageHandler::HandleInspectCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiInspectFallbackCommand,
       base::BindRepeating(&InspectMessageHandler::HandleInspectFallbackCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiActivateCommand,
       base::BindRepeating(&InspectMessageHandler::HandleActivateCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiCloseCommand,
       base::BindRepeating(&InspectMessageHandler::HandleCloseCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiPauseCommand,
       base::BindRepeating(&InspectMessageHandler::HandlePauseCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiDiscoverUsbDevicesEnabledCommand,
       base::BindRepeating(&InspectMessageHandler::HandleBooleanPrefChanged,
                           base::Unretained(this),
                           &prefs::kDevToolsDiscoverUsbDevicesEnabled[0]));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiPortForwardingEnabledCommand,
       base::BindRepeating(&InspectMessageHandler::HandleBooleanPrefChanged,
                           base::Unretained(this),
                           &prefs::kDevToolsPortForwardingEnabled[0]));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiPortForwardingConfigCommand,
       base::BindRepeating(
           &InspectMessageHandler::HandlePortForwardingConfigCommand,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiDiscoverTCPTargetsEnabledCommand,
       base::BindRepeating(&InspectMessageHandler::HandleBooleanPrefChanged,
                           base::Unretained(this),
                           &prefs::kDevToolsDiscoverTCPTargetsEnabled[0]));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiLaunchUIDevToolsCommand,
       base::BindRepeating(&InspectMessageHandler::HandleLaunchUIDevToolsCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiTCPDiscoveryConfigCommand,
       base::BindRepeating(
           &InspectMessageHandler::HandleTCPDiscoveryConfigCommand,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiOpenNodeFrontendCommand,
       base::BindRepeating(&InspectMessageHandler::HandleOpenNodeFrontendCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiReloadCommand,
       base::BindRepeating(&InspectMessageHandler::HandleReloadCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiOpenCommand,
       base::BindRepeating(&InspectMessageHandler::HandleOpenCommand,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kInspectUiInspectBrowser,
       base::BindRepeating(&InspectMessageHandler::HandleInspectBrowserCommand,
                           base::Unretained(this)));
 }
 
-void InspectMessageHandler::HandleInitUICommand(base::Value::ConstListView) {
+void InspectMessageHandler::HandleInitUICommand(const base::Value::List&) {
   inspect_ui_->InitUI();
 }
 
-static bool ParseStringArgs(base::Value::ConstListView args,
+static bool ParseStringArgs(const base::Value::List& args,
                             std::string* arg0,
                             std::string* arg1,
                             std::string* arg2 = 0) {
@@ -305,7 +305,7 @@
 }
 
 void InspectMessageHandler::HandleInspectCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
@@ -313,7 +313,7 @@
 }
 
 void InspectMessageHandler::HandleInspectFallbackCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
@@ -321,30 +321,28 @@
 }
 
 void InspectMessageHandler::HandleActivateCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
     inspect_ui_->Activate(source, id);
 }
 
-void InspectMessageHandler::HandleCloseCommand(
-    base::Value::ConstListView args) {
+void InspectMessageHandler::HandleCloseCommand(const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
     inspect_ui_->Close(source, id);
 }
 
-void InspectMessageHandler::HandleReloadCommand(
-    base::Value::ConstListView args) {
+void InspectMessageHandler::HandleReloadCommand(const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
     inspect_ui_->Reload(source, id);
 }
 
-void InspectMessageHandler::HandleOpenCommand(base::Value::ConstListView args) {
+void InspectMessageHandler::HandleOpenCommand(const base::Value::List& args) {
   std::string source_id;
   std::string browser_id;
   std::string url;
@@ -352,8 +350,7 @@
     inspect_ui_->Open(source_id, browser_id, url);
 }
 
-void InspectMessageHandler::HandlePauseCommand(
-    base::Value::ConstListView args) {
+void InspectMessageHandler::HandlePauseCommand(const base::Value::List& args) {
   std::string source;
   std::string id;
   if (ParseStringArgs(args, &source, &id))
@@ -361,7 +358,7 @@
 }
 
 void InspectMessageHandler::HandleInspectBrowserCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   std::string source_id;
   std::string browser_id;
   std::string front_end;
@@ -373,7 +370,7 @@
 
 void InspectMessageHandler::HandleBooleanPrefChanged(
     const char* pref_name,
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   Profile* profile = Profile::FromWebUI(web_ui());
   if (!profile)
     return;
@@ -383,7 +380,7 @@
 }
 
 void InspectMessageHandler::HandlePortForwardingConfigCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   Profile* profile = Profile::FromWebUI(web_ui());
   if (!profile)
     return;
@@ -396,7 +393,7 @@
 }
 
 void InspectMessageHandler::HandleTCPDiscoveryConfigCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   Profile* profile = Profile::FromWebUI(web_ui());
   if (!profile)
     return;
@@ -406,7 +403,7 @@
 }
 
 void InspectMessageHandler::HandleOpenNodeFrontendCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   Profile* profile = Profile::FromWebUI(web_ui());
   if (!profile)
     return;
@@ -414,7 +411,7 @@
 }
 
 void InspectMessageHandler::HandleLaunchUIDevToolsCommand(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   // Start the UI DevTools server if needed and launch the front-end.
   if (!ChromeBrowserMainExtraPartsViews::Get()->GetUiDevToolsServerInstance()) {
     ChromeBrowserMainExtraPartsViews::Get()->CreateUiDevTools();
diff --git a/chrome/browser/ui/webui/local_state/local_state_ui.cc b/chrome/browser/ui/webui/local_state/local_state_ui.cc
index a49436d..01f3ab60 100644
--- a/chrome/browser/ui/webui/local_state/local_state_ui.cc
+++ b/chrome/browser/ui/webui/local_state/local_state_ui.cc
@@ -49,7 +49,7 @@
  private:
   // Called from JS when the page has loaded. Serializes local state prefs and
   // sends them to the page.
-  void HandleRequestJson(base::Value::ConstListView args);
+  void HandleRequestJson(const base::Value::List& args);
 };
 
 LocalStateUIHandler::LocalStateUIHandler() {
@@ -59,13 +59,13 @@
 }
 
 void LocalStateUIHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestJson",
       base::BindRepeating(&LocalStateUIHandler::HandleRequestJson,
                           base::Unretained(this)));
 }
 
-void LocalStateUIHandler::HandleRequestJson(base::Value::ConstListView args) {
+void LocalStateUIHandler::HandleRequestJson(const base::Value::List& args) {
   AllowJavascript();
   base::Value local_state_values =
       g_browser_process->local_state()->GetPreferenceValues(
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index a6f35fed..30cb878 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -83,17 +83,17 @@
   // Javascript message handlers:
   //--------------------------------
 
-  void OnReloadProxySettings(base::Value::ConstListView list);
-  void OnClearBadProxies(base::Value::ConstListView list);
-  void OnClearHostResolverCache(base::Value::ConstListView list);
-  void OnDomainSecurityPolicyDelete(base::Value::ConstListView list);
-  void OnHSTSQuery(base::Value::ConstListView list);
-  void OnHSTSAdd(base::Value::ConstListView list);
-  void OnExpectCTQuery(base::Value::ConstListView list);
-  void OnExpectCTAdd(base::Value::ConstListView list);
-  void OnExpectCTTestReport(base::Value::ConstListView list);
-  void OnCloseIdleSockets(base::Value::ConstListView list);
-  void OnFlushSocketPools(base::Value::ConstListView list);
+  void OnReloadProxySettings(const base::Value::List& list);
+  void OnClearBadProxies(const base::Value::List& list);
+  void OnClearHostResolverCache(const base::Value::List& list);
+  void OnDomainSecurityPolicyDelete(const base::Value::List& list);
+  void OnHSTSQuery(const base::Value::List& list);
+  void OnHSTSAdd(const base::Value::List& list);
+  void OnExpectCTQuery(const base::Value::List& list);
+  void OnExpectCTAdd(const base::Value::List& list);
+  void OnExpectCTTestReport(const base::Value::List& list);
+  void OnCloseIdleSockets(const base::Value::List& list);
+  void OnFlushSocketPools(const base::Value::List& list);
 
   raw_ptr<content::WebUI> web_ui_;
   base::WeakPtrFactory<NetInternalsMessageHandler> weak_factory_{this};
@@ -105,46 +105,46 @@
 void NetInternalsMessageHandler::RegisterMessages() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "reloadProxySettings",
       base::BindRepeating(&NetInternalsMessageHandler::OnReloadProxySettings,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearBadProxies",
       base::BindRepeating(&NetInternalsMessageHandler::OnClearBadProxies,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearHostResolverCache",
       base::BindRepeating(&NetInternalsMessageHandler::OnClearHostResolverCache,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "domainSecurityPolicyDelete",
       base::BindRepeating(
           &NetInternalsMessageHandler::OnDomainSecurityPolicyDelete,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "hstsQuery", base::BindRepeating(&NetInternalsMessageHandler::OnHSTSQuery,
                                        base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "hstsAdd", base::BindRepeating(&NetInternalsMessageHandler::OnHSTSAdd,
                                      base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "expectCTQuery",
       base::BindRepeating(&NetInternalsMessageHandler::OnExpectCTQuery,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "expectCTAdd",
       base::BindRepeating(&NetInternalsMessageHandler::OnExpectCTAdd,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "expectCTTestReport",
       base::BindRepeating(&NetInternalsMessageHandler::OnExpectCTTestReport,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "closeIdleSockets",
       base::BindRepeating(&NetInternalsMessageHandler::OnCloseIdleSockets,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "flushSocketPools",
       base::BindRepeating(&NetInternalsMessageHandler::OnFlushSocketPools,
                           base::Unretained(this)));
@@ -155,22 +155,22 @@
 }
 
 void NetInternalsMessageHandler::OnReloadProxySettings(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   GetNetworkContext()->ForceReloadProxyConfig(base::NullCallback());
 }
 
 void NetInternalsMessageHandler::OnClearBadProxies(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   GetNetworkContext()->ClearBadProxiesCache(base::NullCallback());
 }
 
 void NetInternalsMessageHandler::OnClearHostResolverCache(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   GetNetworkContext()->ClearHostCache(/*filter=*/nullptr, base::NullCallback());
 }
 
 void NetInternalsMessageHandler::OnDomainSecurityPolicyDelete(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   // |list| should be: [<domain to query>].
   const std::string* domain = list[0].GetIfString();
   DCHECK(domain);
@@ -182,7 +182,7 @@
       *domain, base::BindOnce(&IgnoreBoolCallback));
 }
 
-void NetInternalsMessageHandler::OnHSTSQuery(base::Value::ConstListView list) {
+void NetInternalsMessageHandler::OnHSTSQuery(const base::Value::List& list) {
   const std::string* callback_id = list[0].GetIfString();
   const std::string* domain = list[1].GetIfString();
   DCHECK(callback_id && domain);
@@ -200,7 +200,7 @@
   ResolveJavascriptCallback(base::Value(callback_id), result);
 }
 
-void NetInternalsMessageHandler::OnHSTSAdd(base::Value::ConstListView list) {
+void NetInternalsMessageHandler::OnHSTSAdd(const base::Value::List& list) {
   DCHECK_GE(2u, list.size());
 
   // |list| should be: [<domain to query>, <STS include subdomains>]
@@ -219,7 +219,7 @@
 }
 
 void NetInternalsMessageHandler::OnExpectCTQuery(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   const std::string* callback_id = list[0].GetIfString();
   const std::string* domain = list[1].GetIfString();
   DCHECK(callback_id && domain);
@@ -235,8 +235,7 @@
                      weak_factory_.GetWeakPtr(), *callback_id));
 }
 
-void NetInternalsMessageHandler::OnExpectCTAdd(
-    base::Value::ConstListView list) {
+void NetInternalsMessageHandler::OnExpectCTAdd(const base::Value::List& list) {
   // |list| should be: [<domain to add>, <report URI>, <enforce>].
   const std::string* domain = list[0].GetIfString();
   DCHECK(domain);
@@ -261,7 +260,7 @@
 }
 
 void NetInternalsMessageHandler::OnExpectCTTestReport(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   const std::string* callback_id = list[0].GetIfString();
   const std::string* report_uri_str = list[1].GetIfString();
   DCHECK(callback_id && report_uri_str);
@@ -286,12 +285,12 @@
 }
 
 void NetInternalsMessageHandler::OnFlushSocketPools(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   GetNetworkContext()->CloseAllConnections(base::NullCallback());
 }
 
 void NetInternalsMessageHandler::OnCloseIdleSockets(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   GetNetworkContext()->CloseIdleConnections(base::NullCallback());
 }
 
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
index b19a972..24fda6cf 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
@@ -23,12 +23,12 @@
 }
 
 void PrivacySandboxDialogHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "dialogActionOccurred",
       base::BindRepeating(
           &PrivacySandboxDialogHandler::HandleDialogActionOccurred,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "resizeDialog",
       base::BindRepeating(&PrivacySandboxDialogHandler::HandleResizeDialog,
                           base::Unretained(this)));
@@ -57,7 +57,7 @@
 }
 
 void PrivacySandboxDialogHandler::HandleDialogActionOccurred(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   auto action =
       static_cast<PrivacySandboxService::DialogAction>(args[0].GetInt());
@@ -85,7 +85,7 @@
 }
 
 void PrivacySandboxDialogHandler::HandleResizeDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   // Notify the service that the DOM was loaded and the dialog was shown to
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h
index 2a9ac3d..8a6ca6f7 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h
@@ -40,8 +40,8 @@
   FRIEND_TEST_ALL_PREFIXES(PrivacySandboxNoticeDialogHandlerTest,
                            HandleNoticeAcknowledge);
 
-  void HandleDialogActionOccurred(base::Value::ConstListView args);
-  void HandleResizeDialog(base::Value::ConstListView args);
+  void HandleDialogActionOccurred(const base::Value::List& args);
+  void HandleResizeDialog(const base::Value::List& args);
   void NotifyServiceAboutDialogAction(
       PrivacySandboxService::DialogAction action);
 
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
index 47d3cc7..c3f16e1 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
@@ -117,7 +117,7 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append(kDefaultDialogHeight);
-  handler()->HandleResizeDialog(args.GetListDeprecated());
+  handler()->HandleResizeDialog(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -137,16 +137,14 @@
   base::Value more_info_opened_args(base::Value::Type::LIST);
   more_info_opened_args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kConsentMoreInfoOpened));
-  handler()->HandleDialogActionOccurred(
-      more_info_opened_args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(more_info_opened_args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 
   base::Value more_info_closed_args(base::Value::Type::LIST);
   more_info_closed_args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kConsentMoreInfoClosed));
-  handler()->HandleDialogActionOccurred(
-      more_info_closed_args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(more_info_closed_args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -165,7 +163,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(PrivacySandboxService::DialogAction::kConsentAccepted));
-  handler()->HandleDialogActionOccurred(args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -184,7 +182,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(PrivacySandboxService::DialogAction::kConsentDeclined));
-  handler()->HandleDialogActionOccurred(args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -217,7 +215,7 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append(kDefaultDialogHeight);
-  handler()->HandleResizeDialog(args.GetListDeprecated());
+  handler()->HandleResizeDialog(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -237,7 +235,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kNoticeOpenSettings));
-  handler()->HandleDialogActionOccurred(args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
@@ -256,7 +254,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kNoticeAcknowledge));
-  handler()->HandleDialogActionOccurred(args.GetListDeprecated());
+  handler()->HandleDialogActionOccurred(args.GetList());
 
   ASSERT_EQ(0U, web_ui()->call_data().size());
 }
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 13f38231..ce96b17 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -268,77 +268,77 @@
 }
 
 void AboutHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "aboutPageReady", base::BindRepeating(&AboutHandler::HandlePageReady,
                                             base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "refreshUpdateStatus",
       base::BindRepeating(&AboutHandler::HandleRefreshUpdateStatus,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openFeedbackDialog",
       base::BindRepeating(&AboutHandler::HandleOpenFeedbackDialog,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openHelpPage", base::BindRepeating(&AboutHandler::HandleOpenHelpPage,
                                           base::Unretained(this)));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openDiagnostics",
       base::BindRepeating(&AboutHandler::HandleOpenDiagnostics,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openFirmwareUpdatesPage",
       base::BindRepeating(&AboutHandler::HandleOpenFirmwareUpdates,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openOsHelpPage", base::BindRepeating(&AboutHandler::HandleOpenOsHelpPage,
                                             base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setChannel", base::BindRepeating(&AboutHandler::HandleSetChannel,
                                         base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestUpdate", base::BindRepeating(&AboutHandler::HandleRequestUpdate,
                                            base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestUpdateOverCellular",
       base::BindRepeating(&AboutHandler::HandleRequestUpdateOverCellular,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getVersionInfo", base::BindRepeating(&AboutHandler::HandleGetVersionInfo,
                                             base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getRegulatoryInfo",
       base::BindRepeating(&AboutHandler::HandleGetRegulatoryInfo,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getChannelInfo", base::BindRepeating(&AboutHandler::HandleGetChannelInfo,
                                             base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "canChangeChannel",
       base::BindRepeating(&AboutHandler::HandleCanChangeChannel,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "refreshTPMFirmwareUpdateStatus",
       base::BindRepeating(&AboutHandler::HandleRefreshTPMFirmwareUpdateStatus,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getEndOfLifeInfo",
       base::BindRepeating(&AboutHandler::HandleGetEndOfLifeInfo,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "launchReleaseNotes",
       base::BindRepeating(&AboutHandler::HandleLaunchReleaseNotes,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "checkInternetConnection",
       base::BindRepeating(&AboutHandler::HandleCheckInternetConnection,
                           base::Unretained(this)));
 #endif
 #if BUILDFLAG(IS_MAC)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "promoteUpdater", base::BindRepeating(&AboutHandler::PromoteUpdater,
                                             base::Unretained(this)));
 #endif
@@ -399,11 +399,11 @@
   }
 }
 
-void AboutHandler::HandlePageReady(base::Value::ConstListView args) {
+void AboutHandler::HandlePageReady(const base::Value::List& args) {
   AllowJavascript();
 }
 
-void AboutHandler::HandleRefreshUpdateStatus(base::Value::ConstListView args) {
+void AboutHandler::HandleRefreshUpdateStatus(const base::Value::List& args) {
   RefreshUpdateStatus();
 }
 
@@ -419,12 +419,12 @@
 }
 
 #if BUILDFLAG(IS_MAC)
-void AboutHandler::PromoteUpdater(base::Value::ConstListView args) {
+void AboutHandler::PromoteUpdater(const base::Value::List& args) {
   version_updater_->PromoteUpdater();
 }
 #endif
 
-void AboutHandler::HandleOpenFeedbackDialog(base::Value::ConstListView args) {
+void AboutHandler::HandleOpenFeedbackDialog(const base::Value::List& args) {
   DCHECK(args.empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
@@ -432,7 +432,7 @@
                              chrome::kFeedbackSourceMdSettingsAboutPage);
 }
 
-void AboutHandler::HandleOpenHelpPage(base::Value::ConstListView args) {
+void AboutHandler::HandleOpenHelpPage(const base::Value::List& args) {
   DCHECK(args.empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
@@ -440,18 +440,18 @@
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-void AboutHandler::HandleOpenDiagnostics(base::Value::ConstListView args) {
+void AboutHandler::HandleOpenDiagnostics(const base::Value::List& args) {
   DCHECK(args.empty());
   chrome::ShowDiagnosticsApp(profile_);
 }
 
-void AboutHandler::HandleOpenFirmwareUpdates(base::Value::ConstListView args) {
+void AboutHandler::HandleOpenFirmwareUpdates(const base::Value::List& args) {
   DCHECK(args.empty());
   chrome::ShowFirmwareUpdatesApp(profile_);
 }
 
 void AboutHandler::HandleCheckInternetConnection(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
 
@@ -463,7 +463,7 @@
                             base::Value(network && network->IsOnline()));
 }
 
-void AboutHandler::HandleLaunchReleaseNotes(base::Value::ConstListView args) {
+void AboutHandler::HandleLaunchReleaseNotes(const base::Value::List& args) {
   DCHECK(args.empty());
   // We can always show the release notes since the Help app caches it, or can
   // show an appropriate error state (e.g. No internet connection).
@@ -472,14 +472,14 @@
                              apps::mojom::LaunchSource::kFromOtherApp);
 }
 
-void AboutHandler::HandleOpenOsHelpPage(base::Value::ConstListView args) {
+void AboutHandler::HandleOpenOsHelpPage(const base::Value::List& args) {
   DCHECK(args.empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
   chrome::ShowHelp(browser, chrome::HELP_SOURCE_WEBUI_CHROME_OS);
 }
 
-void AboutHandler::HandleSetChannel(base::Value::ConstListView args) {
+void AboutHandler::HandleSetChannel(const base::Value::List& args) {
   DCHECK(args.size() == 2);
 
   if (!CanChangeChannel(profile_)) {
@@ -504,7 +504,7 @@
   }
 }
 
-void AboutHandler::HandleGetVersionInfo(base::Value::ConstListView args) {
+void AboutHandler::HandleGetVersionInfo(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
   base::ThreadPool::PostTaskAndReplyWithResult(
@@ -520,7 +520,7 @@
   ResolveJavascriptCallback(base::Value(callback_id), *version_info);
 }
 
-void AboutHandler::HandleGetRegulatoryInfo(base::Value::ConstListView args) {
+void AboutHandler::HandleGetRegulatoryInfo(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
 
@@ -531,7 +531,7 @@
                      weak_factory_.GetWeakPtr(), callback_id));
 }
 
-void AboutHandler::HandleGetChannelInfo(base::Value::ConstListView args) {
+void AboutHandler::HandleGetChannelInfo(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
   version_updater_->GetChannel(
@@ -540,7 +540,7 @@
                      weak_factory_.GetWeakPtr(), callback_id));
 }
 
-void AboutHandler::HandleCanChangeChannel(base::Value::ConstListView args) {
+void AboutHandler::HandleCanChangeChannel(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
   ResolveJavascriptCallback(base::Value(callback_id),
@@ -573,12 +573,12 @@
   ResolveJavascriptCallback(base::Value(callback_id), *channel_info);
 }
 
-void AboutHandler::HandleRequestUpdate(base::Value::ConstListView args) {
+void AboutHandler::HandleRequestUpdate(const base::Value::List& args) {
   RequestUpdate();
 }
 
 void AboutHandler::HandleRequestUpdateOverCellular(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
 
   const std::string& update_version = args[0].GetString();
@@ -598,7 +598,7 @@
 }
 
 void AboutHandler::HandleRefreshTPMFirmwareUpdateStatus(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   ash::tpm_firmware_update::GetAvailableUpdateModes(
       base::BindOnce(&AboutHandler::RefreshTPMFirmwareUpdateStatus,
                      weak_factory_.GetWeakPtr()),
@@ -612,7 +612,7 @@
   FireWebUIListener("tpm-firmware-update-status-changed", *event);
 }
 
-void AboutHandler::HandleGetEndOfLifeInfo(base::Value::ConstListView args) {
+void AboutHandler::HandleGetEndOfLifeInfo(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
   version_updater_->GetEolInfo(base::BindOnce(&AboutHandler::OnGetEndOfLifeInfo,
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index 31c900c..2113639 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -65,52 +65,52 @@
 
   // Called once the JS page is ready to be called, serves as a signal to the
   // handler to register C++ observers.
-  void HandlePageReady(base::Value::ConstListView args);
+  void HandlePageReady(const base::Value::List& args);
 
   // Called once when the page has loaded. On ChromeOS, this gets the current
   // update status. On other platforms, it will request and perform an update
   // (if one is available).
-  void HandleRefreshUpdateStatus(base::Value::ConstListView args);
+  void HandleRefreshUpdateStatus(const base::Value::List& args);
   void RefreshUpdateStatus();
 
 #if BUILDFLAG(IS_MAC)
   // Promotes the updater for all users.
-  void PromoteUpdater(base::Value::ConstListView args);
+  void PromoteUpdater(const base::Value::List& args);
 #endif
 
   // Opens the feedback dialog. |args| must be empty.
-  void HandleOpenFeedbackDialog(base::Value::ConstListView args);
+  void HandleOpenFeedbackDialog(const base::Value::List& args);
 
   // Opens the help page. |args| must be empty.
-  void HandleOpenHelpPage(base::Value::ConstListView args);
+  void HandleOpenHelpPage(const base::Value::List& args);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Checks if ReleaseNotes is enabled.
-  void HandleGetEnabledReleaseNotes(base::Value::ConstListView args);
+  void HandleGetEnabledReleaseNotes(const base::Value::List& args);
 
   // Checks if system is connected to internet.
-  void HandleCheckInternetConnection(base::Value::ConstListView args);
+  void HandleCheckInternetConnection(const base::Value::List& args);
 
   // Opens the release notes app. |args| must be empty.
-  void HandleLaunchReleaseNotes(base::Value::ConstListView args);
+  void HandleLaunchReleaseNotes(const base::Value::List& args);
 
   // Opens the help page. |args| must be empty.
-  void HandleOpenOsHelpPage(base::Value::ConstListView args);
+  void HandleOpenOsHelpPage(const base::Value::List& args);
 
   // Sets the release track version.
-  void HandleSetChannel(base::Value::ConstListView args);
+  void HandleSetChannel(const base::Value::List& args);
 
   // Retrieves OS, ARC and firmware versions.
-  void HandleGetVersionInfo(base::Value::ConstListView args);
+  void HandleGetVersionInfo(const base::Value::List& args);
   void OnGetVersionInfoReady(
       std::string callback_id,
       std::unique_ptr<base::DictionaryValue> version_info);
 
   // Retrieves channel info.
-  void HandleGetChannelInfo(base::Value::ConstListView args);
+  void HandleGetChannelInfo(const base::Value::List& args);
 
   // Checks whether we can change the current channel.
-  void HandleCanChangeChannel(base::Value::ConstListView args);
+  void HandleCanChangeChannel(const base::Value::List& args);
 
   // Callbacks for version_updater_->GetChannel calls.
   void OnGetCurrentChannel(std::string callback_id,
@@ -120,11 +120,11 @@
                           const std::string& target_channel);
 
   // Checks for and applies update, triggered by JS.
-  void HandleRequestUpdate(base::Value::ConstListView args);
+  void HandleRequestUpdate(const base::Value::List& args);
 
   // Checks for and applies update over cellular connection, triggered by JS.
   // Update version and size should be included in the list of arguments.
-  void HandleRequestUpdateOverCellular(base::Value::ConstListView args);
+  void HandleRequestUpdateOverCellular(const base::Value::List& args);
 
   // Checks for and applies update over cellular connection.
   void RequestUpdateOverCellular(const std::string& update_version,
@@ -132,7 +132,7 @@
 
   // Called once when the page has loaded to retrieve the TPM firmware update
   // status.
-  void HandleRefreshTPMFirmwareUpdateStatus(base::Value::ConstListView args);
+  void HandleRefreshTPMFirmwareUpdateStatus(const base::Value::List& args);
   void RefreshTPMFirmwareUpdateStatus(
       const std::set<ash::tpm_firmware_update::Mode>& modes);
 #endif
@@ -155,11 +155,11 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  void HandleOpenDiagnostics(base::Value::ConstListView args);
+  void HandleOpenDiagnostics(const base::Value::List& args);
 
-  void HandleOpenFirmwareUpdates(base::Value::ConstListView args);
+  void HandleOpenFirmwareUpdates(const base::Value::List& args);
 
-  void HandleGetRegulatoryInfo(base::Value::ConstListView args);
+  void HandleGetRegulatoryInfo(const base::Value::List& args);
 
   // Callback for when the directory with the regulatory label image and alt
   // text has been found.
@@ -175,7 +175,7 @@
   // date. Will asynchronously resolve the provided callback with an object
   // containing a boolean indicating whether the device has reached/passed End
   // of Life, and an End Of Life description formatted with the month and year.
-  void HandleGetEndOfLifeInfo(base::Value::ConstListView args);
+  void HandleGetEndOfLifeInfo(const base::Value::List& args);
 
   // Callbacks for version_updater_->GetEolInfo calls.
   void OnGetEndOfLifeInfo(std::string callback_id,
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
index d8ef993..f12bac8d83 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.cc
@@ -26,11 +26,11 @@
 AccessibilityMainHandler::~AccessibilityMainHandler() = default;
 
 void AccessibilityMainHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "a11yPageReady",
       base::BindRepeating(&AccessibilityMainHandler::HandleA11yPageReady,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "confirmA11yImageLabels",
       base::BindRepeating(
           &AccessibilityMainHandler::HandleCheckAccessibilityImageLabels,
@@ -53,13 +53,13 @@
 }
 
 void AccessibilityMainHandler::HandleA11yPageReady(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   SendScreenReaderStateChanged();
 }
 
 void AccessibilityMainHandler::HandleCheckAccessibilityImageLabels(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   // When the user tries to enable the feature, show the modal dialog. The
   // dialog will disable the feature again if it is not accepted.
   content::WebContents* web_contents = web_ui()->GetWebContents();
diff --git a/chrome/browser/ui/webui/settings/accessibility_main_handler.h b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
index 0796a2a3..41ad698 100644
--- a/chrome/browser/ui/webui/settings/accessibility_main_handler.h
+++ b/chrome/browser/ui/webui/settings/accessibility_main_handler.h
@@ -28,8 +28,8 @@
   void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
-  void HandleA11yPageReady(base::Value::ConstListView args);
-  void HandleCheckAccessibilityImageLabels(base::Value::ConstListView args);
+  void HandleA11yPageReady(const base::Value::List& args);
+  void HandleCheckAccessibilityImageLabels(const base::Value::List& args);
 
  private:
   void SendScreenReaderStateChanged();
diff --git a/chrome/browser/ui/webui/settings/appearance_handler.cc b/chrome/browser/ui/webui/settings/appearance_handler.cc
index c952297..4a74c67 100644
--- a/chrome/browser/ui/webui/settings/appearance_handler.cc
+++ b/chrome/browser/ui/webui/settings/appearance_handler.cc
@@ -25,28 +25,28 @@
 void AppearanceHandler::OnJavascriptDisallowed() {}
 
 void AppearanceHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "useDefaultTheme",
       base::BindRepeating(&AppearanceHandler::HandleUseDefaultTheme,
                           base::Unretained(this)));
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
 #if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "useSystemTheme",
       base::BindRepeating(&AppearanceHandler::HandleUseSystemTheme,
                           base::Unretained(this)));
 #endif
 }
 
-void AppearanceHandler::HandleUseDefaultTheme(base::Value::ConstListView args) {
+void AppearanceHandler::HandleUseDefaultTheme(const base::Value::List& args) {
   ThemeServiceFactory::GetForProfile(profile_)->UseDefaultTheme();
 }
 
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
 #if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)
-void AppearanceHandler::HandleUseSystemTheme(base::Value::ConstListView args) {
+void AppearanceHandler::HandleUseSystemTheme(const base::Value::List& args) {
   if (profile_->IsChild())
     NOTREACHED();
   else
diff --git a/chrome/browser/ui/webui/settings/appearance_handler.h b/chrome/browser/ui/webui/settings/appearance_handler.h
index 50a9cda3..bb5c9a8 100644
--- a/chrome/browser/ui/webui/settings/appearance_handler.h
+++ b/chrome/browser/ui/webui/settings/appearance_handler.h
@@ -36,13 +36,13 @@
 
  private:
   // Changes the UI theme of the browser to the default theme.
-  void HandleUseDefaultTheme(base::Value::ConstListView args);
+  void HandleUseDefaultTheme(const base::Value::List& args);
 
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
   // Changes the UI theme of the browser to the system (GTK+) theme.
-  void HandleUseSystemTheme(base::Value::ConstListView args);
+  void HandleUseSystemTheme(const base::Value::List& args);
 #endif
 
   raw_ptr<Profile> profile_;  // Weak pointer.
diff --git a/chrome/browser/ui/webui/settings/ash/app_management/OWNERS b/chrome/browser/ui/webui/settings/ash/app_management/OWNERS
index 023044c..75ba0e3 100644
--- a/chrome/browser/ui/webui/settings/ash/app_management/OWNERS
+++ b/chrome/browser/ui/webui/settings/ash/app_management/OWNERS
@@ -1,4 +1 @@
-jshikaram@chromium.org
-
-# For backup
-dominickn@chromium.org
+file://ui/webui/resources/cr_components/app_management/OWNERS
diff --git a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
index 5ae6944..ffeadfe0 100644
--- a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
+++ b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
@@ -63,30 +63,30 @@
 BrowserLifetimeHandler::~BrowserLifetimeHandler() {}
 
 void BrowserLifetimeHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "restart", base::BindRepeating(&BrowserLifetimeHandler::HandleRestart,
                                      base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "relaunch", base::BindRepeating(&BrowserLifetimeHandler::HandleRelaunch,
                                       base::Unretained(this)));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "signOutAndRestart",
       base::BindRepeating(&BrowserLifetimeHandler::HandleSignOutAndRestart,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "factoryReset",
       base::BindRepeating(&BrowserLifetimeHandler::HandleFactoryReset,
                           base::Unretained(this)));
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "shouldShowRelaunchConfirmationDialog",
       base::BindRepeating(
           &BrowserLifetimeHandler::HandleShouldShowRelaunchConfirmationDialog,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getRelaunchConfirmationDialogDescription",
       base::BindRepeating(&BrowserLifetimeHandler::
                               HandleGetRelaunchConfirmationDialogDescription,
@@ -94,25 +94,23 @@
 #endif
 }
 
-void BrowserLifetimeHandler::HandleRestart(base::Value::ConstListView args) {
+void BrowserLifetimeHandler::HandleRestart(const base::Value::List& args) {
   chrome::AttemptRestart();
 }
 
-void BrowserLifetimeHandler::HandleRelaunch(base::Value::ConstListView args) {
+void BrowserLifetimeHandler::HandleRelaunch(const base::Value::List& args) {
   chrome::AttemptRelaunch();
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void BrowserLifetimeHandler::HandleSignOutAndRestart(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   chrome::AttemptUserExit();
 }
 
-void BrowserLifetimeHandler::HandleFactoryReset(
-    base::Value::ConstListView args) {
-  base::Value::ConstListView args_list = args;
-  CHECK_EQ(1U, args_list.size());
-  bool tpm_firmware_update_requested = args_list[0].GetBool();
+void BrowserLifetimeHandler::HandleFactoryReset(const base::Value::List& args) {
+  CHECK_EQ(1U, args.size());
+  bool tpm_firmware_update_requested = args[0].GetBool();
 
   if (tpm_firmware_update_requested) {
     ash::tpm_firmware_update::GetAvailableUpdateModes(
@@ -141,7 +139,7 @@
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
 void BrowserLifetimeHandler::HandleGetRelaunchConfirmationDialogDescription(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   const base::Value& callback_id = args[0];
   size_t incognito_count = BrowserList::GetIncognitoBrowserCount();
@@ -154,7 +152,7 @@
 }
 
 void BrowserLifetimeHandler::HandleShouldShowRelaunchConfirmationDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   const base::Value& callback_id = args[0];
   base::Value result = base::Value(BrowserList::GetIncognitoBrowserCount() > 0);
diff --git a/chrome/browser/ui/webui/settings/browser_lifetime_handler.h b/chrome/browser/ui/webui/settings/browser_lifetime_handler.h
index 46c7fb4..ddedcba0 100644
--- a/chrome/browser/ui/webui/settings/browser_lifetime_handler.h
+++ b/chrome/browser/ui/webui/settings/browser_lifetime_handler.h
@@ -25,18 +25,18 @@
   void OnJavascriptDisallowed() override {}
 
  private:
-  void HandleRestart(base::Value::ConstListView args);
-  void HandleRelaunch(base::Value::ConstListView args);
+  void HandleRestart(const base::Value::List& args);
+  void HandleRelaunch(const base::Value::List& args);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  void HandleSignOutAndRestart(base::Value::ConstListView args);
-  void HandleFactoryReset(base::Value::ConstListView args);
+  void HandleSignOutAndRestart(const base::Value::List& args);
+  void HandleFactoryReset(const base::Value::List& args);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   void HandleGetRelaunchConfirmationDialogDescription(
-      base::Value::ConstListView args);
+      const base::Value::List& args);
   void HandleShouldShowRelaunchConfirmationDialog(
-      base::Value::ConstListView args);
+      const base::Value::List& args);
 #endif
 };
 
diff --git a/chrome/browser/ui/webui/settings/captions_handler.cc b/chrome/browser/ui/webui/settings/captions_handler.cc
index 8449926..d4d40db 100644
--- a/chrome/browser/ui/webui/settings/captions_handler.cc
+++ b/chrome/browser/ui/webui/settings/captions_handler.cc
@@ -41,11 +41,11 @@
 }
 
 void CaptionsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openSystemCaptionsDialog",
       base::BindRepeating(&CaptionsHandler::HandleOpenSystemCaptionsDialog,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "liveCaptionSectionReady",
       base::BindRepeating(&CaptionsHandler::HandleLiveCaptionSectionReady,
                           base::Unretained(this)));
@@ -62,12 +62,12 @@
 }
 
 void CaptionsHandler::HandleLiveCaptionSectionReady(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 }
 
 void CaptionsHandler::HandleOpenSystemCaptionsDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   captions::CaptionSettingsDialog::ShowCaptionSettingsDialog();
 #endif
diff --git a/chrome/browser/ui/webui/settings/captions_handler.h b/chrome/browser/ui/webui/settings/captions_handler.h
index fbb1af9..e353336d 100644
--- a/chrome/browser/ui/webui/settings/captions_handler.h
+++ b/chrome/browser/ui/webui/settings/captions_handler.h
@@ -29,8 +29,8 @@
   void OnJavascriptDisallowed() override;
 
  private:
-  void HandleLiveCaptionSectionReady(base::Value::ConstListView args);
-  void HandleOpenSystemCaptionsDialog(base::Value::ConstListView args);
+  void HandleLiveCaptionSectionReady(const base::Value::List& args);
+  void HandleOpenSystemCaptionsDialog(const base::Value::List& args);
 
   // SodaInstaller::Observer overrides:
   void OnSodaInstalled() override;
diff --git a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
index 73e85aac..8c891e39 100644
--- a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
@@ -110,37 +110,37 @@
 }
 
 void ChromeCleanupHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "registerChromeCleanerObserver",
       base::BindRepeating(
           &ChromeCleanupHandler::HandleRegisterChromeCleanerObserver,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "startScanning",
       base::BindRepeating(&ChromeCleanupHandler::HandleStartScanning,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "restartComputer",
       base::BindRepeating(&ChromeCleanupHandler::HandleRestartComputer,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "startCleanup",
       base::BindRepeating(&ChromeCleanupHandler::HandleStartCleanup,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "notifyShowDetails",
       base::BindRepeating(&ChromeCleanupHandler::HandleNotifyShowDetails,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "notifyChromeCleanupLearnMoreClicked",
       base::BindRepeating(
           &ChromeCleanupHandler::HandleNotifyChromeCleanupLearnMoreClicked,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getMoreItemsPluralString",
       base::BindRepeating(&ChromeCleanupHandler::HandleGetMoreItemsPluralString,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getItemsToRemovePluralString",
       base::BindRepeating(
           &ChromeCleanupHandler::HandleGetItemsToRemovePluralString,
@@ -190,7 +190,7 @@
 }
 
 void ChromeCleanupHandler::HandleRegisterChromeCleanerObserver(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(0U, args.size());
 
   base::RecordAction(
@@ -201,8 +201,7 @@
                     base::Value(controller_->IsAllowedByPolicy()));
 }
 
-void ChromeCleanupHandler::HandleStartScanning(
-    base::Value::ConstListView args) {
+void ChromeCleanupHandler::HandleStartScanning(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   bool allow_logs_upload = false;
   if (args[0].is_bool())
@@ -221,7 +220,7 @@
 }
 
 void ChromeCleanupHandler::HandleRestartComputer(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(0U, args.size());
 
   base::RecordAction(
@@ -230,7 +229,7 @@
   controller_->Reboot();
 }
 
-void ChromeCleanupHandler::HandleStartCleanup(base::Value::ConstListView args) {
+void ChromeCleanupHandler::HandleStartCleanup(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   bool allow_logs_upload = false;
   if (args[0].is_bool())
@@ -252,7 +251,7 @@
 }
 
 void ChromeCleanupHandler::HandleNotifyShowDetails(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   bool details_section_visible = false;
   if (args[0].is_bool())
@@ -268,7 +267,7 @@
 }
 
 void ChromeCleanupHandler::HandleNotifyChromeCleanupLearnMoreClicked(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(0U, args.size());
 
   base::RecordAction(
@@ -276,21 +275,21 @@
 }
 
 void ChromeCleanupHandler::HandleGetMoreItemsPluralString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
 #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
   GetPluralString(IDS_SETTINGS_RESET_CLEANUP_DETAILS_MORE, args);
 #endif  // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
 void ChromeCleanupHandler::HandleGetItemsToRemovePluralString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
 #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
   GetPluralString(IDS_SETTINGS_RESET_CLEANUP_DETAILS_ITEMS_TO_BE_REMOVED, args);
 #endif  // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
 }
 
 void ChromeCleanupHandler::GetPluralString(int id,
-                                           base::Value::ConstListView args) {
+                                           const base::Value::List& args) {
   const auto& list = args;
   CHECK_EQ(2U, list.size());
 
diff --git a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.h b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.h
index 8eeaea7c..66ca15b9 100644
--- a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.h
+++ b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.h
@@ -53,38 +53,37 @@
   // Callback for the "registerChromeCleanerObserver" message. This registers
   // this object as an observer of the Chrome Cleanup global state and
   // and retrieves the current cleanup state.
-  void HandleRegisterChromeCleanerObserver(base::Value::ConstListView args);
+  void HandleRegisterChromeCleanerObserver(const base::Value::List& args);
 
   // Callback for the "startScanning" message to start scanning the user's
   // system to detect unwanted software.
-  void HandleStartScanning(base::Value::ConstListView args);
+  void HandleStartScanning(const base::Value::List& args);
 
   // Callback for the "restartComputer" message to finalize the cleanup with a
   // system restart.
-  void HandleRestartComputer(base::Value::ConstListView args);
+  void HandleRestartComputer(const base::Value::List& args);
 
   // Callback for the "startCleanup" message to start removing unwanted
   // software from the user's computer.
-  void HandleStartCleanup(base::Value::ConstListView args);
+  void HandleStartCleanup(const base::Value::List& args);
 
   // Callback for the "showDetails" message that notifies Chrome about whether
   // the user expanded or closed the details section of the page.
-  void HandleNotifyShowDetails(base::Value::ConstListView args);
+  void HandleNotifyShowDetails(const base::Value::List& args);
 
   // Callback for the "chromeCleanupLearnMore" message that notifies Chrome that
   // the "learn more" link was clicked.
-  void HandleNotifyChromeCleanupLearnMoreClicked(
-      base::Value::ConstListView args);
+  void HandleNotifyChromeCleanupLearnMoreClicked(const base::Value::List& args);
 
   // Callback for the "getMoreItemsPluralString" message, that obtains the text
   // string for the "show more" items on the detailed view.
-  void HandleGetMoreItemsPluralString(base::Value::ConstListView args);
+  void HandleGetMoreItemsPluralString(const base::Value::List& args);
 
   // Callback for the "getItemsToRemovePluralString" message, that obtains the
   // text string for the detailed view when user-initiated cleanups are enabled.
-  void HandleGetItemsToRemovePluralString(base::Value::ConstListView args);
+  void HandleGetItemsToRemovePluralString(const base::Value::List& args);
 
-  void GetPluralString(int id, base::Value::ConstListView args);
+  void GetPluralString(int id, const base::Value::List& args);
 
   // Raw pointer to a singleton. Must outlive this object.
   raw_ptr<safe_browsing::ChromeCleanerController> controller_;
diff --git a/chrome/browser/ui/webui/settings/downloads_handler.cc b/chrome/browser/ui/webui/settings/downloads_handler.cc
index 119796d..a918e80 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler.cc
+++ b/chrome/browser/ui/webui/settings/downloads_handler.cc
@@ -42,26 +42,26 @@
 }
 
 void DownloadsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "initializeDownloads",
       base::BindRepeating(&DownloadsHandler::HandleInitialize,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "resetAutoOpenFileTypes",
       base::BindRepeating(&DownloadsHandler::HandleResetAutoOpenFileTypes,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "selectDownloadLocation",
       base::BindRepeating(&DownloadsHandler::HandleSelectDownloadLocation,
                           base::Unretained(this)));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getDownloadLocationText",
       base::BindRepeating(&DownloadsHandler::HandleGetDownloadLocationText,
                           base::Unretained(this)));
 #endif
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setDownloadsConnectionAccountLink",
       base::BindRepeating(
           &DownloadsHandler::HandleSetDownloadsConnectionAccountLink,
@@ -85,7 +85,7 @@
   pref_registrar_.RemoveAll();
 }
 
-void DownloadsHandler::HandleInitialize(base::Value::ConstListView args) {
+void DownloadsHandler::HandleInitialize(const base::Value::List& args) {
   AllowJavascript();
   SendDownloadsConnectionPolicyToJavascript();
   SendAutoOpenDownloadsToJavascript();
@@ -100,14 +100,14 @@
 }
 
 void DownloadsHandler::HandleResetAutoOpenFileTypes(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   base::RecordAction(UserMetricsAction("Options_ResetAutoOpenFiles"));
   content::DownloadManager* manager = profile_->GetDownloadManager();
   DownloadPrefs::FromDownloadManager(manager)->ResetAutoOpenByUser();
 }
 
 void DownloadsHandler::HandleSelectDownloadLocation(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   // Early return if the select folder dialog is already active.
   if (select_folder_dialog_)
     return;
@@ -143,7 +143,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void DownloadsHandler::HandleGetDownloadLocationText(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(2U, args.size());
   const std::string& callback_id = args[0].GetString();
@@ -183,7 +183,7 @@
 }
 
 void DownloadsHandler::HandleSetDownloadsConnectionAccountLink(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(IsDownloadsConnectionPolicyEnabled());
   CHECK_EQ(1U, args.size());
   bool enable_link = args[0].GetBool();
diff --git a/chrome/browser/ui/webui/settings/downloads_handler.h b/chrome/browser/ui/webui/settings/downloads_handler.h
index 2f98eb8..157088e 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler.h
+++ b/chrome/browser/ui/webui/settings/downloads_handler.h
@@ -38,16 +38,16 @@
 
   // Callback for the "initializeDownloads" message. This starts observers and
   // retrieves the current browser state.
-  void HandleInitialize(base::Value::ConstListView args);
+  void HandleInitialize(const base::Value::List& args);
 
   void SendAutoOpenDownloadsToJavascript();
 
   // Resets the list of filetypes that are auto-opened after download.
-  void HandleResetAutoOpenFileTypes(base::Value::ConstListView args);
+  void HandleResetAutoOpenFileTypes(const base::Value::List& args);
 
   // Callback for the "selectDownloadLocation" message. This will prompt the
   // user for a destination folder using platform-specific APIs.
-  void HandleSelectDownloadLocation(base::Value::ConstListView args);
+  void HandleSelectDownloadLocation(const base::Value::List& args);
 
   // SelectFileDialog::Listener implementation.
   void FileSelected(const base::FilePath& path,
@@ -59,7 +59,7 @@
   // Callback for the "getDownloadLocationText" message.  Converts actual
   // paths in chromeos to values suitable to display to users.
   // E.g. /home/chronos/u-<hash>/Downloads => "Downloads".
-  void HandleGetDownloadLocationText(base::Value::ConstListView args);
+  void HandleGetDownloadLocationText(const base::Value::List& args);
 #endif
 
   bool IsDownloadsConnectionPolicyEnabled() const;
@@ -70,7 +70,7 @@
   // there is an existing linked account and arg is false, this removes the
   // linked account info and stored authentication tokens; otherwise, this
   // merely sends the latest stored account info.
-  void HandleSetDownloadsConnectionAccountLink(base::Value::ConstListView args);
+  void HandleSetDownloadsConnectionAccountLink(const base::Value::List& args);
   // Callback for file system connector code, since prompting the user to sign
   // in is async.
   void OnDownloadsConnectionAccountLinkSet(bool success);
diff --git a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
index a16211503..89f1057 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/downloads_handler_unittest.cc
@@ -167,7 +167,7 @@
     expected_init_callback_count += param.connection_init_enabled;
 
     base::ListValue args;
-    handler()->HandleInitialize(args.GetListDeprecated());
+    handler()->HandleInitialize(args.GetList());
 
     EXPECT_TRUE(handler()->IsJavascriptAllowed());
     ASSERT_EQ(web_ui_call_data().size(), expected_init_callback_count);
diff --git a/chrome/browser/ui/webui/settings/extension_control_handler.cc b/chrome/browser/ui/webui/settings/extension_control_handler.cc
index 0d0a118..a878835 100644
--- a/chrome/browser/ui/webui/settings/extension_control_handler.cc
+++ b/chrome/browser/ui/webui/settings/extension_control_handler.cc
@@ -19,14 +19,14 @@
 ExtensionControlHandler::~ExtensionControlHandler() {}
 
 void ExtensionControlHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "disableExtension",
       base::BindRepeating(&ExtensionControlHandler::HandleDisableExtension,
                           base::Unretained(this)));
 }
 
 void ExtensionControlHandler::HandleDisableExtension(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const std::string& extension_id = args[0].GetString();
   extensions::ExtensionService* extension_service =
       extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()))
diff --git a/chrome/browser/ui/webui/settings/extension_control_handler.h b/chrome/browser/ui/webui/settings/extension_control_handler.h
index 0a8a888..960d399 100644
--- a/chrome/browser/ui/webui/settings/extension_control_handler.h
+++ b/chrome/browser/ui/webui/settings/extension_control_handler.h
@@ -26,7 +26,7 @@
  private:
   // Handler for the "disableExtension" message. Extension ID is passed as the
   // single string argument.
-  void HandleDisableExtension(base::Value::ConstListView args);
+  void HandleDisableExtension(const base::Value::List& args);
 };
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/font_handler.cc b/chrome/browser/ui/webui/settings/font_handler.cc
index 2d113ce..371a26e 100644
--- a/chrome/browser/ui/webui/settings/font_handler.cc
+++ b/chrome/browser/ui/webui/settings/font_handler.cc
@@ -38,7 +38,7 @@
 FontHandler::~FontHandler() {}
 
 void FontHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "fetchFontsData", base::BindRepeating(&FontHandler::HandleFetchFontsData,
                                             base::Unretained(this)));
 }
@@ -47,7 +47,7 @@
 
 void FontHandler::OnJavascriptDisallowed() {}
 
-void FontHandler::HandleFetchFontsData(base::Value::ConstListView args) {
+void FontHandler::HandleFetchFontsData(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
 
diff --git a/chrome/browser/ui/webui/settings/font_handler.h b/chrome/browser/ui/webui/settings/font_handler.h
index 3d30449..bfbdb3a8 100644
--- a/chrome/browser/ui/webui/settings/font_handler.h
+++ b/chrome/browser/ui/webui/settings/font_handler.h
@@ -32,7 +32,7 @@
 
  private:
   // Handler for script asking for font information.
-  void HandleFetchFontsData(base::Value::ConstListView args);
+  void HandleFetchFontsData(const base::Value::List& args);
 
   // Callback to handle fonts loading.
   void FontListHasLoaded(std::string callback_id,
diff --git a/chrome/browser/ui/webui/settings/hats_handler.cc b/chrome/browser/ui/webui/settings/hats_handler.cc
index 652b51a..575f37c 100644
--- a/chrome/browser/ui/webui/settings/hats_handler.cc
+++ b/chrome/browser/ui/webui/settings/hats_handler.cc
@@ -48,14 +48,14 @@
 HatsHandler::~HatsHandler() = default;
 
 void HatsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "trustSafetyInteractionOccurred",
       base::BindRepeating(&HatsHandler::HandleTrustSafetyInteractionOccurred,
                           base::Unretained(this)));
 }
 
 void HatsHandler::HandleTrustSafetyInteractionOccurred(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
diff --git a/chrome/browser/ui/webui/settings/hats_handler.h b/chrome/browser/ui/webui/settings/hats_handler.h
index 9fe4d4f5..563dd3c 100644
--- a/chrome/browser/ui/webui/settings/hats_handler.h
+++ b/chrome/browser/ui/webui/settings/hats_handler.h
@@ -24,7 +24,7 @@
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
 
-  void HandleTrustSafetyInteractionOccurred(base::Value::ConstListView args);
+  void HandleTrustSafetyInteractionOccurred(const base::Value::List& args);
 
  private:
   friend class HatsHandlerTest;
diff --git a/chrome/browser/ui/webui/settings/hats_handler_unittest.cc b/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
index 38b30126..07dd3bc 100644
--- a/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/hats_handler_unittest.cc
@@ -112,12 +112,12 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::USED_PRIVACY_CARD));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
   task_environment()->RunUntilIdle();
 
-  args.GetListDeprecated()[0] = base::Value(
+  args.GetList()[0] = base::Value(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::RAN_SAFETY_CHECK));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
   task_environment()->RunUntilIdle();
 }
 
@@ -130,7 +130,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       HatsHandler::TrustSafetyInteraction::COMPLETED_PRIVACY_GUIDE));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
   task_environment()->RunUntilIdle();
 }
 
@@ -164,7 +164,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::USED_PRIVACY_CARD));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
   task_environment()->RunUntilIdle();
 }
 
@@ -185,7 +185,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       HatsHandler::TrustSafetyInteraction::OPENED_PRIVACY_SANDBOX));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
   task_environment()->RunUntilIdle();
 }
 
@@ -198,12 +198,12 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::USED_PRIVACY_CARD));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
 
   EXPECT_CALL(*mock_sentiment_service_, RanSafetyCheck()).Times(1);
-  args.GetListDeprecated()[0] = base::Value(
+  args.GetList()[0] = base::Value(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::RAN_SAFETY_CHECK));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
 }
 
 TEST_F(HatsHandlerNoSandboxTest, TrustSafetySentimentInteractions) {
@@ -217,12 +217,12 @@
   args.Append(
       static_cast<int>(HatsHandler::TrustSafetyInteraction::RAN_SAFETY_CHECK));
   profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxPageViewed, true);
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
 
   EXPECT_CALL(*mock_sentiment_service_, OpenedPasswordManager(web_contents()));
-  args.GetListDeprecated()[0] = base::Value(static_cast<int>(
+  args.GetList()[0] = base::Value(static_cast<int>(
       HatsHandler::TrustSafetyInteraction::OPENED_PASSWORD_MANAGER));
-  handler()->HandleTrustSafetyInteractionOccurred(args.GetListDeprecated());
+  handler()->HandleTrustSafetyInteractionOccurred(args.GetList());
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/import_data_handler.cc b/chrome/browser/ui/webui/settings/import_data_handler.cc
index 9c3d6769..a2d1ae56 100644
--- a/chrome/browser/ui/webui/settings/import_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/import_data_handler.cc
@@ -55,14 +55,14 @@
 void ImportDataHandler::RegisterMessages() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "initializeImportDialog",
       base::BindRepeating(&ImportDataHandler::HandleInitializeImportDialog,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importData", base::BindRepeating(&ImportDataHandler::HandleImportData,
                                         base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "importFromBookmarksFile",
       base::BindRepeating(&ImportDataHandler::HandleImportFromBookmarksFile,
                           base::Unretained(this)));
@@ -103,7 +103,7 @@
                                     source_profile.importer_type);
 }
 
-void ImportDataHandler::HandleImportData(base::Value::ConstListView args) {
+void ImportDataHandler::HandleImportData(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   const auto& list = args;
   CHECK_GE(list.size(), 2u);
@@ -145,7 +145,7 @@
 }
 
 void ImportDataHandler::HandleInitializeImportDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -160,7 +160,7 @@
 }
 
 void ImportDataHandler::HandleImportFromBookmarksFile(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   if (select_file_dialog_)
diff --git a/chrome/browser/ui/webui/settings/import_data_handler.h b/chrome/browser/ui/webui/settings/import_data_handler.h
index 445e400..f10aab2 100644
--- a/chrome/browser/ui/webui/settings/import_data_handler.h
+++ b/chrome/browser/ui/webui/settings/import_data_handler.h
@@ -43,15 +43,15 @@
 
   // Handler for the "importData" message. First argument is the selected
   // browser index, and second argument is the types of data to import.
-  void HandleImportData(base::Value::ConstListView args);
+  void HandleImportData(const base::Value::List& args);
 
   // Handler for the "initializeImportDialog" message. First argument is a
   // callback id.
-  void HandleInitializeImportDialog(base::Value::ConstListView args);
+  void HandleInitializeImportDialog(const base::Value::List& args);
 
   // Handler for the "importFromBookmarksFile" message. Opens a file selection
   // dialog to choose the bookmarks HTML file.
-  void HandleImportFromBookmarksFile(base::Value::ConstListView args);
+  void HandleImportFromBookmarksFile(const base::Value::List& args);
 
   void SendBrowserProfileData(const std::string& callback_id);
 
diff --git a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
index 3c4981ac..e0a91ae 100644
--- a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
@@ -28,27 +28,27 @@
 IncompatibleApplicationsHandler::~IncompatibleApplicationsHandler() = default;
 
 void IncompatibleApplicationsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestIncompatibleApplicationsList",
       base::BindRepeating(&IncompatibleApplicationsHandler::
                               HandleRequestIncompatibleApplicationsList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "startApplicationUninstallation",
       base::BindRepeating(&IncompatibleApplicationsHandler::
                               HandleStartApplicationUninstallation,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getSubtitlePluralString",
       base::BindRepeating(
           &IncompatibleApplicationsHandler::HandleGetSubtitlePluralString,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getSubtitleNoAdminRightsPluralString",
       base::BindRepeating(&IncompatibleApplicationsHandler::
                               HandleGetSubtitleNoAdminRightsPluralString,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getListTitlePluralString",
       base::BindRepeating(
           &IncompatibleApplicationsHandler::HandleGetListTitlePluralString,
@@ -62,7 +62,7 @@
 }
 
 void IncompatibleApplicationsHandler::HandleRequestIncompatibleApplicationsList(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
 
   AllowJavascript();
@@ -116,7 +116,7 @@
 }
 
 void IncompatibleApplicationsHandler::HandleStartApplicationUninstallation(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1u, args.size());
   base::RecordAction(base::UserMetricsAction(
       "IncompatibleApplicationsPage.UninstallationStarted"));
@@ -127,27 +127,26 @@
 }
 
 void IncompatibleApplicationsHandler::HandleGetSubtitlePluralString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   GetPluralString(IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE,
                   args);
 }
 
 void IncompatibleApplicationsHandler::
-    HandleGetSubtitleNoAdminRightsPluralString(
-        base::Value::ConstListView args) {
+    HandleGetSubtitleNoAdminRightsPluralString(const base::Value::List& args) {
   GetPluralString(
       IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_SUBPAGE_SUBTITLE_NO_ADMIN_RIGHTS,
       args);
 }
 
 void IncompatibleApplicationsHandler::HandleGetListTitlePluralString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   GetPluralString(IDS_SETTINGS_INCOMPATIBLE_APPLICATIONS_LIST_TITLE, args);
 }
 
 void IncompatibleApplicationsHandler::GetPluralString(
     int id,
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
 
   const base::Value& callback_id = args[0];
diff --git a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h
index 10d2cb9..f25749d 100644
--- a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h
+++ b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.h
@@ -34,17 +34,16 @@
 
  private:
   // Sends the list of incompatible applications to the caller via a promise.
-  void HandleRequestIncompatibleApplicationsList(
-      base::Value::ConstListView args);
+  void HandleRequestIncompatibleApplicationsList(const base::Value::List& args);
 
   // Initiates the uninstallation of the application passed using |args|.
-  void HandleStartApplicationUninstallation(base::Value::ConstListView args);
+  void HandleStartApplicationUninstallation(const base::Value::List& args);
 
-  void HandleGetSubtitlePluralString(base::Value::ConstListView args);
+  void HandleGetSubtitlePluralString(const base::Value::List& args);
   void HandleGetSubtitleNoAdminRightsPluralString(
-      base::Value::ConstListView args);
-  void HandleGetListTitlePluralString(base::Value::ConstListView args);
-  void GetPluralString(int id, base::Value::ConstListView args);
+      const base::Value::List& args);
+  void HandleGetListTitlePluralString(const base::Value::List& args);
+  void GetPluralString(int id, const base::Value::List& args);
 
   // Callback for the registry key watchers.
   void OnApplicationRemoved(
diff --git a/chrome/browser/ui/webui/settings/languages_handler.cc b/chrome/browser/ui/webui/settings/languages_handler.cc
index edbc3e89..8560ce8 100644
--- a/chrome/browser/ui/webui/settings/languages_handler.cc
+++ b/chrome/browser/ui/webui/settings/languages_handler.cc
@@ -33,18 +33,18 @@
 LanguagesHandler::~LanguagesHandler() = default;
 
 void LanguagesHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getProspectiveUILanguage",
       base::BindRepeating(&LanguagesHandler::HandleGetProspectiveUILanguage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setProspectiveUILanguage",
       base::BindRepeating(&LanguagesHandler::HandleSetProspectiveUILanguage,
                           base::Unretained(this)));
 }
 
 void LanguagesHandler::HandleGetProspectiveUILanguage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const base::Value& callback_id = args[0];
 
   AllowJavascript();
@@ -64,7 +64,7 @@
 }
 
 void LanguagesHandler::HandleSetProspectiveUILanguage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1U, args.size());
 
diff --git a/chrome/browser/ui/webui/settings/languages_handler.h b/chrome/browser/ui/webui/settings/languages_handler.h
index 97f98b7..b89bac2 100644
--- a/chrome/browser/ui/webui/settings/languages_handler.h
+++ b/chrome/browser/ui/webui/settings/languages_handler.h
@@ -37,11 +37,11 @@
   // Returns the prospective UI language. May not match the actual UI language,
   // depending on the user's permissions and whether the language is substituted
   // for another locale.
-  void HandleGetProspectiveUILanguage(base::Value::ConstListView args);
+  void HandleGetProspectiveUILanguage(const base::Value::List& args);
 
   // Changes the preferred UI language, provided the user is allowed to do so.
   // The actual UI language will not change until the next restart.
-  void HandleSetProspectiveUILanguage(base::Value::ConstListView args);
+  void HandleSetProspectiveUILanguage(const base::Value::List& args);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   Profile* profile_;  // Weak pointer.
diff --git a/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc b/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
index 3cbc69f6..4c8d0a95 100644
--- a/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
+++ b/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
@@ -30,11 +30,11 @@
 MetricsReportingHandler::~MetricsReportingHandler() {}
 
 void MetricsReportingHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getMetricsReporting",
       base::BindRepeating(&MetricsReportingHandler::HandleGetMetricsReporting,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setMetricsReportingEnabled",
       base::BindRepeating(
           &MetricsReportingHandler::HandleSetMetricsReportingEnabled,
@@ -55,7 +55,7 @@
 }
 
 void MetricsReportingHandler::HandleGetMetricsReporting(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_GT(args.size(), 0u);
   const base::Value& callback_id = args[0];
@@ -85,7 +85,7 @@
 }
 
 void MetricsReportingHandler::HandleSetMetricsReportingEnabled(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   if (IsMetricsReportingPolicyManaged()) {
     NOTREACHED();
     // NOTE: ChangeMetricsReportingState() already checks whether metrics
diff --git a/chrome/browser/ui/webui/settings/metrics_reporting_handler.h b/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
index 9dc4198..2130839 100644
--- a/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
+++ b/chrome/browser/ui/webui/settings/metrics_reporting_handler.h
@@ -43,7 +43,7 @@
  protected:
   // Handler for "getMetricsReporting" message. No arguments. Protected for
   // testing.
-  void HandleGetMetricsReporting(base::Value::ConstListView args);
+  void HandleGetMetricsReporting(const base::Value::List& args);
 
  private:
   // Describes the state of metrics reporting in a base::DictionaryValue.
@@ -52,7 +52,7 @@
 
   // Handler for "setMetricsReportingEnabled" message. Passed a single,
   // |enabled| boolean argument.
-  void HandleSetMetricsReportingEnabled(base::Value::ConstListView args);
+  void HandleSetMetricsReportingEnabled(const base::Value::List& args);
 
   // Called when the local state pref controlling metrics reporting changes.
   void OnPrefChanged(const std::string& pref_name);
diff --git a/chrome/browser/ui/webui/settings/metrics_reporting_handler_unittest.cc b/chrome/browser/ui/webui/settings/metrics_reporting_handler_unittest.cc
index a0aba8e..4fe4c389 100644
--- a/chrome/browser/ui/webui/settings/metrics_reporting_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/metrics_reporting_handler_unittest.cc
@@ -45,7 +45,7 @@
 
     base::ListValue args;
     args.Append(std::make_unique<base::Value>(1));
-    handler()->HandleGetMetricsReporting(args.GetListDeprecated());
+    handler()->HandleGetMetricsReporting(args.GetList());
 
     EXPECT_TRUE(handler()->IsJavascriptAllowed());
     EXPECT_EQ(1u, test_web_ui()->call_data().size());
diff --git a/chrome/browser/ui/webui/settings/native_certificates_handler.cc b/chrome/browser/ui/webui/settings/native_certificates_handler.cc
index db9fe39..63b9a2e 100644
--- a/chrome/browser/ui/webui/settings/native_certificates_handler.cc
+++ b/chrome/browser/ui/webui/settings/native_certificates_handler.cc
@@ -17,7 +17,7 @@
 NativeCertificatesHandler::~NativeCertificatesHandler() {}
 
 void NativeCertificatesHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "showManageSSLCertificates",
       base::BindRepeating(
           &NativeCertificatesHandler::HandleShowManageSSLCertificates,
@@ -25,7 +25,7 @@
 }
 
 void NativeCertificatesHandler::HandleShowManageSSLCertificates(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   base::RecordAction(base::UserMetricsAction("Options_ManageSSLCertificates"));
   settings_utils::ShowManageSSLCertificates(web_ui()->GetWebContents());
 }
diff --git a/chrome/browser/ui/webui/settings/native_certificates_handler.h b/chrome/browser/ui/webui/settings/native_certificates_handler.h
index b0cddee..fa83f2b 100644
--- a/chrome/browser/ui/webui/settings/native_certificates_handler.h
+++ b/chrome/browser/ui/webui/settings/native_certificates_handler.h
@@ -26,7 +26,7 @@
 
   // Callback for the "showManageSSLCertificates" message. This will invoke
   // an appropriate certificate management action based on the platform.
-  void HandleShowManageSSLCertificates(base::Value::ConstListView args);
+  void HandleShowManageSSLCertificates(const base::Value::List& args);
 };
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/on_startup_handler.cc b/chrome/browser/ui/webui/settings/on_startup_handler.cc
index bb1f77d..dbc605a 100644
--- a/chrome/browser/ui/webui/settings/on_startup_handler.cc
+++ b/chrome/browser/ui/webui/settings/on_startup_handler.cc
@@ -39,11 +39,11 @@
 }
 
 void OnStartupHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getNtpExtension",
       base::BindRepeating(&OnStartupHandler::HandleGetNtpExtension,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "validateStartupPage",
       base::BindRepeating(&OnStartupHandler::HandleValidateStartupPage,
                           base::Unretained(this)));
@@ -79,7 +79,7 @@
   return dict;
 }
 
-void OnStartupHandler::HandleGetNtpExtension(base::Value::ConstListView args) {
+void OnStartupHandler::HandleGetNtpExtension(const base::Value::List& args) {
   const base::Value& callback_id = args[0];
   AllowJavascript();
 
@@ -87,7 +87,7 @@
 }
 
 void OnStartupHandler::HandleValidateStartupPage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(args.size(), 2U);
   const base::Value& callback_id = args[0];
   const std::string& url_string = args[1].GetString();
diff --git a/chrome/browser/ui/webui/settings/on_startup_handler.h b/chrome/browser/ui/webui/settings/on_startup_handler.h
index a79d88a..98003851 100644
--- a/chrome/browser/ui/webui/settings/on_startup_handler.h
+++ b/chrome/browser/ui/webui/settings/on_startup_handler.h
@@ -44,11 +44,11 @@
   base::Value GetNtpExtension();
 
   // Handler for the "getNtpExtension" message. No arguments.
-  void HandleGetNtpExtension(base::Value::ConstListView args);
+  void HandleGetNtpExtension(const base::Value::List& args);
 
   // Handles the "validateStartupPage" message. Passed a URL that might be a
   // valid startup page.
-  void HandleValidateStartupPage(base::Value::ConstListView args);
+  void HandleValidateStartupPage(const base::Value::List& args);
 
   // extensions::ExtensionRegistryObserver.
   void OnExtensionUnloaded(content::BrowserContext* browser_context,
diff --git a/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc b/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
index 9c316e5..5feea12e 100644
--- a/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/on_startup_handler_unittest.cc
@@ -80,7 +80,7 @@
 TEST_F(OnStartupHandlerTest, HandleGetNtpExtension) {
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kCallbackId);
-  handler()->HandleGetNtpExtension(list_args.GetListDeprecated());
+  handler()->HandleGetNtpExtension(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
@@ -98,7 +98,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kCallbackId);
   list_args.Append("http://example.com");
-  handler()->HandleValidateStartupPage(list_args.GetListDeprecated());
+  handler()->HandleValidateStartupPage(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
@@ -119,7 +119,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kCallbackId);
   list_args.Append("@");
-  handler()->HandleValidateStartupPage(list_args.GetListDeprecated());
+  handler()->HandleValidateStartupPage(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 33cc05b99..9b7ce4a 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -148,7 +148,7 @@
 }
 
 // Guaranteed to return a valid result (or crash).
-void ParseConfigurationArguments(base::Value::ConstListView args,
+void ParseConfigurationArguments(const base::Value::List& args,
                                  SyncConfigInfo* config,
                                  const base::Value** callback_id) {
   const std::string& json = args[1].GetString();
@@ -225,72 +225,72 @@
 
 void PeopleHandler::RegisterMessages() {
   InitializeSyncBlocker();
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupDidClosePage",
       base::BindRepeating(&PeopleHandler::OnDidClosePage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupSetDatatypes",
       base::BindRepeating(&PeopleHandler::HandleSetDatatypes,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupSetEncryptionPassphrase",
       base::BindRepeating(&PeopleHandler::HandleSetEncryptionPassphrase,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupSetDecryptionPassphrase",
       base::BindRepeating(&PeopleHandler::HandleSetDecryptionPassphrase,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupShowSetupUI",
       base::BindRepeating(&PeopleHandler::HandleShowSyncSetupUI,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupGetSyncStatus",
       base::BindRepeating(&PeopleHandler::HandleGetSyncStatus,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncPrefsDispatch",
       base::BindRepeating(&PeopleHandler::HandleSyncPrefsDispatch,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncTrustedVaultBannerStateDispatch",
       base::BindRepeating(&PeopleHandler::HandleTrustedVaultBannerStateDispatch,
                           base::Unretained(this)));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "AttemptUserExit",
       base::BindRepeating(&PeopleHandler::HandleAttemptUserExit,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "TurnOnSync", base::BindRepeating(&PeopleHandler::HandleTurnOnSync,
                                         base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "TurnOffSync", base::BindRepeating(&PeopleHandler::HandleTurnOffSync,
                                          base::Unretained(this)));
 #else
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupStartSignIn",
       base::BindRepeating(&PeopleHandler::HandleStartSignin,
                           base::Unretained(this)));
 #endif
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupSignout", base::BindRepeating(&PeopleHandler::HandleSignout,
                                               base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupPauseSync", base::BindRepeating(&PeopleHandler::HandlePauseSync,
                                                 base::Unretained(this)));
 #endif
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupGetStoredAccounts",
       base::BindRepeating(&PeopleHandler::HandleGetStoredAccounts,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncSetupStartSyncingWithEmail",
       base::BindRepeating(&PeopleHandler::HandleStartSyncingWithEmail,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "SyncStartKeyRetrieval",
       base::BindRepeating(&PeopleHandler::HandleStartKeyRetrieval,
                           base::Unretained(this)));
@@ -373,7 +373,7 @@
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
-void PeopleHandler::OnDidClosePage(base::Value::ConstListView args) {
+void PeopleHandler::OnDidClosePage(const base::Value::List& args) {
   // Don't mark setup as complete if "didAbort" is true, or if authentication
   // is still needed.
   if (!args[0].GetBool() && !IsProfileAuthNeededOrHasErrors()) {
@@ -389,7 +389,7 @@
              : nullptr;
 }
 
-void PeopleHandler::HandleSetDatatypes(base::Value::ConstListView args) {
+void PeopleHandler::HandleSetDatatypes(const base::Value::List& args) {
   SyncConfigInfo configuration;
   const base::Value* callback_id = nullptr;
   ParseConfigurationArguments(args, &configuration, &callback_id);
@@ -425,7 +425,7 @@
     ProfileMetrics::LogProfileSyncInfo(ProfileMetrics::SYNC_CHOOSE);
 }
 
-void PeopleHandler::HandleGetStoredAccounts(base::Value::ConstListView args) {
+void PeopleHandler::HandleGetStoredAccounts(const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1U, args.size());
   const base::Value& callback_id = args[0];
@@ -467,8 +467,7 @@
   return accounts;
 }
 
-void PeopleHandler::HandleStartSyncingWithEmail(
-    base::Value::ConstListView args) {
+void PeopleHandler::HandleStartSyncingWithEmail(const base::Value::List& args) {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   DCHECK(AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_));
   const base::Value& email = args[0];
@@ -492,7 +491,7 @@
 }
 
 void PeopleHandler::HandleSetEncryptionPassphrase(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const base::Value& callback_id = args[0];
 
   // Check the SyncService is up and running before retrieving SyncUserSettings,
@@ -533,7 +532,7 @@
 }
 
 void PeopleHandler::HandleSetDecryptionPassphrase(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const base::Value& callback_id = args[0];
 
   // Check the SyncService is up and running before retrieving SyncUserSettings,
@@ -561,7 +560,7 @@
   ResolveJavascriptCallback(callback_id, base::Value(successfully_set));
 }
 
-void PeopleHandler::HandleShowSyncSetupUI(base::Value::ConstListView args) {
+void PeopleHandler::HandleShowSyncSetupUI(const base::Value::List& args) {
   AllowJavascript();
 
   syncer::SyncService* service = GetSyncService();
@@ -593,17 +592,17 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // On ChromeOS, we need to sign out the user session to fix an auth error, so
 // the user goes through the real signin flow to generate a new auth token.
-void PeopleHandler::HandleAttemptUserExit(base::Value::ConstListView args) {
+void PeopleHandler::HandleAttemptUserExit(const base::Value::List& args) {
   DVLOG(1) << "Signing out the user to fix a sync error.";
   chrome::AttemptUserExit();
 }
 
-void PeopleHandler::HandleTurnOnSync(base::Value::ConstListView args) {
+void PeopleHandler::HandleTurnOnSync(const base::Value::List& args) {
   // TODO(https://crbug.com/1050677)
   NOTIMPLEMENTED();
 }
 
-void PeopleHandler::HandleTurnOffSync(base::Value::ConstListView args) {
+void PeopleHandler::HandleTurnOffSync(const base::Value::List& args) {
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   DCHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSync));
   DCHECK(signin_util::IsUserSignoutAllowedForProfile(profile_));
@@ -615,7 +614,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-void PeopleHandler::HandleStartSignin(base::Value::ConstListView args) {
+void PeopleHandler::HandleStartSignin(const base::Value::List& args) {
   AllowJavascript();
 
   // Should only be called if the user is not already signed in, has a auth
@@ -629,7 +628,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-void PeopleHandler::HandleSignout(base::Value::ConstListView args) {
+void PeopleHandler::HandleSignout(const base::Value::List& args) {
   bool delete_profile = false;
   if (args[0].is_bool())
     delete_profile = args[0].GetBool();
@@ -677,7 +676,7 @@
   }
 }
 
-void PeopleHandler::HandlePauseSync(base::Value::ConstListView args) {
+void PeopleHandler::HandlePauseSync(const base::Value::List& args) {
   DCHECK(AccountConsistencyModeManager::IsDiceEnabledForProfile(profile_));
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
@@ -688,7 +687,7 @@
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
-void PeopleHandler::HandleStartKeyRetrieval(base::Value::ConstListView args) {
+void PeopleHandler::HandleStartKeyRetrieval(const base::Value::List& args) {
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
   if (!browser)
@@ -698,7 +697,7 @@
       browser, syncer::TrustedVaultUserActionTriggerForUMA::kSettings);
 }
 
-void PeopleHandler::HandleGetSyncStatus(base::Value::ConstListView args) {
+void PeopleHandler::HandleGetSyncStatus(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -707,13 +706,13 @@
   ResolveJavascriptCallback(callback_id, GetSyncStatusDictionary());
 }
 
-void PeopleHandler::HandleSyncPrefsDispatch(base::Value::ConstListView args) {
+void PeopleHandler::HandleSyncPrefsDispatch(const base::Value::List& args) {
   AllowJavascript();
   PushSyncPrefs();
 }
 
 void PeopleHandler::HandleTrustedVaultBannerStateDispatch(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   PushTrustedVaultBannerState();
 }
diff --git a/chrome/browser/ui/webui/settings/people_handler.h b/chrome/browser/ui/webui/settings/people_handler.h
index c383b08..9a79f64c 100644
--- a/chrome/browser/ui/webui/settings/people_handler.h
+++ b/chrome/browser/ui/webui/settings/people_handler.h
@@ -153,28 +153,28 @@
   LoginUIService* GetLoginUIService() const;
 
   // Callbacks from the page.
-  void HandleGetProfileInfo(base::Value::ConstListView args);
-  void OnDidClosePage(base::Value::ConstListView args);
-  void HandleSetDatatypes(base::Value::ConstListView args);
-  void HandleSetEncryptionPassphrase(base::Value::ConstListView args);
-  void HandleSetDecryptionPassphrase(base::Value::ConstListView args);
-  void HandleShowSyncSetupUI(base::Value::ConstListView args);
-  void HandleSyncPrefsDispatch(base::Value::ConstListView args);
-  void HandleTrustedVaultBannerStateDispatch(base::Value::ConstListView args);
+  void HandleGetProfileInfo(const base::Value::List& args);
+  void OnDidClosePage(const base::Value::List& args);
+  void HandleSetDatatypes(const base::Value::List& args);
+  void HandleSetEncryptionPassphrase(const base::Value::List& args);
+  void HandleSetDecryptionPassphrase(const base::Value::List& args);
+  void HandleShowSyncSetupUI(const base::Value::List& args);
+  void HandleSyncPrefsDispatch(const base::Value::List& args);
+  void HandleTrustedVaultBannerStateDispatch(const base::Value::List& args);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  void HandleAttemptUserExit(base::Value::ConstListView args);
-  void HandleTurnOnSync(base::Value::ConstListView args);
-  void HandleTurnOffSync(base::Value::ConstListView args);
+  void HandleAttemptUserExit(const base::Value::List& args);
+  void HandleTurnOnSync(const base::Value::List& args);
+  void HandleTurnOffSync(const base::Value::List& args);
 #else
-  void HandleStartSignin(base::Value::ConstListView args);
+  void HandleStartSignin(const base::Value::List& args);
 #endif
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
-  void HandleSignout(base::Value::ConstListView args);
-  void HandlePauseSync(base::Value::ConstListView args);
+  void HandleSignout(const base::Value::List& args);
+  void HandlePauseSync(const base::Value::List& args);
 #endif
-  void HandleStartKeyRetrieval(base::Value::ConstListView args);
-  void HandleGetSyncStatus(base::Value::ConstListView args);
+  void HandleStartKeyRetrieval(const base::Value::List& args);
+  void HandleGetSyncStatus(const base::Value::List& args);
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   // Displays the GAIA login form.
@@ -186,8 +186,8 @@
       signin_metrics::AccessPoint access_point);
 #endif
 
-  void HandleGetStoredAccounts(base::Value::ConstListView args);
-  void HandleStartSyncingWithEmail(base::Value::ConstListView args);
+  void HandleGetStoredAccounts(const base::Value::List& args);
+  void HandleStartSyncingWithEmail(const base::Value::List& args);
   base::Value GetStoredAccountsList();
 
   // Pushes the updated sync prefs to JavaScript.
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index ddbdf468..88b3c86 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -390,7 +390,7 @@
       .WillByDefault(Return(false));
   // Ensure that the user is not signed in before calling |HandleStartSignin()|.
   identity_test_env()->ClearPrimaryAccount();
-  handler_->HandleStartSignin(base::Value::ConstListView());
+  handler_->HandleStartSignin(base::Value::List());
 
   // Sync setup hands off control to the gaia login tab.
   EXPECT_EQ(
@@ -426,7 +426,7 @@
   // engine will try to download control data types (e.g encryption info), but
   // that won't finish for this test as we're simulating cancelling while the
   // spinner is showing.
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   EXPECT_EQ(
       handler_.get(),
@@ -460,7 +460,7 @@
               SetSyncRequested(true));
   SetDefaultExpectationsForConfigPage();
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   // No data is sent yet, because the engine is not initialized.
   EXPECT_EQ(0U, web_ui_.call_data().size());
@@ -501,7 +501,7 @@
   EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(),
               SetSyncRequested(true));
   SetDefaultExpectationsForConfigPage();
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   // Sync engine becomes active, so |handler_| is notified.
   NotifySyncStateChanged();
@@ -543,7 +543,7 @@
                 Return(syncer::SyncService::TransportState::INITIALIZING));
       });
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   // Since the engine is not initialized yet, no data should be sent.
   EXPECT_EQ(0U, web_ui_.call_data().size());
@@ -576,7 +576,7 @@
                 Return(syncer::SyncService::TransportState::CONFIGURING));
       });
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
   // Since the engine was already running, we should *not* get a spinner - all
   // the necessary values are already available.
   ExpectSyncPrefsChanged();
@@ -626,7 +626,7 @@
   ON_CALL(*mock_sync_service_->GetMockUserSettings(), IsFirstSetupComplete())
       .WillByDefault(Return(false));
   // Open the web UI.
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   ASSERT_FALSE(handler_->is_configuring_sync());
 }
@@ -639,7 +639,7 @@
   ON_CALL(*mock_sync_service_->GetMockUserSettings(), IsFirstSetupComplete())
       .WillByDefault(Return(false));
   // Open the web UI.
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   ASSERT_FALSE(handler_->is_configuring_sync());
 }
@@ -659,7 +659,7 @@
   SetupInitializedSyncService();
   EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(),
               SetSelectedTypes(true, _));
-  handler_->HandleSetDatatypes(list_args.GetListDeprecated());
+  handler_->HandleSetDatatypes(list_args.GetList());
 
   ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
@@ -688,7 +688,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("correct_passphrase");
-  handler_->HandleSetDecryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetDecryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(true);
 }
@@ -716,7 +716,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("custom_passphrase");
-  handler_->HandleSetEncryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetEncryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(true);
 }
@@ -745,7 +745,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("invalid_passphrase");
-  handler_->HandleSetDecryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetDecryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(false);
 }
@@ -774,7 +774,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("");
-  handler_->HandleSetEncryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetEncryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(false);
 }
@@ -801,7 +801,7 @@
     EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(),
                 SetSelectedTypes(false, type_to_set));
 
-    handler_->HandleSetDatatypes(list_args.GetListDeprecated());
+    handler_->HandleSetDatatypes(list_args.GetList());
     ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
     Mock::VerifyAndClearExpectations(mock_sync_service_);
   }
@@ -823,7 +823,7 @@
   SetupInitializedSyncService();
   EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(),
               SetSelectedTypes(false, GetAllTypes()));
-  handler_->HandleSetDatatypes(list_args.GetListDeprecated());
+  handler_->HandleSetDatatypes(list_args.GetList());
 
   ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus);
 }
@@ -851,7 +851,7 @@
   // Only the registered types are selected.
   EXPECT_CALL(*mock_sync_service_->GetMockUserSettings(),
               SetSelectedTypes(/*sync_everything=*/false, registered_types));
-  handler_->HandleSetDatatypes(list_args.GetListDeprecated());
+  handler_->HandleSetDatatypes(list_args.GetList());
 }
 
 TEST_F(PeopleHandlerTest, ShowSyncSetup) {
@@ -865,7 +865,7 @@
   SetupInitializedSyncService();
   // This should display the sync setup dialog (not login).
   SetDefaultExpectationsForConfigPage();
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   ExpectSyncPrefsChanged();
 }
@@ -881,7 +881,7 @@
   SetupInitializedSyncService();
   SetDefaultExpectationsForConfigPage();
   // This should display the sync setup dialog (not login).
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "syncAllDataTypes", true);
@@ -914,7 +914,7 @@
   ON_CALL(*mock_sync_service_->GetMockUserSettings(), IsSyncEverythingEnabled())
       .WillByDefault(Return(false));
   // This should display the sync setup dialog (not login).
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, GetAllTypes());
@@ -939,7 +939,7 @@
         .WillByDefault(Return(types));
 
     // This should display the sync setup dialog (not login).
-    handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+    handler_->HandleShowSyncSetupUI(base::Value::List());
 
     // Close the config overlay.
     LoginUIServiceFactory::GetForProfile(profile())->LoginUIClosed(
@@ -968,7 +968,7 @@
   ON_CALL(*mock_sync_service_->GetMockUserSettings(), GetPassphraseType())
       .WillByDefault(Return(syncer::PassphraseType::kFrozenImplicitPassphrase));
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "passphraseRequired", true);
@@ -993,7 +993,7 @@
   ON_CALL(*mock_sync_service_->GetMockUserSettings(), GetPassphraseType())
       .WillByDefault(Return(syncer::PassphraseType::kCustomPassphrase));
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "passphraseRequired", true);
@@ -1015,7 +1015,7 @@
   SetDefaultExpectationsForConfigPage();
 
   // This should display the sync setup dialog (not login).
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "passphraseRequired", false);
@@ -1038,7 +1038,7 @@
       .WillByDefault(Return(true));
 
   // This should display the sync setup dialog (not login).
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "encryptAllData", true);
@@ -1059,7 +1059,7 @@
       .WillByDefault(Return(false));
 
   // This should display the sync setup dialog (not login).
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   base::Value::DictStorage dictionary = ExpectSyncPrefsChanged();
   ExpectHasBoolKey(dictionary, "encryptAllData", false);
@@ -1090,7 +1090,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("passphrase123");
-  handler_->HandleSetEncryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetEncryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(false);
 }
@@ -1119,7 +1119,7 @@
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(kTestCallbackId);
   list_args.Append("passphrase123");
-  handler_->HandleSetEncryptionPassphrase(list_args.GetListDeprecated());
+  handler_->HandleSetEncryptionPassphrase(list_args.GetList());
 
   ExpectSetPassphraseSuccess(false);
 }
@@ -1130,7 +1130,7 @@
   // Sync starts out fully enabled.
   SetDefaultExpectationsForConfigPage();
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   // Now sync gets reset from the dashboard (the user clicked the "Manage synced
   // data" link), which results in the sync-requested and first-setup-complete
@@ -1176,7 +1176,7 @@
 
   base::Value did_abort(base::Value::Type::LIST);
   did_abort.Append(base::Value(false));
-  handler_->OnDidClosePage(did_abort.GetListDeprecated());
+  handler_->OnDidClosePage(did_abort.GetList());
 }
 
 TEST_F(PeopleHandlerTest, DashboardClearWhileSettingsOpen_ConfirmLater) {
@@ -1185,7 +1185,7 @@
   // Sync starts out fully enabled.
   SetDefaultExpectationsForConfigPage();
 
-  handler_->HandleShowSyncSetupUI(base::Value::ConstListView());
+  handler_->HandleShowSyncSetupUI(base::Value::List());
 
   // Now sync gets reset from the dashboard (the user clicked the "Manage synced
   // data" link), which results in the sync-requested and first-setup-complete
@@ -1247,7 +1247,7 @@
 
   base::Value did_abort(base::Value::Type::LIST);
   did_abort.Append(base::Value(false));
-  handler_->OnDidClosePage(did_abort.GetListDeprecated());
+  handler_->OnDidClosePage(did_abort.GetList());
 }
 
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
@@ -1314,7 +1314,7 @@
   ASSERT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   CreatePeopleHandler();
-  handler_->HandleTurnOffSync(base::Value::ConstListView());
+  handler_->HandleTurnOffSync(base::Value::List());
   EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
   base::Value::DictStorage status = ExpectSyncStatusChanged();
   ExpectHasBoolKey(status, "signedIn", false);
diff --git a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
index 1a727dd..c341819 100644
--- a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
+++ b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
@@ -67,32 +67,32 @@
 PrivacySandboxHandler::~PrivacySandboxHandler() = default;
 
 void PrivacySandboxHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getFlocId", base::BindRepeating(&PrivacySandboxHandler::HandleGetFlocId,
                                        base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "resetFlocId",
       base::BindRepeating(&PrivacySandboxHandler::HandleResetFlocId,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setFledgeJoiningAllowed",
       base::BindRepeating(&PrivacySandboxHandler::HandleSetFledgeJoiningAllowed,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getFledgeState",
       base::BindRepeating(&PrivacySandboxHandler::HandleGetFledgeState,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setTopicAllowed",
       base::BindRepeating(&PrivacySandboxHandler::HandleSetTopicAllowed,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getTopicsState",
       base::BindRepeating(&PrivacySandboxHandler::HandleGetTopicsState,
                           base::Unretained(this)));
 }
 
-void PrivacySandboxHandler::HandleGetFlocId(base::Value::ConstListView args) {
+void PrivacySandboxHandler::HandleGetFlocId(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -102,7 +102,7 @@
                             GetFlocIdInformation(Profile::FromWebUI(web_ui())));
 }
 
-void PrivacySandboxHandler::HandleResetFlocId(base::Value::ConstListView args) {
+void PrivacySandboxHandler::HandleResetFlocId(const base::Value::List& args) {
   CHECK_EQ(0U, args.size());
   AllowJavascript();
 
@@ -122,14 +122,14 @@
 }
 
 void PrivacySandboxHandler::HandleSetFledgeJoiningAllowed(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const std::string& site = args[0].GetString();
   const bool enabled = args[1].GetBool();
   GetPrivacySandboxService()->SetFledgeJoiningAllowed(site, enabled);
 }
 
 void PrivacySandboxHandler::HandleGetFledgeState(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const std::string& callback_id = args[0].GetString();
   GetPrivacySandboxService()->GetFledgeJoiningEtldPlusOneForDisplay(
       base::BindOnce(&PrivacySandboxHandler::OnFledgeJoiningSitesRecieved,
@@ -137,7 +137,7 @@
 }
 
 void PrivacySandboxHandler::HandleSetTopicAllowed(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const int topic_id = args[0].GetInt();
   const int taxonomy_version = args[1].GetInt();
   const bool allowed = args[2].GetBool();
@@ -146,7 +146,7 @@
 }
 
 void PrivacySandboxHandler::HandleGetTopicsState(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   base::Value top_topics_list(base::Value::Type::LIST);
   for (const auto& topic : GetPrivacySandboxService()->GetCurrentTopTopics())
     top_topics_list.Append(ConvertTopicToValue(topic));
diff --git a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.h b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.h
index dc6a231..3c38b92e 100644
--- a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.h
+++ b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.h
@@ -34,12 +34,12 @@
   FRIEND_TEST_ALL_PREFIXES(PrivacySandboxHandlerTestMockService,
                            GetTopicsState);
 
-  void HandleGetFlocId(base::Value::ConstListView args);
-  void HandleResetFlocId(base::Value::ConstListView args);
-  void HandleSetFledgeJoiningAllowed(base::Value::ConstListView args);
-  void HandleGetFledgeState(base::Value::ConstListView args);
-  void HandleSetTopicAllowed(base::Value::ConstListView args);
-  void HandleGetTopicsState(base::Value::ConstListView args);
+  void HandleGetFlocId(const base::Value::List& args);
+  void HandleResetFlocId(const base::Value::List& args);
+  void HandleSetFledgeJoiningAllowed(const base::Value::List& args);
+  void HandleGetFledgeState(const base::Value::List& args);
+  void HandleSetTopicAllowed(const base::Value::List& args);
+  void HandleGetTopicsState(const base::Value::List& args);
 
   PrivacySandboxService* GetPrivacySandboxService();
 
diff --git a/chrome/browser/ui/webui/settings/privacy_sandbox_handler_unittest.cc b/chrome/browser/ui/webui/settings/privacy_sandbox_handler_unittest.cc
index 443ec57..d76b4d6 100644
--- a/chrome/browser/ui/webui/settings/privacy_sandbox_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/privacy_sandbox_handler_unittest.cc
@@ -167,7 +167,7 @@
 TEST_F(PrivacySandboxHandlerTest, GetFlocId) {
   base::Value args(base::Value::Type::LIST);
   args.Append(kCallbackId1);
-  handler()->HandleGetFlocId(args.GetListDeprecated());
+  handler()->HandleGetFlocId(args.GetList());
 
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   EXPECT_EQ(kCallbackId1, data.arg1()->GetString());
@@ -178,7 +178,7 @@
 
 TEST_F(PrivacySandboxHandlerTest, ResetFlocId) {
   base::Value args(base::Value::Type::LIST);
-  handler()->HandleResetFlocId(args.GetListDeprecated());
+  handler()->HandleResetFlocId(args.GetList());
 
   // Resetting the FLoC ID should fire the appropriate WebUI listener.
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -214,7 +214,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(kTestSite);
   args.Append(true);
-  handler()->HandleSetFledgeJoiningAllowed(args.GetListDeprecated());
+  handler()->HandleSetFledgeJoiningAllowed(args.GetList());
 }
 
 TEST_F(PrivacySandboxHandlerTestMockService, GetFledgeState) {
@@ -232,11 +232,11 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append(kCallbackId1);
-  handler()->HandleGetFledgeState(args.GetListDeprecated());
+  handler()->HandleGetFledgeState(args.GetList());
 
   args.ClearList();
   args.Append(kCallbackId2);
-  handler()->HandleGetFledgeState(args.GetListDeprecated());
+  handler()->HandleGetFledgeState(args.GetList());
 
   // Provide different sets of information to each request to the FLEDGE
   // backend.
@@ -270,7 +270,7 @@
   args.Append(kTestTopic.topic_id());
   args.Append(kTestTopic.taxonomy_version());
   args.Append(false);
-  handler()->HandleSetTopicAllowed(args.GetListDeprecated());
+  handler()->HandleSetTopicAllowed(args.GetList());
 }
 
 TEST_F(PrivacySandboxHandlerTestMockService, GetTopicsState) {
@@ -294,7 +294,7 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append(kCallbackId1);
-  handler()->HandleGetTopicsState(args.GetListDeprecated());
+  handler()->HandleGetTopicsState(args.GetList());
 
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   EXPECT_EQ(kCallbackId1, data.arg1()->GetString());
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chrome/browser/ui/webui/settings/profile_info_handler.cc
index b7033cd..b24f176b8 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler.cc
+++ b/chrome/browser/ui/webui/settings/profile_info_handler.cc
@@ -45,12 +45,12 @@
 ProfileInfoHandler::~ProfileInfoHandler() {}
 
 void ProfileInfoHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getProfileInfo",
       base::BindRepeating(&ProfileInfoHandler::HandleGetProfileInfo,
                           base::Unretained(this)));
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getProfileStatsCount",
       base::BindRepeating(&ProfileInfoHandler::HandleGetProfileStats,
                           base::Unretained(this)));
@@ -97,7 +97,7 @@
   PushProfileInfo();
 }
 
-void ProfileInfoHandler::HandleGetProfileInfo(base::Value::ConstListView args) {
+void ProfileInfoHandler::HandleGetProfileInfo(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -107,8 +107,7 @@
 }
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-void ProfileInfoHandler::HandleGetProfileStats(
-    base::Value::ConstListView args) {
+void ProfileInfoHandler::HandleGetProfileStats(const base::Value::List& args) {
   AllowJavascript();
 
   ProfileStatisticsFactory::GetForProfile(profile_)->GatherStatistics(
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.h b/chrome/browser/ui/webui/settings/profile_info_handler.h
index dcdc645..75cc9cd 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler.h
+++ b/chrome/browser/ui/webui/settings/profile_info_handler.h
@@ -63,11 +63,11 @@
   FRIEND_TEST_ALL_PREFIXES(ProfileInfoHandlerTest, PushProfileInfo);
 
   // Callbacks from the page.
-  void HandleGetProfileInfo(base::Value::ConstListView args);
+  void HandleGetProfileInfo(const base::Value::List& args);
   void PushProfileInfo();
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-  void HandleGetProfileStats(base::Value::ConstListView args);
+  void HandleGetProfileStats(const base::Value::List& args);
 
   // Returns the sum of the counts of individual profile states. Returns 0 if
   // there exists a stat that was not successfully retrieved.
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc b/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
index 3e07c539..51a5f393 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/profile_info_handler_unittest.cc
@@ -117,7 +117,7 @@
 TEST_F(ProfileInfoHandlerTest, GetProfileInfo) {
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append("get-profile-info-callback-id");
-  handler()->HandleGetProfileInfo(list_args.GetListDeprecated());
+  handler()->HandleGetProfileInfo(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
index 39db2b7..c2d58be0 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -69,41 +69,41 @@
 }
 
 void ProtocolHandlersHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "observeProtocolHandlers",
       base::BindRepeating(
           &ProtocolHandlersHandler::HandleObserveProtocolHandlers,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "observeProtocolHandlersEnabledState",
       base::BindRepeating(
           &ProtocolHandlersHandler::HandleObserveProtocolHandlersEnabledState,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeHandler",
       base::BindRepeating(&ProtocolHandlersHandler::HandleRemoveHandler,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setHandlersEnabled",
       base::BindRepeating(&ProtocolHandlersHandler::HandleSetHandlersEnabled,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setDefault",
       base::BindRepeating(&ProtocolHandlersHandler::HandleSetDefault,
                           base::Unretained(this)));
 
   // Web App Protocol Handlers register message callbacks:
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "observeAppProtocolHandlers",
       base::BindRepeating(
           &ProtocolHandlersHandler::HandleObserveAppProtocolHandlers,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeAppAllowedHandler",
       base::BindRepeating(
           &ProtocolHandlersHandler::HandleRemoveAllowedAppHandler,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeAppDisallowedHandler",
       base::BindRepeating(
           &ProtocolHandlersHandler::HandleRemoveDisallowedAppHandler,
@@ -175,14 +175,14 @@
 }
 
 void ProtocolHandlersHandler::HandleObserveProtocolHandlers(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   SendHandlersEnabledValue();
   UpdateHandlerList();
 }
 
 void ProtocolHandlersHandler::HandleObserveProtocolHandlersEnabledState(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   SendHandlersEnabledValue();
 }
@@ -193,7 +193,7 @@
 }
 
 void ProtocolHandlersHandler::HandleRemoveHandler(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   ProtocolHandler handler(ParseHandlerFromArgs(args));
   CHECK(!handler.IsEmpty());
   GetProtocolHandlerRegistry()->RemoveHandler(handler);
@@ -204,7 +204,7 @@
 }
 
 void ProtocolHandlersHandler::HandleSetHandlersEnabled(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   bool enabled = true;
   CHECK(args[0].is_bool());
   enabled = args[0].GetBool();
@@ -214,22 +214,19 @@
     GetProtocolHandlerRegistry()->Disable();
 }
 
-void ProtocolHandlersHandler::HandleSetDefault(
-    base::Value::ConstListView args) {
+void ProtocolHandlersHandler::HandleSetDefault(const base::Value::List& args) {
   const ProtocolHandler& handler(ParseHandlerFromArgs(args));
   CHECK(!handler.IsEmpty());
   GetProtocolHandlerRegistry()->OnAcceptRegisterProtocolHandler(handler);
 }
 
 ProtocolHandler ProtocolHandlersHandler::ParseHandlerFromArgs(
-    base::Value::ConstListView args) const {
-  base::Value::ConstListView args_list = args;
-  bool ok = args_list.size() >= 2u && args_list[0].is_string() &&
-            args_list[1].is_string();
+    const base::Value::List& args) const {
+  bool ok = args.size() >= 2u && args[0].is_string() && args[1].is_string();
   if (!ok)
     return ProtocolHandler::EmptyProtocolHandler();
-  std::string protocol = args_list[0].GetString();
-  std::string url = args_list[1].GetString();
+  std::string protocol = args[0].GetString();
+  std::string url = args[1].GetString();
   return ProtocolHandler::CreateProtocolHandler(protocol, GURL(url));
 }
 
@@ -303,14 +300,14 @@
 }
 
 void ProtocolHandlersHandler::HandleObserveAppProtocolHandlers(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   UpdateAllAllowedLaunchProtocols();
   UpdateAllDisallowedLaunchProtocols();
 }
 
 void ProtocolHandlersHandler::HandleRemoveAllowedAppHandler(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   content::ProtocolHandler handler(ParseAppHandlerFromArgs(args));
   CHECK(!handler.IsEmpty());
   DCHECK(web_app_provider_);
@@ -324,7 +321,7 @@
 }
 
 void ProtocolHandlersHandler::HandleRemoveDisallowedAppHandler(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   content::ProtocolHandler handler(ParseAppHandlerFromArgs(args));
   CHECK(!handler.IsEmpty());
   DCHECK(web_app_provider_);
@@ -343,7 +340,7 @@
 }
 
 content::ProtocolHandler ProtocolHandlersHandler::ParseAppHandlerFromArgs(
-    base::Value::ConstListView args) const {
+    const base::Value::List& args) const {
   const std::string* protocol = args[0].GetIfString();
   const std::string* url = args[1].GetIfString();
   const std::string* app_id = args[2].GetIfString();
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
index 0078795..eccfaf6 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.h
@@ -67,26 +67,25 @@
   // Called to fetch the state of the protocol handlers. If the full list of
   // handlers is not needed, consider HandleObserveProtocolHandlersEnabledState
   // instead.
-  void HandleObserveProtocolHandlers(base::Value::ConstListView args);
+  void HandleObserveProtocolHandlers(const base::Value::List& args);
 
   // Called to begin updates to the handlers enabled status. This is a subset
   // (lighter alternative) of HandleObserveProtocolHandlers. There's no need to
   // call this function if HandleObserveProtocolHandlers is called.
-  void HandleObserveProtocolHandlersEnabledState(
-      base::Value::ConstListView args);
+  void HandleObserveProtocolHandlersEnabledState(const base::Value::List& args);
 
   // Notifies the JS side whether the handlers are enabled or not.
   void SendHandlersEnabledValue();
 
   // Called when the user toggles whether custom handlers are enabled.
-  void HandleSetHandlersEnabled(base::Value::ConstListView args);
+  void HandleSetHandlersEnabled(const base::Value::List& args);
 
   // Called when the user sets a new default handler for a protocol.
-  void HandleSetDefault(base::Value::ConstListView args);
+  void HandleSetDefault(const base::Value::List& args);
 
   // Parses a ProtocolHandler out of the arguments passed back from the view.
   // |args| is a list of [protocol, url].
-  ProtocolHandler ParseHandlerFromArgs(base::Value::ConstListView args) const;
+  ProtocolHandler ParseHandlerFromArgs(const base::Value::List& args) const;
 
   // Returns a JSON object describing the set of protocol handlers for the
   // given protocol.
@@ -101,7 +100,7 @@
 
   // Remove a handler.
   // |args| is a list of [protocol, url].
-  void HandleRemoveHandler(base::Value::ConstListView args);
+  void HandleRemoveHandler(const base::Value::List& args);
 
   custom_handlers::ProtocolHandlerRegistry* GetProtocolHandlerRegistry();
 
@@ -112,12 +111,12 @@
   // Web App Protocol Handler specific functions:
 
   // Called to fetch the state of the app protocol handlers.
-  void HandleObserveAppProtocolHandlers(base::Value::ConstListView args);
+  void HandleObserveAppProtocolHandlers(const base::Value::List& args);
 
   // Parses an App ProtocolHandler out of |args|, which is a list of [protocol,
   // url, app_id].
   content::ProtocolHandler ParseAppHandlerFromArgs(
-      base::Value::ConstListView args) const;
+      const base::Value::List& args) const;
 
   // Returns a DictionaryValue describing the set of app protocol handlers for
   // the given |protocol| in the given |handlers| list.
@@ -133,11 +132,11 @@
 
   // Remove an approved app handler.
   // |args| is a list of [protocol, url, app_id].
-  void HandleRemoveAllowedAppHandler(base::Value::ConstListView args);
+  void HandleRemoveAllowedAppHandler(const base::Value::List& args);
 
   // Remove a disallowed app handler.
   // |args| is a list of [protocol, url, app_id].
-  void HandleRemoveDisallowedAppHandler(base::Value::ConstListView args);
+  void HandleRemoveDisallowedAppHandler(const base::Value::List& args);
 
   const raw_ptr<Profile> profile_;
   const raw_ptr<web_app::WebAppProvider> web_app_provider_;
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index e24cb444..0e5399aa 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -97,33 +97,33 @@
 }
 
 void ResetSettingsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "performResetProfileSettings",
       base::BindRepeating(&ResetSettingsHandler::HandleResetProfileSettings,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "onShowResetProfileDialog",
       base::BindRepeating(&ResetSettingsHandler::OnShowResetProfileDialog,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getReportedSettings",
       base::BindRepeating(&ResetSettingsHandler::HandleGetReportedSettings,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "onHideResetProfileDialog",
       base::BindRepeating(&ResetSettingsHandler::OnHideResetProfileDialog,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "onHideResetProfileBanner",
       base::BindRepeating(&ResetSettingsHandler::OnHideResetProfileBanner,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getTriggeredResetToolName",
       base::BindRepeating(
           &ResetSettingsHandler::HandleGetTriggeredResetToolName,
           base::Unretained(this)));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "onPowerwashDialogShow",
       base::BindRepeating(&ResetSettingsHandler::OnShowPowerwashDialog,
                           base::Unretained(this)));
@@ -131,7 +131,7 @@
 }
 
 void ResetSettingsHandler::HandleResetProfileSettings(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(3U, args.size());
@@ -174,7 +174,7 @@
 }
 
 void ResetSettingsHandler::HandleGetReportedSettings(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -192,7 +192,7 @@
 }
 
 void ResetSettingsHandler::OnShowResetProfileDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   if (!GetResetter()->IsActive()) {
     setting_snapshot_ = std::make_unique<ResettableSettingsSnapshot>(profile_);
   }
@@ -208,13 +208,13 @@
 }
 
 void ResetSettingsHandler::OnHideResetProfileDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   if (!GetResetter()->IsActive())
     setting_snapshot_.reset();
 }
 
 void ResetSettingsHandler::OnHideResetProfileBanner(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   chrome_prefs::ClearResetTime(profile_);
 }
 
@@ -262,7 +262,7 @@
 }
 
 void ResetSettingsHandler::HandleGetTriggeredResetToolName(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -295,7 +295,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void ResetSettingsHandler::OnShowPowerwashDialog(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   UMA_HISTOGRAM_ENUMERATION(
       "Reset.ChromeOS.PowerwashDialogShown",
       ash::reset::DialogViewType::kFromOptions,
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.h b/chrome/browser/ui/webui/settings/reset_settings_handler.h
index 1dfee21..89135484 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.h
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.h
@@ -50,26 +50,26 @@
   virtual ProfileResetter* GetResetter();
 
   // Javascript callback to start clearing data.
-  void HandleResetProfileSettings(base::Value::ConstListView args);
+  void HandleResetProfileSettings(const base::Value::List& args);
 
  private:
   // Retrieves the settings that will be reported, called from Javascript.
-  void HandleGetReportedSettings(base::Value::ConstListView args);
+  void HandleGetReportedSettings(const base::Value::List& args);
 
   // Called once the settings that will be reported have been retrieved.
   void OnGetReportedSettingsDone(std::string callback_id);
 
   // Called when the reset profile dialog is shown.
-  void OnShowResetProfileDialog(base::Value::ConstListView args);
+  void OnShowResetProfileDialog(const base::Value::List& args);
 
   // Called when the reset profile dialog is hidden.
-  void OnHideResetProfileDialog(base::Value::ConstListView args);
+  void OnHideResetProfileDialog(const base::Value::List& args);
 
   // Called when the reset profile banner is shown.
-  void OnHideResetProfileBanner(base::Value::ConstListView args);
+  void OnHideResetProfileBanner(const base::Value::List& args);
 
   // Retrieve the triggered reset tool name, called from Javascript.
-  void HandleGetTriggeredResetToolName(base::Value::ConstListView args);
+  void HandleGetTriggeredResetToolName(const base::Value::List& args);
 
   // Called when BrandcodeConfigFetcher completed fetching settings.
   void OnSettingsFetched();
@@ -89,7 +89,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Will be called when powerwash dialog is shown.
-  void OnShowPowerwashDialog(base::Value::ConstListView args);
+  void OnShowPowerwashDialog(const base::Value::List& args);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   const raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/reset_settings_handler_unittest.cc
index 8fd1f13..7d28137 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler_unittest.cc
@@ -95,7 +95,7 @@
   list.Append(expected_callback_id);
   list.Append(false);
   list.Append("");
-  handler()->HandleResetProfileSettings(list.GetListDeprecated());
+  handler()->HandleResetProfileSettings(list.GetList());
   // Check that the delegate ProfileResetter was called.
   EXPECT_EQ(1u, handler()->resets());
   // Check that Javascript side is notified after resetting is done.
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler.cc b/chrome/browser/ui/webui/settings/safety_check_handler.cc
index 6f029b3..7ae143fd 100644
--- a/chrome/browser/ui/webui/settings/safety_check_handler.cc
+++ b/chrome/browser/ui/webui/settings/safety_check_handler.cc
@@ -359,7 +359,7 @@
       timestamp_delegate_(std::move(timestamp_delegate)) {}
 
 void SafetyCheckHandler::HandlePerformSafetyCheck(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   SendSafetyCheckStartedWebUiUpdates();
 
   // Run safety check after a delay. This ensures that the "running" state is
@@ -373,7 +373,7 @@
 }
 
 void SafetyCheckHandler::HandleGetParentRanDisplayString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   const base::Value& callback_id = args[0];
 
   // Send updated timestamp-based display strings to all SC children who have
@@ -1056,11 +1056,11 @@
 void SafetyCheckHandler::RegisterMessages() {
   // Usage of base::Unretained(this) is safe, because web_ui() owns `this` and
   // won't release ownership until destruction.
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kPerformSafetyCheck,
       base::BindRepeating(&SafetyCheckHandler::HandlePerformSafetyCheck,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       kGetParentRanDisplayString,
       base::BindRepeating(&SafetyCheckHandler::HandleGetParentRanDisplayString,
                           base::Unretained(this)));
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler.h b/chrome/browser/ui/webui/settings/safety_check_handler.h
index 650c97e..bdfee49 100644
--- a/chrome/browser/ui/webui/settings/safety_check_handler.h
+++ b/chrome/browser/ui/webui/settings/safety_check_handler.h
@@ -189,11 +189,11 @@
 
   // Handles triggering the safety check from the frontend (by user pressing a
   // button).
-  void HandlePerformSafetyCheck(base::Value::ConstListView args);
+  void HandlePerformSafetyCheck(const base::Value::List& args);
 
   // Handles updating the safety check parent display string to show how long
   // ago the safety check last ran.
-  void HandleGetParentRanDisplayString(base::Value::ConstListView args);
+  void HandleGetParentRanDisplayString(const base::Value::List& args);
 
   // Triggers an update check and invokes OnUpdateCheckResult once results
   // are available.
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler.cc b/chrome/browser/ui/webui/settings/search_engines_handler.cc
index 9c5c7416..cc55f93 100644
--- a/chrome/browser/ui/webui/settings/search_engines_handler.cc
+++ b/chrome/browser/ui/webui/settings/search_engines_handler.cc
@@ -57,37 +57,37 @@
 }
 
 void SearchEnginesHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getSearchEnginesList",
       base::BindRepeating(&SearchEnginesHandler::HandleGetSearchEnginesList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setDefaultSearchEngine",
       base::BindRepeating(&SearchEnginesHandler::HandleSetDefaultSearchEngine,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setIsActiveSearchEngine",
       base::BindRepeating(&SearchEnginesHandler::HandleSetIsActiveSearchEngine,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeSearchEngine",
       base::BindRepeating(&SearchEnginesHandler::HandleRemoveSearchEngine,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "validateSearchEngineInput",
       base::BindRepeating(
           &SearchEnginesHandler::HandleValidateSearchEngineInput,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "searchEngineEditStarted",
       base::BindRepeating(&SearchEnginesHandler::HandleSearchEngineEditStarted,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "searchEngineEditCancelled",
       base::BindRepeating(
           &SearchEnginesHandler::HandleSearchEngineEditCancelled,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "searchEngineEditCompleted",
       base::BindRepeating(
           &SearchEnginesHandler::HandleSearchEngineEditCompleted,
@@ -252,7 +252,7 @@
 }
 
 void SearchEnginesHandler::HandleGetSearchEnginesList(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const base::Value& callback_id = args[0];
   AllowJavascript();
@@ -260,7 +260,7 @@
 }
 
 void SearchEnginesHandler::HandleSetDefaultSearchEngine(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   int index;
   if (!ExtractIntegerValue(args, &index)) {
     NOTREACHED();
@@ -275,7 +275,7 @@
 }
 
 void SearchEnginesHandler::HandleSetIsActiveSearchEngine(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   const int index = args[0].GetInt();
   const bool is_active = args[1].GetBool();
@@ -287,7 +287,7 @@
 }
 
 void SearchEnginesHandler::HandleRemoveSearchEngine(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   int index;
   if (!ExtractIntegerValue(args, &index)) {
     NOTREACHED();
@@ -303,7 +303,7 @@
 }
 
 void SearchEnginesHandler::HandleSearchEngineEditStarted(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   int index;
   if (!ExtractIntegerValue(args, &index)) {
     NOTREACHED();
@@ -336,7 +336,7 @@
 }
 
 void SearchEnginesHandler::HandleValidateSearchEngineInput(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(3U, args.size());
 
   const base::Value& callback_id = args[0];
@@ -365,7 +365,7 @@
 }
 
 void SearchEnginesHandler::HandleSearchEngineEditCancelled(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   if (!edit_controller_.get())
     return;
   edit_controller_->CleanUpCancelledAdd();
@@ -373,7 +373,7 @@
 }
 
 void SearchEnginesHandler::HandleSearchEngineEditCompleted(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   if (!edit_controller_.get())
     return;
   const std::string& search_engine = args[0].GetString();
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler.h b/chrome/browser/ui/webui/settings/search_engines_handler.h
index 1f2ef5cc..d2b04da 100644
--- a/chrome/browser/ui/webui/settings/search_engines_handler.h
+++ b/chrome/browser/ui/webui/settings/search_engines_handler.h
@@ -54,28 +54,28 @@
 
  private:
   // Retrieves all search engines and returns them to WebUI.
-  void HandleGetSearchEnginesList(base::Value::ConstListView args);
+  void HandleGetSearchEnginesList(const base::Value::List& args);
 
   std::unique_ptr<base::DictionaryValue> GetSearchEnginesList();
 
   // Removes the search engine at the given index. Called from WebUI.
-  void HandleRemoveSearchEngine(base::Value::ConstListView args);
+  void HandleRemoveSearchEngine(const base::Value::List& args);
 
   // Sets the search engine at the given index to be default. Called from WebUI.
-  void HandleSetDefaultSearchEngine(base::Value::ConstListView args);
+  void HandleSetDefaultSearchEngine(const base::Value::List& args);
 
   // Activates or deactivates the search engine at the given index. Called from
   // WebUI.
-  void HandleSetIsActiveSearchEngine(base::Value::ConstListView args);
+  void HandleSetIsActiveSearchEngine(const base::Value::List& args);
 
   // Starts an edit session for the search engine at the given index. If the
   // index is -1, starts editing a new search engine instead of an existing one.
   // Called from WebUI.
-  void HandleSearchEngineEditStarted(base::Value::ConstListView args);
+  void HandleSearchEngineEditStarted(const base::Value::List& args);
 
   // Validates the given search engine values, and reports the results back
   // to WebUI. Called from WebUI.
-  void HandleValidateSearchEngineInput(base::Value::ConstListView args);
+  void HandleValidateSearchEngineInput(const base::Value::List& args);
 
   // Checks whether the given user input field (searchEngine, keyword, queryUrl)
   // is populated with a valid value.
@@ -84,11 +84,11 @@
 
   // Called when an edit is canceled.
   // Called from WebUI.
-  void HandleSearchEngineEditCancelled(base::Value::ConstListView args);
+  void HandleSearchEngineEditCancelled(const base::Value::List& args);
 
   // Called when an edit is finished and should be saved.
   // Called from WebUI.
-  void HandleSearchEngineEditCompleted(base::Value::ConstListView args);
+  void HandleSearchEngineEditCompleted(const base::Value::List& args);
 
   // Returns a dictionary to pass to WebUI representing the given search engine.
   std::unique_ptr<base::DictionaryValue> CreateDictionaryForEngine(
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
index b936147..b1bc8a14 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -90,17 +90,17 @@
 ClearBrowsingDataHandler::~ClearBrowsingDataHandler() = default;
 
 void ClearBrowsingDataHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getInstalledApps",
       base::BindRepeating(
           &ClearBrowsingDataHandler::GetRecentlyLaunchedInstalledApps,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearBrowsingData",
       base::BindRepeating(&ClearBrowsingDataHandler::HandleClearBrowsingData,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "initializeClearBrowsingData",
       base::BindRepeating(&ClearBrowsingDataHandler::HandleInitialize,
                           base::Unretained(this)));
@@ -159,11 +159,11 @@
   list_args.Append(std::move(data_types));
   list_args.Append(1);
   list_args.Append(std::move(installed_apps));
-  HandleClearBrowsingData(list_args.GetListDeprecated());
+  HandleClearBrowsingData(list_args.GetList());
 }
 
 void ClearBrowsingDataHandler::GetRecentlyLaunchedInstalledApps(
-    base::Value::ConstListView list) {
+    const base::Value::List& list) {
   CHECK_EQ(2U, list.size());
   std::string webui_callback_id = list[0].GetString();
   int period_selected = list[1].GetInt();
@@ -240,7 +240,7 @@
 }
 
 void ClearBrowsingDataHandler::HandleClearBrowsingData(
-    base::Value::ConstListView args_list) {
+    const base::Value::List& args_list) {
   CHECK_EQ(4U, args_list.size());
   std::string webui_callback_id = args_list[0].GetString();
 
@@ -413,8 +413,7 @@
   ResolveJavascriptCallback(base::Value(webui_callback_id), std::move(result));
 }
 
-void ClearBrowsingDataHandler::HandleInitialize(
-    base::Value::ConstListView args) {
+void ClearBrowsingDataHandler::HandleInitialize(const base::Value::List& args) {
   AllowJavascript();
   const base::Value& callback_id = args[0];
 
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
index 3ffd6300..3276231 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h
@@ -54,7 +54,7 @@
  protected:
   // Fetches a list of installed apps to be displayed in the clear browsing
   // data confirmation dialog. Called by Javascript.
-  void GetRecentlyLaunchedInstalledApps(base::Value::ConstListView args);
+  void GetRecentlyLaunchedInstalledApps(const base::Value::List& args);
 
  private:
   friend class TestingClearBrowsingDataHandler;
@@ -80,7 +80,7 @@
       base::Value::ConstListView installed_apps);
 
   // Clears browsing data, called by Javascript.
-  void HandleClearBrowsingData(base::Value::ConstListView value);
+  void HandleClearBrowsingData(const base::Value::List& value);
 
   // Called when a clearing task finished. |webui_callback_id| is provided
   // by the WebUI action that initiated it.
@@ -93,7 +93,7 @@
       uint64_t failed_data_types);
 
   // Initializes the dialog UI. Called by JavaScript when the DOM is ready.
-  void HandleInitialize(base::Value::ConstListView args);
+  void HandleInitialize(const base::Value::List& args);
 
   // Implementation of SyncServiceObserver.
   void OnStateChanged(syncer::SyncService* sync) override;
diff --git a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
index f84bef0..9135029 100644
--- a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
@@ -139,39 +139,39 @@
 }
 
 void CookiesViewHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.getDisplayList",
       base::BindRepeating(&CookiesViewHandler::HandleGetDisplayList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.removeAll",
       base::BindRepeating(&CookiesViewHandler::HandleRemoveAll,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.removeShownItems",
       base::BindRepeating(&CookiesViewHandler::HandleRemoveShownItems,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.removeItem",
       base::BindRepeating(&CookiesViewHandler::HandleRemoveItem,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.getCookieDetails",
       base::BindRepeating(&CookiesViewHandler::HandleGetCookieDetails,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.getNumCookiesString",
       base::BindRepeating(&CookiesViewHandler::HandleGetNumCookiesString,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.removeSite",
       base::BindRepeating(&CookiesViewHandler::HandleRemoveSite,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.removeThirdPartyCookies",
       base::BindRepeating(&CookiesViewHandler::HandleRemoveThirdParty,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "localData.reload",
       base::BindRepeating(&CookiesViewHandler::HandleReloadCookies,
                           base::Unretained(this)));
@@ -232,8 +232,7 @@
   cookies_tree_model_->AddCookiesTreeObserver(this);
 }
 
-void CookiesViewHandler::HandleGetCookieDetails(
-    base::Value::ConstListView args) {
+void CookiesViewHandler::HandleGetCookieDetails(const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   std::string callback_id = args[0].GetString();
   std::string site = args[1].GetString();
@@ -266,7 +265,7 @@
 }
 
 void CookiesViewHandler::HandleGetNumCookiesString(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   std::string callback_id;
   callback_id = args[0].GetString();
@@ -281,7 +280,7 @@
   ResolveJavascriptCallback(base::Value(callback_id), base::Value(string));
 }
 
-void CookiesViewHandler::HandleGetDisplayList(base::Value::ConstListView args) {
+void CookiesViewHandler::HandleGetDisplayList(const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   std::string callback_id = args[0].GetString();
   std::u16string filter = base::UTF8ToUTF16(args[1].GetString());
@@ -307,7 +306,7 @@
   ReturnLocalDataList(callback_id);
 }
 
-void CookiesViewHandler::HandleReloadCookies(base::Value::ConstListView args) {
+void CookiesViewHandler::HandleReloadCookies(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   std::string callback_id = args[0].GetString();
 
@@ -333,7 +332,7 @@
   ProcessPendingRequests();
 }
 
-void CookiesViewHandler::HandleRemoveAll(base::Value::ConstListView args) {
+void CookiesViewHandler::HandleRemoveAll(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   AllowJavascript();
 
@@ -351,7 +350,7 @@
   ResolveJavascriptCallback(base::Value(callback_id), base::Value());
 }
 
-void CookiesViewHandler::HandleRemoveItem(base::Value::ConstListView args) {
+void CookiesViewHandler::HandleRemoveItem(const base::Value::List& args) {
   std::string node_path = args[0].GetString();
 
   AllowJavascript();
@@ -370,8 +369,7 @@
   }
 }
 
-void CookiesViewHandler::HandleRemoveThirdParty(
-    base::Value::ConstListView args) {
+void CookiesViewHandler::HandleRemoveThirdParty(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   std::string callback_id = args[0].GetString();
 
@@ -390,8 +388,7 @@
   ProcessPendingRequests();
 }
 
-void CookiesViewHandler::HandleRemoveShownItems(
-    base::Value::ConstListView args) {
+void CookiesViewHandler::HandleRemoveShownItems(const base::Value::List& args) {
   CHECK_EQ(0U, args.size());
 
   AllowJavascript();
@@ -408,7 +405,7 @@
     cookies_tree_model_->DeleteCookieNode(parent->children().front().get());
 }
 
-void CookiesViewHandler::HandleRemoveSite(base::Value::ConstListView args) {
+void CookiesViewHandler::HandleRemoveSite(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   std::u16string site = base::UTF8ToUTF16(args[0].GetString());
   AllowJavascript();
diff --git a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
index 9056d87..31185bff 100644
--- a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.h
@@ -71,41 +71,41 @@
   void RecreateCookiesTreeModel();
 
   // Set |filter_| and get a portion (or all) of the list items.
-  void HandleGetDisplayList(base::Value::ConstListView args);
+  void HandleGetDisplayList(const base::Value::List& args);
   void GetDisplayList(std::string callback_id, const std::u16string& filter);
 
   // Remove all items matching the current |filter_|.
-  void HandleRemoveShownItems(base::Value::ConstListView args);
+  void HandleRemoveShownItems(const base::Value::List& args);
   void RemoveShownItems();
 
   // Remove selected sites data.
-  void HandleRemoveSite(base::Value::ConstListView args);
+  void HandleRemoveSite(const base::Value::List& args);
   void RemoveSite(const std::u16string& site);
 
   // Retrieve cookie details for a specific site.
-  void HandleGetCookieDetails(base::Value::ConstListView args);
+  void HandleGetCookieDetails(const base::Value::List& args);
   void GetCookieDetails(const std::string& callback_id,
                         const std::string& site);
 
   // Gets a plural string for the given number of cookies.
-  void HandleGetNumCookiesString(base::Value::ConstListView args);
+  void HandleGetNumCookiesString(const base::Value::List& args);
 
   // Remove all sites data.
-  void HandleRemoveAll(base::Value::ConstListView args);
+  void HandleRemoveAll(const base::Value::List& args);
   void RemoveAll(const std::string& callback_id);
 
   // Remove a single item.
-  void HandleRemoveItem(base::Value::ConstListView args);
+  void HandleRemoveItem(const base::Value::List& args);
   void RemoveItem(const std::string& path);
 
   // Removes cookies and site data available in third-party contexts.
-  void HandleRemoveThirdParty(base::Value::ConstListView args);
+  void HandleRemoveThirdParty(const base::Value::List& args);
 
   void ReturnLocalDataList(const std::string& callback_id);
 
   // Reloads the CookiesTreeModel and passes the nodes to
   // 'CookiesView.loadChildren' to update the WebUI.
-  void HandleReloadCookies(base::Value::ConstListView args);
+  void HandleReloadCookies(const base::Value::List& args);
 
   // Flag to indicate whether there is a batch update in progress.
   bool batch_update_;
diff --git a/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
index 69b8427..f83deab 100644
--- a/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
@@ -92,7 +92,7 @@
     SetupTreeModelForTesting();
     base::Value reload_args(base::Value::Type::LIST);
     reload_args.Append(kCallbackId);
-    handler()->HandleReloadCookies(reload_args.GetListDeprecated());
+    handler()->HandleReloadCookies(reload_args.GetList());
 
     // The handler will post a task to recreate the tree model.
     task_environment()->RunUntilIdle();
@@ -134,7 +134,7 @@
 
   base::Value reload_args(base::Value::Type::LIST);
   reload_args.Append(kReloadCallbackID);
-  handler()->HandleReloadCookies(reload_args.GetListDeprecated());
+  handler()->HandleReloadCookies(reload_args.GetList());
   task_environment()->RunUntilIdle();
 
   // At the point the handler will have recreated the model (using the provided
@@ -143,7 +143,7 @@
   base::Value get_display_list_args(base::Value::Type::LIST);
   get_display_list_args.Append(kGetDisplaylistCallbackID);
   get_display_list_args.Append("");
-  handler()->HandleGetDisplayList(get_display_list_args.GetListDeprecated());
+  handler()->HandleGetDisplayList(get_display_list_args.GetList());
   task_environment()->RunUntilIdle();
 
   // Because the tree model hasn't completed the batch, no callback should
@@ -188,33 +188,33 @@
         args.Append(callback_id);
         current_filter = current_filter == kTestHost1 ? "" : kTestHost1;
         args.Append(kTestHost1);
-        handler()->HandleGetDisplayList(args.GetListDeprecated());
+        handler()->HandleGetDisplayList(args.GetList());
       });
   auto get_display_list_same_filter =
       base::BindLambdaForTesting([&](std::string callback_id) {
         base::Value args(base::Value::Type::LIST);
         args.Append(callback_id);
         args.Append(current_filter);
-        handler()->HandleGetDisplayList(args.GetListDeprecated());
+        handler()->HandleGetDisplayList(args.GetList());
       });
   auto get_cookie_details =
       base::BindLambdaForTesting([&](std::string callback_id) {
         base::Value args(base::Value::Type::LIST);
         args.Append(callback_id);
         args.Append(kTestHost1);
-        handler()->HandleGetCookieDetails(args.GetListDeprecated());
+        handler()->HandleGetCookieDetails(args.GetList());
       });
   auto reload_cookies =
       base::BindLambdaForTesting([&](std::string callback_id) {
         base::Value args(base::Value::Type::LIST);
         args.Append(callback_id);
-        handler()->HandleReloadCookies(args.GetListDeprecated());
+        handler()->HandleReloadCookies(args.GetList());
       });
   auto remove_third_party =
       base::BindLambdaForTesting([&](std::string callback_id) {
         base::Value args(base::Value::Type::LIST);
         args.Append(callback_id);
-        handler()->HandleRemoveThirdParty(args.GetListDeprecated());
+        handler()->HandleRemoveThirdParty(args.GetList());
       });
   // Include a dummy request which allows the request queue to be cleared. This
   // ensures that requests may be queued up both during, and outside of, batch
@@ -270,7 +270,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(kCallbackId);
   args.Append(kTestHost1);
-  handler()->HandleGetCookieDetails(args.GetListDeprecated());
+  handler()->HandleGetCookieDetails(args.GetList());
   task_environment()->RunUntilIdle();
 
   // At this point the handler should have queued the creation of a tree and
@@ -301,7 +301,7 @@
     args.Append(kCallbackId);
     args.Append(kTestHost1);
 
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -320,7 +320,7 @@
     args.Append(kCallbackId);
     args.Append("");
 
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -345,7 +345,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append(kTestHost2);
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -361,7 +361,7 @@
   // Remove displayed items.
   {
     base::Value args(base::Value::Type::LIST);
-    handler()->HandleRemoveShownItems(args.GetListDeprecated());
+    handler()->HandleRemoveShownItems(args.GetList());
     task_environment()->RunUntilIdle();
   }
 
@@ -370,7 +370,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append("");
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -390,7 +390,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append(kCallbackId);
   args.Append(kTestHost1);
-  handler()->HandleGetCookieDetails(args.GetListDeprecated());
+  handler()->HandleGetCookieDetails(args.GetList());
   task_environment()->RunUntilIdle();
 
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -410,7 +410,7 @@
   {
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
-    handler()->HandleRemoveAll(args.GetListDeprecated());
+    handler()->HandleRemoveAll(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -424,7 +424,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append("");
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -448,7 +448,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append(kTestHost1);
-    handler()->HandleGetCookieDetails(args.GetListDeprecated());
+    handler()->HandleGetCookieDetails(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -465,7 +465,7 @@
   {
     base::Value args(base::Value::Type::LIST);
     args.Append(node_path_id);
-    handler()->HandleRemoveItem(args.GetListDeprecated());
+    handler()->HandleRemoveItem(args.GetList());
     task_environment()->RunUntilIdle();
 
     // Removal should fire an update event.
@@ -480,7 +480,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append(kTestHost1);
-    handler()->HandleGetCookieDetails(args.GetListDeprecated());
+    handler()->HandleGetCookieDetails(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -497,7 +497,7 @@
   {
     base::Value args(base::Value::Type::LIST);
     args.Append(kTestHost1);
-    handler()->HandleRemoveSite(args.GetListDeprecated());
+    handler()->HandleRemoveSite(args.GetList());
     task_environment()->RunUntilIdle();
 
     // Removal should fire an update event.
@@ -511,7 +511,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append("");
-    handler()->HandleGetDisplayList(args.GetListDeprecated());
+    handler()->HandleGetDisplayList(args.GetList());
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
diff --git a/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc b/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
index 052bc31..90a9107 100644
--- a/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
@@ -33,11 +33,11 @@
 DefaultBrowserHandler::~DefaultBrowserHandler() = default;
 
 void DefaultBrowserHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestDefaultBrowserState",
       base::BindRepeating(&DefaultBrowserHandler::RequestDefaultBrowserState,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setAsDefaultBrowser",
       base::BindRepeating(&DefaultBrowserHandler::SetAsDefaultBrowser,
                           base::Unretained(this)));
@@ -49,8 +49,7 @@
   local_state_pref_registrar_.Add(
       prefs::kDefaultBrowserSettingEnabled,
       base::BindRepeating(&DefaultBrowserHandler::RequestDefaultBrowserState,
-                          base::Unretained(this),
-                          base::Value::ConstListView()));
+                          base::Unretained(this), base::Value::List()));
   default_browser_worker_ = new shell_integration::DefaultBrowserWorker();
 }
 
@@ -61,7 +60,7 @@
 }
 
 void DefaultBrowserHandler::RequestDefaultBrowserState(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(args.size(), 1U);
@@ -72,8 +71,7 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void DefaultBrowserHandler::SetAsDefaultBrowser(
-    base::Value::ConstListView args) {
+void DefaultBrowserHandler::SetAsDefaultBrowser(const base::Value::List& args) {
   CHECK(!DefaultBrowserIsDisabledByPolicy());
   AllowJavascript();
   RecordSetAsDefaultUMA();
diff --git a/chrome/browser/ui/webui/settings/settings_default_browser_handler.h b/chrome/browser/ui/webui/settings/settings_default_browser_handler.h
index 6e91a128..78ed7c4 100644
--- a/chrome/browser/ui/webui/settings/settings_default_browser_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_default_browser_handler.h
@@ -42,10 +42,10 @@
   std::string check_default_callback_id_;
 
   // Called from WebUI to request the current state.
-  void RequestDefaultBrowserState(base::Value::ConstListView args);
+  void RequestDefaultBrowserState(const base::Value::List& args);
 
   // Makes this the default browser. Called from WebUI.
-  void SetAsDefaultBrowser(base::Value::ConstListView args);
+  void SetAsDefaultBrowser(const base::Value::List& args);
 
   // Called with the default browser state when the DefaultBrowserWorker is
   // done.
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 cce6985c..4027e8e 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1651,14 +1651,16 @@
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_TOPICS_EMPTY},
       {"privacySandboxAdPersonalizationDialogRemovedTopicsEmpty",
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_EMPTY},
-      {"privacySandboxAdPersonalizationDialogRemovedInterestsLabel",
-       IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_INTERESTS_LABEL},
+      {"privacySandboxAdPersonalizationDialogRemovedTopicsLabel",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_TOPICS_LABEL},
       {"privacySandboxAdPersonalizationDialogFledgeTitle",
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_TITLE},
       {"privacySandboxAdPersonalizationDialogFledgeEmpty",
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_FLEDGE_EMPTY},
       {"privacySandboxAdPersonalizationDialogRemovedFledgeEmpty",
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_EMPTY},
+      {"privacySandboxAdPersonalizationDialogRemovedFledgeLabel",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_DIALOG_REMOVED_FLEDGE_LABEL},
       {"privacySandboxAdMeasurementDialogTitle",
        IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_DIALOG_TITLE},
       {"privacySandboxAdMeasurementDialogDescription",
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
index b6c753f7..57b9efc 100644
--- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
@@ -53,34 +53,34 @@
 ManageProfileHandler::~ManageProfileHandler() {}
 
 void ManageProfileHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getAvailableIcons",
       base::BindRepeating(&ManageProfileHandler::HandleGetAvailableIcons,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setProfileIconToGaiaAvatar",
       base::BindRepeating(
           &ManageProfileHandler::HandleSetProfileIconToGaiaAvatar,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setProfileIconToDefaultAvatar",
       base::BindRepeating(
           &ManageProfileHandler::HandleSetProfileIconToDefaultAvatar,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setProfileName",
       base::BindRepeating(&ManageProfileHandler::HandleSetProfileName,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "requestProfileShortcutStatus",
       base::BindRepeating(
           &ManageProfileHandler::HandleRequestProfileShortcutStatus,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "addProfileShortcut",
       base::BindRepeating(&ManageProfileHandler::HandleAddProfileShortcut,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeProfileShortcut",
       base::BindRepeating(&ManageProfileHandler::HandleRemoveProfileShortcut,
                           base::Unretained(this)));
@@ -124,7 +124,7 @@
 }
 
 void ManageProfileHandler::HandleGetAvailableIcons(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   profiles::UpdateGaiaProfileInfoIfNeeded(profile_);
@@ -181,7 +181,7 @@
 }
 
 void ManageProfileHandler::HandleSetProfileIconToGaiaAvatar(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   PrefService* pref_service = profile_->GetPrefs();
@@ -201,7 +201,7 @@
 }
 
 void ManageProfileHandler::HandleSetProfileIconToDefaultAvatar(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CHECK_EQ(1u, args.size());
   CHECK(args[0].is_int());
@@ -220,8 +220,7 @@
   ProfileMetrics::LogProfileUpdate(profile_->GetPath());
 }
 
-void ManageProfileHandler::HandleSetProfileName(
-    base::Value::ConstListView args) {
+void ManageProfileHandler::HandleSetProfileName(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CHECK_EQ(1u, args.size());
 
@@ -235,7 +234,7 @@
 }
 
 void ManageProfileHandler::HandleRequestProfileShortcutStatus(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(ProfileShortcutManager::IsFeatureEnabled());
@@ -271,7 +270,7 @@
 }
 
 void ManageProfileHandler::HandleAddProfileShortcut(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(ProfileShortcutManager::IsFeatureEnabled());
   ProfileShortcutManager* shortcut_manager =
       g_browser_process->profile_manager()->profile_shortcut_manager();
@@ -281,7 +280,7 @@
 }
 
 void ManageProfileHandler::HandleRemoveProfileShortcut(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(ProfileShortcutManager::IsFeatureEnabled());
   ProfileShortcutManager* shortcut_manager =
     g_browser_process->profile_manager()->profile_shortcut_manager();
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h
index 50d6493f..2741526 100644
--- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.h
@@ -59,24 +59,24 @@
 
   // Callback for the "getAvailableIcons" message.
   // Sends the array of default profile icon URLs and profile names to WebUI.
-  void HandleGetAvailableIcons(base::Value::ConstListView args);
+  void HandleGetAvailableIcons(const base::Value::List& args);
 
   // Get all the available profile icons to choose from.
   std::vector<base::Value> GetAvailableIcons();
 
   // Callback for the "setProfileIconToGaiaAvatar" message.
-  void HandleSetProfileIconToGaiaAvatar(base::Value::ConstListView args);
+  void HandleSetProfileIconToGaiaAvatar(const base::Value::List& args);
 
   // Callback for the "setProfileIconToDefaultAvatar" message.
-  void HandleSetProfileIconToDefaultAvatar(base::Value::ConstListView args);
+  void HandleSetProfileIconToDefaultAvatar(const base::Value::List& args);
 
   // Callback for the "setProfileName" message.
-  void HandleSetProfileName(base::Value::ConstListView args);
+  void HandleSetProfileName(const base::Value::List& args);
 
   // Callback for the "requestProfileShortcutStatus" message, which is called
   // when editing an existing profile. Asks the profile shortcut manager whether
   // the profile has shortcuts and gets the result in |OnHasProfileShortcuts()|.
-  void HandleRequestProfileShortcutStatus(base::Value::ConstListView args);
+  void HandleRequestProfileShortcutStatus(const base::Value::List& args);
 
   // Callback invoked from the profile manager indicating whether the profile
   // being edited has any desktop shortcuts.
@@ -86,12 +86,12 @@
   // Callback for the "addProfileShortcut" message, which is called when editing
   // an existing profile and the user clicks the "Add desktop shortcut" button.
   // Adds a desktop shortcut for the profile.
-  void HandleAddProfileShortcut(base::Value::ConstListView args);
+  void HandleAddProfileShortcut(const base::Value::List& args);
 
   // Callback for the "removeProfileShortcut" message, which is called when
   // editing an existing profile and the user clicks the "Remove desktop
   // shortcut" button. Removes the desktop shortcut for the profile.
-  void HandleRemoveProfileShortcut(base::Value::ConstListView args);
+  void HandleRemoveProfileShortcut(const base::Value::List& args);
 
   // Non-owning pointer to the associated profile.
   raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
index 7b612c6f..80c55920 100644
--- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
@@ -159,7 +159,7 @@
 };
 
 TEST_F(ManageProfileHandlerTest, HandleSetProfileIconToGaiaAvatar) {
-  handler()->HandleSetProfileIconToGaiaAvatar(base::Value::ConstListView());
+  handler()->HandleSetProfileIconToGaiaAvatar(base::Value::List());
 
   PrefService* pref_service = profile()->GetPrefs();
   EXPECT_FALSE(pref_service->GetBoolean(prefs::kProfileUsingDefaultAvatar));
@@ -169,7 +169,7 @@
 TEST_F(ManageProfileHandlerTest, HandleSetProfileIconToDefaultCustomAvatar) {
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(15);
-  handler()->HandleSetProfileIconToDefaultAvatar(list_args.GetListDeprecated());
+  handler()->HandleSetProfileIconToDefaultAvatar(list_args.GetList());
 
   PrefService* pref_service = profile()->GetPrefs();
   EXPECT_EQ(15, pref_service->GetInteger(prefs::kProfileAvatarIndex));
@@ -181,7 +181,7 @@
   int generic_avatar_index = profiles::GetPlaceholderAvatarIndex();
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append(generic_avatar_index);
-  handler()->HandleSetProfileIconToDefaultAvatar(list_args.GetListDeprecated());
+  handler()->HandleSetProfileIconToDefaultAvatar(list_args.GetList());
 
   PrefService* pref_service = profile()->GetPrefs();
   EXPECT_EQ(generic_avatar_index,
@@ -193,7 +193,7 @@
 TEST_F(ManageProfileHandlerTest, HandleSetProfileName) {
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append("New Profile Name");
-  handler()->HandleSetProfileName(list_args.GetListDeprecated());
+  handler()->HandleSetProfileName(list_args.GetList());
 
   PrefService* pref_service = profile()->GetPrefs();
   EXPECT_EQ("New Profile Name", pref_service->GetString(prefs::kProfileName));
@@ -208,7 +208,7 @@
 
   base::Value list_args_1(base::Value::Type::LIST);
   list_args_1.Append("get-icons-callback-id");
-  handler()->HandleGetAvailableIcons(list_args_1.GetListDeprecated());
+  handler()->HandleGetAvailableIcons(list_args_1.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
@@ -227,7 +227,7 @@
 
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append("get-icons-callback-id");
-  handler()->HandleGetAvailableIcons(list_args.GetListDeprecated());
+  handler()->HandleGetAvailableIcons(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
@@ -246,7 +246,7 @@
 
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append("get-icons-callback-id");
-  handler()->HandleGetAvailableIcons(list_args.GetListDeprecated());
+  handler()->HandleGetAvailableIcons(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
@@ -292,7 +292,7 @@
 
   base::Value list_args(base::Value::Type::LIST);
   list_args.Append("get-icons-callback-id");
-  handler()->HandleGetAvailableIcons(list_args.GetListDeprecated());
+  handler()->HandleGetAvailableIcons(list_args.GetList());
 
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
diff --git a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
index 4e731a5..805cfb66 100644
--- a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
@@ -44,12 +44,12 @@
 }
 
 void MediaDevicesSelectionHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getDefaultCaptureDevices",
       base::BindRepeating(
           &MediaDevicesSelectionHandler::GetDefaultCaptureDevices,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setDefaultCaptureDevice",
       base::BindRepeating(
           &MediaDevicesSelectionHandler::SetDefaultCaptureDevice,
@@ -67,7 +67,7 @@
 }
 
 void MediaDevicesSelectionHandler::GetDefaultCaptureDevices(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(1U, args.size());
   if (!args[0].is_string()) {
     NOTREACHED();
@@ -83,7 +83,7 @@
 }
 
 void MediaDevicesSelectionHandler::SetDefaultCaptureDevice(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(2U, args.size());
   if (!args[0].is_string() || !args[1].is_string()) {
     NOTREACHED();
diff --git a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h
index 28d5540..992bd9e9 100644
--- a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h
@@ -42,12 +42,12 @@
   };
 
   // Fetches the list of default capture devices.
-  void GetDefaultCaptureDevices(base::Value::ConstListView args);
+  void GetDefaultCaptureDevices(const base::Value::List& args);
 
   // Sets the default audio/video capture device for media. |args| includes the
   // media type (kAuudio/kVideo) and the unique id of the new default device
   // that the user has chosen.
-  void SetDefaultCaptureDevice(base::Value::ConstListView args);
+  void SetDefaultCaptureDevice(const base::Value::List& args);
 
   // Helpers methods to update the device menus.
   void UpdateDevicesMenuForType(DeviceType type);
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
index 3bd2357..74b3ecc 100644
--- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
@@ -58,26 +58,26 @@
 SecureDnsHandler::~SecureDnsHandler() = default;
 
 void SecureDnsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getSecureDnsResolverList",
       base::BindRepeating(&SecureDnsHandler::HandleGetSecureDnsResolverList,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getSecureDnsSetting",
       base::BindRepeating(&SecureDnsHandler::HandleGetSecureDnsSetting,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "isValidConfig",
       base::BindRepeating(&SecureDnsHandler::HandleIsValidConfig,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "probeConfig", base::BindRepeating(&SecureDnsHandler::HandleProbeConfig,
                                          base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "recordUserDropdownInteraction",
       base::BindRepeating(
           &SecureDnsHandler::HandleRecordUserDropdownInteraction,
@@ -152,7 +152,7 @@
 }
 
 void SecureDnsHandler::HandleGetSecureDnsResolverList(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   std::string callback_id = args[0].GetString();
 
@@ -161,14 +161,14 @@
 }
 
 void SecureDnsHandler::HandleGetSecureDnsSetting(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1u, args.size());
   const base::Value& callback_id = args[0];
   ResolveJavascriptCallback(callback_id, CreateSecureDnsSettingDict());
 }
 
-void SecureDnsHandler::HandleIsValidConfig(base::Value::ConstListView args) {
+void SecureDnsHandler::HandleIsValidConfig(const base::Value::List& args) {
   AllowJavascript();
   const base::Value& callback_id = args[0];
   const std::string& custom_entry = args[1].GetString();
@@ -178,7 +178,7 @@
   ResolveJavascriptCallback(callback_id, base::Value(valid));
 }
 
-void SecureDnsHandler::HandleProbeConfig(base::Value::ConstListView args) {
+void SecureDnsHandler::HandleProbeConfig(const base::Value::List& args) {
   AllowJavascript();
 
   if (!probe_callback_id_.empty()) {
@@ -203,7 +203,7 @@
 }
 
 void SecureDnsHandler::HandleRecordUserDropdownInteraction(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   const std::string& old_provider = args[0].GetString();
   const std::string& new_provider = args[1].GetString();
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
index 36dc0ba..b5d22f1 100644
--- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.h
@@ -50,19 +50,19 @@
 
  protected:
   // Retrieves all pre-approved secure resolvers and returns them to WebUI.
-  void HandleGetSecureDnsResolverList(base::Value::ConstListView args);
+  void HandleGetSecureDnsResolverList(const base::Value::List& args);
 
   // Intended to be called once upon creation of the secure DNS setting.
-  void HandleGetSecureDnsSetting(base::Value::ConstListView args);
+  void HandleGetSecureDnsSetting(const base::Value::List& args);
 
   // Parses a custom entry and returns true if it is a fully valid config.
-  void HandleIsValidConfig(base::Value::ConstListView args);
+  void HandleIsValidConfig(const base::Value::List& args);
 
   // Returns whether or not a test query succeeds with the provided config.
-  void HandleProbeConfig(base::Value::ConstListView args);
+  void HandleProbeConfig(const base::Value::List& args);
 
   // Records metrics on the user-initiated dropdown selection event.
-  void HandleRecordUserDropdownInteraction(base::Value::ConstListView args);
+  void HandleRecordUserDropdownInteraction(const base::Value::List& args);
 
   // Retrieves the current host resolver configuration, computes the
   // corresponding UI representation, and sends it to javascript.
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
index 73d4a84..cdbead43 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
@@ -46,7 +46,7 @@
 }
 
 void HandleClose(base::RepeatingClosure close_callback,
-                 base::Value::ConstListView args) {
+                 const base::Value::List& args) {
   DCHECK_EQ(0u, args.size());
   close_callback.Run();
 }
@@ -95,15 +95,15 @@
 SecurityKeysPINHandler::~SecurityKeysPINHandler() = default;
 
 void SecurityKeysPINHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyStartSetPIN",
       base::BindRepeating(&SecurityKeysPINHandler::HandleStartSetPIN,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeySetPIN",
       base::BindRepeating(&SecurityKeysPINHandler::HandleSetPIN,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyPINClose",
       base::BindRepeating(&HandleClose,
                           base::BindRepeating(&SecurityKeysPINHandler::Close,
@@ -118,8 +118,7 @@
   callback_id_.clear();
 }
 
-void SecurityKeysPINHandler::HandleStartSetPIN(
-    base::Value::ConstListView args) {
+void SecurityKeysPINHandler::HandleStartSetPIN(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(State::kNone, state_);
   DCHECK_EQ(1u, args.size());
@@ -180,7 +179,7 @@
                             base::Value(std::move(response)));
 }
 
-void SecurityKeysPINHandler::HandleSetPIN(base::Value::ConstListView args) {
+void SecurityKeysPINHandler::HandleSetPIN(const base::Value::List& args) {
   DCHECK(state_ == State::kGatherNewPIN || state_ == State::kGatherChangePIN);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(3u, args.size());
@@ -202,15 +201,15 @@
 SecurityKeysResetHandler::~SecurityKeysResetHandler() = default;
 
 void SecurityKeysResetHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyReset",
       base::BindRepeating(&SecurityKeysResetHandler::HandleReset,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCompleteReset",
       base::BindRepeating(&SecurityKeysResetHandler::HandleCompleteReset,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyResetClose",
       base::BindRepeating(&HandleClose,
                           base::BindRepeating(&SecurityKeysResetHandler::Close,
@@ -225,7 +224,7 @@
   callback_id_.clear();
 }
 
-void SecurityKeysResetHandler::HandleReset(base::Value::ConstListView args) {
+void SecurityKeysResetHandler::HandleReset(const base::Value::List& args) {
   DCHECK_EQ(State::kNone, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
@@ -256,7 +255,7 @@
 }
 
 void SecurityKeysResetHandler::HandleCompleteReset(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
 
@@ -319,8 +318,7 @@
     : SecurityKeysHandlerBase(std::move(discovery_factory)) {}
 SecurityKeysCredentialHandler::~SecurityKeysCredentialHandler() = default;
 
-void SecurityKeysCredentialHandler::HandleStart(
-    base::Value::ConstListView args) {
+void SecurityKeysCredentialHandler::HandleStart(const base::Value::List& args) {
   DCHECK_EQ(State::kNone, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
@@ -344,28 +342,28 @@
 }
 
 void SecurityKeysCredentialHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementStart",
       base::BindRepeating(&SecurityKeysCredentialHandler::HandleStart,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementPIN",
       base::BindRepeating(&SecurityKeysCredentialHandler::HandlePIN,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementEnumerate",
       base::BindRepeating(&SecurityKeysCredentialHandler::HandleEnumerate,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementDelete",
       base::BindRepeating(&SecurityKeysCredentialHandler::HandleDelete,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementUpdate",
       base::BindRepeating(
           &SecurityKeysCredentialHandler::HandleUpdateUserInformation,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyCredentialManagementClose",
       base::BindRepeating(
           &HandleClose,
@@ -383,7 +381,7 @@
   DCHECK(!credential_management_provide_pin_cb_);
 }
 
-void SecurityKeysCredentialHandler::HandlePIN(base::Value::ConstListView args) {
+void SecurityKeysCredentialHandler::HandlePIN(const base::Value::List& args) {
   DCHECK_EQ(State::kPIN, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(2u, args.size());
@@ -398,7 +396,7 @@
 }
 
 void SecurityKeysCredentialHandler::HandleEnumerate(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(state_, State::kReady);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
@@ -413,7 +411,7 @@
 }
 
 void SecurityKeysCredentialHandler::HandleDelete(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(State::kReady, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(2u, args.size());
@@ -440,7 +438,7 @@
 }
 
 void SecurityKeysCredentialHandler::HandleUpdateUserInformation(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(State::kReady, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(5u, args.size());
@@ -661,7 +659,7 @@
 SecurityKeysBioEnrollmentHandler::~SecurityKeysBioEnrollmentHandler() = default;
 
 void SecurityKeysBioEnrollmentHandler::HandleStart(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(state_, State::kNone);
   DCHECK_EQ(1u, args.size());
@@ -682,41 +680,41 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollStart",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleStart,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollProvidePIN",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleProvidePIN,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollGetSensorInfo",
       base::BindRepeating(
           &SecurityKeysBioEnrollmentHandler::HandleGetSensorInfo,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollEnumerate",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleEnumerate,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollStartEnrolling",
       base::BindRepeating(
           &SecurityKeysBioEnrollmentHandler::HandleStartEnrolling,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollDelete",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleDelete,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollRename",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleRename,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollCancel",
       base::BindRepeating(&SecurityKeysBioEnrollmentHandler::HandleCancel,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyBioEnrollClose",
       base::BindRepeating(
           &HandleClose,
@@ -808,7 +806,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleProvidePIN(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(2u, args.size());
   DCHECK_EQ(state_, State::kGatherPIN);
@@ -818,7 +816,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleGetSensorInfo(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
   DCHECK_EQ(state_, State::kReady);
@@ -834,7 +832,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleEnumerate(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
   DCHECK_EQ(state_, State::kReady);
@@ -869,7 +867,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleStartEnrolling(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
   DCHECK_EQ(state_, State::kReady);
@@ -940,7 +938,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleDelete(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(2u, args.size());
   state_ = State::kDeleting;
@@ -968,7 +966,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleRename(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(args.size(), 3u);
   state_ = State::kRenaming;
@@ -996,7 +994,7 @@
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleCancel(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(state_, State::kEnrolling);
   DCHECK_EQ(0u, args.size());
@@ -1012,22 +1010,21 @@
 void SecurityKeysPhonesHandler::OnJavascriptDisallowed() {}
 
 void SecurityKeysPhonesHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyPhonesEnumerate",
       base::BindRepeating(&SecurityKeysPhonesHandler::HandleEnumerate,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyPhonesDelete",
       base::BindRepeating(&SecurityKeysPhonesHandler::HandleDelete,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "securityKeyPhonesRename",
       base::BindRepeating(&SecurityKeysPhonesHandler::HandleRename,
                           base::Unretained(this)));
 }
 
-void SecurityKeysPhonesHandler::HandleEnumerate(
-    base::Value::ConstListView args) {
+void SecurityKeysPhonesHandler::HandleEnumerate(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(1u, args.size());
 
@@ -1035,7 +1032,7 @@
   DoEnumerate(args[0]);
 }
 
-void SecurityKeysPhonesHandler::HandleDelete(base::Value::ConstListView args) {
+void SecurityKeysPhonesHandler::HandleDelete(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(2u, args.size());
 
@@ -1054,7 +1051,7 @@
   DoEnumerate(args[0]);
 }
 
-void SecurityKeysPhonesHandler::HandleRename(base::Value::ConstListView args) {
+void SecurityKeysPhonesHandler::HandleRename(const base::Value::List& args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(3u, args.size());
 
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.h b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
index 358b6151..ce33e5c 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
@@ -76,12 +76,12 @@
   void RegisterMessages() override;
   void Close() override;
 
-  void HandleStartSetPIN(base::Value::ConstListView args);
+  void HandleStartSetPIN(const base::Value::List& args);
   void OnGatherPIN(uint32_t current_min_pin_length,
                    uint32_t new_min_pin_length,
                    absl::optional<int64_t> num_retries);
   void OnSetPINComplete(device::CtapDeviceResponseCode code);
-  void HandleSetPIN(base::Value::ConstListView args);
+  void HandleSetPIN(const base::Value::List& args);
 
   State state_ = State::kNone;
 
@@ -112,9 +112,9 @@
   void RegisterMessages() override;
   void Close() override;
 
-  void HandleReset(base::Value::ConstListView args);
+  void HandleReset(const base::Value::List& args);
   void OnResetSent();
-  void HandleCompleteReset(base::Value::ConstListView args);
+  void HandleCompleteReset(const base::Value::List& args);
   void OnResetFinished(device::CtapDeviceResponseCode result);
 
   State state_ = State::kNone;
@@ -138,9 +138,9 @@
  protected:
   explicit SecurityKeysCredentialHandler(
       std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory);
-  void HandleStart(base::Value::ConstListView args);
-  void HandlePIN(base::Value::ConstListView args);
-  void HandleUpdateUserInformation(base::Value::ConstListView args);
+  void HandleStart(const base::Value::List& args);
+  void HandlePIN(const base::Value::List& args);
+  void HandleUpdateUserInformation(const base::Value::List& args);
 
  private:
   enum class State {
@@ -156,8 +156,8 @@
   void RegisterMessages() override;
   void Close() override;
 
-  void HandleEnumerate(base::Value::ConstListView args);
-  void HandleDelete(base::Value::ConstListView args);
+  void HandleEnumerate(const base::Value::List& args);
+  void HandleDelete(const base::Value::List& args);
 
   void OnCredentialManagementReady();
   void OnHaveCredentials(
@@ -194,9 +194,9 @@
  protected:
   explicit SecurityKeysBioEnrollmentHandler(
       std::unique_ptr<device::FidoDiscoveryFactory> discovery_factory);
-  void HandleStart(base::Value::ConstListView args);
-  void HandleProvidePIN(base::Value::ConstListView args);
-  void HandleStartEnrolling(base::Value::ConstListView args);
+  void HandleStart(const base::Value::List& args);
+  void HandleProvidePIN(const base::Value::List& args);
+  void HandleStartEnrolling(const base::Value::List& args);
 
  private:
   enum class State {
@@ -218,9 +218,9 @@
   void OnGatherPIN(uint32_t min_pin_length,
                    int64_t num_retries,
                    base::OnceCallback<void(std::string)>);
-  void HandleGetSensorInfo(base::Value::ConstListView args);
+  void HandleGetSensorInfo(const base::Value::List& args);
 
-  void HandleEnumerate(base::Value::ConstListView args);
+  void HandleEnumerate(const base::Value::List& args);
   void OnHaveEnumeration(
       device::CtapDeviceResponseCode,
       absl::optional<std::map<std::vector<uint8_t>, std::string>>);
@@ -233,13 +233,13 @@
       device::CtapDeviceResponseCode code,
       absl::optional<std::map<std::vector<uint8_t>, std::string>> enrollments);
 
-  void HandleDelete(base::Value::ConstListView args);
+  void HandleDelete(const base::Value::List& args);
   void OnDelete(device::CtapDeviceResponseCode);
 
-  void HandleRename(base::Value::ConstListView args);
+  void HandleRename(const base::Value::List& args);
   void OnRename(device::CtapDeviceResponseCode);
 
-  void HandleCancel(base::Value::ConstListView args);
+  void HandleCancel(const base::Value::List& args);
 
   State state_ = State::kNone;
   std::string callback_id_;
@@ -260,9 +260,9 @@
   void OnJavascriptDisallowed() override;
 
  private:
-  void HandleEnumerate(base::Value::ConstListView args);
-  void HandleDelete(base::Value::ConstListView args);
-  void HandleRename(base::Value::ConstListView args);
+  void HandleEnumerate(const base::Value::List& args);
+  void HandleDelete(const base::Value::List& args);
+  void HandleRename(const base::Value::List& args);
 
   void DoEnumerate(const base::Value& callback_id);
 };
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
index b7a8c699..2124042 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
@@ -59,7 +59,7 @@
     constexpr char kCallbackId[] = "securityKeyCredentialManagementStart";
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
-    HandleStart(args.GetListDeprecated());
+    HandleStart(args.GetList());
     base::RunLoop().RunUntilIdle();
     return kCallbackId;
   }
@@ -71,7 +71,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append(kTestPIN);
-    HandlePIN(args.GetListDeprecated());
+    HandlePIN(args.GetList());
     base::RunLoop().RunUntilIdle();
     return kCallbackId;
   }
@@ -100,7 +100,7 @@
     constexpr char kCallbackId[] = "bioEnrollStart";
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
-    HandleStart(args.GetListDeprecated());
+    HandleStart(args.GetList());
     base::RunLoop().RunUntilIdle();
     return kCallbackId;
   }
@@ -112,7 +112,7 @@
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
     args.Append(kTestPIN);
-    HandleProvidePIN(args.GetListDeprecated());
+    HandleProvidePIN(args.GetList());
     base::RunLoop().RunUntilIdle();
     return kCallbackId;
   }
@@ -123,7 +123,7 @@
     constexpr char kCallbackId[] = "bioEnrollStartEnrolling";
     base::Value args(base::Value::Type::LIST);
     args.Append(kCallbackId);
-    HandleStartEnrolling(args.GetListDeprecated());
+    HandleStartEnrolling(args.GetList());
     base::RunLoop().RunUntilIdle();
     return kCallbackId;
   }
@@ -212,7 +212,7 @@
   EXPECT_TRUE(*response->FindBoolKey("supportsUpdateUserInformation"));
 
   handler_->SimulateProvidePIN();
-  handler_->HandleUpdateUserInformation(args.GetListDeprecated());
+  handler_->HandleUpdateUserInformation(args.GetList());
   base::RunLoop().RunUntilIdle();
 
   device::PublicKeyCredentialUserEntity updated_user(
@@ -241,7 +241,7 @@
   std::string callback_id("start_callback_id");
   base::Value args(base::Value::Type::LIST);
   args.Append(callback_id);
-  handler_->HandleStart(args.GetListDeprecated());
+  handler_->HandleStart(args.GetList());
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(web_ui_->call_data()[0]->arg1()->GetString(),
diff --git a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
index d3f3116..197d435 100644
--- a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
@@ -30,23 +30,23 @@
   if (Profile::FromWebUI(web_ui())->IsOffTheRecord())
     return;
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "addStartupPage",
       base::BindRepeating(&StartupPagesHandler::HandleAddStartupPage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "editStartupPage",
       base::BindRepeating(&StartupPagesHandler::HandleEditStartupPage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "onStartupPrefsPageLoad",
       base::BindRepeating(&StartupPagesHandler::HandleOnStartupPrefsPageLoad,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeStartupPage",
       base::BindRepeating(&StartupPagesHandler::HandleRemoveStartupPage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setStartupPagesToCurrentPages",
       base::BindRepeating(
           &StartupPagesHandler::HandleSetStartupPagesToCurrentPages,
@@ -105,8 +105,7 @@
   OnModelChanged();
 }
 
-void StartupPagesHandler::HandleAddStartupPage(
-    base::Value::ConstListView args) {
+void StartupPagesHandler::HandleAddStartupPage(const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
 
   const base::Value& callback_id = args[0];
@@ -128,8 +127,7 @@
   ResolveJavascriptCallback(callback_id, base::Value(true));
 }
 
-void StartupPagesHandler::HandleEditStartupPage(
-    base::Value::ConstListView args) {
+void StartupPagesHandler::HandleEditStartupPage(const base::Value::List& args) {
   CHECK_EQ(args.size(), 3U);
   const base::Value& callback_id = args[0];
   int index = args[1].GetInt();
@@ -155,12 +153,12 @@
 }
 
 void StartupPagesHandler::HandleOnStartupPrefsPageLoad(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 }
 
 void StartupPagesHandler::HandleRemoveStartupPage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_GE(args.size(), 1u);
   if (!args[0].is_int()) {
     NOTREACHED();
@@ -179,7 +177,7 @@
 }
 
 void StartupPagesHandler::HandleSetStartupPagesToCurrentPages(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   startup_custom_pages_table_model_.SetToCurrentlyOpenPages(
       web_ui()->GetWebContents());
   SaveStartupPagesPref();
diff --git a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.h b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.h
index 8492863..b5f30b5 100644
--- a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.h
@@ -40,19 +40,19 @@
 
  private:
   // Adds a startup page with the given URL after the given index.
-  void HandleAddStartupPage(base::Value::ConstListView args);
+  void HandleAddStartupPage(const base::Value::List& args);
 
   // Changes the startup page at the given index to the given URL.
-  void HandleEditStartupPage(base::Value::ConstListView args);
+  void HandleEditStartupPage(const base::Value::List& args);
 
   // Informs the code that the JS page has loaded.
-  void HandleOnStartupPrefsPageLoad(base::Value::ConstListView args);
+  void HandleOnStartupPrefsPageLoad(const base::Value::List& args);
 
   // Removes the startup page at the given index.
-  void HandleRemoveStartupPage(base::Value::ConstListView args);
+  void HandleRemoveStartupPage(const base::Value::List& args);
 
   // Sets the startup page set to the current pages.
-  void HandleSetStartupPagesToCurrentPages(base::Value::ConstListView args);
+  void HandleSetStartupPagesToCurrentPages(const base::Value::List& args);
 
   // Stores the current state of the startup page preferences.
   void SaveStartupPagesPref();
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc
index 248f608..9eac726 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -506,114 +506,114 @@
 }
 
 void SiteSettingsHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "fetchUsageTotal",
       base::BindRepeating(&SiteSettingsHandler::HandleFetchUsageTotal,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearUnpartitionedUsage",
       base::BindRepeating(&SiteSettingsHandler::HandleClearUnpartitionedUsage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearPartitionedUsage",
       base::BindRepeating(&SiteSettingsHandler::HandleClearPartitionedUsage,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setDefaultValueForContentType",
       base::BindRepeating(
           &SiteSettingsHandler::HandleSetDefaultValueForContentType,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getDefaultValueForContentType",
       base::BindRepeating(
           &SiteSettingsHandler::HandleGetDefaultValueForContentType,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getAllSites",
       base::BindRepeating(&SiteSettingsHandler::HandleGetAllSites,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getCategoryList",
       base::BindRepeating(&SiteSettingsHandler::HandleGetCategoryList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getCookieSettingDescription",
       base::BindRepeating(
           &SiteSettingsHandler::HandleGetCookieSettingDescription,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getRecentSitePermissions",
       base::BindRepeating(&SiteSettingsHandler::HandleGetRecentSitePermissions,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getFormattedBytes",
       base::BindRepeating(&SiteSettingsHandler::HandleGetFormattedBytes,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getExceptionList",
       base::BindRepeating(&SiteSettingsHandler::HandleGetExceptionList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getChooserExceptionList",
       base::BindRepeating(&SiteSettingsHandler::HandleGetChooserExceptionList,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "getOriginPermissions",
       base::BindRepeating(&SiteSettingsHandler::HandleGetOriginPermissions,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setOriginPermissions",
       base::BindRepeating(&SiteSettingsHandler::HandleSetOriginPermissions,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "resetCategoryPermissionForPattern",
       base::BindRepeating(
           &SiteSettingsHandler::HandleResetCategoryPermissionForPattern,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setCategoryPermissionForPattern",
       base::BindRepeating(
           &SiteSettingsHandler::HandleSetCategoryPermissionForPattern,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "resetChooserExceptionForSite",
       base::BindRepeating(
           &SiteSettingsHandler::HandleResetChooserExceptionForSite,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "isOriginValid",
       base::BindRepeating(&SiteSettingsHandler::HandleIsOriginValid,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "isPatternValidForType",
       base::BindRepeating(&SiteSettingsHandler::HandleIsPatternValidForType,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "updateIncognitoStatus",
       base::BindRepeating(&SiteSettingsHandler::HandleUpdateIncognitoStatus,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "fetchZoomLevels",
       base::BindRepeating(&SiteSettingsHandler::HandleFetchZoomLevels,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "removeZoomLevel",
       base::BindRepeating(&SiteSettingsHandler::HandleRemoveZoomLevel,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "setBlockAutoplayEnabled",
       base::BindRepeating(&SiteSettingsHandler::HandleSetBlockAutoplayEnabled,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "fetchBlockAutoplayStatus",
       base::BindRepeating(&SiteSettingsHandler::HandleFetchBlockAutoplayStatus,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "clearEtldPlus1DataAndCookies",
       base::BindRepeating(
           &SiteSettingsHandler::HandleClearEtldPlus1DataAndCookies,
           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "recordAction",
       base::BindRepeating(&SiteSettingsHandler::HandleRecordAction,
                           base::Unretained(this)));
@@ -780,8 +780,7 @@
   SendZoomLevels();
 }
 
-void SiteSettingsHandler::HandleFetchUsageTotal(
-    base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleFetchUsageTotal(const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1U, args.size());
   usage_host_ = args[0].GetString();
@@ -796,7 +795,7 @@
 }
 
 void SiteSettingsHandler::HandleClearUnpartitionedUsage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& origin_string = args[0].GetString();
   auto origin = url::Origin::Create(GURL(origin_string));
@@ -810,7 +809,7 @@
 }
 
 void SiteSettingsHandler::HandleClearPartitionedUsage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   const std::string& origin = args[0].GetString();
   const std::string& etld_plus1 = args[1].GetString();
@@ -819,7 +818,7 @@
 }
 
 void SiteSettingsHandler::HandleSetDefaultValueForContentType(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
   const std::string& content_type = args[0].GetString();
   const std::string& setting = args[1].GetString();
@@ -854,7 +853,7 @@
 }
 
 void SiteSettingsHandler::HandleGetDefaultValueForContentType(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -871,7 +870,7 @@
   ResolveJavascriptCallback(callback_id, category);
 }
 
-void SiteSettingsHandler::HandleGetAllSites(base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleGetAllSites(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(1U, args.size());
@@ -939,8 +938,7 @@
   ResolveJavascriptCallback(base::Value(callback_id), result);
 }
 
-void SiteSettingsHandler::HandleGetCategoryList(
-    base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleGetCategoryList(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -957,7 +955,7 @@
 }
 
 void SiteSettingsHandler::HandleGetCookieSettingDescription(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(1U, args.size());
   std::string callback_id = args[0].GetString();
@@ -966,7 +964,7 @@
 }
 
 void SiteSettingsHandler::HandleGetRecentSitePermissions(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -1071,7 +1069,7 @@
 }
 
 void SiteSettingsHandler::HandleGetFormattedBytes(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(2U, args.size());
   int64_t num_bytes = static_cast<int64_t>(args[1].GetDouble());
@@ -1080,7 +1078,7 @@
 }
 
 void SiteSettingsHandler::HandleGetExceptionList(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -1115,7 +1113,7 @@
 }
 
 void SiteSettingsHandler::HandleGetChooserExceptionList(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
@@ -1131,7 +1129,7 @@
 }
 
 void SiteSettingsHandler::HandleGetOriginPermissions(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(3U, args.size());
@@ -1179,7 +1177,7 @@
 }
 
 void SiteSettingsHandler::HandleSetOriginPermissions(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(3U, args.size());
   std::string origin_string = args[0].GetString();
   const std::string* type_string = args[1].GetIfString();
@@ -1246,7 +1244,7 @@
 }
 
 void SiteSettingsHandler::HandleResetCategoryPermissionForPattern(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(4U, args.size());
   const std::string& primary_pattern_string = args[0].GetString();
   const std::string& secondary_pattern_string = args[1].GetString();
@@ -1303,7 +1301,7 @@
 }
 
 void SiteSettingsHandler::HandleSetCategoryPermissionForPattern(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(5U, args.size());
   const std::string& primary_pattern_string = args[0].GetString();
   const std::string& secondary_pattern_string = args[1].GetString();
@@ -1369,7 +1367,7 @@
 }
 
 void SiteSettingsHandler::HandleResetChooserExceptionForSite(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(4U, args.size());
 
   const std::string& chooser_type_str = args[0].GetString();
@@ -1391,7 +1389,7 @@
                                           args[3]);
 }
 
-void SiteSettingsHandler::HandleIsOriginValid(base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleIsOriginValid(const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(2U, args.size());
   const base::Value& callback_id = args[0];
@@ -1402,7 +1400,7 @@
 }
 
 void SiteSettingsHandler::HandleIsPatternValidForType(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   CHECK_EQ(3U, args.size());
   const base::Value& callback_id = args[0];
@@ -1420,14 +1418,13 @@
 }
 
 void SiteSettingsHandler::HandleUpdateIncognitoStatus(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   FireWebUIListener("onIncognitoStatusChanged",
                     base::Value(profile_->HasPrimaryOTRProfile()));
 }
 
-void SiteSettingsHandler::HandleFetchZoomLevels(
-    base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleFetchZoomLevels(const base::Value::List& args) {
   AllowJavascript();
   SendZoomLevels();
 }
@@ -1510,8 +1507,7 @@
   FireWebUIListener("onZoomLevelsChanged", zoom_levels_exceptions);
 }
 
-void SiteSettingsHandler::HandleRemoveZoomLevel(
-    base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleRemoveZoomLevel(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
 
   std::string origin = args[0].GetString();
@@ -1528,7 +1524,7 @@
 }
 
 void SiteSettingsHandler::HandleFetchBlockAutoplayStatus(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
   SendBlockAutoplayStatus();
 }
@@ -1558,7 +1554,7 @@
 }
 
 void SiteSettingsHandler::HandleSetBlockAutoplayEnabled(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   AllowJavascript();
 
   if (!UnifiedAutoplayConfig::IsBlockAutoplayUserModifiable(profile_))
@@ -1720,7 +1716,7 @@
 }
 
 void SiteSettingsHandler::HandleClearEtldPlus1DataAndCookies(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& etld_plus1 = args[0].GetString();
 
@@ -1751,7 +1747,7 @@
   RemoveNonTreeModelData(affected_origins);
 }
 
-void SiteSettingsHandler::HandleRecordAction(base::Value::ConstListView args) {
+void SiteSettingsHandler::HandleRecordAction(const base::Value::List& args) {
   const auto& list = args;
   CHECK_EQ(1U, list.size());
   int action = list[0].GetInt();
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.h b/chrome/browser/ui/webui/settings/site_settings_handler.h
index 622d2a1..f86b467b 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.h
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -163,38 +163,38 @@
 
   // Asynchronously fetches the usage for a given origin. Replies back with
   // OnGetUsageInfo above.
-  void HandleFetchUsageTotal(base::Value::ConstListView args);
+  void HandleFetchUsageTotal(const base::Value::List& args);
 
   // Deletes the storage being used for a given host.
-  void HandleClearUnpartitionedUsage(base::Value::ConstListView args);
+  void HandleClearUnpartitionedUsage(const base::Value::List& args);
 
-  void HandleClearPartitionedUsage(base::Value::ConstListView args);
+  void HandleClearPartitionedUsage(const base::Value::List& args);
 
   // Gets and sets the default value for a particular content settings type.
-  void HandleSetDefaultValueForContentType(base::Value::ConstListView args);
-  void HandleGetDefaultValueForContentType(base::Value::ConstListView args);
+  void HandleSetDefaultValueForContentType(const base::Value::List& args);
+  void HandleGetDefaultValueForContentType(const base::Value::List& args);
 
   // Returns a list of sites with permissions settings, grouped by their
   // eTLD+1. Recreates the cookies tree model to fetch the cookie and usage
   // data, which will send the list of sites with cookies or usage data to
   // the front end when fetching finished.
-  void HandleGetAllSites(base::Value::ConstListView args);
+  void HandleGetAllSites(const base::Value::List& args);
 
   // Returns a list of content settings types that are controlled via a standard
   // permissions UI and should be made visible to the user. There is a single
   // nullable string argument, which represents an associated origin. See
   // `SiteSettingsPrefsBrowserProxy#getCategoryList`.
-  void HandleGetCategoryList(base::Value::ConstListView args);
+  void HandleGetCategoryList(const base::Value::List& args);
 
   // Returns a string for display describing the current cookie settings.
-  void HandleGetCookieSettingDescription(base::Value::ConstListView args);
+  void HandleGetCookieSettingDescription(const base::Value::List& args);
 
   // Returns a list containing the most recent permission changes for the
   // content types that are visiblein settings, grouped by origin/profile
   // (incognito, regular) combinations, limited to N origin/profile pairings.
   // This includes permission changes made by embargo, but does not include
   // permissions enforced via policy.
-  void HandleGetRecentSitePermissions(base::Value::ConstListView args);
+  void HandleGetRecentSitePermissions(const base::Value::List& args);
 
   // Called when the list of origins using storage has been fetched, and sends
   // this list back to the front end.
@@ -207,65 +207,65 @@
 
   // Converts a given number of bytes into a human-readable format, with data
   // units.
-  void HandleGetFormattedBytes(base::Value::ConstListView args);
+  void HandleGetFormattedBytes(const base::Value::List& args);
 
   // Returns the list of site exceptions for a given content settings type.
-  void HandleGetExceptionList(base::Value::ConstListView args);
+  void HandleGetExceptionList(const base::Value::List& args);
 
   // Returns the list of chooser exceptions for a given chooser type.
-  void HandleGetChooserExceptionList(base::Value::ConstListView args);
+  void HandleGetChooserExceptionList(const base::Value::List& args);
 
   // Gets and sets a list of ContentSettingTypes for an origin.
   // TODO(https://crbug.com/739241): Investigate replacing the
   // '*CategoryPermissionForPattern' equivalents below with these methods.
-  void HandleGetOriginPermissions(base::Value::ConstListView args);
-  void HandleSetOriginPermissions(base::Value::ConstListView args);
+  void HandleGetOriginPermissions(const base::Value::List& args);
+  void HandleSetOriginPermissions(const base::Value::List& args);
 
   // Handles setting and resetting an origin permission.
-  void HandleResetCategoryPermissionForPattern(base::Value::ConstListView args);
-  void HandleSetCategoryPermissionForPattern(base::Value::ConstListView args);
+  void HandleResetCategoryPermissionForPattern(const base::Value::List& args);
+  void HandleSetCategoryPermissionForPattern(const base::Value::List& args);
 
   // TODO(andypaicu, crbug.com/880684): Update to only expect a list of three
   // arguments, replacing the current (requesting,embedding) arguments with
   // simply (origin) and update all call sites.
   // Handles resetting a chooser exception for the given site.
-  void HandleResetChooserExceptionForSite(base::Value::ConstListView args);
+  void HandleResetChooserExceptionForSite(const base::Value::List& args);
 
   // Returns whether a given string is a valid origin.
-  void HandleIsOriginValid(base::Value::ConstListView args);
+  void HandleIsOriginValid(const base::Value::List& args);
 
   // Returns whether the pattern is valid given the type.
-  void HandleIsPatternValidForType(base::Value::ConstListView args);
+  void HandleIsPatternValidForType(const base::Value::List& args);
 
   // Looks up whether an incognito session is active.
-  void HandleUpdateIncognitoStatus(base::Value::ConstListView args);
+  void HandleUpdateIncognitoStatus(const base::Value::List& args);
 
   // Notifies the JS side whether incognito is enabled.
   void SendIncognitoStatus(Profile* profile, bool was_destroyed);
 
   // Handles the request for a list of all zoom levels.
-  void HandleFetchZoomLevels(base::Value::ConstListView args);
+  void HandleFetchZoomLevels(const base::Value::List& args);
 
   // Sends the zoom level list down to the web ui.
   void SendZoomLevels();
 
   // Removes a particular zoom level for a given host.
-  void HandleRemoveZoomLevel(base::Value::ConstListView args);
+  void HandleRemoveZoomLevel(const base::Value::List& args);
 
   // Handles the request to send block autoplay state.
-  void HandleFetchBlockAutoplayStatus(base::Value::ConstListView args);
+  void HandleFetchBlockAutoplayStatus(const base::Value::List& args);
 
   // Notifies the JS side about the state of the block autoplay toggle.
   void SendBlockAutoplayStatus();
 
   // Updates the block autoplay enabled pref when the UI is toggled.
-  void HandleSetBlockAutoplayEnabled(base::Value::ConstListView args);
+  void HandleSetBlockAutoplayEnabled(const base::Value::List& args);
 
   // Clear web storage data and cookies from cookies tree model for an ETLD+1.
-  void HandleClearEtldPlus1DataAndCookies(base::Value::ConstListView args);
+  void HandleClearEtldPlus1DataAndCookies(const base::Value::List& args);
 
   // Record metrics for actions on All Sites Page.
-  void HandleRecordAction(base::Value::ConstListView args);
+  void HandleRecordAction(const base::Value::List& args);
 
   // Provides an opportunity for site data which is not integrated into the
   // tree model to be removed when entries for |origins| are removed.
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 05a79dd..01b87c3 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -577,7 +577,7 @@
   base::Value get_args(base::Value::Type::LIST);
   get_args.Append(kCallbackId);
   get_args.Append(kNotifications);
-  handler()->HandleGetDefaultValueForContentType(get_args.GetListDeprecated());
+  handler()->HandleGetDefaultValueForContentType(get_args.GetList());
   ValidateDefault(CONTENT_SETTING_ASK,
                   site_settings::SiteSettingSource::kDefault, 1U);
 
@@ -586,12 +586,12 @@
   set_args.Append(kNotifications);
   set_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
-  handler()->HandleSetDefaultValueForContentType(set_args.GetListDeprecated());
+  handler()->HandleSetDefaultValueForContentType(set_args.GetList());
 
   EXPECT_EQ(2U, web_ui()->call_data().size());
 
   // Verify that the default has been set to 'Blocked'.
-  handler()->HandleGetDefaultValueForContentType(get_args.GetListDeprecated());
+  handler()->HandleGetDefaultValueForContentType(get_args.GetList());
   ValidateDefault(CONTENT_SETTING_BLOCK,
                   site_settings::SiteSettingSource::kDefault, 3U);
 }
@@ -602,7 +602,7 @@
   get_all_sites_args.Append(kCallbackId);
 
   // Test all sites is empty when there are no preferences.
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
   {
@@ -624,7 +624,7 @@
       url1, url1, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK);
   map->SetContentSettingDefaultScope(
       url2, url2, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW);
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
 
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -652,7 +652,7 @@
   const GURL url3("https://example2.net");
   map->SetContentSettingDefaultScope(
       url3, url3, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK);
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
 
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -692,7 +692,7 @@
       CONTENT_SETTING_BLOCK,
       auto_blocker->GetEmbargoResult(url4, ContentSettingsType::NOTIFICATIONS)
           .content_setting);
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
 
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -706,7 +706,7 @@
 
   // Check |url4| disappears from the list when its embargo expires.
   clock.Advance(base::Days(8));
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
 
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -736,7 +736,7 @@
       auto_blocker->GetEmbargoResult(url3, ContentSettingsType::NOTIFICATIONS)
           .content_setting);
 
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     EXPECT_EQ("cr.webUIResponse", data.function_name());
@@ -765,7 +765,7 @@
       auto_blocker->GetEmbargoResult(url5, ContentSettingsType::NOTIFICATIONS)
           .content_setting);
 
-  handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+  handler()->HandleGetAllSites(get_all_sites_args.GetList());
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     EXPECT_EQ("cr.webUIResponse", data.function_name());
@@ -813,7 +813,7 @@
 
   // Test recent permissions is empty when there are no preferences.
   handler()->HandleGetRecentSitePermissions(
-      get_recent_permissions_args.GetListDeprecated());
+      get_recent_permissions_args.GetList());
   EXPECT_EQ(1U, web_ui()->call_data().size());
 
   {
@@ -851,7 +851,7 @@
         url1, ContentSettingsType::NOTIFICATIONS, false);
 
   handler()->HandleGetRecentSitePermissions(
-      get_recent_permissions_args.GetListDeprecated());
+      get_recent_permissions_args.GetList());
   {
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     EXPECT_EQ("cr.webUIResponse", data.function_name());
@@ -1111,14 +1111,12 @@
         content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
     set_args.Append(true);  // Incognito.
 
-    handler()->HandleSetCategoryPermissionForPattern(
-        set_args.GetListDeprecated());
+    handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
 
     base::Value get_exception_list_args(base::Value::Type::LIST);
     get_exception_list_args.Append(kCallbackId);
     get_exception_list_args.Append(kNotifications);
-    handler()->HandleGetExceptionList(
-        get_exception_list_args.GetListDeprecated());
+    handler()->HandleGetExceptionList(get_exception_list_args.GetList());
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
 
@@ -1138,14 +1136,12 @@
         content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
     set_args.Append(false);  // Incognito.
 
-    handler()->HandleSetCategoryPermissionForPattern(
-        set_args.GetListDeprecated());
+    handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
 
     base::Value get_exception_list_args(base::Value::Type::LIST);
     get_exception_list_args.Append(kCallbackId);
     get_exception_list_args.Append(kNotifications);
-    handler()->HandleGetExceptionList(
-        get_exception_list_args.GetListDeprecated());
+    handler()->HandleGetExceptionList(get_exception_list_args.GetList());
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
 
@@ -1174,8 +1170,7 @@
         content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
     set_args.Append(false);  // Incognito.
 
-    handler()->HandleSetCategoryPermissionForPattern(
-        set_args.GetListDeprecated());
+    handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
     ASSERT_EQ(1U, web_ui()->call_data().size());
   }
 
@@ -1214,8 +1209,7 @@
     reset_args.Append(std::string());
     reset_args.Append(kNotifications);
     reset_args.Append(false);  // Incognito.
-    handler()->HandleResetCategoryPermissionForPattern(
-        reset_args.GetListDeprecated());
+    handler()->HandleResetCategoryPermissionForPattern(reset_args.GetList());
 
     // Check there is 1 blocked origin.
     base::ListValue exceptions;
@@ -1233,8 +1227,7 @@
     reset_args.Append(std::string());
     reset_args.Append(kNotifications);
     reset_args.Append(false);  // Incognito.
-    handler()->HandleResetCategoryPermissionForPattern(
-        reset_args.GetListDeprecated());
+    handler()->HandleResetCategoryPermissionForPattern(reset_args.GetList());
 
     // Check that there are no blocked or embargoed origins.
     base::ListValue exceptions;
@@ -1260,8 +1253,7 @@
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
   set_args.Append(false);  // Incognito.
 
-  handler()->HandleSetCategoryPermissionForPattern(
-      set_args.GetListDeprecated());
+  handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
   ASSERT_EQ(1U, web_ui()->call_data().size());
 
   // Reset blocked origin.
@@ -1271,8 +1263,7 @@
   reset_args.Append(kNotifications);
   reset_args.Append(false);  // Incognito.
   // Check that this method is not crashing for an invalid origin.
-  handler()->HandleResetCategoryPermissionForPattern(
-      reset_args.GetListDeprecated());
+  handler()->HandleResetCategoryPermissionForPattern(reset_args.GetList());
 }
 
 TEST_F(SiteSettingsHandlerTest, Origins) {
@@ -1287,16 +1278,14 @@
     set_args.Append(
         content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
     set_args.Append(false);  // Incognito.
-    handler()->HandleSetCategoryPermissionForPattern(
-        set_args.GetListDeprecated());
+    handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
     EXPECT_EQ(1U, web_ui()->call_data().size());
   }
 
   base::Value get_exception_list_args(base::Value::Type::LIST);
   get_exception_list_args.Append(kCallbackId);
   get_exception_list_args.Append(kNotifications);
-  handler()->HandleGetExceptionList(
-      get_exception_list_args.GetListDeprecated());
+  handler()->HandleGetExceptionList(get_exception_list_args.GetList());
   ValidateOrigin(google, "", google, CONTENT_SETTING_BLOCK,
                  site_settings::SiteSettingSource::kPreference, 2U);
 
@@ -1307,14 +1296,12 @@
     reset_args.Append(std::string());
     reset_args.Append(kNotifications);
     reset_args.Append(false);  // Incognito.
-    handler()->HandleResetCategoryPermissionForPattern(
-        reset_args.GetListDeprecated());
+    handler()->HandleResetCategoryPermissionForPattern(reset_args.GetList());
     EXPECT_EQ(3U, web_ui()->call_data().size());
   }
 
   // Verify the reset was successful.
-  handler()->HandleGetExceptionList(
-      get_exception_list_args.GetListDeprecated());
+  handler()->HandleGetExceptionList(get_exception_list_args.GetList());
   ValidateNoOrigin(4U);
 }
 
@@ -1338,7 +1325,7 @@
         content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
     set_notification_origin_args.Append(false /* incognito */);
     handler()->HandleSetCategoryPermissionForPattern(
-        set_notification_origin_args.GetListDeprecated());
+        set_notification_origin_args.GetList());
   }
 
   {
@@ -1350,7 +1337,7 @@
         content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
     set_notification_origin_args.Append(false /* incognito */);
     handler()->HandleSetCategoryPermissionForPattern(
-        set_notification_origin_args.GetListDeprecated());
+        set_notification_origin_args.GetList());
   }
 
   origin_queried_waiter.Run();
@@ -1394,8 +1381,7 @@
   get_origin_permissions_args.Append(std::move(category_list));
 
   // Test Chrome built-in defaults are marked as default.
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ASK,
                  site_settings::SiteSettingSource::kDefault, 1U);
 
@@ -1403,11 +1389,9 @@
   default_value_args.Append(kNotifications);
   default_value_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
-  handler()->HandleSetDefaultValueForContentType(
-      default_value_args.GetListDeprecated());
+  handler()->HandleSetDefaultValueForContentType(default_value_args.GetList());
   // A user-set global default should also show up as default.
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_BLOCK,
                  site_settings::SiteSettingSource::kDefault, 3U);
 
@@ -1419,10 +1403,9 @@
       content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
   set_notification_pattern_args.Append(false);
   handler()->HandleSetCategoryPermissionForPattern(
-      set_notification_pattern_args.GetListDeprecated());
+      set_notification_pattern_args.GetList());
   // A user-set pattern should not show up as default.
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ALLOW,
                  site_settings::SiteSettingSource::kPreference, 5U);
 
@@ -1434,17 +1417,15 @@
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
   set_notification_origin_args.Append(false);
   handler()->HandleSetCategoryPermissionForPattern(
-      set_notification_origin_args.GetListDeprecated());
+      set_notification_origin_args.GetList());
   // A user-set per-origin permission should not show up as default.
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_BLOCK,
                  site_settings::SiteSettingSource::kPreference, 7U);
 
   // Enterprise-policy set defaults should not show up as default.
   source_setter.SetPolicyDefault(CONTENT_SETTING_ALLOW);
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(google, google, expected_display_name, CONTENT_SETTING_ALLOW,
                  site_settings::SiteSettingSource::kPolicy, 8U);
 }
@@ -1461,7 +1442,7 @@
     category_list.Append(kNotifications);
     get_args.Append(std::move(category_list));
   }
-  handler()->HandleGetOriginPermissions(get_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_args.GetList());
   ValidateOrigin(origin_with_port, origin_with_port, origin,
                  CONTENT_SETTING_ASK,
                  site_settings::SiteSettingSource::kDefault, 1U);
@@ -1472,7 +1453,7 @@
   set_args.Append(kNotifications);
   set_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
-  handler()->HandleSetOriginPermissions(set_args.GetListDeprecated());
+  handler()->HandleSetOriginPermissions(set_args.GetList());
   EXPECT_EQ(2U, web_ui()->call_data().size());
 
   // Reset things back to how they were.
@@ -1482,11 +1463,11 @@
   reset_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_DEFAULT));
 
-  handler()->HandleSetOriginPermissions(reset_args.GetListDeprecated());
+  handler()->HandleSetOriginPermissions(reset_args.GetList());
   EXPECT_EQ(3U, web_ui()->call_data().size());
 
   // Verify the reset was successful.
-  handler()->HandleGetOriginPermissions(get_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_args.GetList());
   ValidateOrigin(origin_with_port, origin_with_port, origin,
                  CONTENT_SETTING_ASK,
                  site_settings::SiteSettingSource::kDefault, 4U);
@@ -1503,7 +1484,7 @@
     category_list.Append(kNotifications);
     get_args.Append(std::move(category_list));
   }
-  handler()->HandleGetOriginPermissions(get_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_args.GetList());
   // Verify that it'll return CONTENT_SETTING_BLOCK as |origin| is not a secure
   // context, a requirement for notifications. Note that the display string
   // will be blank since it's an invalid URL.
@@ -1520,10 +1501,10 @@
   }
   set_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_ALLOW));
-  handler()->HandleSetOriginPermissions(set_args.GetListDeprecated());
+  handler()->HandleSetOriginPermissions(set_args.GetList());
 
   // Also make sure the content setting for |origin| wasn't actually changed.
-  handler()->HandleGetOriginPermissions(get_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_args.GetList());
   ValidateOrigin(origin, origin, "", CONTENT_SETTING_BLOCK,
                  site_settings::SiteSettingSource::kInsecureOrigin, 2U);
 }
@@ -1555,7 +1536,7 @@
 
   // We don't need to check the results. This is just to make sure it doesn't
   // crash on the input.
-  handler()->HandleSetCategoryPermissionForPattern(args.GetListDeprecated());
+  handler()->HandleSetCategoryPermissionForPattern(args.GetList());
 
   scoped_refptr<const extensions::Extension> extension;
   extension = extensions::ExtensionBuilder()
@@ -1580,7 +1561,7 @@
   CHECK(dictionary.FindBoolKey(site_settings::kIncognito).has_value());
 
   // Again, don't need to check the results.
-  handler()->HandleSetCategoryPermissionForPattern(args.GetListDeprecated());
+  handler()->HandleSetCategoryPermissionForPattern(args.GetList());
 }
 
 TEST_F(SiteSettingsHandlerTest, ExtensionDisplayName) {
@@ -1606,8 +1587,7 @@
     category_list.Append(kNotifications);
     get_origin_permissions_args.Append(std::move(category_list));
   }
-  handler()->HandleGetOriginPermissions(
-      get_origin_permissions_args.GetListDeprecated());
+  handler()->HandleGetOriginPermissions(get_origin_permissions_args.GetList());
   ValidateOrigin(test_extension_url, test_extension_url, kExtensionName,
                  CONTENT_SETTING_ASK,
                  site_settings::SiteSettingSource::kDefault, 1U);
@@ -1620,7 +1600,7 @@
     args.Append(kCallbackId);
     args.Append(test_case.arguments.pattern);
     args.Append(test_case.arguments.content_type);
-    handler()->HandleIsPatternValidForType(args.GetListDeprecated());
+    handler()->HandleIsPatternValidForType(args.GetList());
     ValidatePattern(test_case.expected.validity, counter,
                     test_case.expected.reason);
     ++counter;
@@ -1629,7 +1609,7 @@
 
 TEST_F(SiteSettingsHandlerTest, Incognito) {
   base::Value args(base::Value::Type::LIST);
-  handler()->HandleUpdateIncognitoStatus(args.GetListDeprecated());
+  handler()->HandleUpdateIncognitoStatus(args.GetList());
   ValidateIncognitoExists(false, 1U);
 
   CreateIncognitoProfile();
@@ -1649,11 +1629,11 @@
   ValidateZoom(host, "122%", 1U);
 
   base::Value args(base::Value::Type::LIST);
-  handler()->HandleFetchZoomLevels(args.GetListDeprecated());
+  handler()->HandleFetchZoomLevels(args.GetList());
   ValidateZoom(host, "122%", 2U);
 
   args.Append("http://www.google.com");
-  handler()->HandleRemoveZoomLevel(args.GetListDeprecated());
+  handler()->HandleRemoveZoomLevel(args.GetList());
   ValidateZoom("", "", 3U);
 
   double default_level = host_zoom_map->GetDefaultZoomLevel();
@@ -1784,7 +1764,7 @@
   set_args.Append(kNotifications);
   set_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_BLOCK));
-  handler()->HandleSetOriginPermissions(set_args.GetListDeprecated());
+  handler()->HandleSetOriginPermissions(set_args.GetList());
 
   // Make sure all tabs belonging to the same origin as |origin_anchor| have an
   // infobar shown.
@@ -1834,7 +1814,7 @@
   reset_args.Append(std::move(category_list));
   reset_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_DEFAULT));
-  handler()->HandleSetOriginPermissions(reset_args.GetListDeprecated());
+  handler()->HandleSetOriginPermissions(reset_args.GetList());
 
   // Check the same tabs (plus the tab navigated to |origin_path|) still have
   // infobars showing.
@@ -1876,15 +1856,14 @@
   set_args.Append(
       content_settings::ContentSettingToString(CONTENT_SETTING_SESSION_ONLY));
   set_args.Append(false);  // Incognito.
-  handler()->HandleSetCategoryPermissionForPattern(
-      set_args.GetListDeprecated());
+  handler()->HandleSetCategoryPermissionForPattern(set_args.GetList());
 
   EXPECT_EQ(kNumberContentSettingListeners, web_ui()->call_data().size());
 }
 
 TEST_F(SiteSettingsHandlerTest, BlockAutoplay_SendOnRequest) {
   base::Value args(base::Value::Type::LIST);
-  handler()->HandleFetchBlockAutoplayStatus(args.GetListDeprecated());
+  handler()->HandleFetchBlockAutoplayStatus(args.GetList());
 
   // Check that we are checked and enabled.
   ValidateBlockAutoplay(true, true);
@@ -1924,7 +1903,7 @@
   base::Value data(base::Value::Type::LIST);
   data.Append(false);
 
-  handler()->HandleSetBlockAutoplayEnabled(data.GetListDeprecated());
+  handler()->HandleSetBlockAutoplayEnabled(data.GetList());
   EXPECT_FALSE(profile()->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled));
 }
 
@@ -1965,7 +1944,7 @@
     base::Value get_all_sites_args(base::Value::Type::LIST);
     get_all_sites_args.Append(kCallbackId);
 
-    handler()->HandleGetAllSites(get_all_sites_args.GetListDeprecated());
+    handler()->HandleGetAllSites(get_all_sites_args.GetList());
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
@@ -1986,8 +1965,7 @@
     get_exception_list_args.Append(kCallbackId);
     get_exception_list_args.Append(kNotifications);
 
-    handler()->HandleGetExceptionList(
-        get_exception_list_args.GetListDeprecated());
+    handler()->HandleGetExceptionList(get_exception_list_args.GetList());
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     base::Value::ConstListView exception_list =
@@ -2004,7 +1982,7 @@
     get_recent_permissions_args.Append(3);
 
     handler()->HandleGetRecentSitePermissions(
-        get_recent_permissions_args.GetListDeprecated());
+        get_recent_permissions_args.GetList());
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     base::Value::ConstListView recent_permission_list =
@@ -2042,7 +2020,7 @@
     get_origin_permissions_args.Append(std::move(category_list));
 
     handler()->HandleGetOriginPermissions(
-        get_origin_permissions_args.GetListDeprecated());
+        get_origin_permissions_args.GetList());
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     const base::Value::ConstListView exception_list =
         data.arg3()->GetListDeprecated();
@@ -2190,7 +2168,7 @@
     args.Append(kCallbackId);
     args.Append(chooser_type);
 
-    handler()->HandleGetChooserExceptionList(args.GetListDeprecated());
+    handler()->HandleGetChooserExceptionList(args.GetList());
 
     EXPECT_EQ(web_ui()->call_data().size(), expected_total_calls);
 
@@ -2356,7 +2334,7 @@
                                             ContentSettingsType::USB_GUARD),
                                         ContentSettingsType::USB_CHOOSER_DATA));
   EXPECT_CALL(observer_, OnPermissionRevoked(kGoogleOrigin));
-  handler()->HandleResetChooserExceptionForSite(args.GetListDeprecated());
+  handler()->HandleResetChooserExceptionForSite(args.GetList());
   auto* chooser_context = UsbChooserContextFactory::GetForProfile(profile());
   chooser_context->FlushScheduledSaveSettingsCalls();
 
@@ -2404,7 +2382,7 @@
                                             ContentSettingsType::USB_GUARD),
                                         ContentSettingsType::USB_CHOOSER_DATA));
   EXPECT_CALL(observer_, OnPermissionRevoked(kChromiumOrigin));
-  handler()->HandleResetChooserExceptionForSite(args.GetListDeprecated());
+  handler()->HandleResetChooserExceptionForSite(args.GetList());
   chooser_context->FlushScheduledSaveSettingsCalls();
 
   // The HandleResetChooserExceptionForSite() method should have also caused the
@@ -2450,7 +2428,7 @@
                                             ContentSettingsType::USB_GUARD),
                                         ContentSettingsType::USB_CHOOSER_DATA));
   EXPECT_CALL(observer_, OnPermissionRevoked(kAndroidOrigin));
-  handler()->HandleResetChooserExceptionForSite(args.GetListDeprecated());
+  handler()->HandleResetChooserExceptionForSite(args.GetList());
   chooser_context->FlushScheduledSaveSettingsCalls();
 
   // The HandleResetChooserExceptionForSite() method should have also caused the
@@ -2486,7 +2464,7 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append("example.com");
-  handler()->HandleClearEtldPlus1DataAndCookies(args.GetListDeprecated());
+  handler()->HandleClearEtldPlus1DataAndCookies(args.GetList());
 
   // All host nodes for non-secure example.com, and abc.example.com, which do
   // not have any unpartitioned  storage, should have been removed.
@@ -2518,7 +2496,7 @@
   args.ClearList();
   args.Append("google.com");
 
-  handler()->HandleClearEtldPlus1DataAndCookies(args.GetListDeprecated());
+  handler()->HandleClearEtldPlus1DataAndCookies(args.GetList());
 
   EXPECT_EQ(11, handler()->cookies_tree_model_->GetRoot()->GetTotalNodeCount());
 
@@ -2529,7 +2507,7 @@
   args.ClearList();
   args.Append("google.com.au");
 
-  handler()->HandleClearEtldPlus1DataAndCookies(args.GetListDeprecated());
+  handler()->HandleClearEtldPlus1DataAndCookies(args.GetList());
   // No nodes representing storage partitioned on google.com.au should be
   // present.
   for (const auto& host_node :
@@ -2560,7 +2538,7 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append("https://www.example.com/");
-  handler()->HandleClearUnpartitionedUsage(args.GetListDeprecated());
+  handler()->HandleClearUnpartitionedUsage(args.GetList());
 
   // Confirm that only the unpartitioned items for example.com have been
   // cleared.
@@ -2583,7 +2561,7 @@
   // not be cleared.
   args = base::Value(base::Value::Type::LIST);
   args.Append("https://google.com.au/");
-  handler()->HandleClearUnpartitionedUsage(args.GetListDeprecated());
+  handler()->HandleClearUnpartitionedUsage(args.GetList());
 
   remaining_host_nodes = GetHostNodes(GURL("https://google.com.au"));
 
@@ -2632,7 +2610,7 @@
   // Clear at the eTLD+1 level and ensure affected origins are cleared.
   base::Value args(base::Value::Type::LIST);
   args.Append("example.com");
-  handler()->HandleClearEtldPlus1DataAndCookies(args.GetListDeprecated());
+  handler()->HandleClearEtldPlus1DataAndCookies(args.GetList());
   host_content_settings_map->GetSettingsForOneType(
       ContentSettingsType::CLIENT_HINTS, &client_hints_settings);
   EXPECT_EQ(2U, client_hints_settings.size());
@@ -2653,7 +2631,7 @@
   // origin.
   args.ClearList();
   args.Append("https://google.com/");
-  handler()->HandleClearUnpartitionedUsage(args.GetListDeprecated());
+  handler()->HandleClearUnpartitionedUsage(args.GetList());
 
   // Validate the client hint has been cleared.
   host_content_settings_map->GetSettingsForOneType(
@@ -2677,7 +2655,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append("https://www.example.com/");
   args.Append("google.com");
-  handler()->HandleClearPartitionedUsage(args.GetListDeprecated());
+  handler()->HandleClearPartitionedUsage(args.GetList());
 
   // This should have only removed cookies for embedded.com partitioned on
   // google.com, leaving other cookies and storage untouched.
@@ -2733,7 +2711,7 @@
   // Validate get method works.
   base::Value get_args(base::Value::Type::LIST);
   get_args.Append(kCallbackId);
-  handler()->HandleGetCookieSettingDescription(get_args.GetListDeprecated());
+  handler()->HandleGetCookieSettingDescription(get_args.GetList());
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
 
   EXPECT_EQ("cr.webUIResponse", data.function_name());
@@ -2805,7 +2783,7 @@
   base::Value get_args(base::Value::Type::LIST);
   get_args.Append(kCallbackId);
   get_args.Append(size);
-  handler()->HandleGetFormattedBytes(get_args.GetListDeprecated());
+  handler()->HandleGetFormattedBytes(get_args.GetList());
 
   // Validate that this method can handle large data.
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
@@ -2824,13 +2802,13 @@
 
   base::Value args(base::Value::Type::LIST);
   args.Append("www.example.com");
-  handler()->HandleFetchUsageTotal(args.GetListDeprecated());
+  handler()->HandleFetchUsageTotal(args.GetList());
   handler()->OnGetUsageInfo();
   ValidateUsageInfo("www.example.com", "2 B", "1 cookie");
 
   args.ClearList();
   args.Append("example.com");
-  handler()->HandleFetchUsageTotal(args.GetListDeprecated());
+  handler()->HandleFetchUsageTotal(args.GetList());
   handler()->OnGetUsageInfo();
   ValidateUsageInfo("example.com", "", "1 cookie");
 }
diff --git a/chrome/browser/ui/webui/settings/system_handler.cc b/chrome/browser/ui/webui/settings/system_handler.cc
index 54de4467..0a5776f6 100644
--- a/chrome/browser/ui/webui/settings/system_handler.cc
+++ b/chrome/browser/ui/webui/settings/system_handler.cc
@@ -29,13 +29,13 @@
 }
 
 void SystemHandler::RegisterMessages() {
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "showProxySettings",
       base::BindRepeating(&SystemHandler::HandleShowProxySettings,
                           base::Unretained(this)));
 }
 
-void SystemHandler::HandleShowProxySettings(base::Value::ConstListView args) {
+void SystemHandler::HandleShowProxySettings(const base::Value::List& args) {
   base::RecordAction(base::UserMetricsAction("Options_ShowProxySettings"));
   settings_utils::ShowNetworkProxySettings(web_ui()->GetWebContents());
 }
diff --git a/chrome/browser/ui/webui/settings/system_handler.h b/chrome/browser/ui/webui/settings/system_handler.h
index a8465c3..369761da 100644
--- a/chrome/browser/ui/webui/settings/system_handler.h
+++ b/chrome/browser/ui/webui/settings/system_handler.h
@@ -32,7 +32,7 @@
 
  private:
   // Handler for the "showProxySettings" message. No args.
-  void HandleShowProxySettings(base::Value::ConstListView args);
+  void HandleShowProxySettings(const base::Value::List& args);
 };
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
index 34ff5bf..cb530f0 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -445,7 +445,7 @@
       "getAvailableAccounts",
       base::BindRepeating(&ProfilePickerHandler::HandleGetAvailableAccounts,
                           base::Unretained(this)));
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       "openAshAccountSettingsPage",
       base::BindRepeating(
           &ProfilePickerHandler::HandleOpenAshAccountSettingsPage,
@@ -1169,7 +1169,7 @@
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 
 void ProfilePickerHandler::HandleOpenAshAccountSettingsPage(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   std::string settings_url = chrome::kChromeUIOSSettingsURL;
   settings_url.append(chromeos::settings::mojom::kMyAccountsSubpagePath);
   lacros_url_handling::NavigateInAsh(GURL(settings_url));
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chrome/browser/ui/webui/signin/profile_picker_handler.h
index 85a4a25..1363746766 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler.h
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -142,7 +142,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
   // Opens the Ash account settings page in a new window.
-  void HandleOpenAshAccountSettingsPage(base::Value::ConstListView args);
+  void HandleOpenAshAccountSettingsPage(const base::Value::List& args);
 
   // List of available accounts used by the profile choice and the account
   // selection screens.
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
index ff8f843..1c7ab8d 100644
--- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.cc
@@ -37,7 +37,7 @@
 namespace {
 
 // Converts the string at |index| in |list| to an int, defaulting to 0 on error.
-int64_t StringAtIndexToInt64(base::Value::ConstListView list, size_t index) {
+int64_t StringAtIndexToInt64(const base::Value::List& list, size_t index) {
   if (list.size() > index && list[index].is_string()) {
     int64_t integer = 0;
     if (base::StringToInt64(list[index].GetString(), &integer))
@@ -47,7 +47,7 @@
 }
 
 // Returns whether the there is any value at the given |index|.
-bool HasSomethingAtIndex(base::Value::ConstListView list, size_t index) {
+bool HasSomethingAtIndex(const base::Value::List& list, size_t index) {
   if (list.size() > index && list[index].is_string()) {
     return !list[index].GetString().empty();
   }
@@ -92,65 +92,65 @@
 void SyncInternalsMessageHandler::RegisterMessages() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestDataAndRegisterForUpdates,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestDataAndRegisterForUpdates,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestListOfTypes,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestListOfTypes,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestIncludeSpecificsInitialState,
       base::BindRepeating(&SyncInternalsMessageHandler::
                               HandleRequestIncludeSpecificsInitialState,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kSetIncludeSpecifics,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleSetIncludeSpecifics,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kWriteUserEvent,
       base::BindRepeating(&SyncInternalsMessageHandler::HandleWriteUserEvent,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestStart,
       base::BindRepeating(&SyncInternalsMessageHandler::HandleRequestStart,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestStopKeepData,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestStopKeepData,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kRequestStopClearData,
       base::BindRepeating(
           &SyncInternalsMessageHandler::HandleRequestStopClearData,
           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kTriggerRefresh,
       base::BindRepeating(&SyncInternalsMessageHandler::HandleTriggerRefresh,
                           base::Unretained(this)));
 
-  web_ui()->RegisterDeprecatedMessageCallback2(
+  web_ui()->RegisterMessageCallback(
       syncer::sync_ui_util::kGetAllNodes,
       base::BindRepeating(&SyncInternalsMessageHandler::HandleGetAllNodes,
                           base::Unretained(this)));
 }
 
 void SyncInternalsMessageHandler::HandleRequestDataAndRegisterForUpdates(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(args.empty());
   AllowJavascript();
 
@@ -175,7 +175,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleRequestListOfTypes(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(args.empty());
   AllowJavascript();
 
@@ -191,7 +191,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleRequestIncludeSpecificsInitialState(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK(args.empty());
   AllowJavascript();
 
@@ -204,7 +204,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleGetAllNodes(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(1U, args.size());
   AllowJavascript();
 
@@ -223,14 +223,14 @@
 }
 
 void SyncInternalsMessageHandler::HandleSetIncludeSpecifics(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(1U, args.size());
   AllowJavascript();
   include_specifics_ = args[0].GetBool();
 }
 
 void SyncInternalsMessageHandler::HandleWriteUserEvent(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(2U, args.size());
   AllowJavascript();
 
@@ -255,7 +255,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleRequestStart(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
@@ -271,7 +271,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleRequestStopKeepData(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
@@ -282,7 +282,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleRequestStopClearData(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   DCHECK_EQ(0U, args.size());
 
   SyncService* service = GetSyncService();
@@ -293,7 +293,7 @@
 }
 
 void SyncInternalsMessageHandler::HandleTriggerRefresh(
-    base::Value::ConstListView args) {
+    const base::Value::List& args) {
   SyncService* service = GetSyncService();
   if (!service)
     return;
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
index 99bb9bae..a8007091 100644
--- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
+++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler.h
@@ -41,36 +41,35 @@
 
   // Fires an event to send updated data to the About page and registers
   // observers to notify the page upon updates.
-  void HandleRequestDataAndRegisterForUpdates(base::Value::ConstListView args);
+  void HandleRequestDataAndRegisterForUpdates(const base::Value::List& args);
 
   // Fires an event to send the list of types back to the page.
-  void HandleRequestListOfTypes(base::Value::ConstListView args);
+  void HandleRequestListOfTypes(const base::Value::List& args);
 
   // Fires an event to send the initial state of the "include specifics" flag.
-  void HandleRequestIncludeSpecificsInitialState(
-      base::Value::ConstListView args);
+  void HandleRequestIncludeSpecificsInitialState(const base::Value::List& args);
 
   // Handler for getAllNodes message.  Needs a |request_id| argument.
-  void HandleGetAllNodes(base::Value::ConstListView args);
+  void HandleGetAllNodes(const base::Value::List& args);
 
   // Handler for setting internal state of if specifics should be included in
   // protocol events when sent to be displayed.
-  void HandleSetIncludeSpecifics(base::Value::ConstListView args);
+  void HandleSetIncludeSpecifics(const base::Value::List& args);
 
   // Handler for writeUserEvent message.
-  void HandleWriteUserEvent(base::Value::ConstListView args);
+  void HandleWriteUserEvent(const base::Value::List& args);
 
   // Handler for requestStart message.
-  void HandleRequestStart(base::Value::ConstListView args);
+  void HandleRequestStart(const base::Value::List& args);
 
   // Handler for requestStopKeepData message.
-  void HandleRequestStopKeepData(base::Value::ConstListView args);
+  void HandleRequestStopKeepData(const base::Value::List& args);
 
   // Handler for requestStopClearData message.
-  void HandleRequestStopClearData(base::Value::ConstListView args);
+  void HandleRequestStopClearData(const base::Value::List& args);
 
   // Handler for triggerRefresh message.
-  void HandleTriggerRefresh(base::Value::ConstListView args);
+  void HandleTriggerRefresh(const base::Value::List& args);
 
   // Callback used in GetAllNodes.
   void OnReceivedAllNodes(const std::string& callback_id,
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
index aed67da..7f1a7a0 100644
--- a/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
+++ b/chrome/browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc
@@ -205,8 +205,7 @@
 
 TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObservers) {
   EXPECT_EQ(0, test_sync_service()->add_observer_count());
-  handler()->HandleRequestDataAndRegisterForUpdates(
-      base::Value::ConstListView());
+  handler()->HandleRequestDataAndRegisterForUpdates(base::Value::List());
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
 
   EXPECT_EQ(0, test_sync_service()->remove_observer_count());
@@ -219,8 +218,7 @@
 
 TEST_F(SyncInternalsMessageHandlerTest, AddRemoveObserversDisallowJavascript) {
   EXPECT_EQ(0, test_sync_service()->add_observer_count());
-  handler()->HandleRequestDataAndRegisterForUpdates(
-      base::Value::ConstListView());
+  handler()->HandleRequestDataAndRegisterForUpdates(base::Value::List());
   EXPECT_EQ(1, test_sync_service()->add_observer_count());
 
   EXPECT_EQ(0, test_sync_service()->remove_observer_count());
@@ -238,8 +236,7 @@
   SyncServiceFactory::GetInstance()->SetTestingFactory(
       profile(), BrowserContextKeyedServiceFactory::TestingFactory());
 
-  handler()->HandleRequestDataAndRegisterForUpdates(
-      base::Value::ConstListView());
+  handler()->HandleRequestDataAndRegisterForUpdates(base::Value::List());
   handler()->DisallowJavascript();
   // Cannot verify observer methods on sync services were not called, because
   // there is no sync service. Rather, we're just making sure the handler hasn't
@@ -249,14 +246,14 @@
 TEST_F(SyncInternalsMessageHandlerTest, HandleGetAllNodes) {
   base::Value args(base::Value::Type::LIST);
   args.Append("getAllNodes_0");
-  handler()->HandleGetAllNodes(args.GetListDeprecated());
+  handler()->HandleGetAllNodes(args.GetList());
   test_sync_service()->get_all_nodes_callback().Run(
       std::make_unique<base::ListValue>());
   EXPECT_EQ(1, CallCountWithName("cr.webUIResponse"));
 
   base::Value args2(base::Value::Type::LIST);
   args2.Append("getAllNodes_1");
-  handler()->HandleGetAllNodes(args2.GetListDeprecated());
+  handler()->HandleGetAllNodes(args2.GetList());
   // This  breaks the weak ref the callback is hanging onto. Which results in
   // the call count not incrementing.
   handler()->DisallowJavascript();
@@ -266,7 +263,7 @@
 
   base::Value args3(base::Value::Type::LIST);
   args3.Append("getAllNodes_2");
-  handler()->HandleGetAllNodes(args3.GetListDeprecated());
+  handler()->HandleGetAllNodes(args3.GetList());
   test_sync_service()->get_all_nodes_callback().Run(
       std::make_unique<base::ListValue>());
   EXPECT_EQ(2, CallCountWithName("cr.webUIResponse"));
@@ -296,7 +293,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append("1000000000000000000");
   args.Append("-1");
-  handler()->HandleWriteUserEvent(args.GetListDeprecated());
+  handler()->HandleWriteUserEvent(args.GetList());
 
   ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size());
   const UserEventSpecifics& event =
@@ -310,7 +307,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append("123abc");
   args.Append("abcdefghijklmnopqrstuvwxyz");
-  handler()->HandleWriteUserEvent(args.GetListDeprecated());
+  handler()->HandleWriteUserEvent(args.GetList());
 
   ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size());
   const UserEventSpecifics& event =
@@ -324,7 +321,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append("");
   args.Append("");
-  handler()->HandleWriteUserEvent(args.GetListDeprecated());
+  handler()->HandleWriteUserEvent(args.GetList());
 
   ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size());
   const UserEventSpecifics& event =
@@ -341,7 +338,7 @@
   base::Value args(base::Value::Type::LIST);
   args.Append("0");
   args.Append("0");
-  handler()->HandleWriteUserEvent(args.GetListDeprecated());
+  handler()->HandleWriteUserEvent(args.GetList());
 
   ASSERT_EQ(1u, fake_user_event_service()->GetRecordedUserEvents().size());
   const UserEventSpecifics& event =
diff --git a/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc
index 1e95806..1875bdca 100644
--- a/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc
+++ b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc
@@ -104,9 +104,9 @@
           return;
 
         if (update.GetAppType() == apps::AppType::kWeb)
-          installed_web_apps.push_back(update.GetAppId());
+          installed_web_apps.push_back(update.AppId());
         else if (update.GetAppType() == apps::AppType::kChromeApp)
-          installed_chrome_apps.push_back(update.GetAppId());
+          installed_chrome_apps.push_back(update.AppId());
       });
 
   size_t fix_count = 0;
diff --git a/chrome/browser/web_applications/app_service/web_apps_browsertest.cc b/chrome/browser/web_applications/app_service/web_apps_browsertest.cc
index 317b1d7..36814ace 100644
--- a/chrome/browser/web_applications/app_service/web_apps_browsertest.cc
+++ b/chrome/browser/web_applications/app_service/web_apps_browsertest.cc
@@ -136,10 +136,10 @@
       apps::AppServiceProxyFactory::GetForProfile(browser()->profile());
   proxy->FlushMojoCallsForTesting();
 
-  apps::mojom::IconKeyPtr original_key;
+  absl::optional<apps::IconKey> original_key;
   proxy->AppRegistryCache().ForOneApp(
       app_id, [&original_key](const apps::AppUpdate& update) {
-        original_key = update.IconKey().Clone();
+        original_key = update.IconKey();
       });
 
   const int32_t event_flags =
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
index 37daf44..8fc3e4a4 100644
--- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
@@ -1414,8 +1414,8 @@
     return readiness;
   }
 
-  apps::mojom::IconKeyPtr GetAppIconKey(const AppId& app_id) {
-    apps::mojom::IconKeyPtr icon_key;
+  absl::optional<apps::IconKey> GetAppIconKey(const AppId& app_id) {
+    absl::optional<apps::IconKey> icon_key;
     bool app_found =
         GetAppServiceProxy(browser()->profile())
             ->AppRegistryCache()
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 24e4414..cf125b6 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1646071077-9aedf66c31663f9c7e7f6ab5c57064506e6d22e3.profdata
+chrome-mac-arm-main-1646092217-f566a771229e12cd6a796e73b5ffd2dd551a8116.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 70e4888..278fd95 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1646071077-ee0df829bf9ebf8d09cd94902ac9f5a8c7599453.profdata
+chrome-mac-main-1646092217-fa107a99cb070b557cf6cf0e502b18e96ea3428e.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 83888d41..5987bc2 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1646071077-45141f75459b07f056a8e57174b68db5ef3adc7b.profdata
+chrome-win32-main-1646092217-659e7fa71de649935cfeb9662b0682b33dd3eb3e.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index fbb821e..c5f95978 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1646071077-4954644c55a3bf2b43bc90f44554c86f255c6d3c.profdata
+chrome-win64-main-1646092217-65f9abe94b01437a4f4e2f911784b885f4316514.profdata
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index ee8f84c..0174f52 100644
--- a/chrome/installer/setup/install_worker.cc
+++ b/chrome/installer/setup/install_worker.cc
@@ -556,12 +556,12 @@
 
   // Only update if this machine is:
   // - domain joined, or
+  // - Azure Active Directory joined, or
   // - registered with MDM and is not windows home edition
-  bool is_enterprise_version =
-      base::win::OSInfo::GetInstance()->version_type() != base::win::SUITE_HOME;
-  if (!(base::win::IsEnrolledToDomain() ||
-        (base::win::IsDeviceRegisteredWithManagement() &&
-         is_enterprise_version))) {
+  if (!(base::win::IsEnrolledToDomain() || base::win::IsJoinedToAzureAD() ||
+        (base::win::OSInfo::GetInstance()->version_type() !=
+             base::win::SUITE_HOME &&
+         base::win::IsDeviceRegisteredWithManagement()))) {
     return;
   }
 
diff --git a/chrome/installer/setup/install_worker_unittest.cc b/chrome/installer/setup/install_worker_unittest.cc
index 117d2af..846bb9c2 100644
--- a/chrome/installer/setup/install_worker_unittest.cc
+++ b/chrome/installer/setup/install_worker_unittest.cc
@@ -326,7 +326,8 @@
 //   bool: is domain joined
 //   bool: is registered with MDM
 //   bool: is Windows 10 home edition
-using AddUpdateBrandCodeWorkItemTestParams = std::tuple<bool, bool, bool>;
+//   bool: is Azure Active Directory joined
+using AddUpdateBrandCodeWorkItemTestParams = std::tuple<bool, bool, bool, bool>;
 
 // These tests run at system level.
 static const bool kSystemLevel = true;
@@ -338,6 +339,7 @@
       : is_domain_joined_(std::get<0>(GetParam())),
         is_registered_(std::get<1>(GetParam())),
         is_home_edition_(std::get<2>(GetParam())),
+        is_aad_joined_(std::get<3>(GetParam())),
         scoped_install_details_(kSystemLevel),
         current_version_(new base::Version("1.0.0.0")),
         installation_state_(
@@ -351,7 +353,8 @@
         scoped_os_info_override_(
             is_home_edition_
                 ? base::test::ScopedOSInfoOverride::Type::kWin10Home
-                : base::test::ScopedOSInfoOverride::Type::kWin10Pro) {}
+                : base::test::ScopedOSInfoOverride::Type::kWin10Pro),
+        scoped_aad_state_(is_aad_joined_) {}
 
   void SetUp() override {
     // Override registry so that tests don't mess up the machine's state.
@@ -371,7 +374,8 @@
     }
 
     if (!installer::GetUpdatedBrandCode(brand).empty() &&
-        (is_domain_joined_ || (is_registered_ && !is_home_edition_))) {
+        (is_domain_joined_ || is_aad_joined_ ||
+         (is_registered_ && !is_home_edition_))) {
       EXPECT_CALL(*work_item_list,
                   AddSetRegStringValueWorkItem(_, _, _, _, _, _))
           .WillOnce(Return(nullptr));  // Return value ignored.
@@ -384,6 +388,7 @@
   const bool is_domain_joined_;
   const bool is_registered_;
   const bool is_home_edition_;
+  const bool is_aad_joined_;
 
   install_static::ScopedInstallDetails scoped_install_details_;
   std::unique_ptr<base::Version> current_version_;
@@ -395,6 +400,7 @@
   base::win::ScopedDeviceRegisteredWithManagementForTesting
       scoped_registration_state_;
   base::test::ScopedOSInfoOverride scoped_os_info_override_;
+  base::win::ScopedAzureADJoinStateForTesting scoped_aad_state_;
 };
 
 TEST_P(AddUpdateBrandCodeWorkItemTest, NoBrand) {
@@ -428,11 +434,14 @@
     const char* registered =
         std::get<1>(info.param) ? "registered" : "notregistered";
     const char* home = std::get<2>(info.param) ? "home" : "nothome";
-    return base::StringPrintf("%s_%s_%s", joined, registered, home);
+    const char* aad_joined =
+        std::get<3>(info.param) ? "aadjoined" : "notaadjoined";
+    return base::StringPrintf("%s_%s_%s_%s", joined, registered, home,
+                              aad_joined);
   }
 };
 
 INSTANTIATE_TEST_SUITE_P(AddUpdateBrandCodeWorkItemTest,
                          AddUpdateBrandCodeWorkItemTest,
-                         Combine(Bool(), Bool(), Bool()),
+                         Combine(Bool(), Bool(), Bool(), Bool()),
                          AddUpdateBrandCodeWorkItemTestParamToString());
diff --git a/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc b/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
index d672e420..c773054 100644
--- a/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
+++ b/chrome/services/sharing/nearby/platform/wifi_lan_medium.cc
@@ -14,6 +14,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
+#include "base/time/time.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "net/base/net_errors.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -24,6 +25,13 @@
 
 namespace {
 
+// The max time spent trying to connect to another device's TCP socket. We
+// expect connection attempts to fail in practice, for example, when two devices
+// are on different networks. We want to fail quickly so another upgrade medium
+// like WebRTC can be used. The default networking stack timeout is too long; it
+// can take over 2 minutes.
+constexpr base::TimeDelta kConnectTimeout = base::Seconds(2);
+
 // The max size of the server socket's queue of pending connection requests from
 // remote sockets. Any additional connection requests are refused.
 constexpr uint32_t kBacklog = 10;
@@ -149,6 +157,7 @@
   mojo::PendingReceiver<network::mojom::TCPConnectedSocket> receiver =
       tcp_connected_socket.InitWithNewPipeAndPassReceiver();
   socket_factory_->CreateTCPConnectedSocket(
+      /*timeout=*/kConnectTimeout,
       /*local_addr=*/absl::nullopt, address_list,
       /*tcp_connected_socket_options=*/nullptr,
       net::MutableNetworkTrafficAnnotationTag(kTrafficAnnotation),
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 74c2b03c..413c240 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -894,7 +894,7 @@
     }
 
     if (enable_feed_v2) {
-      sources += [ "../browser/feed/android/rss_links_fetcher_browsertest.cc" ]
+      sources += [ "../browser/feed/rss_links_fetcher_browsertest.cc" ]
       deps += [
         "//components/feed:feature_list",
         "//components/feed/core/v2:feed_core_v2",
@@ -4192,6 +4192,17 @@
           [ "../browser/site_isolation/spellcheck_per_process_browsertest.cc" ]
     }
 
+    if (enable_feed_v2) {
+      sources += [ "../browser/feed/rss_links_fetcher_browsertest.cc" ]
+      deps += [
+        "//components/feed:feature_list",
+        "//components/feed/core/v2:feed_core_v2",
+        "//components/feed/core/v2:ios_shared",
+        "//components/feed/core/v2:test_helpers",
+        "//components/feed/mojom:mojo_bindings",
+      ]
+    }
+
     if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) {
       sources += [
         "../browser/ui/views/profiles/profile_picker_view_browsertest.cc",
@@ -5129,6 +5140,13 @@
     "../../base/path_service_unittest.cc",
   ]
 
+  if (enable_feed_v2) {
+    sources += [
+      "../browser/feed/feed_service_factory_unittest.cc",
+      "../browser/feed/rss_links_fetcher_unittest.cc",
+    ]
+  }
+
   if (enable_paint_preview) {
     sources += [
       "../browser/paint_preview/services/paint_preview_tab_service_unittest.cc",
@@ -5182,8 +5200,6 @@
       "../browser/device_reauth/android/biometric_authenticator_android_unittest.cc",
       "../browser/download/android/available_offline_content_provider_unittest.cc",
       "../browser/download/android/download_manager_service_unittest.cc",
-      "../browser/feed/android/feed_service_factory_unittest.cc",
-      "../browser/feed/android/rss_links_fetcher_unittest.cc",
       "../browser/notifications/notification_channels_provider_android_unittest.cc",
       "../browser/optimization_guide/android/optimization_guide_tab_url_provider_android_unittest.cc",
       "../browser/password_manager/android/password_ui_view_android_unittest.cc",
@@ -5532,6 +5548,8 @@
     "//components/feed:buildflags",
     "//components/feed/core/v2:feed_core_stubs",
     "//components/feed/core/v2:feed_core_v2",
+    "//components/feed/core/v2:test_helpers",
+    "//components/feed/mojom:mojo_bindings",
     "//components/feedback",
     "//components/flags_ui",
     "//components/flags_ui:test_support",
@@ -6087,7 +6105,6 @@
       "//components/enterprise/common/proto:connectors_proto",
       "//components/favicon/core/test:test_support",
       "//components/feed/core/shared_prefs:feed_shared_prefs",
-      "//components/feed/core/v2:test_helpers",
       "//components/feed/mojom:mojo_bindings",
       "//components/gcm_driver/instance_id/android:instance_id_driver_java",
       "//components/gcm_driver/instance_id/android:instance_id_driver_test_support_java",
@@ -7881,6 +7898,11 @@
     } else {
       sources += [ "../browser/printing/print_view_manager_basic_unittest.cc" ]
     }
+
+    if (enable_oop_printing) {
+      sources +=
+          [ "../browser/printing/print_backend_service_manager_unittest.cc" ]
+    }
   }
 
   if (enable_session_service) {
diff --git a/chrome/test/base/chromeos/fake_ash_test_chrome_browser_main_extra_parts.cc b/chrome/test/base/chromeos/fake_ash_test_chrome_browser_main_extra_parts.cc
index aac089b7e..2d9ad525 100644
--- a/chrome/test/base/chromeos/fake_ash_test_chrome_browser_main_extra_parts.cc
+++ b/chrome/test/base/chromeos/fake_ash_test_chrome_browser_main_extra_parts.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/ash/crosapi/test_controller_ash.h"
 #include "chromeos/services/machine_learning/public/cpp/fake_service_connection.h"
 #include "ui/base/test/ui_controls.h"
+#include "ui/views/input_event_activation_protector.h"
 
 namespace test {
 
@@ -64,6 +65,7 @@
   crosapi::CrosapiManager::Get()->crosapi_ash()->SetTestControllerForTesting(
       test_controller_ash_.get());
   crosapi::BrowserManager::Get()->DisableAutoLaunchForTesting();
+  views::InputEventActivationProtector::DisableForTesting();
 
   // Call this at the end of PostBrowserStart().
   AshIsReadyForTesting();
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/BUILD.gn b/chrome/test/data/webui/chromeos/os_feedback_ui/BUILD.gn
index 25cbf3a..d89eca98 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/BUILD.gn
@@ -32,6 +32,7 @@
 js_library("fake_help_content_provider_test") {
   deps = [
     "../..:chai_assert",
+    "//ash/webui/common/resources:mojo_utils",
     "//ash/webui/os_feedback_ui/resources:fake_data",
     "//ash/webui/os_feedback_ui/resources:fake_help_content_provider",
     "//ash/webui/os_feedback_ui/resources:feedback_types",
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/fake_help_content_provider_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/fake_help_content_provider_test.js
index 9b94ef7e..36ad8c4 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/fake_help_content_provider_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/fake_help_content_provider_test.js
@@ -4,7 +4,8 @@
 
 import {fakeHelpContentList, fakeSearchRequest, fakeSearchResponse} from 'chrome://os-feedback/fake_data.js';
 import {FakeHelpContentProvider} from 'chrome://os-feedback/fake_help_content_provider.js';
-import {HelpContentList, mojoString16ToString, SearchResponse} from 'chrome://os-feedback/feedback_types.js';
+import {HelpContentList, SearchResponse} from 'chrome://os-feedback/feedback_types.js';
+import {mojoString16ToString} from 'chrome://resources/ash/common/mojo_utils.js';
 
 import {assertDeepEquals, assertEquals} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
index bd54e262..ebf951c 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
@@ -14,6 +14,7 @@
       'setAmbientModeEnabled',
       'setTopicSource',
       'setTemperatureUnit',
+      'setAlbumSelected',
     ]);
   }
 
@@ -93,4 +94,8 @@
   setTemperatureUnit(temperature_unit: TemperatureUnit) {
     this.methodCalled('setTemperatureUnit', temperature_unit);
   }
+
+  setAlbumSelected(id: string, topic_source: TopicSource, selected: boolean) {
+    this.methodCalled('setAlbumSelected', id, topic_source, selected);
+  }
 }
diff --git a/chrome/test/data/webui/settings/privacy_sandbox_test.ts b/chrome/test/data/webui/settings/privacy_sandbox_test.ts
index 245e3ad5..ef83b2fe 100644
--- a/chrome/test/data/webui/settings/privacy_sandbox_test.ts
+++ b/chrome/test/data/webui/settings/privacy_sandbox_test.ts
@@ -298,7 +298,7 @@
                 '#' +
                 PrivacySandboxSettingsView.AD_PERSONALIZATION_DIALOG)!.if !);
     const removedRow = page.shadowRoot!.querySelector<HTMLElement>(
-        '#adPersonalizationRemovedRow')!;
+        '.ad-personalization-removed-row')!;
     assertTrue(isVisible(removedRow));
     const backButton = page.shadowRoot!.querySelector<HTMLElement>(
         '#adPersonalizationBackButton')!;
@@ -319,7 +319,7 @@
                        PrivacySandboxSettingsView
                            .AD_PERSONALIZATION_REMOVED_DIALOG)!.if !);
     const removedRow = page.shadowRoot!.querySelector<HTMLElement>(
-        '#adPersonalizationRemovedRow')!;
+        '.ad-personalization-removed-row')!;
     assertFalse(isVisible(removedRow));
     const backButton = page.shadowRoot!.querySelector<HTMLElement>(
         '#adPersonalizationBackButton')!;
@@ -428,8 +428,8 @@
 
     // Clicking on the link row for removed interests should take you to the
     // removed interests page.
-    page.shadowRoot!.querySelector<HTMLElement>(
-                        '#adPersonalizationRemovedRow')!.click();
+    page.shadowRoot!
+        .querySelector<HTMLElement>('.ad-personalization-removed-row')!.click();
     await flushTasks();
     assertAdPersonalizationRemovedDialogVisible();
 
@@ -508,8 +508,8 @@
     assertEquals('test-topic-1', topTopics.items![0].topic!.displayString);
 
     // Switch to removed page.
-    page.shadowRoot!.querySelector<HTMLElement>(
-                        '#adPersonalizationRemovedRow')!.click();
+    page.shadowRoot!
+        .querySelector<HTMLElement>('.ad-personalization-removed-row')!.click();
     await flushTasks();
     assertAdPersonalizationRemovedDialogVisible();
 
@@ -541,8 +541,8 @@
     assertTrue(isVisible(topTopicsSection.querySelector('#topTopicsEmpty')));
 
     // Switch to removed page.
-    page.shadowRoot!.querySelector<HTMLElement>(
-                        '#adPersonalizationRemovedRow')!.click();
+    page.shadowRoot!
+        .querySelector<HTMLElement>('.ad-personalization-removed-row')!.click();
     await flushTasks();
     assertAdPersonalizationRemovedDialogVisible();
 
@@ -591,8 +591,8 @@
     assertEquals('test-site-one.com', joiningSites.items![0].site!);
 
     // Switch to removed page.
-    page.shadowRoot!.querySelector<HTMLElement>(
-                        '#adPersonalizationRemovedRow')!.click();
+    page.shadowRoot!
+        .querySelector<HTMLElement>('.ad-personalization-removed-row')!.click();
     await flushTasks();
     assertAdPersonalizationRemovedDialogVisible();
 
@@ -625,8 +625,8 @@
         isVisible(joiningSitesSection.querySelector('#joiningSitesEmpty')));
 
     // Switch to removed page.
-    page.shadowRoot!.querySelector<HTMLElement>(
-                        '#adPersonalizationRemovedRow')!.click();
+    page.shadowRoot!
+        .querySelector<HTMLElement>('.ad-personalization-removed-row')!.click();
     await flushTasks();
     assertAdPersonalizationRemovedDialogVisible();
 
diff --git a/chromeos/crosapi/mojom/test_controller.mojom b/chromeos/crosapi/mojom/test_controller.mojom
index d815f5de..20d6d798 100644
--- a/chromeos/crosapi/mojom/test_controller.mojom
+++ b/chromeos/crosapi/mojom/test_controller.mojom
@@ -42,10 +42,14 @@
 // This interface is implemented by Ash-Chrome.
 // This interface provides tests a mechanism to mutate or query ash.
 // In the future, this interface may merge with an automation or a11y interface.
-// Next version: 11
-// Next method id: 18
+// Next version: 12
+// Next method id: 21
 [Stable, Uuid="1f93f9d7-e466-466c-a675-c21b48cf30d3"]
 interface TestController {
+  // Clicks the middle of the views element identified by |element_name|.
+  [MinVersion=11]
+  ClickElement@20(string element_name) => (bool success);
+
   // Clicks the middle of the window. Assumes that the window exists and is
   // visible on screen. |window_id| should be obtained from
   // PlatformWindow::GetWindowUniqueId(). A typical format might be:
@@ -56,6 +60,11 @@
   [MinVersion=5]
   DoesItemExistInShelf@9(string item_id) => (bool exists);
 
+  // Checks if ash is currently showing any views UI element with the given
+  // element_name.
+  [MinVersion=11]
+  DoesElementExist@19(string element_name) => (bool exists);
+
   // Queries whether a window with the given |window_id| exists and is either
   // visible or minimized. |window_id| should be obtained from
   // PlatformWindow::GetWindowUniqueId(). A typical format might be:
@@ -110,6 +119,12 @@
   [MinVersion=6]
   PinOrUnpinItemInShelf@11(string item_id, bool pin) => (bool success);
 
+  // Select the context menu item for the shelf item with |item_id| at |index|.
+  // Returns false on any error.
+  [MinVersion=11]
+  SelectContextMenuForShelfItem@18(string item_id, uint32 index)
+      => (bool success);
+
   // Simulates a user left-clicking an item in the shelf. This assumes the item
   // is already in the shelf. Returns |false| on any error.
   [MinVersion=6]
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index e1bad0e1..662c09d6 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -208,6 +208,8 @@
 }
 
 mojom::VpnType OncVpnTypeToMojo(const std::string& onc_vpn_type) {
+  if (onc_vpn_type == ::onc::vpn::kIPsec)
+    return mojom::VpnType::kIKEv2;
   if (onc_vpn_type == ::onc::vpn::kTypeL2TP_IPsec)
     return mojom::VpnType::kL2TPIPsec;
   if (onc_vpn_type == ::onc::vpn::kOpenVPN)
@@ -224,6 +226,8 @@
 
 std::string MojoVpnTypeToOnc(mojom::VpnType mojo_vpn_type) {
   switch (mojo_vpn_type) {
+    case mojom::VpnType::kIKEv2:
+      return ::onc::vpn::kIPsec;
     case mojom::VpnType::kL2TPIPsec:
       return ::onc::vpn::kTypeL2TP_IPsec;
     case mojom::VpnType::kOpenVPN:
@@ -1297,6 +1301,10 @@
       GetManagedStringList(ipsec_dict, ::onc::ipsec::kServerCAPEMs);
   ipsec->server_ca_refs =
       GetManagedStringList(ipsec_dict, ::onc::ipsec::kServerCARefs);
+  ipsec->local_identity =
+      GetManagedString(ipsec_dict, ::onc::ipsec::kLocalIdentity);
+  ipsec->remote_identity =
+      GetManagedString(ipsec_dict, ::onc::ipsec::kRemoteIdentity);
   return ipsec;
 }
 
@@ -1685,6 +1693,9 @@
       vpn->host = GetManagedString(vpn_dict, ::onc::vpn::kHost);
 
       switch (vpn->type) {
+        case mojom::VpnType::kIKEv2:
+          vpn->ip_sec = GetManagedIPSecProperties(vpn_dict, ::onc::vpn::kIPsec);
+          break;
         case mojom::VpnType::kL2TPIPsec:
           vpn->ip_sec = GetManagedIPSecProperties(vpn_dict, ::onc::vpn::kIPsec);
           vpn->l2tp = GetManagedL2TPProperties(vpn_dict, ::onc::vpn::kL2TP);
@@ -1929,6 +1940,14 @@
                     &ip_sec_dict);
       SetStringList(::onc::ipsec::kServerCARefs, ip_sec.server_ca_refs,
                     &ip_sec_dict);
+      SetString(::onc::ipsec::kLocalIdentity, ip_sec.local_identity,
+                &ip_sec_dict);
+      SetString(::onc::ipsec::kRemoteIdentity, ip_sec.remote_identity,
+                &ip_sec_dict);
+      if (ip_sec.eap) {
+        ip_sec_dict.SetKey(::onc::ipsec::kEAP,
+                           GetEAPProperties(*ip_sec.eap.get()));
+      }
       type_dict.SetKey(::onc::vpn::kIPsec, std::move(ip_sec_dict));
     }
     if (vpn.l2tp) {
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc
index 8f82997..919c918 100644
--- a/chromeos/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -296,7 +296,7 @@
         kCellularTestIccid,
         NetworkProfileHandler::GetSharedProfilePath().c_str()));
     vpn_path_ = helper()->ConfigureService(
-        R"({"GUID": "vpn_guid", "Type": "vpn", "State": "association",
+        R"({"GUID": "vpn_l2tp_guid", "Type": "vpn", "State": "association",
             "Provider": {"Type": "l2tpipsec"}})");
     helper()->ConfigureService(base::StringPrintf(
         R"({"GUID":"openvpn_guid", "Type": "vpn", "Name": "openvpn",
@@ -305,6 +305,8 @@
           "OpenVPN.Compress": "lzo", "OpenVPN.KeyDirection": "1",
           "OpenVPN.TLSAuthContents": "%s"})",
         kOpenVPNTLSAuthContents));
+    helper()->ConfigureService(R"({"GUID": "vpn_ikev2_guid", "Type": "vpn",
+            "State": "idle", "Provider": {"Type": "ikev2"}})");
 
     // Add a non visible configured wifi service.
     std::string wifi3_path = helper()->ConfigureService(
@@ -841,9 +843,9 @@
   EXPECT_EQ(mojom::OncSource::kDevice, network->source);
   EXPECT_TRUE(cellular->sim_locked);
 
-  network = GetNetworkState("vpn_guid");
+  network = GetNetworkState("vpn_l2tp_guid");
   ASSERT_TRUE(network);
-  EXPECT_EQ("vpn_guid", network->guid);
+  EXPECT_EQ("vpn_l2tp_guid", network->guid);
   EXPECT_EQ(mojom::NetworkType::kVPN, network->type);
   EXPECT_EQ(mojom::ConnectionStateType::kConnecting, network->connection_state);
   ASSERT_TRUE(network->type_state);
@@ -851,6 +853,17 @@
   EXPECT_EQ(mojom::VpnType::kL2TPIPsec, network->type_state->get_vpn()->type);
   EXPECT_EQ(mojom::OncSource::kNone, network->source);
 
+  network = GetNetworkState("vpn_ikev2_guid");
+  ASSERT_TRUE(network);
+  EXPECT_EQ("vpn_ikev2_guid", network->guid);
+  EXPECT_EQ(mojom::NetworkType::kVPN, network->type);
+  EXPECT_EQ(mojom::ConnectionStateType::kNotConnected,
+            network->connection_state);
+  ASSERT_TRUE(network->type_state);
+  ASSERT_TRUE(network->type_state->is_vpn());
+  EXPECT_EQ(mojom::VpnType::kIKEv2, network->type_state->get_vpn()->type);
+  EXPECT_EQ(mojom::OncSource::kNone, network->source);
+
   // TODO(919691): Test ProxyMode once UIProxyConfigService logic is improved.
 }
 
@@ -865,7 +878,7 @@
   ASSERT_EQ(3u, networks.size());
   EXPECT_EQ("eth_guid", networks[0]->guid);
   EXPECT_EQ("wifi1_guid", networks[1]->guid);
-  EXPECT_EQ("vpn_guid", networks[2]->guid);
+  EXPECT_EQ("vpn_l2tp_guid", networks[2]->guid);
 
   // First active network
   filter->limit = 1;
@@ -1196,9 +1209,9 @@
   EXPECT_TRUE(cellular->sim_locked);
   EXPECT_EQ(mojom::ActivationStateType::kActivated, cellular->activation_state);
 
-  properties = GetManagedProperties("vpn_guid");
+  properties = GetManagedProperties("vpn_l2tp_guid");
   ASSERT_TRUE(properties);
-  EXPECT_EQ("vpn_guid", properties->guid);
+  EXPECT_EQ("vpn_l2tp_guid", properties->guid);
   EXPECT_EQ(mojom::NetworkType::kVPN, properties->type);
   EXPECT_EQ(mojom::ConnectionStateType::kConnecting,
             properties->connection_state);
@@ -2101,7 +2114,7 @@
                                base::Value(vpn_path()));
   properties = GetAlwaysOnVpn();
   EXPECT_EQ(mojom::AlwaysOnVpnMode::kOff, properties->mode);
-  EXPECT_EQ("vpn_guid", properties->service_guid);
+  EXPECT_EQ("vpn_l2tp_guid", properties->service_guid);
 
   helper()->SetProfileProperty(helper()->ProfilePathUser(),
                                shill::kAlwaysOnVpnModeProperty,
@@ -2119,7 +2132,7 @@
 TEST_F(CrosNetworkConfigTest, SetAlwaysOnVpn) {
   mojom::AlwaysOnVpnPropertiesPtr properties =
       mojom::AlwaysOnVpnProperties::New(mojom::AlwaysOnVpnMode::kBestEffort,
-                                        "vpn_guid");
+                                        "vpn_l2tp_guid");
   SetAlwaysOnVpn(std::move(properties));
 
   EXPECT_EQ("best-effort",
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
index 3d9d4e31d..b09dd34 100644
--- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom
+++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -68,6 +68,7 @@
 // The configuration type for virtual networks.
 enum VpnType {
   // Internal VPN types.
+  kIKEv2,
   kL2TPIPsec,
   kOpenVPN,
   kWireGuard,
@@ -504,8 +505,10 @@
   ManagedEAPProperties? eap;
   ManagedString? group;
   ManagedInt32? ike_version;
+  ManagedString? local_identity;
   // Note: |psk| contains a placeholder if set to avoid leaking secrets.
   ManagedString? psk;
+  ManagedString? remote_identity;
   ManagedBoolean? save_credentials;
   ManagedStringList? server_ca_pems;
   ManagedStringList? server_ca_refs;
@@ -812,9 +815,12 @@
   string authentication_type;
   string? client_cert_pkcs11_id;
   string? client_cert_type;
+  EAPConfigProperties? eap;
   string? group;
   int32 ike_version = 1;
+  string? local_identity;
   string? psk;
+  string? remote_identity;
   bool save_credentials = false;
   array<string>? server_ca_pems;
   array<string>? server_ca_refs;
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc
index ff2abd7..7f6c086b 100644
--- a/components/autofill/content/browser/content_autofill_driver.cc
+++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -128,8 +128,8 @@
       ->IsOffTheRecord();
 }
 
-bool ContentAutofillDriver::IsInMainFrame() const {
-  return render_frame_host_->GetParent() == nullptr;
+bool ContentAutofillDriver::IsInAnyMainFrame() const {
+  return render_frame_host_->GetMainFrame() == render_frame_host_;
 }
 
 bool ContentAutofillDriver::IsPrerendering() const {
diff --git a/components/autofill/content/browser/content_autofill_driver.h b/components/autofill/content/browser/content_autofill_driver.h
index 0211ed1..294c419 100644
--- a/components/autofill/content/browser/content_autofill_driver.h
+++ b/components/autofill/content/browser/content_autofill_driver.h
@@ -149,7 +149,7 @@
 
   // AutofillDriver:
   bool IsIncognito() const override;
-  bool IsInMainFrame() const override;
+  bool IsInAnyMainFrame() const override;
   bool IsPrerendering() const override;
   bool CanShowAutofillUi() const override;
   ui::AXTreeID GetAxTreeId() const override;
diff --git a/components/autofill/content/browser/form_forest_unittest.cc b/components/autofill/content/browser/form_forest_unittest.cc
index 98700db5..aa14d0a 100644
--- a/components/autofill/content/browser/form_forest_unittest.cc
+++ b/components/autofill/content/browser/form_forest_unittest.cc
@@ -551,7 +551,7 @@
     // Copy fields to the root.
     auto IsRoot = [this](FormSpan fs) {
       MockContentAutofillDriver* d = driver(fs.form);
-      return d->IsInMainFrame() || d->is_sub_root();
+      return d->IsInAnyMainFrame() || d->is_sub_root();
     };
     auto it = base::ranges::find_if(form_fields, IsRoot);
     CHECK(it != form_fields.end());
@@ -602,7 +602,7 @@
   }
 
   FormData& GetFlattenedForm(base::StringPiece form_name) {
-    CHECK(driver(form_name)->IsInMainFrame() ||
+    CHECK(driver(form_name)->IsInAnyMainFrame() ||
           driver(form_name)->is_sub_root());
     auto it = forms_.find(form_name);
     CHECK(it != forms_.end()) << form_name;
diff --git a/components/autofill/core/browser/autofill_driver.h b/components/autofill/core/browser/autofill_driver.h
index 5506d33..aab63e7e 100644
--- a/components/autofill/core/browser/autofill_driver.h
+++ b/components/autofill/core/browser/autofill_driver.h
@@ -39,8 +39,9 @@
   // Returns whether the user is currently operating in an incognito context.
   virtual bool IsIncognito() const = 0;
 
-  // Returns whether AutofillDriver instance is associated with a main frame.
-  virtual bool IsInMainFrame() const = 0;
+  // Returns whether AutofillDriver instance is associated with a main frame,
+  // and this can be a primary or non-primary main frame.
+  virtual bool IsInAnyMainFrame() const = 0;
 
   // Returns whether the AutofillDriver instance is associated with a
   // prerendered frame.
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 657257fa..9684b76 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -441,10 +441,10 @@
           std::make_unique<AutofillSuggestionGenerator>(client,
                                                         personal_data_)) {
   address_form_event_logger_ = std::make_unique<AddressFormEventLogger>(
-      driver->IsInMainFrame(), form_interactions_ukm_logger(), client);
+      driver->IsInAnyMainFrame(), form_interactions_ukm_logger(), client);
   credit_card_form_event_logger_ = std::make_unique<CreditCardFormEventLogger>(
-      driver->IsInMainFrame(), form_interactions_ukm_logger(), personal_data_,
-      client);
+      driver->IsInAnyMainFrame(), form_interactions_ukm_logger(),
+      personal_data_, client);
 
   credit_card_access_manager_ = std::make_unique<CreditCardAccessManager>(
       driver, client, personal_data_, credit_card_form_event_logger_.get());
@@ -1590,11 +1590,11 @@
   DCHECK(!pending_form_data_);
   AutofillManager::Reset();
   address_form_event_logger_ = std::make_unique<AddressFormEventLogger>(
-      driver()->IsInMainFrame(), form_interactions_ukm_logger(),
+      driver()->IsInAnyMainFrame(), form_interactions_ukm_logger(),
       unsafe_client());
   credit_card_form_event_logger_ = std::make_unique<CreditCardFormEventLogger>(
-      driver()->IsInMainFrame(), form_interactions_ukm_logger(), personal_data_,
-      unsafe_client());
+      driver()->IsInAnyMainFrame(), form_interactions_ukm_logger(),
+      personal_data_, unsafe_client());
   credit_card_access_manager_ = std::make_unique<CreditCardAccessManager>(
       driver(), unsafe_client(), personal_data_,
       credit_card_form_event_logger_.get());
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index 748c621c..3d31778 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -642,15 +642,15 @@
                                   public testing::WithParamInterface<bool> {
  public:
   AutofillMetricsIFrameTest()
-      : is_in_main_frame_(GetParam()),
+      : is_in_any_main_frame_(GetParam()),
         credit_card_form_events_frame_histogram_(
             std::string("Autofill.FormEvents.CreditCard.") +
-            (is_in_main_frame_ ? "IsInMainFrame" : "IsInIFrame")) {
-    autofill_driver_->SetIsInMainFrame(is_in_main_frame_);
+            (is_in_any_main_frame_ ? "IsInMainFrame" : "IsInIFrame")) {
+    autofill_driver_->SetIsInAnyMainFrame(is_in_any_main_frame_);
   }
 
  protected:
-  const bool is_in_main_frame_;
+  const bool is_in_any_main_frame_;
   const std::string credit_card_form_events_frame_histogram_;
 };
 
diff --git a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
index 980ca66..b329b85 100644
--- a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
@@ -18,11 +18,11 @@
 namespace autofill {
 
 AddressFormEventLogger::AddressFormEventLogger(
-    bool is_in_main_frame,
+    bool is_in_any_main_frame,
     AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
     AutofillClient* client)
     : FormEventLoggerBase("Address",
-                          is_in_main_frame,
+                          is_in_any_main_frame,
                           form_interactions_ukm_logger,
                           client ? client->GetLogManager() : nullptr) {}
 
diff --git a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
index 06b8aa4..fe0262e 100644
--- a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
+++ b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
@@ -20,7 +20,7 @@
 class AddressFormEventLogger : public FormEventLoggerBase {
  public:
   AddressFormEventLogger(
-      bool is_in_main_frame,
+      bool is_in_any_main_frame,
       AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
       AutofillClient* client);
 
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
index da83914..09f7900 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
@@ -31,12 +31,12 @@
 }  // namespace
 
 CreditCardFormEventLogger::CreditCardFormEventLogger(
-    bool is_in_main_frame,
+    bool is_in_any_main_frame,
     AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
     PersonalDataManager* personal_data_manager,
     AutofillClient* client)
     : FormEventLoggerBase("CreditCard",
-                          is_in_main_frame,
+                          is_in_any_main_frame,
                           form_interactions_ukm_logger,
                           client ? client->GetLogManager() : nullptr),
       personal_data_manager_(personal_data_manager),
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
index 6067384d..adf73a3 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
@@ -36,7 +36,7 @@
   };
 
   CreditCardFormEventLogger(
-      bool is_in_main_frame,
+      bool is_in_any_main_frame,
       AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
       PersonalDataManager* personal_data_manager,
       AutofillClient* client);
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
index e6ac243..41272e27 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
@@ -37,11 +37,11 @@
 
 FormEventLoggerBase::FormEventLoggerBase(
     const std::string& form_type_name,
-    bool is_in_main_frame,
+    bool is_in_any_main_frame,
     AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
     LogManager* log_manager)
     : form_type_name_(form_type_name),
-      is_in_main_frame_(is_in_main_frame),
+      is_in_any_main_frame_(is_in_any_main_frame),
       form_interactions_ukm_logger_(form_interactions_ukm_logger),
       log_manager_(log_manager) {}
 
@@ -207,7 +207,7 @@
   // Log again in a different histogram so that iframes can be analyzed on
   // their own.
   base::UmaHistogramEnumeration(
-      name + (is_in_main_frame_ ? ".IsInMainFrame" : ".IsInIFrame"), event,
+      name + (is_in_any_main_frame_ ? ".IsInMainFrame" : ".IsInIFrame"), event,
       NUM_FORM_EVENTS);
 
   // Allow specialized types of logging, e.g. splitting metrics in useful ways.
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
index 1efc0af..64cfc9aa 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
@@ -28,7 +28,7 @@
  public:
   FormEventLoggerBase(
       const std::string& form_type_name,
-      bool is_in_main_frame,
+      bool is_in_any_main_frame,
       AutofillMetrics::FormInteractionsUkmLogger* form_interactions_ukm_logger,
       LogManager* log_manager);
 
@@ -115,7 +115,7 @@
 
   // Constructor parameters.
   std::string form_type_name_;
-  bool is_in_main_frame_;
+  bool is_in_any_main_frame_;
 
   // State variables.
   size_t server_record_type_count_ = 0;
diff --git a/components/autofill/core/browser/test_autofill_driver.cc b/components/autofill/core/browser/test_autofill_driver.cc
index 79d95064..e2c9496 100644
--- a/components/autofill/core/browser/test_autofill_driver.cc
+++ b/components/autofill/core/browser/test_autofill_driver.cc
@@ -25,8 +25,8 @@
   return is_incognito_;
 }
 
-bool TestAutofillDriver::IsInMainFrame() const {
-  return is_in_main_frame_;
+bool TestAutofillDriver::IsInAnyMainFrame() const {
+  return is_in_any_main_frame_;
 }
 
 bool TestAutofillDriver::IsPrerendering() const {
@@ -120,8 +120,8 @@
   is_incognito_ = is_incognito;
 }
 
-void TestAutofillDriver::SetIsInMainFrame(bool is_in_main_frame) {
-  is_in_main_frame_ = is_in_main_frame;
+void TestAutofillDriver::SetIsInAnyMainFrame(bool is_in_any_main_frame) {
+  is_in_any_main_frame_ = is_in_any_main_frame;
 }
 
 void TestAutofillDriver::SetIsolationInfo(
diff --git a/components/autofill/core/browser/test_autofill_driver.h b/components/autofill/core/browser/test_autofill_driver.h
index 8cf1c0e..543b884 100644
--- a/components/autofill/core/browser/test_autofill_driver.h
+++ b/components/autofill/core/browser/test_autofill_driver.h
@@ -35,7 +35,7 @@
 
   // AutofillDriver implementation overrides.
   bool IsIncognito() const override;
-  bool IsInMainFrame() const override;
+  bool IsInAnyMainFrame() const override;
   bool IsPrerendering() const override;
   bool CanShowAutofillUi() const override;
   ui::AXTreeID GetAxTreeId() const override;
@@ -81,7 +81,7 @@
   // functionality.
 
   void SetIsIncognito(bool is_incognito);
-  void SetIsInMainFrame(bool is_in_main_frame);
+  void SetIsInAnyMainFrame(bool is_in_any_main_frame);
   void SetIsolationInfo(const net::IsolationInfo& isolation_info);
 
   // The filter that determines the return value of FillOrPreviewForm().
@@ -99,7 +99,7 @@
   network::TestURLLoaderFactory test_url_loader_factory_;
   scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
   bool is_incognito_ = false;
-  bool is_in_main_frame_ = false;
+  bool is_in_any_main_frame_ = false;
   net::IsolationInfo isolation_info_;
   base::RepeatingCallback<
       bool(const url::Origin&, FieldGlobalId, ServerFieldType)>
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm
index 564eddf..eb64f04b 100644
--- a/components/autofill/ios/browser/autofill_agent_unittests.mm
+++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -382,7 +382,7 @@
   autofill::AutofillDriverIOS* main_frame_driver =
       autofill::AutofillDriverIOS::FromWebStateAndWebFrame(&fake_web_state_,
                                                            main_frame);
-  EXPECT_TRUE(main_frame_driver->IsInMainFrame());
+  EXPECT_TRUE(main_frame_driver->IsInAnyMainFrame());
   auto iframe_unique = CreateChildWebFrame();
   iframe_unique->set_call_java_script_function_callback(base::BindRepeating(^{
     EXPECT_TRUE(main_frame_driver->is_processed());
@@ -392,7 +392,7 @@
   autofill::AutofillDriverIOS* iframe_driver =
       autofill::AutofillDriverIOS::FromWebStateAndWebFrame(&fake_web_state_,
                                                            iframe);
-  EXPECT_FALSE(iframe_driver->IsInMainFrame());
+  EXPECT_FALSE(iframe_driver->IsInAnyMainFrame());
   EXPECT_FALSE(main_frame_driver->is_processed());
   EXPECT_FALSE(iframe_driver->is_processed());
   fake_web_state_.SetLoading(false);
diff --git a/components/autofill/ios/browser/autofill_driver_ios.h b/components/autofill/ios/browser/autofill_driver_ios.h
index 99c5e2c..38d7944 100644
--- a/components/autofill/ios/browser/autofill_driver_ios.h
+++ b/components/autofill/ios/browser/autofill_driver_ios.h
@@ -42,7 +42,7 @@
 
   // AutofillDriver:
   bool IsIncognito() const override;
-  bool IsInMainFrame() const override;
+  bool IsInAnyMainFrame() const override;
   bool IsPrerendering() const override;
   bool CanShowAutofillUi() const override;
   ui::AXTreeID GetAxTreeId() const override;
diff --git a/components/autofill/ios/browser/autofill_driver_ios.mm b/components/autofill/ios/browser/autofill_driver_ios.mm
index b791befd..60336c4e 100644
--- a/components/autofill/ios/browser/autofill_driver_ios.mm
+++ b/components/autofill/ios/browser/autofill_driver_ios.mm
@@ -69,7 +69,7 @@
   return web_state_->GetBrowserState()->IsOffTheRecord();
 }
 
-bool AutofillDriverIOS::IsInMainFrame() const {
+bool AutofillDriverIOS::IsInAnyMainFrame() const {
   web::WebFrame* web_frame = web::GetWebFrameWithId(web_state_, web_frame_id_);
   return web_frame ? web_frame->IsMainFrame() : true;
 }
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
index 320e1305..098753da 100644
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -868,7 +868,7 @@
         Simplified view for web pages
       </message>
       <message name="IDS_READER_FOR_ACCESSIBILITY_SUMMARY" desc="Summary of preference that allows the user to use simplified view on any supported articles, even if the page is mobile-friendly.">
-        Get notified when a site can be shown in simplified view
+        Get notified when an article can be shown in simplified view
       </message>
       <message name="IDS_ACCESSIBILITY_TAB_SWITCHER_TITLE" desc="Title of preference that allows the user to use a simplified tab switcher that is accessibility friendly. The words 'Open tabs' should match translation in TC ID 3108541343994525384, provided that 'open' is correctly used as an adjective and not a verb.">
         Simplified view for open tabs
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_READER_FOR_ACCESSIBILITY_SUMMARY.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_READER_FOR_ACCESSIBILITY_SUMMARY.png.sha1
index 433f68cd..92ca318 100644
--- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_READER_FOR_ACCESSIBILITY_SUMMARY.png.sha1
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_READER_FOR_ACCESSIBILITY_SUMMARY.png.sha1
@@ -1 +1 @@
-ef7969ff56c980a729507dafa20ba40b7be0a4d3
\ No newline at end of file
+d372e51f1c4eb2a0ef8db98c73909fdacc413059
\ No newline at end of file
diff --git a/components/embedder_support/android/metrics/android_metrics_service_client.cc b/components/embedder_support/android/metrics/android_metrics_service_client.cc
index cf77d615..86022b7 100644
--- a/components/embedder_support/android/metrics/android_metrics_service_client.cc
+++ b/components/embedder_support/android/metrics/android_metrics_service_client.cc
@@ -37,6 +37,7 @@
 #include "components/metrics/drive_metrics_provider.h"
 #include "components/metrics/entropy_state_provider.h"
 #include "components/metrics/file_metrics_provider.h"
+#include "components/metrics/form_factor_metrics_provider.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_service.h"
 #include "components/metrics/metrics_state_manager.h"
@@ -334,6 +335,8 @@
       std::make_unique<EntropyStateProvider>(pref_service_));
   metrics_service_->RegisterMetricsProvider(
       std::make_unique<ScreenInfoMetricsProvider>());
+  metrics_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
   metrics_service_->RegisterMetricsProvider(CreateFileMetricsProvider(
       pref_service_, metrics_state_manager_->IsMetricsReportingEnabled()));
   metrics_service_->RegisterMetricsProvider(
@@ -377,6 +380,9 @@
   ukm_service_->RegisterMetricsProvider(
       std::make_unique<metrics::ScreenInfoMetricsProvider>());
 
+  ukm_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
+
   ukm_service_->RegisterMetricsProvider(ukm::CreateFieldTrialsProviderForUkm());
 
   UpdateUkmService();
diff --git a/components/error_page/common/alt_game_images/alt_game_images.cc.template b/components/error_page/common/alt_game_images/alt_game_images.cc.template
index 4469c39..837a7e3 100644
--- a/components/error_page/common/alt_game_images/alt_game_images.cc.template
+++ b/components/error_page/common/alt_game_images/alt_game_images.cc.template
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Copyright 2021 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -7,12 +7,12 @@
 
 #include "components/error_page/common/alt_game_images.h"
 
-#include <cstring>
+#include <memory>
+#include <string>
 
-#include "base/base64.h"
 #include "base/base64url.h"
+#include "base/logging.h"
 #include "base/rand_util.h"
-#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "crypto/encryptor.h"
 #include "crypto/symmetric_key.h"
@@ -25,18 +25,18 @@
   };
 {% endfor %}
 
-const uint8_t* kAltGameImages1x[] = {
+const uint8_t* const kAltGameImages1x[] = {
   {% for image in images_1x %}
     kAltGameImages1x{{ image.name }},
   {% endfor %}
 };
-constexpr int kAltGameImagesCount = base::size(kAltGameImages1x);
+constexpr int kAltGameImagesCount = std::size(kAltGameImages1x);
 const size_t kAltGameImages1xLength[] = {
   {% for image in images_1x %}
-    base::size(kAltGameImages1x{{ image.name }}),
+    std::size(kAltGameImages1x{{ image.name }}),
   {% endfor %}
 };
-static_assert(base::size(kAltGameImages1xLength) == kAltGameImagesCount, "");
+static_assert(std::size(kAltGameImages1xLength) == kAltGameImagesCount, "");
 
 {% for image in images_2x %}
   const uint8_t kAltGameImages2x{{ image.name }}[] = {
@@ -44,7 +44,7 @@
   };
 {% endfor %}
 
-const uint8_t* kAltGameImages2x[] = {
+const uint8_t* const kAltGameImages2x[] = {
   {% for image in images_2x %}
     kAltGameImages2x{{ image.name }},
   {% endfor %}
@@ -52,12 +52,12 @@
 
 const size_t kAltGameImages2xLength[] = {
   {% for image in images_2x %}
-    base::size(kAltGameImages2x{{ image.name }}),
+    std::size(kAltGameImages2x{{ image.name }}),
   {% endfor %}
 };
 
-static_assert(base::size(kAltGameImages2x) == kAltGameImagesCount, "");
-static_assert(base::size(kAltGameImages2xLength) == kAltGameImagesCount, "");
+static_assert(std::size(kAltGameImages2x) == kAltGameImagesCount, "");
+static_assert(std::size(kAltGameImages2xLength) == kAltGameImagesCount, "");
 
 std::string DecryptImage(const std::string& image_ciphertext,
                          crypto::SymmetricKey* key) {
@@ -83,15 +83,17 @@
   if (id < 0 || id >= kAltGameImagesCount)
     return false;
 
-  if (scale == 1)
+  if (scale == 1) {
     *image = std::string(reinterpret_cast<const char*>(kAltGameImages1x[id]),
                          kAltGameImages1xLength[id]);
-  else if (scale == 2)
+    return true;
+  }
+  if (scale == 2) {
     *image = std::string(reinterpret_cast<const char*>(kAltGameImages2x[id]),
                          kAltGameImages2xLength[id]);
-  else
-    return false;
-  return true;
+    return true;
+  }
+  return false;
 }
 
 std::unique_ptr<crypto::SymmetricKey> GetKey() {
diff --git a/components/feed/features.gni b/components/feed/features.gni
index 0b98745..3120a23 100644
--- a/components/feed/features.gni
+++ b/components/feed/features.gni
@@ -2,11 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//chrome/android/channel.gni")
-
 declare_args() {
   # Whether Feed is enabled in the build.
-  enable_feed_v2 = is_android
+  enable_feed_v2 = !is_ios
 
   # Whether to include Feed in ChromeModern builds.
   enable_feed_v2_modern = true
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn
index f523a79e..9c08e218 100644
--- a/components/metrics/BUILD.gn
+++ b/components/metrics/BUILD.gn
@@ -49,6 +49,8 @@
     "field_trials_provider.h",
     "file_metrics_provider.cc",
     "file_metrics_provider.h",
+    "form_factor_metrics_provider.cc",
+    "form_factor_metrics_provider.h",
     "histogram_encoder.cc",
     "histogram_encoder.h",
     "log_decoder.cc",
@@ -132,6 +134,7 @@
     "//crypto",
     "//extensions/buildflags",
     "//third_party/icu",
+    "//ui/base",
     "//url",
   ]
 
@@ -445,6 +448,7 @@
     "expired_histograms_checker_unittest.cc",
     "field_trials_provider_unittest.cc",
     "file_metrics_provider_unittest.cc",
+    "form_factor_metrics_provider_unittest.cc",
     "histogram_encoder_unittest.cc",
     "library_support/histogram_manager_unittest.cc",
     "log_decoder_unittest.cc",
diff --git a/components/metrics/DEPS b/components/metrics/DEPS
index 432023a..a596a1f 100644
--- a/components/metrics/DEPS
+++ b/components/metrics/DEPS
@@ -18,7 +18,8 @@
   "+third_party/metrics_proto",
   "+third_party/zlib/google",
   "-net",
-  "+url"
+  "+ui/base",
+  "+url",
 ]
 
 specific_include_rules = {
diff --git a/components/metrics/form_factor_metrics_provider.cc b/components/metrics/form_factor_metrics_provider.cc
new file mode 100644
index 0000000..4e1506f
--- /dev/null
+++ b/components/metrics/form_factor_metrics_provider.cc
@@ -0,0 +1,42 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/metrics/form_factor_metrics_provider.h"
+
+#include "build/build_config.h"
+#include "ui/base/device_form_factor.h"
+
+#if BUILDFLAG(IS_ANDROID)
+#include "base/android/build_info.h"
+#endif  // BUILDFLAG(IS_ANDROID)
+
+namespace metrics {
+
+void FormFactorMetricsProvider::ProvideSystemProfileMetrics(
+    SystemProfileProto* system_profile_proto) {
+  system_profile_proto->mutable_hardware()->set_form_factor(GetFormFactor());
+}
+
+SystemProfileProto::Hardware::FormFactor
+FormFactorMetricsProvider::GetFormFactor() const {
+#if BUILDFLAG(IS_ANDROID)
+  // TODO(crbug.com/1300338): Move the TV form factor logic to
+  // ui/base/device_form_factor_android.cc.
+  if (base::android::BuildInfo::GetInstance()->is_tv())
+    return SystemProfileProto::Hardware::FORM_FACTOR_TV;
+#endif  // BUILDFLAG(IS_ANDROID)
+
+  switch (ui::GetDeviceFormFactor()) {
+    case ui::DEVICE_FORM_FACTOR_DESKTOP:
+      return SystemProfileProto::Hardware::FORM_FACTOR_DESKTOP;
+    case ui::DEVICE_FORM_FACTOR_PHONE:
+      return SystemProfileProto::Hardware::FORM_FACTOR_PHONE;
+    case ui::DEVICE_FORM_FACTOR_TABLET:
+      return SystemProfileProto::Hardware::FORM_FACTOR_TABLET;
+    default:
+      return SystemProfileProto::Hardware::FORM_FACTOR_UNKNOWN;
+  }
+}
+
+}  // namespace metrics
diff --git a/components/metrics/form_factor_metrics_provider.h b/components/metrics/form_factor_metrics_provider.h
new file mode 100644
index 0000000..df1042f
--- /dev/null
+++ b/components/metrics/form_factor_metrics_provider.h
@@ -0,0 +1,35 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_METRICS_FORM_FACTOR_METRICS_PROVIDER_H_
+#define COMPONENTS_METRICS_FORM_FACTOR_METRICS_PROVIDER_H_
+
+#include "components/metrics/metrics_provider.h"
+#include "third_party/metrics_proto/system_profile.pb.h"
+
+namespace metrics {
+
+// Provides metrics related to the device's form factor.
+class FormFactorMetricsProvider : public MetricsProvider {
+ public:
+  FormFactorMetricsProvider() = default;
+
+  FormFactorMetricsProvider(const FormFactorMetricsProvider&) = delete;
+  FormFactorMetricsProvider& operator=(const FormFactorMetricsProvider&) =
+      delete;
+
+  ~FormFactorMetricsProvider() override = default;
+
+  // MetricsProvider:
+  void ProvideSystemProfileMetrics(
+      SystemProfileProto* system_profile_proto) override;
+
+ protected:
+  // Returns the device's form factor. Protected and virtual for testing.
+  virtual SystemProfileProto::Hardware::FormFactor GetFormFactor() const;
+};
+
+}  // namespace metrics
+
+#endif  // COMPONENTS_METRICS_FORM_FACTOR_METRICS_PROVIDER_H_
diff --git a/components/metrics/form_factor_metrics_provider_unittest.cc b/components/metrics/form_factor_metrics_provider_unittest.cc
new file mode 100644
index 0000000..d775d70
--- /dev/null
+++ b/components/metrics/form_factor_metrics_provider_unittest.cc
@@ -0,0 +1,46 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/metrics/form_factor_metrics_provider.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/metrics_proto/system_profile.pb.h"
+
+namespace metrics {
+namespace {
+
+constexpr SystemProfileProto::Hardware::FormFactor kFormFactor =
+    SystemProfileProto::Hardware::FORM_FACTOR_DESKTOP;
+
+class TestFormFactorMetricsProvider : public FormFactorMetricsProvider {
+ public:
+  TestFormFactorMetricsProvider() = default;
+
+  TestFormFactorMetricsProvider(const TestFormFactorMetricsProvider&) = delete;
+  TestFormFactorMetricsProvider& operator=(
+      const TestFormFactorMetricsProvider&) = delete;
+
+  ~TestFormFactorMetricsProvider() override = default;
+
+ private:
+  SystemProfileProto::Hardware::FormFactor GetFormFactor() const override {
+    return kFormFactor;
+  }
+};
+
+}  // namespace
+
+TEST(FormFactorMetricsProviderTest, ProvideSystemProfileMetrics) {
+  TestFormFactorMetricsProvider provider;
+  SystemProfileProto system_profile;
+
+  provider.ProvideSystemProfileMetrics(&system_profile);
+
+  // Verify that the system profile has the form factor set.
+  const SystemProfileProto::Hardware& hardware = system_profile.hardware();
+  ASSERT_TRUE(hardware.has_form_factor());
+  EXPECT_EQ(kFormFactor, hardware.form_factor());
+}
+
+}  // namespace metrics
diff --git a/components/network_session_configurator/browser/network_session_configurator.cc b/components/network_session_configurator/browser/network_session_configurator.cc
index 3582b609..50a3310 100644
--- a/components/network_session_configurator/browser/network_session_configurator.cc
+++ b/components/network_session_configurator/browser/network_session_configurator.cc
@@ -224,6 +224,23 @@
       "true");
 }
 
+absl::optional<bool> GetExponentialBackOffOnInitialDelay(
+    const VariationParameters& quic_trial_params) {
+  if (base::LowerCaseEqualsASCII(
+          GetVariationParam(quic_trial_params,
+                            "exponential_backoff_on_initial_delay"),
+          "false")) {
+    return false;
+  }
+  if (base::LowerCaseEqualsASCII(
+          GetVariationParam(quic_trial_params,
+                            "exponential_backoff_on_initial_delay"),
+          "true")) {
+    return true;
+  }
+  return absl::nullopt;
+}
+
 int GetQuicIdleConnectionTimeoutSeconds(
     const VariationParameters& quic_trial_params) {
   int value;
@@ -420,6 +437,19 @@
   return base::flat_set<std::string>(std::move(host_vector));
 }
 
+int GetInitialDelayForBrokenAlternativeServiceSeconds(
+    const VariationParameters& quic_trial_params) {
+  int value;
+  if (base::StringToInt(
+          GetVariationParam(
+              quic_trial_params,
+              "initial_delay_for_broken_alternative_service_seconds"),
+          &value)) {
+    return value;
+  }
+  return 0;
+}
+
 void SetQuicFlags(const VariationParameters& quic_trial_params) {
   std::string flags_list =
       GetVariationParam(quic_trial_params, "set_quic_flags");
@@ -640,6 +670,14 @@
           max_migrations_to_non_default_network_on_path_degrading;
     }
     params->quic_host_allowlist = GetQuicHostAllowlist(quic_trial_params);
+    const int initial_delay_for_broken_alternative_service_seconds =
+        GetInitialDelayForBrokenAlternativeServiceSeconds(quic_trial_params);
+    if (initial_delay_for_broken_alternative_service_seconds > 0) {
+      quic_params->initial_delay_for_broken_alternative_service =
+          base::Seconds(initial_delay_for_broken_alternative_service_seconds);
+    }
+    quic_params->exponential_backoff_on_initial_delay =
+        GetExponentialBackOffOnInitialDelay(quic_trial_params);
 
     SetQuicFlags(quic_trial_params);
   }
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
index 2bf58ff..d510377 100644
--- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc
+++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -104,6 +104,9 @@
   EXPECT_FALSE(params_.enable_quic_proxies_for_https_urls);
   EXPECT_EQ("Chrome/52.0.2709.0 Linux x86_64", quic_params_.user_agent_id);
   EXPECT_EQ(0u, quic_params_.origins_to_force_quic_on.size());
+  EXPECT_FALSE(
+      quic_params_.initial_delay_for_broken_alternative_service.has_value());
+  EXPECT_FALSE(quic_params_.exponential_backoff_on_initial_delay.has_value());
 }
 
 TEST_F(NetworkSessionConfiguratorTest, Http2FieldTrialGroupNameDoesNotMatter) {
@@ -257,6 +260,47 @@
 }
 
 TEST_F(NetworkSessionConfiguratorTest,
+       InitialDelayForBrokenAlternativeServiceSeconds) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["initial_delay_for_broken_alternative_service_seconds"] =
+      "5";
+  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  ASSERT_TRUE(
+      quic_params_.initial_delay_for_broken_alternative_service.has_value());
+  EXPECT_EQ(base::Seconds(5),
+            quic_params_.initial_delay_for_broken_alternative_service.value());
+}
+
+TEST_F(NetworkSessionConfiguratorTest, ExponentialBackOffOnInitialDelay) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["exponential_backoff_on_initial_delay"] = "true";
+  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  ASSERT_TRUE(quic_params_.exponential_backoff_on_initial_delay.has_value());
+  EXPECT_TRUE(quic_params_.exponential_backoff_on_initial_delay.value());
+}
+
+TEST_F(NetworkSessionConfiguratorTest,
+       DisableExponentialBackOffOnInitialDelay) {
+  std::map<std::string, std::string> field_trial_params;
+  field_trial_params["exponential_backoff_on_initial_delay"] = "false";
+  variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params);
+  base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled");
+
+  ParseFieldTrials();
+
+  ASSERT_TRUE(quic_params_.exponential_backoff_on_initial_delay.has_value());
+  EXPECT_FALSE(quic_params_.exponential_backoff_on_initial_delay.value());
+}
+
+TEST_F(NetworkSessionConfiguratorTest,
        QuicIdleConnectionTimeoutSecondsFieldTrialParams) {
   std::map<std::string, std::string> field_trial_params;
   field_trial_params["idle_connection_timeout_seconds"] = "300";
diff --git a/components/on_load_script_injector/DIR_METADATA b/components/on_load_script_injector/DIR_METADATA
index 6d8f079..566a281f 100644
--- a/components/on_load_script_injector/DIR_METADATA
+++ b/components/on_load_script_injector/DIR_METADATA
@@ -2,6 +2,6 @@
   component: "Fuchsia"
 }
 
-team_email: "cr-fuchsia@chromium.org"
+team_email: "fuchsia-dev@chromium.org"
 
 os: FUCHSIA
diff --git a/components/policy/core/common/BUILD.gn b/components/policy/core/common/BUILD.gn
index 9aa66afa..85230ee 100644
--- a/components/policy/core/common/BUILD.gn
+++ b/components/policy/core/common/BUILD.gn
@@ -210,6 +210,13 @@
     "//components/policy:generated",
   ]
 
+  if (is_mac) {
+    sources += [
+      "management/platform_management_status_provider_mac.cc",
+      "management/platform_management_status_provider_mac.h",
+    ]
+  }
+
   if (is_win) {
     sources += [
       "management/platform_management_status_provider_win.cc",
diff --git a/components/policy/core/common/management/management_service.cc b/components/policy/core/common/management/management_service.cc
index 1d640fb..f5f50bf 100644
--- a/components/policy/core/common/management/management_service.cc
+++ b/components/policy/core/common/management/management_service.cc
@@ -11,8 +11,11 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
+#include "build/build_config.h"
 #include "components/policy/core/common/features.h"
+#include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/persistent_pref_store.h"
+#include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 
 namespace policy {
@@ -165,6 +168,16 @@
   management_authorities_for_testing_.reset();
 }
 
+// static
+void ManagementService::RegisterLocalStatePrefs(PrefRegistrySimple* registry) {
+#if BUILDFLAG(IS_WIN)
+  registry->RegisterIntegerPref(policy_prefs::kAzureActiveDirectoryManagement,
+                                NONE);
+#elif BUILDFLAG(IS_MAC)
+  registry->RegisterIntegerPref(policy_prefs::kEnterpriseMDMManagementMac, 0);
+#endif
+}
+
 bool ManagementService::IsManaged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return GetManagementAuthorityTrustworthiness() >
diff --git a/components/policy/core/common/management/management_service.h b/components/policy/core/common/management/management_service.h
index 5f7f6690..8fc4293 100644
--- a/components/policy/core/common/management/management_service.h
+++ b/components/policy/core/common/management/management_service.h
@@ -18,6 +18,7 @@
 #include "third_party/abseil-cpp/absl/types/variant.h"
 
 class PrefService;
+class PrefRegistrySimple;
 
 namespace policy {
 
@@ -51,6 +52,11 @@
 class POLICY_EXPORT ManagementStatusProvider {
  public:
   ManagementStatusProvider();
+
+  // `cache_pref_name` is an optional that is the name of the pref used to store
+  // the management authority from this provider. If this is empty, the provider
+  // always returns the up-to-date management authority, otherwise returns the
+  // value from the prefs.
   explicit ManagementStatusProvider(const std::string& cache_pref_name);
   virtual ~ManagementStatusProvider();
 
@@ -116,6 +122,8 @@
   void SetManagementStatusProviderForTesting(
       std::vector<std::unique_ptr<ManagementStatusProvider>> providers);
 
+  static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
+
  protected:
   // Sets the management status providers to be used by the service.
   void SetManagementStatusProvider(
diff --git a/components/policy/core/common/management/platform_management_service.cc b/components/policy/core/common/management/platform_management_service.cc
index a874a637..6e663f8f 100644
--- a/components/policy/core/common/management/platform_management_service.cc
+++ b/components/policy/core/common/management/platform_management_service.cc
@@ -14,8 +14,9 @@
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "components/policy/core/common/features.h"
-
-#if BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_MAC)
+#include "components/policy/core/common/management/platform_management_status_provider_mac.h"
+#elif BUILDFLAG(IS_WIN)
 #include "components/policy/core/common/management/platform_management_status_provider_win.h"
 #endif
 
@@ -25,11 +26,15 @@
 std::vector<std::unique_ptr<ManagementStatusProvider>>
 GetPlatformManagementSatusProviders() {
   std::vector<std::unique_ptr<ManagementStatusProvider>> providers;
-#if BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   providers.emplace_back(std::make_unique<DomainEnrollmentStatusProvider>());
   providers.emplace_back(
       std::make_unique<EnterpriseMDMManagementStatusProvider>());
 #endif
+#if BUILDFLAG(IS_WIN)
+  providers.emplace_back(
+      std::make_unique<AzureActiveDirectoryStatusProvider>());
+#endif
   return providers;
 }
 
diff --git a/components/policy/core/common/management/platform_management_status_provider_mac.cc b/components/policy/core/common/management/platform_management_status_provider_mac.cc
new file mode 100644
index 0000000..9a2e820
--- /dev/null
+++ b/components/policy/core/common/management/platform_management_status_provider_mac.cc
@@ -0,0 +1,53 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/policy/core/common/management/platform_management_status_provider_mac.h"
+
+#include "components/policy/core/common/policy_pref_names.h"
+
+namespace policy {
+
+DomainEnrollmentStatusProvider::DomainEnrollmentStatusProvider() {
+  domain_join_state_ = base::AreDeviceAndUserJoinedToDomain();
+}
+
+DomainEnrollmentStatusProvider::~DomainEnrollmentStatusProvider() = default;
+
+EnterpriseManagementAuthority DomainEnrollmentStatusProvider::FetchAuthority() {
+  return domain_join_state_.device_joined || domain_join_state_.user_joined
+             ? EnterpriseManagementAuthority::DOMAIN_LOCAL
+             : EnterpriseManagementAuthority::NONE;
+}
+
+EnterpriseMDMManagementStatusProvider::EnterpriseMDMManagementStatusProvider()
+    : ManagementStatusProvider(policy_prefs::kEnterpriseMDMManagementMac) {}
+
+EnterpriseMDMManagementStatusProvider::
+    ~EnterpriseMDMManagementStatusProvider() = default;
+
+EnterpriseManagementAuthority
+EnterpriseMDMManagementStatusProvider::FetchAuthority() {
+  base::MacDeviceManagementStateNew mdm_state_new =
+      base::IsDeviceRegisteredWithManagementNew();
+
+  bool managed = false;
+  switch (mdm_state_new) {
+    case base::MacDeviceManagementStateNew::kLimitedMDMEnrollment:
+    case base::MacDeviceManagementStateNew::kFullMDMEnrollment:
+    case base::MacDeviceManagementStateNew::kDEPMDMEnrollment:
+      managed = true;
+      break;
+    case base::MacDeviceManagementStateNew::kFailureAPIUnavailable:
+      managed = base::MacDeviceManagementStateOld::kMDMEnrollment ==
+                base::IsDeviceRegisteredWithManagementOld();
+      break;
+    default:
+      break;
+  }
+
+  return managed ? EnterpriseManagementAuthority::CLOUD
+                 : EnterpriseManagementAuthority::NONE;
+}
+
+}  // namespace policy
diff --git a/components/policy/core/common/management/platform_management_status_provider_mac.h b/components/policy/core/common/management/platform_management_status_provider_mac.h
new file mode 100644
index 0000000..7b34d7a
--- /dev/null
+++ b/components/policy/core/common/management/platform_management_status_provider_mac.h
@@ -0,0 +1,41 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_POLICY_CORE_COMMON_MANAGEMENT_PLATFORM_MANAGEMENT_STATUS_PROVIDER_MAC_H_
+#define COMPONENTS_POLICY_CORE_COMMON_MANAGEMENT_PLATFORM_MANAGEMENT_STATUS_PROVIDER_MAC_H_
+
+#include "base/enterprise_util.h"
+#include "components/policy/core/common/management/management_service.h"
+#include "components/policy/policy_export.h"
+
+namespace policy {
+
+class POLICY_EXPORT DomainEnrollmentStatusProvider final
+    : public ManagementStatusProvider {
+ public:
+  DomainEnrollmentStatusProvider();
+  ~DomainEnrollmentStatusProvider() final;
+
+ protected:
+  // ManagementStatusProvider impl
+  EnterpriseManagementAuthority FetchAuthority() final;
+
+ private:
+  base::DeviceUserDomainJoinState domain_join_state_;
+};
+
+class POLICY_EXPORT EnterpriseMDMManagementStatusProvider final
+    : public ManagementStatusProvider {
+ public:
+  EnterpriseMDMManagementStatusProvider();
+  ~EnterpriseMDMManagementStatusProvider() final;
+
+ protected:
+  // ManagementStatusProvider impl
+  EnterpriseManagementAuthority FetchAuthority() final;
+};
+
+}  // namespace policy
+
+#endif  // COMPONENTS_POLICY_CORE_COMMON_MANAGEMENT_PLATFORM_MANAGEMENT_STATUS_PROVIDER_MAC_H_
diff --git a/components/policy/core/common/management/platform_management_status_provider_win.cc b/components/policy/core/common/management/platform_management_status_provider_win.cc
index b91672e..298fddb 100644
--- a/components/policy/core/common/management/platform_management_status_provider_win.cc
+++ b/components/policy/core/common/management/platform_management_status_provider_win.cc
@@ -7,16 +7,14 @@
 #include "base/win/win_util.h"
 #include "base/win/windows_version.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
+#include "components/policy/core/common/policy_pref_names.h"
 
 namespace policy {
 DomainEnrollmentStatusProvider::DomainEnrollmentStatusProvider() = default;
 
-DomainEnrollmentStatusProvider::~DomainEnrollmentStatusProvider() = default;
-
 EnterpriseManagementAuthority DomainEnrollmentStatusProvider::FetchAuthority() {
-  return DomainEnrollmentStatusProvider::IsEnrolledToDomain()
-             ? EnterpriseManagementAuthority::DOMAIN_LOCAL
-             : EnterpriseManagementAuthority::NONE;
+  return DomainEnrollmentStatusProvider::IsEnrolledToDomain() ? DOMAIN_LOCAL
+                                                              : NONE;
 }
 
 bool DomainEnrollmentStatusProvider::IsEnrolledToDomain() {
@@ -26,16 +24,21 @@
 EnterpriseMDMManagementStatusProvider::EnterpriseMDMManagementStatusProvider() =
     default;
 
-EnterpriseMDMManagementStatusProvider::
-    ~EnterpriseMDMManagementStatusProvider() = default;
-
 EnterpriseManagementAuthority
 EnterpriseMDMManagementStatusProvider::FetchAuthority() {
   return base::win::OSInfo::GetInstance()->version_type() !=
                      base::win::SUITE_HOME &&
                  base::win::IsDeviceRegisteredWithManagement()
-             ? EnterpriseManagementAuthority::CLOUD
-             : EnterpriseManagementAuthority::NONE;
+             ? CLOUD
+             : NONE;
+}
+
+AzureActiveDirectoryStatusProvider::AzureActiveDirectoryStatusProvider()
+    : ManagementStatusProvider(policy_prefs::kAzureActiveDirectoryManagement) {}
+
+EnterpriseManagementAuthority
+AzureActiveDirectoryStatusProvider::FetchAuthority() {
+  return base::win::IsJoinedToAzureAD() ? CLOUD_DOMAIN : NONE;
 }
 
 }  // namespace policy
diff --git a/components/policy/core/common/management/platform_management_status_provider_win.h b/components/policy/core/common/management/platform_management_status_provider_win.h
index b540a5a..5a0084d 100644
--- a/components/policy/core/common/management/platform_management_status_provider_win.h
+++ b/components/policy/core/common/management/platform_management_status_provider_win.h
@@ -14,7 +14,11 @@
     : public ManagementStatusProvider {
  public:
   DomainEnrollmentStatusProvider();
-  ~DomainEnrollmentStatusProvider() final;
+
+  DomainEnrollmentStatusProvider(const DomainEnrollmentStatusProvider&) =
+      delete;
+  DomainEnrollmentStatusProvider& operator=(
+      const DomainEnrollmentStatusProvider&) = delete;
 
   static bool IsEnrolledToDomain();
 
@@ -27,7 +31,11 @@
     : public ManagementStatusProvider {
  public:
   EnterpriseMDMManagementStatusProvider();
-  ~EnterpriseMDMManagementStatusProvider() final;
+
+  EnterpriseMDMManagementStatusProvider(
+      const EnterpriseMDMManagementStatusProvider&) = delete;
+  EnterpriseMDMManagementStatusProvider& operator=(
+      const EnterpriseMDMManagementStatusProvider&) = delete;
 
   static bool IsEnrolledToDomain();
 
@@ -36,6 +44,23 @@
   EnterpriseManagementAuthority FetchAuthority() final;
 };
 
+// TODO (crbug/1300217): Handle management state changing while the browser is
+// running.
+class POLICY_EXPORT AzureActiveDirectoryStatusProvider final
+    : public ManagementStatusProvider {
+ public:
+  AzureActiveDirectoryStatusProvider();
+
+  AzureActiveDirectoryStatusProvider(
+      const AzureActiveDirectoryStatusProvider&) = delete;
+  AzureActiveDirectoryStatusProvider& operator=(
+      const AzureActiveDirectoryStatusProvider&) = delete;
+
+ protected:
+  // ManagementStatusProvider impl
+  EnterpriseManagementAuthority FetchAuthority() override;
+};
+
 }  // namespace policy
 
 #endif  // COMPONENTS_POLICY_CORE_COMMON_MANAGEMENT_PLATFORM_MANAGEMENT_STATUS_PROVIDER_WIN_H_
diff --git a/components/policy/core/common/policy_loader_win.cc b/components/policy/core/common/policy_loader_win.cc
index 856ac6b..738207c 100644
--- a/components/policy/core/common/policy_loader_win.cc
+++ b/components/policy/core/common/policy_loader_win.cc
@@ -181,6 +181,8 @@
                             base::win::IsDeviceRegisteredWithManagement());
   base::UmaHistogramBoolean("EnterpriseCheck.IsEnterpriseUser",
                             base::IsMachineExternallyManaged());
+  base::UmaHistogramBoolean("EnterpriseCheck.IsJoinedToAzureAD",
+                            base::win::IsJoinedToAzureAD());
 
   std::wstring machine_name;
   if (GetName(
diff --git a/components/policy/core/common/policy_pref_names.cc b/components/policy/core/common/policy_pref_names.cc
index ed1d31d..e297ce3 100644
--- a/components/policy/core/common/policy_pref_names.cc
+++ b/components/policy/core/common/policy_pref_names.cc
@@ -9,6 +9,18 @@
 namespace policy {
 namespace policy_prefs {
 
+#if BUILDFLAG(IS_WIN)
+// Boolean pref that stores if the OS is actively managed by
+// Azure Active Directory. This will be used to cache the management status so
+// that it is loaded faster at sartup.
+const char kAzureActiveDirectoryManagement[] =
+    "management.platform.azure_active_directory";
+#elif BUILDFLAG(IS_MAC)
+// Integer pref that stores the Mac enterprise MDM management authority.
+const char kEnterpriseMDMManagementMac[] =
+    "management.platform.enterprise_mdm_mac";
+#endif
+
 // 64-bit serialization of the time last policy usage statistics were collected
 // by UMA_HISTOGRAM_ENUMERATION.
 const char kLastPolicyStatisticsUpdate[] = "policy.last_statistics_update";
diff --git a/components/policy/core/common/policy_pref_names.h b/components/policy/core/common/policy_pref_names.h
index dbc17bc..71bbdea0 100644
--- a/components/policy/core/common/policy_pref_names.h
+++ b/components/policy/core/common/policy_pref_names.h
@@ -11,10 +11,16 @@
 namespace policy {
 namespace policy_prefs {
 
+#if BUILDFLAG(IS_WIN)
+POLICY_EXPORT extern const char kAzureActiveDirectoryManagement[];
+#endif
 POLICY_EXPORT extern const char kCloudManagementEnrollmentMandatory[];
 POLICY_EXPORT extern const char kDlpClipboardCheckSizeLimit[];
 POLICY_EXPORT extern const char kDlpReportingEnabled[];
 POLICY_EXPORT extern const char kDlpRulesList[];
+#if BUILDFLAG(IS_MAC)
+POLICY_EXPORT extern const char kEnterpriseMDMManagementMac[];
+#endif
 POLICY_EXPORT extern const char kLastPolicyStatisticsUpdate[];
 POLICY_EXPORT extern const char kNativeWindowOcclusionEnabled[];
 POLICY_EXPORT extern const char kSafeSitesFilterBehavior[];
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 719f36e1..b5b3d8c 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -21142,7 +21142,7 @@
       },
       'example_value': '37185d02-e055-11e7-80c1-9a214cf093ae',
       'id': 510,
-      'caption': '''The enrollment token of cloud policy on desktop''',
+      'caption': '''The enrollment token of cloud policy''',
       'tags': [],
       'desc': '''Setting the policy means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> tries to register itself with <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME">Chrome Browser Cloud Management</ph>. The value of this policy is an enrollment token you can retrieve from the <ph name="GOOGLE_ADMIN_CONSOLE_PRODUCT_NAME">Google Admin console</ph>.
 
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager.h b/components/segmentation_platform/internal/execution/model_execution_manager.h
index 0b648e6..6e8d071 100644
--- a/components/segmentation_platform/internal/execution/model_execution_manager.h
+++ b/components/segmentation_platform/internal/execution/model_execution_manager.h
@@ -24,6 +24,10 @@
  public:
   virtual ~ModelExecutionManager() = default;
 
+  // Disallow copy/assign.
+  ModelExecutionManager(const ModelExecutionManager&) = delete;
+  ModelExecutionManager& operator=(const ModelExecutionManager&) = delete;
+
   // The float value is only valid when ModelExecutionStatus == kSuccess.
   using ModelExecutionCallback =
       base::OnceCallback<void(const std::pair<float, ModelExecutionStatus>&)>;
@@ -38,6 +42,9 @@
   virtual void ExecuteModel(
       optimization_guide::proto::OptimizationTarget segment_id,
       ModelExecutionCallback callback) = 0;
+
+ protected:
+  ModelExecutionManager() = default;
 };
 
 }  // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager_impl.h b/components/segmentation_platform/internal/execution/model_execution_manager_impl.h
index c18df54..766a31d2 100644
--- a/components/segmentation_platform/internal/execution/model_execution_manager_impl.h
+++ b/components/segmentation_platform/internal/execution/model_execution_manager_impl.h
@@ -56,7 +56,7 @@
           optimization_guide::proto::OptimizationTarget,
           const SegmentationModelHandler::ModelUpdatedCallback&)>;
 
-  explicit ModelExecutionManagerImpl(
+  ModelExecutionManagerImpl(
       const base::flat_set<OptimizationTarget>& segment_ids,
       ModelHandlerCreator model_handler_creator,
       base::Clock* clock,
diff --git a/components/services/app_service/public/cpp/app_registry_cache_unittest.cc b/components/services/app_service/public/cpp/app_registry_cache_unittest.cc
index 3c36874..bcab93d0 100644
--- a/components/services/app_service/public/cpp/app_registry_cache_unittest.cc
+++ b/components/services/app_service/public/cpp/app_registry_cache_unittest.cc
@@ -58,11 +58,7 @@
 };
 
 MATCHER_P(HasAppId, app_id, "Has the correct app id") {
-  if (base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) {
-    return arg.GetAppId() == app_id;
-  } else {
-    return arg.AppId() == app_id;
-  }
+  return arg.AppId() == app_id;
 }
 
 // Responds to a cache's OnAppUpdate to call back into the cache, checking that
@@ -111,21 +107,21 @@
         if (num_apps_seen_on_app_update_ == 0) {
           // If this is the first time that OnAppUpdate is called, after a
           // PrepareForOnApps call, then just populate the names_snapshot_ map.
-          names_snapshot_[inner.GetAppId()] = inner.Name();
+          names_snapshot_[inner.AppId()] = inner.Name();
         } else {
           // Otherwise, check that the names found during this OnAppUpdate call
           // match those during the first OnAppUpdate call.
-          auto iter = names_snapshot_.find(inner.GetAppId());
+          auto iter = names_snapshot_.find(inner.AppId());
           EXPECT_EQ(inner.Name(),
                     (iter != names_snapshot_.end()) ? iter->second : "");
         }
       }
 
-      if (outer.GetAppId() == inner.GetAppId()) {
+      if (outer.AppId() == inner.AppId()) {
         ExpectEq(outer, inner);
       }
 
-      if (inner.GetAppId() == "p") {
+      if (inner.AppId() == "p") {
         EXPECT_EQ(expected_name_for_p_, inner.Name());
       }
 
@@ -137,13 +133,13 @@
         "no_such_app_id",
         [&outer](const AppUpdate& inner) { ExpectEq(outer, inner); }));
 
-    EXPECT_TRUE(cache_->ForApp(
-        outer.GetAppId(),
-        [&outer](const AppUpdate& inner) { ExpectEq(outer, inner); }));
+    EXPECT_TRUE(cache_->ForApp(outer.AppId(), [&outer](const AppUpdate& inner) {
+      ExpectEq(outer, inner);
+    }));
 
     if (outer.NameChanged()) {
       std::string old_name;
-      auto iter = old_names_.find(outer.GetAppId());
+      auto iter = old_names_.find(outer.AppId());
       if (iter != old_names_.end()) {
         old_name = iter->second;
       }
@@ -152,7 +148,7 @@
       // "mango" to "mulberry" and never from "mulberry" to "melon".
       EXPECT_LT(old_name, outer.Name());
     }
-    old_names_[outer.GetAppId()] = outer.Name();
+    old_names_[outer.AppId()] = outer.Name();
 
     std::vector<AppPtr> super_recursive;
     while (!super_recursive_apps_.empty()) {
@@ -180,7 +176,7 @@
 
   static void ExpectEq(const AppUpdate& outer, const AppUpdate& inner) {
     EXPECT_EQ(outer.GetAppType(), inner.GetAppType());
-    EXPECT_EQ(outer.GetAppId(), inner.GetAppId());
+    EXPECT_EQ(outer.AppId(), inner.AppId());
     EXPECT_EQ(outer.StateIsNull(), inner.StateIsNull());
     EXPECT_EQ(outer.Readiness(), inner.Readiness());
     EXPECT_EQ(outer.Name(), inner.Name());
@@ -228,11 +224,7 @@
 
   // apps::AppRegistryCache::Observer overrides.
   void OnAppUpdate(const apps::AppUpdate& update) override {
-    if (base::FeatureList::IsEnabled(kAppServiceOnAppUpdateWithoutMojom)) {
-      updated_ids_.insert(update.GetAppId());
-    } else {
-      updated_ids_.insert(update.AppId());
-    }
+    updated_ids_.insert(update.AppId());
   }
 
   void UpdateApps() {
@@ -311,7 +303,7 @@
           (update.Readiness() == Readiness::kReady)) {
         num_freshly_installed_++;
       }
-      updated_ids_.insert(update.GetAppId());
+      updated_ids_.insert(update.AppId());
       updated_names_.insert(update.Name());
     } else {
       EXPECT_NE("", update.Name());
@@ -481,14 +473,14 @@
   bool found_c = false;
   EXPECT_TRUE(cache.ForApp("c", [&found_c](const apps::AppUpdate& update) {
     found_c = true;
-    EXPECT_EQ("c", update.GetAppId());
+    EXPECT_EQ("c", update.AppId());
   }));
   EXPECT_TRUE(found_c);
 
   bool found_e = false;
   EXPECT_FALSE(cache.ForApp("e", [&found_e](const apps::AppUpdate& update) {
     found_e = true;
-    EXPECT_EQ("e", update.GetAppId());
+    EXPECT_EQ("e", update.AppId());
   }));
   EXPECT_FALSE(found_e);
 }
diff --git a/components/services/app_service/public/cpp/app_update.cc b/components/services/app_service/public/cpp/app_update.cc
index 802c25b8..b0531b2 100644
--- a/components/services/app_service/public/cpp/app_update.cc
+++ b/components/services/app_service/public/cpp/app_update.cc
@@ -275,13 +275,12 @@
 }
 
 const std::string& AppUpdate::AppId() const {
+  if (ShouldUseNonMojom()) {
+    return delta_ ? delta_->app_id : state_->app_id;
+  }
   return mojom_delta_ ? mojom_delta_->app_id : mojom_state_->app_id;
 }
 
-const std::string& AppUpdate::GetAppId() const {
-  return delta_ ? delta_->app_id : state_->app_id;
-}
-
 apps::Readiness AppUpdate::Readiness() const {
   if (ShouldUseNonMojom()) {
     GET_VALUE_WITH_DEFAULT_VALUE(readiness, apps::Readiness::kUnknown)
@@ -455,22 +454,27 @@
                             mojom_state_->additional_search_terms));
 }
 
-apps::mojom::IconKeyPtr AppUpdate::IconKey() const {
+absl::optional<apps::IconKey> AppUpdate::IconKey() const {
+  apps::IconKey icon_key;
+  if (ShouldUseNonMojom()) {
+    if (delta_ && delta_->icon_key.has_value()) {
+      icon_key = std::move(*delta_->icon_key->Clone());
+      return icon_key;
+    }
+    if (state_ && state_->icon_key.has_value()) {
+      icon_key = std::move(*state_->icon_key->Clone());
+      return icon_key;
+    }
+    return absl::nullopt;
+  }
+
   if (mojom_delta_ && !mojom_delta_->icon_key.is_null()) {
-    return mojom_delta_->icon_key.Clone();
+    icon_key = std::move(*ConvertMojomIconKeyToIconKey(mojom_delta_->icon_key));
+    return icon_key;
   }
   if (mojom_state_ && !mojom_state_->icon_key.is_null()) {
-    return mojom_state_->icon_key.Clone();
-  }
-  return apps::mojom::IconKeyPtr();
-}
-
-absl::optional<apps::IconKey> AppUpdate::GetIconKey() const {
-  if (delta_ && delta_->icon_key.has_value()) {
-    return absl::optional<apps::IconKey>(std::move(*delta_->icon_key->Clone()));
-  }
-  if (state_ && state_->icon_key.has_value()) {
-    return absl::optional<apps::IconKey>(std::move(*state_->icon_key->Clone()));
+    icon_key = std::move(*ConvertMojomIconKeyToIconKey(mojom_state_->icon_key));
+    return icon_key;
   }
   return absl::nullopt;
 }
@@ -863,19 +867,12 @@
           (mojom_delta_->has_badge != mojom_state_->has_badge));
 }
 
-apps::mojom::OptionalBool AppUpdate::Paused() const {
-  if (mojom_delta_ &&
-      (mojom_delta_->paused != apps::mojom::OptionalBool::kUnknown)) {
-    return mojom_delta_->paused;
+absl::optional<bool> AppUpdate::Paused() const {
+  if (ShouldUseNonMojom()) {
+    GET_VALUE_WITH_FALLBACK(paused, absl::nullopt);
   }
-  if (mojom_state_) {
-    return mojom_state_->paused;
-  }
-  return apps::mojom::OptionalBool::kUnknown;
-}
 
-absl::optional<bool> AppUpdate::GetPaused() const {
-  GET_VALUE_WITH_FALLBACK(paused, absl::nullopt);
+  CONVERT_MOJOM_OPTIONALBOOL_TO_OPTIONAL_VALUE(paused)
 }
 
 bool AppUpdate::PausedChanged() const {
@@ -1056,7 +1053,7 @@
   out << "AllowUninstall: " << PRINT_OPTIONAL_VALUE(AllowUninstall)
       << std::endl;
   out << "HasBadge: " << app.HasBadge() << std::endl;
-  out << "Paused: " << app.Paused() << std::endl;
+  out << "Paused: " << PRINT_OPTIONAL_VALUE(Paused) << std::endl;
   out << "IntentFilters: " << std::endl;
   for (const auto& filter : app.IntentFilters()) {
     out << filter << std::endl;
diff --git a/components/services/app_service/public/cpp/app_update.h b/components/services/app_service/public/cpp/app_update.h
index ed9f845..05b82540 100644
--- a/components/services/app_service/public/cpp/app_update.h
+++ b/components/services/app_service/public/cpp/app_update.h
@@ -80,7 +80,6 @@
   apps::AppType GetAppType() const;
 
   const std::string& AppId() const;
-  const std::string& GetAppId() const;
 
   apps::Readiness Readiness() const;
   apps::Readiness PriorReadiness() const;
@@ -107,8 +106,7 @@
   std::vector<std::string> AdditionalSearchTerms() const;
   bool AdditionalSearchTermsChanged() const;
 
-  apps::mojom::IconKeyPtr IconKey() const;
-  absl::optional<apps::IconKey> GetIconKey() const;
+  absl::optional<apps::IconKey> IconKey() const;
   bool IconKeyChanged() const;
 
   base::Time LastLaunchTime() const;
@@ -171,8 +169,7 @@
   absl::optional<bool> GetHasBadge() const;
   bool HasBadgeChanged() const;
 
-  apps::mojom::OptionalBool Paused() const;
-  absl::optional<bool> GetPaused() const;
+  absl::optional<bool> Paused() const;
   bool PausedChanged() const;
 
   std::vector<apps::mojom::IntentFilterPtr> IntentFilters() const;
diff --git a/components/services/app_service/public/cpp/app_update_mojom_unittest.cc b/components/services/app_service/public/cpp/app_update_mojom_unittest.cc
index d50c42a..6c57b7cf 100644
--- a/components/services/app_service/public/cpp/app_update_mojom_unittest.cc
+++ b/components/services/app_service/public/cpp/app_update_mojom_unittest.cc
@@ -48,7 +48,7 @@
   std::vector<std::string> expect_additional_search_terms_;
   bool expect_additional_search_terms_changed_;
 
-  apps::mojom::IconKeyPtr expect_icon_key_;
+  absl::optional<apps::IconKey> expect_icon_key_;
   bool expect_icon_key_changed_;
 
   base::Time expect_last_launch_time_;
@@ -99,7 +99,7 @@
   apps::mojom::OptionalBool expect_has_badge_;
   bool expect_has_badge_changed_;
 
-  apps::mojom::OptionalBool expect_paused_;
+  absl::optional<bool> expect_paused_;
   bool expect_paused_changed_;
 
   std::vector<apps::mojom::IntentFilterPtr> expect_intent_filters_;
@@ -266,7 +266,7 @@
     expect_description_ = "";
     expect_version_ = "";
     expect_additional_search_terms_.clear();
-    expect_icon_key_ = nullptr;
+    expect_icon_key_ = absl::nullopt;
     expect_last_launch_time_ = base::Time();
     expect_install_time_ = base::Time();
     expect_permissions_.clear();
@@ -283,7 +283,7 @@
     expect_handles_intents_ = apps::mojom::OptionalBool::kUnknown;
     expect_allow_uninstall_ = absl::nullopt;
     expect_has_badge_ = apps::mojom::OptionalBool::kUnknown;
-    expect_paused_ = apps::mojom::OptionalBool::kUnknown;
+    expect_paused_ = absl::nullopt;
     expect_intent_filters_.clear();
     expect_resize_locked_ = apps::mojom::OptionalBool::kUnknown;
     expect_window_mode_ = apps::mojom::WindowMode::kUnknown;
@@ -457,7 +457,7 @@
     if (state) {
       auto x = apps::mojom::IconKey::New(100, 0, 0);
       state->icon_key = x.Clone();
-      expect_icon_key_ = x.Clone();
+      expect_icon_key_ = std::move(*apps::ConvertMojomIconKeyToIconKey(x));
       expect_icon_key_changed_ = false;
       CheckExpects(u);
     }
@@ -465,7 +465,7 @@
     if (delta) {
       auto x = apps::mojom::IconKey::New(200, 0, 0);
       delta->icon_key = x.Clone();
-      expect_icon_key_ = x.Clone();
+      expect_icon_key_ = std::move(*apps::ConvertMojomIconKeyToIconKey(x));
       expect_icon_key_changed_ = true;
       CheckExpects(u);
     }
@@ -801,14 +801,14 @@
 
     if (state) {
       state->paused = apps::mojom::OptionalBool::kFalse;
-      expect_paused_ = apps::mojom::OptionalBool::kFalse;
+      expect_paused_ = false;
       expect_paused_changed_ = false;
       CheckExpects(u);
     }
 
     if (delta) {
       delta->paused = apps::mojom::OptionalBool::kTrue;
-      expect_paused_ = apps::mojom::OptionalBool::kTrue;
+      expect_paused_ = true;
       expect_paused_changed_ = true;
       CheckExpects(u);
     }
diff --git a/components/services/app_service/public/cpp/app_update_unittest.cc b/components/services/app_service/public/cpp/app_update_unittest.cc
index 83cce149..f82d308 100644
--- a/components/services/app_service/public/cpp/app_update_unittest.cc
+++ b/components/services/app_service/public/cpp/app_update_unittest.cc
@@ -191,12 +191,7 @@
     EXPECT_EQ(expect_additional_search_terms_changed_,
               u.AdditionalSearchTermsChanged());
 
-    if (expect_icon_key_.has_value()) {
-      ASSERT_TRUE(u.GetIconKey().has_value());
-      EXPECT_EQ(expect_icon_key_.value(), u.GetIconKey().value());
-    } else {
-      ASSERT_FALSE(u.GetIconKey().has_value());
-    }
+    EXPECT_EQ(expect_icon_key_, u.IconKey());
     EXPECT_EQ(expect_icon_key_changed_, u.IconKeyChanged());
 
     EXPECT_EQ(expect_last_launch_time_, u.LastLaunchTime());
@@ -247,7 +242,7 @@
     EXPECT_EQ(expect_has_badge_, u.GetHasBadge());
     EXPECT_EQ(expect_has_badge_changed_, u.HasBadgeChanged());
 
-    EXPECT_EQ(expect_paused_, u.GetPaused());
+    EXPECT_EQ(expect_paused_, u.Paused());
     EXPECT_EQ(expect_paused_changed_, u.PausedChanged());
 
     EXPECT_TRUE(IsEqual(expect_intent_filters_, u.GetIntentFilters()));
@@ -274,7 +269,7 @@
     AppUpdate u(state, delta, account_id_);
 
     EXPECT_EQ(app_type, u.GetAppType());
-    EXPECT_EQ(app_id, u.GetAppId());
+    EXPECT_EQ(app_id, u.AppId());
 
     expect_readiness_ = Readiness::kUnknown;
     expect_prior_readiness_ = Readiness::kUnknown;
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc
index ed5183b..beda10640 100644
--- a/components/viz/common/quads/render_pass_io.cc
+++ b/components/viz/common/quads/render_pass_io.cc
@@ -949,30 +949,6 @@
   return -1;
 }
 
-#define MAP_MATERIAL_TO_STRING(NAME) \
-  case DrawQuad::Material::NAME:     \
-    return #NAME;
-const char* DrawQuadMaterialToString(DrawQuad::Material material) {
-  switch (material) {
-    MAP_MATERIAL_TO_STRING(kInvalid)
-    MAP_MATERIAL_TO_STRING(kDebugBorder)
-    MAP_MATERIAL_TO_STRING(kPictureContent)
-    MAP_MATERIAL_TO_STRING(kCompositorRenderPass)
-    MAP_MATERIAL_TO_STRING(kSharedElement)
-    MAP_MATERIAL_TO_STRING(kSolidColor)
-    MAP_MATERIAL_TO_STRING(kStreamVideoContent)
-    MAP_MATERIAL_TO_STRING(kSurfaceContent)
-    MAP_MATERIAL_TO_STRING(kTextureContent)
-    MAP_MATERIAL_TO_STRING(kTiledContent)
-    MAP_MATERIAL_TO_STRING(kYuvVideoContent)
-    MAP_MATERIAL_TO_STRING(kVideoHole)
-    default:
-      NOTREACHED();
-      return "";
-  }
-}
-#undef MAP_MATERIAL_TO_STRING
-
 #define MAP_STRING_TO_MATERIAL(NAME) \
   if (str == #NAME)                  \
     return static_cast<int>(DrawQuad::Material::NAME);
@@ -1884,6 +1860,30 @@
 }
 #undef MAP_BLEND_MODE_TO_STRING
 
+#define MAP_MATERIAL_TO_STRING(NAME) \
+  case DrawQuad::Material::NAME:     \
+    return #NAME;
+const char* DrawQuadMaterialToString(DrawQuad::Material material) {
+  switch (material) {
+    MAP_MATERIAL_TO_STRING(kInvalid)
+    MAP_MATERIAL_TO_STRING(kDebugBorder)
+    MAP_MATERIAL_TO_STRING(kPictureContent)
+    MAP_MATERIAL_TO_STRING(kCompositorRenderPass)
+    MAP_MATERIAL_TO_STRING(kSharedElement)
+    MAP_MATERIAL_TO_STRING(kSolidColor)
+    MAP_MATERIAL_TO_STRING(kStreamVideoContent)
+    MAP_MATERIAL_TO_STRING(kSurfaceContent)
+    MAP_MATERIAL_TO_STRING(kTextureContent)
+    MAP_MATERIAL_TO_STRING(kTiledContent)
+    MAP_MATERIAL_TO_STRING(kYuvVideoContent)
+    MAP_MATERIAL_TO_STRING(kVideoHole)
+    default:
+      NOTREACHED();
+      return "";
+  }
+}
+#undef MAP_MATERIAL_TO_STRING
+
 base::Value CompositorRenderPassToDict(
     const CompositorRenderPass& render_pass) {
   base::Value dict(base::Value::Type::DICTIONARY);
diff --git a/components/viz/common/quads/render_pass_io.h b/components/viz/common/quads/render_pass_io.h
index 7fcfe09..e038dcaf 100644
--- a/components/viz/common/quads/render_pass_io.h
+++ b/components/viz/common/quads/render_pass_io.h
@@ -26,6 +26,8 @@
     CompositorRenderPassList* render_pass_list);
 
 VIZ_COMMON_EXPORT const char* BlendModeToString(SkBlendMode blend_mode);
+VIZ_COMMON_EXPORT const char* DrawQuadMaterialToString(
+    DrawQuad::Material material);
 
 // Represents the important information used for (de)serialization of
 // `CompositorFrame`s on a given surface.
diff --git a/components/viz/common/transition_utils.cc b/components/viz/common/transition_utils.cc
index 60eca51b..030a426 100644
--- a/components/viz/common/transition_utils.cc
+++ b/components/viz/common/transition_utils.cc
@@ -14,6 +14,8 @@
 #include "components/viz/common/quads/compositor_render_pass_draw_quad.h"
 #include "components/viz/common/quads/render_pass_io.h"
 #include "components/viz/common/quads/shared_element_draw_quad.h"
+#include "components/viz/common/quads/solid_color_draw_quad.h"
+#include "third_party/skia/include/core/SkColor.h"
 
 namespace viz {
 
@@ -35,6 +37,13 @@
   bool first_pass_visit = true;
 };
 
+std::string SkColorToRGBAString(SkColor color) {
+  std::ostringstream str;
+  str << "rgba(" << SkColorGetR(color) << ", " << SkColorGetG(color) << ", "
+      << SkColorGetB(color) << ", " << SkColorGetA(color) << ")";
+  return str.str();
+}
+
 std::unordered_set<uint64_t> ProcessStack(
     std::ostringstream& str,
     std::vector<StackFrame>& stack,
@@ -44,19 +53,26 @@
       str << " ";
   };
   auto write_render_pass = [&str](const CompositorRenderPass* pass) {
-    str << "(" << pass << ") render pass id=" << pass->id.GetUnsafeValue();
+    str << "(" << pass << ") render pass id=" << pass->id.GetUnsafeValue()
+        << " output_rect=" << pass->output_rect.ToString();
     if (pass->shared_element_resource_id.IsValid())
       str << " " << pass->shared_element_resource_id.ToString();
     str << "\n";
   };
   auto write_sqs = [&str](const SharedQuadState* sqs) {
-    str << "(" << sqs << ") switched to sqs with opacity " << sqs->opacity
-        << " and blend mode " << BlendModeToString(sqs->blend_mode) << "\n";
+    str << "(" << sqs << ") switched to sqs with opacity=" << sqs->opacity
+        << ", blend_mode=" << BlendModeToString(sqs->blend_mode)
+        << " quad_layer_rect=" << sqs->quad_layer_rect.ToString() << "\n";
   };
   auto write_shared_element_quad = [&str](const SharedElementDrawQuad* quad) {
     str << "(" << quad << ") SharedElementDrawQuad "
         << quad->resource_id.ToString() << "\n";
   };
+  auto write_solid_color_quad = [&str](const SolidColorDrawQuad* quad) {
+    str << "(" << quad
+        << ") SolidColorDrawQuad color=" << SkColorToRGBAString(quad->color)
+        << "\n";
+  };
   auto write_compositor_render_pass_quad =
       [&str](const CompositorRenderPassDrawQuad* quad) {
         str << "(" << quad << ") CompositorRenderPassDrawQuad\n";
@@ -116,8 +132,14 @@
         write_shared_element_quad(quad);
         break;
       }
+      case DrawQuad::Material::kSolidColor: {
+        auto* quad = SolidColorDrawQuad::MaterialCast((*frame.quad_iter));
+        write_solid_color_quad(quad);
+        break;
+      }
       default:
-        str << "(other quad type)\n";
+        str << "DrawQuad, material: "
+            << DrawQuadMaterialToString((*frame.quad_iter)->material) << "\n";
         break;
     }
   }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 68acc3a8..9f8cb8c6 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -104,6 +104,7 @@
     "//content:content_resources",
     "//content:dev_ui_content_resources",
     "//content/app/resources",
+    "//content/browser/attribution_reporting:attribution_reporting_proto",
     "//content/browser/attribution_reporting:mojo_bindings",
     "//content/browser/background_fetch:background_fetch_proto",
     "//content/browser/background_sync:background_sync_proto",
@@ -381,6 +382,8 @@
     "aggregation_service/public_key_parsing_utils.h",
     "attribution_reporting/aggregatable_attribution.cc",
     "attribution_reporting/aggregatable_attribution.h",
+    "attribution_reporting/attribution_aggregatable_sources.cc",
+    "attribution_reporting/attribution_aggregatable_sources.h",
     "attribution_reporting/attribution_cookie_checker.h",
     "attribution_reporting/attribution_cookie_checker_impl.cc",
     "attribution_reporting/attribution_cookie_checker_impl.h",
diff --git a/content/browser/attribution_reporting/BUILD.gn b/content/browser/attribution_reporting/BUILD.gn
index 7cfc9ef..315596b 100644
--- a/content/browser/attribution_reporting/BUILD.gn
+++ b/content/browser/attribution_reporting/BUILD.gn
@@ -3,6 +3,11 @@
 # found in the LICENSE file.
 
 import("//mojo/public/tools/bindings/mojom.gni")
+import("//third_party/protobuf/proto_library.gni")
+
+proto_library("attribution_reporting_proto") {
+  sources = [ "attribution_reporting.proto" ]
+}
 
 mojom("mojo_bindings") {
   sources = [ "attribution_internals.mojom" ]
@@ -27,6 +32,7 @@
         "common_source_info.h",
       ]
       traits_sources = [ "attribution_internals_mojom_traits.cc" ]
+      traits_deps = [":attribution_reporting_proto"]
     },
   ]
 }
diff --git a/content/browser/attribution_reporting/attribution_aggregatable_sources.cc b/content/browser/attribution_reporting/attribution_aggregatable_sources.cc
new file mode 100644
index 0000000..d0ceb71
--- /dev/null
+++ b/content/browser/attribution_reporting/attribution_aggregatable_sources.cc
@@ -0,0 +1,52 @@
+// Copyright 2022 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 "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
+
+#include <utility>
+
+#include "base/ranges/algorithm.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/blink/public/common/attribution_reporting/constants.h"
+
+namespace content {
+
+// static
+absl::optional<AttributionAggregatableSources>
+AttributionAggregatableSources::Create(
+    proto::AttributionAggregatableSources proto) {
+  bool is_valid =
+      proto.sources().size() <=
+          blink::kMaxAttributionAggregatableKeysPerSource &&
+      base::ranges::all_of(proto.sources(), [](const auto& source) {
+        return source.first.size() <=
+                   blink::kMaxBytesPerAttributionAggregatableKeyId &&
+               source.second.has_high_bits() && source.second.has_low_bits();
+      });
+  return is_valid ? absl::make_optional(
+                        AttributionAggregatableSources(std::move(proto)))
+                  : absl::nullopt;
+}
+
+AttributionAggregatableSources::AttributionAggregatableSources(
+    proto::AttributionAggregatableSources proto)
+    : proto_(std::move(proto)) {}
+
+AttributionAggregatableSources::AttributionAggregatableSources() = default;
+
+AttributionAggregatableSources::~AttributionAggregatableSources() = default;
+
+AttributionAggregatableSources::AttributionAggregatableSources(
+    const AttributionAggregatableSources&) = default;
+
+AttributionAggregatableSources::AttributionAggregatableSources(
+    AttributionAggregatableSources&&) = default;
+
+AttributionAggregatableSources& AttributionAggregatableSources::operator=(
+    const AttributionAggregatableSources&) = default;
+
+AttributionAggregatableSources& AttributionAggregatableSources::operator=(
+    AttributionAggregatableSources&&) = default;
+
+}  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_aggregatable_sources.h b/content/browser/attribution_reporting/attribution_aggregatable_sources.h
new file mode 100644
index 0000000..0c1005e
--- /dev/null
+++ b/content/browser/attribution_reporting/attribution_aggregatable_sources.h
@@ -0,0 +1,42 @@
+// Copyright 2022 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 CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_AGGREGATABLE_SOURCES_H_
+#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_AGGREGATABLE_SOURCES_H_
+
+#include "content/browser/attribution_reporting/attribution_reporting.pb.h"
+#include "content/common/content_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace content {
+
+// This is a wrapper of `proto::AttributionAggregatableSources`.
+class CONTENT_EXPORT AttributionAggregatableSources {
+ public:
+  // Returns `absl::nullopt` if `proto` is invalid.
+  static absl::optional<AttributionAggregatableSources> Create(
+      proto::AttributionAggregatableSources proto);
+
+  AttributionAggregatableSources();
+  ~AttributionAggregatableSources();
+
+  AttributionAggregatableSources(const AttributionAggregatableSources&);
+  AttributionAggregatableSources(AttributionAggregatableSources&&);
+
+  AttributionAggregatableSources& operator=(
+      const AttributionAggregatableSources&);
+  AttributionAggregatableSources& operator=(AttributionAggregatableSources&&);
+
+  const proto::AttributionAggregatableSources& proto() const { return proto_; }
+
+ private:
+  explicit AttributionAggregatableSources(
+      proto::AttributionAggregatableSources proto);
+
+  proto::AttributionAggregatableSources proto_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_AGGREGATABLE_SOURCES_H_
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
index cc2a2de..c389c6e 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -9,14 +9,17 @@
 #include "base/bind.h"
 #include "base/check.h"
 #include "base/time/time.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_host_utils.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
+#include "content/browser/attribution_reporting/attribution_reporting.pb.h"
 #include "content/browser/attribution_reporting/common_source_info.h"
 #include "content/browser/attribution_reporting/storable_source.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/content_client.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/attribution_reporting/constants.h"
 #include "url/origin.h"
 
@@ -44,6 +47,22 @@
   return true;
 }
 
+proto::AttributionAggregatableSources ConvertToProto(
+    const blink::mojom::AttributionAggregatableSources& aggregatable_sources) {
+  proto::AttributionAggregatableSources result;
+
+  for (const auto& [key_id, key_ptr] : aggregatable_sources.sources) {
+    DCHECK(key_ptr);
+    proto::AttributionAggregatableKey key;
+    key.set_high_bits(key_ptr->high_bits);
+    key.set_low_bits(key_ptr->low_bits);
+
+    (*result.mutable_sources())[key_id] = std::move(key);
+  }
+
+  return result;
+}
+
 }  // namespace
 
 AttributionDataHostManagerImpl::AttributionDataHostManagerImpl(
@@ -107,6 +126,12 @@
   if (!IsFilterDataValid(*data->filter_data))
     return;
 
+  absl::optional<AttributionAggregatableSources> aggregatable_sources =
+      AttributionAggregatableSources::Create(
+          ConvertToProto(*data->aggregatable_sources));
+  if (!aggregatable_sources.has_value())
+    return;
+
   StorableSource storable_source(CommonSourceInfo(
       data->source_event_id, context.context_origin, data->destination,
       reporting_origin, source_time,
@@ -114,7 +139,8 @@
                                       context.source_type),
       context.source_type, data->priority,
       data->debug_key ? absl::make_optional(data->debug_key->value)
-                      : absl::nullopt));
+                      : absl::nullopt,
+      std::move(*aggregatable_sources)));
 
   attribution_manager_->HandleSource(std::move(storable_source));
 }
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
index eb4dd2d5..ec34d37 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
@@ -4,9 +4,14 @@
 
 #include "content/browser/attribution_reporting/attribution_data_host_manager_impl.h"
 
+#include <stddef.h>
+
 #include <memory>
+#include <string>
 #include <utility>
 
+#include "base/strings/string_number_conversions.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
 #include "content/public/browser/browser_context.h"
@@ -17,6 +22,8 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/attribution_reporting/constants.h"
+#include "third_party/blink/public/mojom/conversions/attribution_data_host.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -63,7 +70,14 @@
                   SourceTypeIs(CommonSourceInfo::SourceType::kEvent),
                   SourceEventIdIs(10), ConversionOriginIs(destination_origin),
                   ImpressionOriginIs(page_origin), SourcePriorityIs(20),
-                  SourceDebugKeyIs(789))));
+                  SourceDebugKeyIs(789),
+                  AggregatableSourcesAre(AttributionAggregatableSources::Create(
+                      AggregatableSourcesProtoBuilder()
+                          .AddKey("key", AggregatableKeyProtoBuilder()
+                                             .SetHighBits(5)
+                                             .SetLowBits(345)
+                                             .Build())
+                          .Build())))));
 
   mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote;
   data_host_manager_.RegisterDataHost(
@@ -76,6 +90,12 @@
   source_data->priority = 20;
   source_data->debug_key = blink::mojom::AttributionDebugKey::New(789);
   source_data->filter_data = blink::mojom::AttributionFilterData::New();
+  source_data->aggregatable_sources =
+      AggregatableSourcesMojoBuilder()
+          .AddKey(/*key_id=*/"key",
+                  blink::mojom::AttributionAggregatableKey::New(
+                      /*high_bits=*/5, /*low_bits=*/345))
+          .Build();
   data_host_remote->SourceDataAvailable(std::move(source_data));
   data_host_remote.FlushForTesting();
 }
@@ -130,6 +150,8 @@
     source_data->reporting_origin =
         url::Origin::Create(GURL(test_case.reporting_origin));
     source_data->filter_data = blink::mojom::AttributionFilterData::New();
+    source_data->aggregatable_sources =
+        blink::mojom::AttributionAggregatableSources::New();
     data_host_remote->SourceDataAvailable(std::move(source_data));
     data_host_remote.FlushForTesting();
 
@@ -155,6 +177,8 @@
         url::Origin::Create(GURL("https://reporter.example"));
     source_data->filter_data =
         blink::mojom::AttributionFilterData::New(test_case.AsMap());
+    source_data->aggregatable_sources =
+        blink::mojom::AttributionAggregatableSources::New();
     data_host_remote->SourceDataAvailable(std::move(source_data));
     data_host_remote.FlushForTesting();
 
@@ -188,6 +212,8 @@
   source_data->destination = destination_origin;
   source_data->reporting_origin = reporting_origin;
   source_data->filter_data = blink::mojom::AttributionFilterData::New();
+  source_data->aggregatable_sources =
+      blink::mojom::AttributionAggregatableSources::New();
   data_host_remote->SourceDataAvailable(std::move(source_data));
   data_host_remote.FlushForTesting();
 }
@@ -220,6 +246,8 @@
   source_data->destination = destination_origin;
   source_data->reporting_origin = reporting_origin;
   source_data->filter_data = blink::mojom::AttributionFilterData::New();
+  source_data->aggregatable_sources =
+      blink::mojom::AttributionAggregatableSources::New();
   data_host_remote->SourceDataAvailable(source_data.Clone());
   data_host_remote.FlushForTesting();
 
@@ -240,4 +268,60 @@
   data_host_remote.FlushForTesting();
 }
 
+TEST_F(AttributionDataHostManagerImplTest,
+       SourceDataHost_AggregatableSourcesSizeCheckPerformed) {
+  struct AggregatableSourcesSizeTestCase {
+    const char* description;
+    bool valid;
+    size_t key_count;
+    size_t key_size;
+
+    blink::mojom::AttributionAggregatableSourcesPtr GetAggregatableSources()
+        const {
+      AggregatableSourcesMojoBuilder builder;
+      for (size_t i = 0u; i < key_count; ++i) {
+        std::string key(key_size, 'A' + i);
+        builder.AddKey(std::move(key),
+                       blink::mojom::AttributionAggregatableKey::New(
+                           /*high_bits=*/i, /*low_bits=*/i));
+      }
+      return builder.Build();
+    }
+  };
+
+  const AggregatableSourcesSizeTestCase kTestCases[] = {
+      {"empty", true, 0, 0},
+      {"max_keys", true, blink::kMaxAttributionAggregatableKeysPerSource, 1},
+      {"too_many_keys", false,
+       blink::kMaxAttributionAggregatableKeysPerSource + 1, 1},
+      {"max_key_size", true, 1,
+       blink::kMaxBytesPerAttributionAggregatableKeyId},
+      {"excessive_key_size", false, 1,
+       blink::kMaxBytesPerAttributionAggregatableKeyId + 1},
+  };
+
+  for (auto& test_case : kTestCases) {
+    SCOPED_TRACE(
+        test_case.description);  // Since EXPECT_CALL doesn't support <<
+    EXPECT_CALL(mock_manager_, HandleSource).Times(test_case.valid);
+
+    mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote;
+    data_host_manager_.RegisterDataHost(
+        data_host_remote.BindNewPipeAndPassReceiver(),
+        url::Origin::Create(GURL("https://page.example")));
+
+    auto source_data = blink::mojom::AttributionSourceData::New();
+    source_data->destination =
+        url::Origin::Create(GURL("https://trigger.example"));
+    source_data->reporting_origin =
+        url::Origin::Create(GURL("https://reporter.example"));
+    source_data->filter_data = blink::mojom::AttributionFilterData::New();
+    source_data->aggregatable_sources = test_case.GetAggregatableSources();
+    data_host_remote->SourceDataAvailable(std::move(source_data));
+    data_host_remote.FlushForTesting();
+
+    Mock::VerifyAndClear(&mock_manager_);
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_host_utils.cc b/content/browser/attribution_reporting/attribution_host_utils.cc
index 61862ce..d98723b 100644
--- a/content/browser/attribution_reporting/attribution_host_utils.cc
+++ b/content/browser/attribution_reporting/attribution_host_utils.cc
@@ -8,6 +8,7 @@
 
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/attribution_reporting/common_source_info.h"
 #include "content/browser/attribution_reporting/storable_source.h"
@@ -63,7 +64,8 @@
           impression.conversion_destination, reporting_origin, impression_time,
           CommonSourceInfo::GetExpiryTime(impression.expiry, impression_time,
                                           source_type),
-          source_type, impression.priority, /*debug_key=*/absl::nullopt));
+          source_type, impression.priority, /*debug_key=*/absl::nullopt,
+          AttributionAggregatableSources()));
 
   // TODO(apaseltiner): It would be nice to be able to report an issue in
   // DevTools in the event that a debug key is present but the corresponding
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
index 2afea6f..04c8929 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -1216,8 +1216,15 @@
   EXPECT_THAT(report_sender_->calls(), SizeIs(1));
 }
 
+#if defined(THREAD_SANITIZER)
+#define MAYBE_OnlineConnectionTypeChanges_ReportTimesNotAdjusted \
+  DISABLED_OnlineConnectionTypeChanges_ReportTimesNotAdjusted
+#else
+#define MAYBE_OnlineConnectionTypeChanges_ReportTimesNotAdjusted \
+  OnlineConnectionTypeChanges_ReportTimesNotAdjusted
+#endif
 TEST_F(AttributionManagerImplTest,
-       OnlineConnectionTypeChanges_ReportTimesNotAdjusted) {
+       MAYBE_OnlineConnectionTypeChanges_ReportTimesNotAdjusted) {
   storage_delegate_->set_offline_report_delay_config(
       AttributionStorageDelegate::OfflineReportDelayConfig{
           .min = base::Minutes(1),
diff --git a/content/browser/attribution_reporting/attribution_reporting.proto b/content/browser/attribution_reporting/attribution_reporting.proto
new file mode 100644
index 0000000..b5ff336
--- /dev/null
+++ b/content/browser/attribution_reporting/attribution_reporting.proto
@@ -0,0 +1,20 @@
+// Copyright 2022 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.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package content.proto;
+
+// Proto equivalent of `blink::mojom::AttributionAggregatableKey`.
+message AttributionAggregatableKey {
+  optional uint64 high_bits = 1;
+  optional uint64 low_bits = 2;
+}
+
+// Proto equivalent of `blink::mojom::AttributionAggregatableSources`.
+message AttributionAggregatableSources {
+  map<string, AttributionAggregatableKey> sources = 1;
+}
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
index 93ad1cf..644a1e8 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -141,11 +141,14 @@
 }
 
 base::GUID AttributionStorageDelegateImpl::NewReportID() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return base::GUID::GenerateRandomV4();
 }
 
 absl::optional<AttributionStorageDelegate::OfflineReportDelayConfig>
 AttributionStorageDelegateImpl::GetOfflineReportDelayConfig() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (noise_mode_ == AttributionNoiseMode::kDefault &&
       delay_mode_ == AttributionDelayMode::kDefault) {
     // Add uniform random noise in the range of [0, 1 minutes] to the report
@@ -165,6 +168,8 @@
 
 void AttributionStorageDelegateImpl::ShuffleReports(
     std::vector<AttributionReport>& reports) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   switch (noise_mode_) {
     case AttributionNoiseMode::kDefault:
       rng_->RandomShuffle(reports);
@@ -176,6 +181,8 @@
 
 double AttributionStorageDelegateImpl::GetRandomizedResponseRate(
     CommonSourceInfo::SourceType source_type) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   switch (source_type) {
     case CommonSourceInfo::SourceType::kNavigation:
       return randomized_response_rates_.navigation;
@@ -272,6 +279,8 @@
 uint64_t AttributionStorageDelegateImpl::SanitizeTriggerData(
     uint64_t trigger_data,
     CommonSourceInfo::SourceType source_type) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   const uint64_t cardinality = TriggerDataCardinality(source_type);
   return trigger_data % cardinality;
 }
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index 49846f7f..0b18449 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -25,9 +25,11 @@
 #include "base/ranges/algorithm.h"
 #include "base/time/time.h"
 #include "content/browser/attribution_reporting/aggregatable_attribution.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_info.h"
 #include "content/browser/attribution_reporting/attribution_observer_types.h"
 #include "content/browser/attribution_reporting/attribution_report.h"
+#include "content/browser/attribution_reporting/attribution_reporting.pb.h"
 #include "content/browser/attribution_reporting/attribution_storage_delegate.h"
 #include "content/browser/attribution_reporting/attribution_storage_sql_migrations.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
@@ -165,11 +167,15 @@
 // Version 26 - 2022/02/23 - https://crrev.com/c/3472530
 //
 // Version 26 adds the aggregatable_report_metadata.debug_key column.
-const int AttributionStorageSql::kCurrentVersionNumber = 26;
+//
+// Version 27 - 2022/02/23 - https://crrev.com/c/3427362
+//
+// Version 27 adds the impressions.aggregatable_sources column.
+const int AttributionStorageSql::kCurrentVersionNumber = 27;
 
 // Earliest version which can use a |kCurrentVersionNumber| database
 // without failing.
-const int AttributionStorageSql::kCompatibleVersionNumber = 26;
+const int AttributionStorageSql::kCompatibleVersionNumber = 27;
 
 // Latest version of the database that cannot be upgraded to
 // |kCurrentVersionNumber| without razing the database.
@@ -198,9 +204,11 @@
 //
 // Version 25 was deprecated by https://crrev.com/c/3472530.
 //
-// Note that Versions 15-25 were introduced during the transitional state of
+// Version 26 was deprecated by https://crrev.com/c/3427362.
+//
+// Note that Versions 15-26 were introduced during the transitional state of
 // the Attribution Reporting API and can be removed when done.
-const int AttributionStorageSql::kDeprecatedVersionNumber = 25;
+const int AttributionStorageSql::kDeprecatedVersionNumber = 26;
 
 namespace {
 
@@ -300,6 +308,16 @@
                    DeserializeUint64(statement.ColumnInt64(col)));
 }
 
+absl::optional<AttributionAggregatableSources> ParseAggregatableSources(
+    const std::string& str) {
+  proto::AttributionAggregatableSources aggregatable_sources;
+  if (!aggregatable_sources.ParseFromString(str))
+    return absl::nullopt;
+
+  return AttributionAggregatableSources::Create(
+      std::move(aggregatable_sources));
+}
+
 struct StoredSourceData {
   StoredSource source;
   int num_conversions;
@@ -310,7 +328,7 @@
 // expected ordering of columns used for the input to this function.
 absl::optional<StoredSourceData> ReadSourceFromStatement(
     sql::Statement& statement) {
-  DCHECK_EQ(statement.ColumnCount(), 13);
+  DCHECK_EQ(statement.ColumnCount(), 14);
 
   StoredSource::Id source_id(statement.ColumnInt64(0));
   uint64_t source_event_id = DeserializeUint64(statement.ColumnInt64(1));
@@ -327,9 +345,12 @@
   absl::optional<uint64_t> debug_key = ColumnUint64OrNull(statement, 10);
   int num_conversions = statement.ColumnInt(11);
   int64_t aggregatable_budget_consumed = statement.ColumnInt64(12);
+  absl::optional<AttributionAggregatableSources> aggregatable_sources =
+      ParseAggregatableSources(statement.ColumnString(13));
 
   if (!source_type.has_value() || !attribution_logic.has_value() ||
-      num_conversions < 0 || aggregatable_budget_consumed < 0) {
+      num_conversions < 0 || aggregatable_budget_consumed < 0 ||
+      !aggregatable_sources.has_value()) {
     return absl::nullopt;
   }
 
@@ -338,7 +359,8 @@
           CommonSourceInfo(source_event_id, std::move(impression_origin),
                            std::move(conversion_origin),
                            std::move(reporting_origin), impression_time,
-                           expiry_time, *source_type, priority, debug_key),
+                           expiry_time, *source_type, priority, debug_key,
+                           std::move(*aggregatable_sources)),
           *attribution_logic, source_id),
       .num_conversions = num_conversions,
       .aggregatable_budget_consumed = aggregatable_budget_consumed};
@@ -351,7 +373,7 @@
       "SELECT impression_id,impression_data,impression_origin,"
       "conversion_origin,reporting_origin,impression_time,expiry_time,"
       "source_type,attributed_truthfully,priority,debug_key,"
-      "num_conversions,aggregatable_budget_consumed "
+      "num_conversions,aggregatable_budget_consumed,aggregatable_sources "
       "FROM impressions "
       "WHERE impression_id = ?";
   sql::Statement statement(
@@ -417,7 +439,7 @@
         "SELECT impression_id,impression_data,impression_origin,"
         "conversion_origin,reporting_origin,impression_time,expiry_time,"
         "source_type,attributed_truthfully,priority,debug_key,"
-        "num_conversions,aggregatable_budget_consumed "
+        "num_conversions,aggregatable_budget_consumed,aggregatable_sources "
         "FROM impressions "
         DCHECK_SQL_INDEXED_BY("conversion_destination_idx")
         "WHERE conversion_destination = ? AND reporting_origin = ? AND "
@@ -562,8 +584,9 @@
       "conversion_destination,"
       "reporting_origin,impression_time,expiry_time,source_type,"
       "attributed_truthfully,priority,impression_site,"
-      "num_conversions,active,debug_key,aggregatable_budget_consumed)"
-      "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0)";
+      "num_conversions,active,debug_key,aggregatable_budget_consumed,"
+      "aggregatable_sources)"
+      "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?)";
   sql::Statement statement(
       db_->GetCachedStatement(SQL_FROM_HERE, kInsertImpressionSql));
   statement.BindInt64(0, SerializeUint64(common_info.source_event_id()));
@@ -582,6 +605,9 @@
 
   BindUint64OrNull(statement, 13, common_info.debug_key());
 
+  statement.BindBlob(
+      14, common_info.aggregatable_sources().proto().SerializeAsString());
+
   if (!statement.Run())
     return StoreSourceResult(StorableSource::Result::kInternalError);
 
@@ -1030,7 +1056,7 @@
 // ordering of columns used for the input to this function.
 absl::optional<AttributionReport>
 AttributionStorageSql::ReadReportFromStatement(sql::Statement& statement) {
-  DCHECK_EQ(statement.ColumnCount(), 19);
+  DCHECK_EQ(statement.ColumnCount(), 20);
 
   uint64_t trigger_data = DeserializeUint64(statement.ColumnInt64(0));
   base::Time trigger_time = statement.ColumnTime(1);
@@ -1055,6 +1081,8 @@
   absl::optional<uint64_t> source_debug_key = ColumnUint64OrNull(statement, 17);
   absl::optional<uint64_t> trigger_debug_key =
       ColumnUint64OrNull(statement, 18);
+  absl::optional<AttributionAggregatableSources> aggregatable_sources =
+      ParseAggregatableSources(statement.ColumnString(19));
 
   // Ensure origins are valid before continuing. This could happen if there is
   // database corruption.
@@ -1065,7 +1093,7 @@
   if (impression_origin.opaque() || conversion_origin.opaque() ||
       reporting_origin.opaque() || !source_type.has_value() ||
       !attribution_logic.has_value() || failed_send_attempts < 0 ||
-      !external_report_id.is_valid()) {
+      !external_report_id.is_valid() || !aggregatable_sources.has_value()) {
     return absl::nullopt;
   }
 
@@ -1076,7 +1104,7 @@
                        std::move(conversion_origin),
                        std::move(reporting_origin), impression_time,
                        expiry_time, *source_type, attribution_source_priority,
-                       source_debug_key),
+                       source_debug_key, std::move(*aggregatable_sources)),
       *attribution_logic, source_id);
 
   AttributionReport report(
@@ -1138,7 +1166,7 @@
       "I.impression_origin,I.conversion_origin,I.reporting_origin,"
       "I.impression_data,I.impression_time,I.expiry_time,I.impression_id,"
       "I.source_type,I.priority,I.attributed_truthfully,I.debug_key,"
-      "C.debug_key "
+      "C.debug_key,I.aggregatable_sources "
       "FROM conversions C JOIN impressions I ON "
       "C.impression_id = I.impression_id WHERE C.report_time <= ? "
       "LIMIT ?";
@@ -1221,7 +1249,7 @@
       "I.impression_origin,I.conversion_origin,I.reporting_origin,"
       "I.impression_data,I.impression_time,I.expiry_time,I.impression_id,"
       "I.source_type,I.priority,I.attributed_truthfully,I.debug_key,"
-      "C.debug_key "
+      "C.debug_key,I.aggregatable_sources "
       "FROM conversions C JOIN impressions I ON "
       "C.impression_id = I.impression_id WHERE C.conversion_id = ?";
   sql::Statement statement(
@@ -1681,7 +1709,7 @@
       "SELECT impression_id,impression_data,impression_origin,"
       "conversion_origin,reporting_origin,impression_time,expiry_time,"
       "source_type,attributed_truthfully,priority,debug_key,"
-      "num_conversions,aggregatable_budget_consumed "
+      "num_conversions,aggregatable_budget_consumed,aggregatable_sources "
       "FROM impressions "
       "WHERE active = 1 and expiry_time > ? "
       "LIMIT ?";
@@ -1887,7 +1915,8 @@
       "priority INTEGER NOT NULL,"
       "impression_site TEXT NOT NULL,"
       "debug_key INTEGER,"
-      "aggregatable_budget_consumed INTEGER NOT NULL)";
+      "aggregatable_budget_consumed INTEGER NOT NULL,"
+      "aggregatable_sources BLOB NOT NULL)";
   if (!db_->Execute(kImpressionTableSql))
     return false;
 
@@ -2392,7 +2421,7 @@
       "A.trigger_time,I.impression_origin,I.conversion_origin,"
       "I.reporting_origin,I.impression_data,I.impression_time,I.expiry_time,"
       "I.impression_id,I.source_type,I.priority,I.attributed_truthfully,"
-      "I.debug_key,A.debug_key "
+      "I.debug_key,A.debug_key,I.aggregatable_sources "
       "FROM aggregatable_contributions AS C "
       DCHECK_SQL_INDEXED_BY("contribution_report_time_idx")
       "JOIN aggregatable_report_metadata AS A "
@@ -2438,6 +2467,8 @@
         ColumnUint64OrNull(statement, 18);
     absl::optional<uint64_t> trigger_debug_key =
         ColumnUint64OrNull(statement, 19);
+    absl::optional<AttributionAggregatableSources> aggregatable_sources =
+        ParseAggregatableSources(statement.ColumnString(20));
 
     // Ensure origins are valid before continuing. This could happen if there is
     // database corruption.
@@ -2445,7 +2476,7 @@
         !external_report_id.is_valid() || impression_origin.opaque() ||
         conversion_origin.opaque() || reporting_origin.opaque() ||
         !source_type.has_value() || !attribution_logic.has_value() ||
-        failed_send_attempts < 0) {
+        failed_send_attempts < 0 || !aggregatable_sources.has_value()) {
       continue;
     }
 
@@ -2456,14 +2487,14 @@
                          std::move(conversion_origin),
                          std::move(reporting_origin), impression_time,
                          expiry_time, *source_type, attribution_source_priority,
-                         source_debug_key),
+                         source_debug_key, std::move(*aggregatable_sources)),
         *attribution_logic, source_id);
 
     AttributionReport report(
         AttributionInfo(std::move(source), trigger_time, trigger_debug_key),
         report_time, std::move(external_report_id),
         AttributionReport::AggregatableContributionData(
-            AggregatableHistogramContribution(std::move(bucket_key),
+            AggregatableHistogramContribution(bucket_key,
                                               static_cast<uint32_t>(value)),
             report_id));
     report.set_failed_send_attempts(failed_send_attempts);
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc
index 0839afa..ea0b665 100644
--- a/content/browser/attribution_reporting/attribution_storage_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -24,8 +24,10 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/browser/attribution_reporting/aggregatable_attribution.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_observer_types.h"
 #include "content/browser/attribution_reporting/attribution_report.h"
+#include "content/browser/attribution_reporting/attribution_reporting.pb.h"
 #include "content/browser/attribution_reporting/attribution_storage_sql.h"
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
@@ -1771,6 +1773,23 @@
                                 TriggerDebugKeyIs(33))));
 }
 
+TEST_F(AttributionStorageTest, AttributionAggregatableSources_RoundTrips) {
+  proto::AttributionAggregatableSources proto =
+      AggregatableSourcesProtoBuilder()
+          .AddKey("key", AggregatableKeyProtoBuilder()
+                             .SetHighBits(5)
+                             .SetLowBits(345)
+                             .Build())
+          .Build();
+  absl::optional<AttributionAggregatableSources> aggregatable_sources =
+      AttributionAggregatableSources::Create(std::move(proto));
+  EXPECT_TRUE(aggregatable_sources.has_value());
+  storage()->StoreSource(
+      SourceBuilder().SetAggregatableSources(*aggregatable_sources).Build());
+  EXPECT_THAT(storage()->GetActiveSources(),
+              ElementsAre(AggregatableSourcesAre(*aggregatable_sources)));
+}
+
 // This is tested more thoroughly by the `RateLimitTable` unit tests. Here just
 // ensure that the rate limits are consulted at all.
 TEST_F(AttributionStorageTest, MaxReportingOriginsPerSource) {
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc
index e9c1a86..b93905e 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -324,12 +324,18 @@
   return *this;
 }
 
+SourceBuilder& SourceBuilder::SetAggregatableSources(
+    AttributionAggregatableSources aggregatable_sources) {
+  aggregatable_sources_ = std::move(aggregatable_sources);
+  return *this;
+}
+
 CommonSourceInfo SourceBuilder::BuildCommonInfo() const {
-  return CommonSourceInfo(source_event_id_, impression_origin_,
-                          conversion_origin_, reporting_origin_,
-                          impression_time_,
-                          /*expiry_time=*/impression_time_ + expiry_,
-                          source_type_, priority_, debug_key_);
+  return CommonSourceInfo(
+      source_event_id_, impression_origin_, conversion_origin_,
+      reporting_origin_, impression_time_,
+      /*expiry_time=*/impression_time_ + expiry_, source_type_, priority_,
+      debug_key_, aggregatable_sources_);
 }
 
 StorableSource SourceBuilder::Build() const {
@@ -464,6 +470,59 @@
                                         randomized_trigger_rate_, report_id_));
 }
 
+AggregatableKeyProtoBuilder::AggregatableKeyProtoBuilder() = default;
+
+AggregatableKeyProtoBuilder::~AggregatableKeyProtoBuilder() = default;
+
+AggregatableKeyProtoBuilder& AggregatableKeyProtoBuilder::SetHighBits(
+    uint64_t high_bits) {
+  key_.set_high_bits(high_bits);
+  return *this;
+}
+
+AggregatableKeyProtoBuilder& AggregatableKeyProtoBuilder::SetLowBits(
+    uint64_t low_bits) {
+  key_.set_low_bits(low_bits);
+  return *this;
+}
+
+proto::AttributionAggregatableKey AggregatableKeyProtoBuilder::Build() const {
+  return key_;
+}
+
+AggregatableSourcesProtoBuilder::AggregatableSourcesProtoBuilder() = default;
+
+AggregatableSourcesProtoBuilder::~AggregatableSourcesProtoBuilder() = default;
+
+AggregatableSourcesProtoBuilder& AggregatableSourcesProtoBuilder::AddKey(
+    std::string key_id,
+    proto::AttributionAggregatableKey key) {
+  (*aggregatable_sources_.mutable_sources())[std::move(key_id)] =
+      std::move(key);
+  return *this;
+}
+
+proto::AttributionAggregatableSources AggregatableSourcesProtoBuilder::Build()
+    const {
+  return aggregatable_sources_;
+}
+
+AggregatableSourcesMojoBuilder::AggregatableSourcesMojoBuilder() = default;
+
+AggregatableSourcesMojoBuilder::~AggregatableSourcesMojoBuilder() = default;
+
+AggregatableSourcesMojoBuilder& AggregatableSourcesMojoBuilder::AddKey(
+    std::string key_id,
+    blink::mojom::AttributionAggregatableKeyPtr key) {
+  sources_.sources.emplace(std::move(key_id), std::move(key));
+  return *this;
+}
+
+blink::mojom::AttributionAggregatableSourcesPtr
+AggregatableSourcesMojoBuilder::Build() const {
+  return sources_.Clone();
+}
+
 bool operator==(const AttributionTrigger& a, const AttributionTrigger& b) {
   const auto tie = [](const AttributionTrigger& t) {
     return std::make_tuple(t.trigger_data(), t.conversion_destination(),
@@ -475,11 +534,11 @@
 
 bool operator==(const CommonSourceInfo& a, const CommonSourceInfo& b) {
   const auto tie = [](const CommonSourceInfo& source) {
-    return std::make_tuple(source.source_event_id(), source.impression_origin(),
-                           source.conversion_origin(),
-                           source.reporting_origin(), source.impression_time(),
-                           source.expiry_time(), source.source_type(),
-                           source.priority(), source.debug_key());
+    return std::make_tuple(
+        source.source_event_id(), source.impression_origin(),
+        source.conversion_origin(), source.reporting_origin(),
+        source.impression_time(), source.expiry_time(), source.source_type(),
+        source.priority(), source.debug_key(), source.aggregatable_sources());
   };
   return tie(a) == tie(b);
 }
@@ -710,6 +769,7 @@
              << ",priority=" << source.priority() << ",debug_key="
              << (source.debug_key() ? base::NumberToString(*source.debug_key())
                                     : "null")
+             << ",aggregatable_sources=" << source.aggregatable_sources()
              << "}";
 }
 
@@ -867,6 +927,65 @@
   return map;
 }
 
+namespace proto {
+
+bool operator==(const AttributionAggregatableKey& a,
+                const AttributionAggregatableKey& b) {
+  auto tie = [](const AttributionAggregatableKey& key) {
+    return std::make_tuple(key.has_high_bits(), key.high_bits(),
+                           key.has_low_bits(), key.low_bits());
+  };
+  return tie(a) == tie(b);
+}
+
+bool operator==(const AttributionAggregatableSources& a,
+                const AttributionAggregatableSources& b) {
+  if (a.sources().size() != b.sources().size())
+    return false;
+
+  return base::ranges::all_of(a.sources(), [&](const auto& source) {
+    auto iter = b.sources().find(source.first);
+    return iter != b.sources().end() && iter->second == source.second;
+  });
+}
+
+std::ostream& operator<<(std::ostream& out,
+                         const AttributionAggregatableKey& key) {
+  return out << "{high_bits="
+             << (key.has_high_bits() ? base::NumberToString(key.high_bits())
+                                     : "null")
+             << ",low_bits="
+             << (key.has_low_bits() ? base::NumberToString(key.low_bits())
+                                    : "null")
+             << "}";
+}
+
+std::ostream& operator<<(
+    std::ostream& out,
+    const AttributionAggregatableSources& aggregatable_sources) {
+  out << "{sources=[";
+
+  const char* separator = "";
+  for (const auto& [key_id, key] : aggregatable_sources.sources()) {
+    out << separator << key_id << ":" << key;
+    separator = ", ";
+  }
+  return out << "]}";
+}
+
+}  // namespace proto
+
+bool operator==(const AttributionAggregatableSources& a,
+                const AttributionAggregatableSources& b) {
+  return a.proto() == b.proto();
+}
+
+std::ostream& operator<<(
+    std::ostream& out,
+    const AttributionAggregatableSources& aggregatable_sources) {
+  return out << "{proto=" << aggregatable_sources.proto() << "}";
+}
+
 std::vector<AttributionReport> GetAttributionReportsForTesting(
     AttributionManagerImpl* manager,
     base::Time max_report_time) {
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h
index 2acee26..dbd7288 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.h
+++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -19,12 +19,14 @@
 #include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_host.h"
 #include "content/browser/attribution_reporting/attribution_info.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/attribution_reporting/attribution_manager_impl.h"
 #include "content/browser/attribution_reporting/attribution_observer_types.h"
 #include "content/browser/attribution_reporting/attribution_report.h"
+#include "content/browser/attribution_reporting/attribution_reporting.pb.h"
 #include "content/browser/attribution_reporting/attribution_storage.h"
 #include "content/browser/attribution_reporting/attribution_storage_delegate.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
@@ -356,6 +358,9 @@
 
   SourceBuilder& SetDedupKeys(std::vector<uint64_t> dedup_keys);
 
+  SourceBuilder& SetAggregatableSources(
+      AttributionAggregatableSources aggregatable_sources);
+
   StorableSource Build() const;
 
   StoredSource BuildStored() const;
@@ -379,6 +384,7 @@
   // Ensure that we don't use uninitialized memory.
   StoredSource::Id source_id_{0};
   std::vector<uint64_t> dedup_keys_;
+  AttributionAggregatableSources aggregatable_sources_;
 };
 
 // Returns a AttributionTrigger with default data which matches the default
@@ -470,6 +476,56 @@
   absl::optional<AttributionReport::EventLevelData::Id> report_id_;
 };
 
+// Helper class to construct a `proto::AttributionAggregatableKey` for testing.
+class AggregatableKeyProtoBuilder {
+ public:
+  AggregatableKeyProtoBuilder();
+  ~AggregatableKeyProtoBuilder();
+
+  AggregatableKeyProtoBuilder& SetHighBits(uint64_t high_bits);
+
+  AggregatableKeyProtoBuilder& SetLowBits(uint64_t low_bits);
+
+  proto::AttributionAggregatableKey Build() const;
+
+ private:
+  proto::AttributionAggregatableKey key_;
+};
+
+// Helper class to construct a `proto::AttributionAggregatableSources` for
+// testing.
+class AggregatableSourcesProtoBuilder {
+ public:
+  AggregatableSourcesProtoBuilder();
+  ~AggregatableSourcesProtoBuilder();
+
+  AggregatableSourcesProtoBuilder& AddKey(
+      std::string key_id,
+      proto::AttributionAggregatableKey key);
+
+  proto::AttributionAggregatableSources Build() const;
+
+ private:
+  proto::AttributionAggregatableSources aggregatable_sources_;
+};
+
+// Helper class to construct a `blink::mojom::AttributionAggregatableSources`
+// for testing.
+class AggregatableSourcesMojoBuilder {
+ public:
+  AggregatableSourcesMojoBuilder();
+  ~AggregatableSourcesMojoBuilder();
+
+  AggregatableSourcesMojoBuilder& AddKey(
+      std::string key_id,
+      blink::mojom::AttributionAggregatableKeyPtr key);
+
+  blink::mojom::AttributionAggregatableSourcesPtr Build() const;
+
+ private:
+  blink::mojom::AttributionAggregatableSources sources_;
+};
+
 bool operator==(const AttributionTrigger& a, const AttributionTrigger& b);
 
 bool operator==(const CommonSourceInfo& a, const CommonSourceInfo& b);
@@ -555,6 +611,13 @@
 
 std::ostream& operator<<(std::ostream& out, StorableSource::Result status);
 
+bool operator==(const AttributionAggregatableSources& a,
+                const AttributionAggregatableSources& b);
+
+std::ostream& operator<<(
+    std::ostream& out,
+    const AttributionAggregatableSources& aggregatable_sources);
+
 std::vector<AttributionReport> GetAttributionReportsForTesting(
     AttributionManagerImpl* manager,
     base::Time max_report_time);
@@ -604,6 +667,11 @@
   return ExplainMatchResult(matcher, arg.dedup_keys(), result_listener);
 }
 
+MATCHER_P(AggregatableSourcesAre, matcher, "") {
+  return ExplainMatchResult(matcher, arg.common_info().aggregatable_sources(),
+                            result_listener);
+}
+
 // Trigger matchers.
 
 MATCHER_P(TriggerConversionDestinationIs, matcher, "") {
diff --git a/content/browser/attribution_reporting/common_source_info.cc b/content/browser/attribution_reporting/common_source_info.cc
index f825ef6..49c185f 100644
--- a/content/browser/attribution_reporting/common_source_info.cc
+++ b/content/browser/attribution_reporting/common_source_info.cc
@@ -30,15 +30,17 @@
          base::clamp(expiry, kMinImpressionExpiry, kDefaultImpressionExpiry);
 }
 
-CommonSourceInfo::CommonSourceInfo(uint64_t source_event_id,
-                                   url::Origin impression_origin,
-                                   url::Origin conversion_origin,
-                                   url::Origin reporting_origin,
-                                   base::Time impression_time,
-                                   base::Time expiry_time,
-                                   SourceType source_type,
-                                   int64_t priority,
-                                   absl::optional<uint64_t> debug_key)
+CommonSourceInfo::CommonSourceInfo(
+    uint64_t source_event_id,
+    url::Origin impression_origin,
+    url::Origin conversion_origin,
+    url::Origin reporting_origin,
+    base::Time impression_time,
+    base::Time expiry_time,
+    SourceType source_type,
+    int64_t priority,
+    absl::optional<uint64_t> debug_key,
+    AttributionAggregatableSources aggregatable_sources)
     : source_event_id_(source_event_id),
       impression_origin_(std::move(impression_origin)),
       conversion_origin_(std::move(conversion_origin)),
@@ -47,7 +49,8 @@
       expiry_time_(expiry_time),
       source_type_(source_type),
       priority_(priority),
-      debug_key_(debug_key) {
+      debug_key_(debug_key),
+      aggregatable_sources_(std::move(aggregatable_sources)) {
   // 30 days is the max allowed expiry for an impression.
   DCHECK_GE(base::Days(30), expiry_time - impression_time);
   // The impression must expire strictly after it occurred.
diff --git a/content/browser/attribution_reporting/common_source_info.h b/content/browser/attribution_reporting/common_source_info.h
index 0f680bcca..10a68485 100644
--- a/content/browser/attribution_reporting/common_source_info.h
+++ b/content/browser/attribution_reporting/common_source_info.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/time/time.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/common/content_export.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/origin.h"
@@ -47,7 +48,8 @@
                    base::Time expiry_time,
                    SourceType source_type,
                    int64_t priority,
-                   absl::optional<uint64_t> debug_key);
+                   absl::optional<uint64_t> debug_key,
+                   AttributionAggregatableSources aggregatable_sources);
 
   ~CommonSourceInfo();
 
@@ -75,6 +77,10 @@
 
   absl::optional<uint64_t> debug_key() const { return debug_key_; }
 
+  const AttributionAggregatableSources& aggregatable_sources() const {
+    return aggregatable_sources_;
+  }
+
   void ClearDebugKey() { debug_key_ = absl::nullopt; }
 
   // Returns the schemeful site of |conversion_origin|.
@@ -99,6 +105,7 @@
   SourceType source_type_;
   int64_t priority_;
   absl::optional<uint64_t> debug_key_;
+  AttributionAggregatableSources aggregatable_sources_;
 
   // When adding new members, the corresponding `operator==()` definition in
   // `attribution_test_utils.h` should also be updated.
diff --git a/content/browser/attribution_reporting/source_declaration_browsertest.cc b/content/browser/attribution_reporting/source_declaration_browsertest.cc
index f30afaa..7932b9f 100644
--- a/content/browser/attribution_reporting/source_declaration_browsertest.cc
+++ b/content/browser/attribution_reporting/source_declaration_browsertest.cc
@@ -39,6 +39,7 @@
 using ::testing::Field;
 using ::testing::IsEmpty;
 using ::testing::Pair;
+using ::testing::Pointee;
 using ::testing::UnorderedElementsAre;
 
 std::unique_ptr<MockDataHost> GetRegisteredDataHost(
@@ -201,6 +202,7 @@
   EXPECT_EQ(source_data.front()->expiry, absl::nullopt);
   EXPECT_FALSE(source_data.front()->debug_key);
   EXPECT_THAT(source_data.front()->filter_data->filter_values, IsEmpty());
+  EXPECT_THAT(source_data.front()->aggregatable_sources->sources, IsEmpty());
 }
 
 IN_PROC_BROWSER_TEST_F(AttributionSourceDeclarationBrowserTest,
@@ -244,6 +246,59 @@
                                    Pair("b", ElementsAre("1", "2"))));
 }
 
+IN_PROC_BROWSER_TEST_F(
+    AttributionSourceDeclarationBrowserTest,
+    AttributionSrcImg_SourceRegisteredWithAttributionAggregatableSources) {
+  SourceObserver source_observer(web_contents());
+  GURL page_url =
+      https_server()->GetURL("b.test", "/page_with_impression_creator.html");
+  EXPECT_TRUE(NavigateToURL(web_contents(), page_url));
+
+  MockAttributionHost host(web_contents());
+  std::unique_ptr<MockDataHost> data_host;
+  base::RunLoop loop;
+  EXPECT_CALL(host, RegisterDataHost)
+      .WillOnce(
+          [&](mojo::PendingReceiver<blink::mojom::AttributionDataHost> host) {
+            data_host = GetRegisteredDataHost(std::move(host));
+            loop.Quit();
+          });
+
+  GURL register_url = https_server()->GetURL(
+      "c.test", "/register_aggregatable_source_headers.html");
+
+  EXPECT_TRUE(
+      ExecJs(web_contents(),
+             JsReplace("createAttributionSourceImg($1);", register_url)));
+  if (!data_host)
+    loop.Run();
+  data_host->WaitForSourceData(/*num_source_data=*/1);
+  const auto& source_data = data_host->source_data();
+
+  EXPECT_EQ(source_data.size(), 1u);
+  EXPECT_EQ(source_data.front()->source_event_id, 5UL);
+  EXPECT_EQ(source_data.front()->destination,
+            url::Origin::Create(GURL("https://advertiser.example")));
+  EXPECT_EQ(source_data.front()->priority, 0);
+  EXPECT_EQ(source_data.front()->expiry, absl::nullopt);
+  EXPECT_FALSE(source_data.front()->debug_key);
+  EXPECT_THAT(
+      source_data.front()->aggregatable_sources->sources,
+      UnorderedElementsAre(
+          Pair("key1",
+               Pointee(AllOf(
+                   Field(&blink::mojom::AttributionAggregatableKey::high_bits,
+                         0),
+                   Field(&blink::mojom::AttributionAggregatableKey::low_bits,
+                         5)))),
+          Pair("key2",
+               Pointee(AllOf(
+                   Field(&blink::mojom::AttributionAggregatableKey::high_bits,
+                         0),
+                   Field(&blink::mojom::AttributionAggregatableKey::low_bits,
+                         345))))));
+}
+
 IN_PROC_BROWSER_TEST_F(AttributionSourceDeclarationBrowserTest,
                        AttributionSrcImgRedirect_MultipleSourcesRegistered) {
   SourceObserver source_observer(web_contents());
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc
index a61367b..3a42722f 100644
--- a/content/browser/renderer_host/back_forward_cache_impl.cc
+++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -1414,7 +1414,8 @@
 }
 
 bool BackForwardCacheImpl::IsScreenReaderAllowed() {
-  return base::FeatureList::IsEnabled(kEnableBackForwardCacheForScreenReader);
+  return base::FeatureList::IsEnabled(
+      features::kEnableBackForwardCacheForScreenReader);
 }
 
 bool BackForwardCache::DisabledReason::operator<(
diff --git a/content/browser/renderer_host/back_forward_cache_impl.h b/content/browser/renderer_host/back_forward_cache_impl.h
index 062bbcb1..e9d8628 100644
--- a/content/browser/renderer_host/back_forward_cache_impl.h
+++ b/content/browser/renderer_host/back_forward_cache_impl.h
@@ -66,11 +66,6 @@
     "BackForwardCacheMediaSessionPlaybackStateChange",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enable back/forward cache for screen reader users. This flag should be
-// removed once the https://crbug.com/1271450 is resolved.
-const base::Feature kEnableBackForwardCacheForScreenReader{
-    "EnableBackForwardCacheForScreenReader", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Combines a flattened list and a tree of the reasons why each document cannot
 // enter the back/forward cache (might be empty if it can). The tree saves the
 // reasons for each document in the tree (including those without the reasons)
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc
index 25a61189..5e914ed 100644
--- a/content/browser/renderer_host/render_process_host_browsertest.cc
+++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -64,7 +64,9 @@
 #include "third_party/blink/public/common/chrome_debug_urls.h"
 
 #if BUILDFLAG(IS_WIN)
+#include "base/test/scoped_feature_list.h"
 #include "base/win/windows_version.h"
+#include "sandbox/policy/features.h"
 #endif
 
 namespace content {
@@ -882,6 +884,27 @@
   EXPECT_EQ(0, host_destructions_);
 }
 
+#if BUILDFLAG(IS_WIN)
+// Test class instance to run specific setup steps for renderer app container.
+class RendererAppContainerRenderProcessHostTest : public RenderProcessHostTest {
+ public:
+  RendererAppContainerRenderProcessHostTest() {
+    scoped_feature_list_.InitWithFeatureState(
+        sandbox::policy::features::kRendererAppContainer, true);
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(RendererAppContainerRenderProcessHostTest, Navigate) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  EXPECT_TRUE(NavigateToURL(
+      shell(), embedded_test_server()->GetURL("foo.com", "/title1.html")));
+}
+
+#endif  // BUILDFLAG(IS_WIN)
+
 // Test class instance to run specific setup steps for capture streams.
 class CaptureStreamRenderProcessHostTest : public RenderProcessHostTest {
  public:
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.cc b/content/browser/shared_storage/shared_storage_document_service_impl.cc
index ac660e3..f1b74ebd 100644
--- a/content/browser/shared_storage/shared_storage_document_service_impl.cc
+++ b/content/browser/shared_storage/shared_storage_document_service_impl.cc
@@ -8,6 +8,7 @@
 #include "content/browser/shared_storage/shared_storage_worklet_host_manager.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/render_frame_host.h"
+#include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
 
 namespace content {
 
@@ -62,14 +63,11 @@
     const std::vector<GURL>& urls,
     const std::vector<uint8_t>& serialized_data,
     RunURLSelectionOperationOnWorkletCallback callback) {
-  if (urls.size() >
-      static_cast<size_t>(
-          blink::features::kSharedStorageURLSelectionOperationInputURLSizeLimit
-              .Get())) {
+  if (!blink::IsValidSharedStorageURLsArrayLength(urls.size())) {
     // This could indicate a compromised renderer, so let's terminate it.
     receiver_.ReportBadMessage(
-        "Attempted to execute RunURLSelectionOperationOnWorklet with URLs "
-        "array length exceeding the size limit.");
+        "Attempted to execute RunURLSelectionOperationOnWorklet with invalid "
+        "URLs array length.");
     return;
   }
 
diff --git a/content/browser/webui/web_ui_message_handler.cc b/content/browser/webui/web_ui_message_handler.cc
index 9c8582d..9d08c0e 100644
--- a/content/browser/webui/web_ui_message_handler.cc
+++ b/content/browser/webui/web_ui_message_handler.cc
@@ -43,13 +43,12 @@
 
 bool WebUIMessageHandler::ExtractIntegerValue(const base::ListValue* value,
                                               int* out_int) {
-  return WebUIMessageHandler::ExtractIntegerValue(value->GetListDeprecated(),
-                                                  out_int);
+  return WebUIMessageHandler::ExtractIntegerValue(value->GetList(), out_int);
 }
 
-bool WebUIMessageHandler::ExtractIntegerValue(base::Value::ConstListView value,
+bool WebUIMessageHandler::ExtractIntegerValue(const base::Value::List& list,
                                               int* out_int) {
-  const base::Value& single_element = value[0];
+  const base::Value& single_element = list[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_int = static_cast<int>(*double_value);
@@ -61,13 +60,12 @@
 
 bool WebUIMessageHandler::ExtractDoubleValue(const base::ListValue* value,
                                              double* out_value) {
-  return WebUIMessageHandler::ExtractDoubleValue(value->GetListDeprecated(),
-                                                 out_value);
+  return WebUIMessageHandler::ExtractDoubleValue(value->GetList(), out_value);
 }
 
-bool WebUIMessageHandler::ExtractDoubleValue(base::Value::ConstListView value,
+bool WebUIMessageHandler::ExtractDoubleValue(const base::Value::List& list,
                                              double* out_value) {
-  const base::Value& single_element = value[0];
+  const base::Value& single_element = list[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_value = *double_value;
@@ -79,13 +77,13 @@
 
 std::u16string WebUIMessageHandler::ExtractStringValue(
     const base::ListValue* value) {
-  return WebUIMessageHandler::ExtractStringValue(value->GetListDeprecated());
+  return WebUIMessageHandler::ExtractStringValue(value->GetList());
 }
 
 std::u16string WebUIMessageHandler::ExtractStringValue(
-    base::Value::ConstListView list_view) {
-  if (0u < list_view.size() && list_view[0].is_string())
-    return base::UTF8ToUTF16(list_view[0].GetString());
+    const base::Value::List& list) {
+  if (0u < list.size() && list[0].is_string())
+    return base::UTF8ToUTF16(list[0].GetString());
 
   NOTREACHED();
   return std::u16string();
diff --git a/content/public/browser/web_ui_message_handler.h b/content/public/browser/web_ui_message_handler.h
index dc958ce..d8a699f 100644
--- a/content/public/browser/web_ui_message_handler.h
+++ b/content/public/browser/web_ui_message_handler.h
@@ -65,18 +65,17 @@
 
   // Extract an integer value from a list Value.
   static bool ExtractIntegerValue(const base::ListValue* value, int* out_int);
-  static bool ExtractIntegerValue(base::Value::ConstListView value,
-                                  int* out_int);
+  static bool ExtractIntegerValue(const base::Value::List& list, int* out_int);
 
   // Extract a floating point (double) value from a list Value.
   static bool ExtractDoubleValue(const base::ListValue* value,
                                  double* out_value);
-  static bool ExtractDoubleValue(base::Value::ConstListView value,
+  static bool ExtractDoubleValue(const base::Value::List& list,
                                  double* out_value);
 
   // Extract a string value from a list Value.
   static std::u16string ExtractStringValue(const base::ListValue* value);
-  static std::u16string ExtractStringValue(base::Value::ConstListView value);
+  static std::u16string ExtractStringValue(const base::Value::List& list);
 
   // This is where subclasses specify which messages they'd like to handle and
   // perform any additional initialization.. At this point web_ui() will return
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 75b671c..88d9881 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -93,6 +93,11 @@
 const base::Feature kBackForwardCacheSameSiteForBots{
     "BackForwardCacheSameSiteForBots", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enable back/forward cache for screen reader users. This flag should be
+// removed once the https://crbug.com/1271450 is resolved.
+const base::Feature kEnableBackForwardCacheForScreenReader{
+    "EnableBackForwardCacheForScreenReader", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // BackForwardCache is disabled on low memory devices. The threshold is defined
 // via a field trial param: "memory_threshold_for_back_forward_cache_in_mb"
 // It is compared against base::SysInfo::AmountOfPhysicalMemoryMB().
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index c74ee91..c0e2ba4 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -73,6 +73,8 @@
 CONTENT_EXPORT extern const base::Feature kEarlyEstablishGpuChannel;
 CONTENT_EXPORT extern const base::Feature kEarlyHintsPreloadForNavigation;
 CONTENT_EXPORT extern const base::Feature kEmbeddingRequiresOptIn;
+CONTENT_EXPORT extern const base::Feature
+    kEnableBackForwardCacheForScreenReader;
 CONTENT_EXPORT extern const base::Feature kEnableCanvas2DLayers;
 CONTENT_EXPORT extern const base::Feature kEnumerateDevicesHideDeviceIDs;
 CONTENT_EXPORT extern const base::Feature kExperimentalAccessibilityLabels;
diff --git a/content/services/shared_storage_worklet/public/mojom/BUILD.gn b/content/services/shared_storage_worklet/public/mojom/BUILD.gn
index 6e4e608..9297480 100644
--- a/content/services/shared_storage_worklet/public/mojom/BUILD.gn
+++ b/content/services/shared_storage_worklet/public/mojom/BUILD.gn
@@ -10,6 +10,9 @@
   deps = [
     "//mojo/public/mojom/base",
     "//services/network/public/mojom",
+    "//third_party/blink/public/mojom:mojom_platform",
     "//url/mojom:url_mojom_gurl",
   ]
+  overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ]
+  component_deps = [ "//third_party/blink/public/common" ]
 }
diff --git a/content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom b/content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom
index 41715f7..04a446f 100644
--- a/content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom
+++ b/content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom
@@ -7,6 +7,7 @@
 import "mojo/public/mojom/base/string16.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "services/network/public/mojom/url_loader_factory.mojom";
+import "third_party/blink/public/mojom/shared_storage/shared_storage.mojom";
 import "url/mojom/origin.mojom";
 import "url/mojom/url.mojom";
 
@@ -37,19 +38,19 @@
  // Handle sharedStorage.set(): set `key`’s entry to `value`. If
   // `ignoreIfPresent` is true, the entry is not updated if `key` already
   // exists.
-  SharedStorageSet(mojo_base.mojom.String16 key,
-                   mojo_base.mojom.String16 value,
+  SharedStorageSet(blink.mojom.SharedStorageKeyArgument key,
+                   blink.mojom.SharedStorageValueArgument value,
                    bool ignore_if_present)
     => (bool success, string error_message);
 
   // Handle sharedStorage.append(): append `value` to the entry for `key`.
   // Equivalent to "set" if the `key` is not present.
-  SharedStorageAppend(mojo_base.mojom.String16 key,
-                      mojo_base.mojom.String16 value)
+  SharedStorageAppend(blink.mojom.SharedStorageKeyArgument key,
+                      blink.mojom.SharedStorageValueArgument value)
     => (bool success, string error_message);
 
   // Handle sharedStorage.delete(): delete the entry at the given `key`.
-  SharedStorageDelete(mojo_base.mojom.String16 key)
+  SharedStorageDelete(blink.mojom.SharedStorageKeyArgument key)
     => (bool success, string error_message);
 
   // Handle sharedStorage.clear(): delete all entries.
@@ -58,7 +59,7 @@
 
   // Handle sharedStorage.get(): get the entry at `key`, or an empty string if
   // `key` is not present.
-  SharedStorageGet(mojo_base.mojom.String16 key)
+  SharedStorageGet(blink.mojom.SharedStorageKeyArgument key)
     => (bool success, string error_message, mojo_base.mojom.String16 value);
 
   // Returns (potentially in batches) the keys of the shared storage.
diff --git a/content/services/shared_storage_worklet/shared_storage.cc b/content/services/shared_storage_worklet/shared_storage.cc
index 9f00e77..5e91ac7 100644
--- a/content/services/shared_storage_worklet/shared_storage.cc
+++ b/content/services/shared_storage_worklet/shared_storage.cc
@@ -10,6 +10,7 @@
 #include "gin/arguments.h"
 #include "gin/dictionary.h"
 #include "gin/handle.h"
+#include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
 
 namespace shared_storage_worklet {
 
@@ -47,7 +48,8 @@
   v8::Local<v8::Promise> promise = resolver->GetPromise();
 
   std::u16string arg0_key;
-  if (!args->GetNext(&arg0_key)) {
+  if (!args->GetNext(&arg0_key) ||
+      !blink::IsValidSharedStorageKeyStringLength(arg0_key.size())) {
     resolver
         ->Reject(
             args->GetHolderCreationContext(),
@@ -59,7 +61,8 @@
   }
 
   std::u16string arg1_value;
-  if (!args->GetNext(&arg1_value)) {
+  if (!args->GetNext(&arg1_value) ||
+      !blink::IsValidSharedStorageValueStringLength(arg1_value.size())) {
     resolver
         ->Reject(
             args->GetHolderCreationContext(),
@@ -107,7 +110,8 @@
   v8::Local<v8::Promise> promise = resolver->GetPromise();
 
   std::u16string arg0_key;
-  if (!args->GetNext(&arg0_key)) {
+  if (!args->GetNext(&arg0_key) ||
+      !blink::IsValidSharedStorageKeyStringLength(arg0_key.size())) {
     resolver
         ->Reject(args->GetHolderCreationContext(),
                  gin::StringToV8(isolate,
@@ -118,7 +122,8 @@
   }
 
   std::u16string arg1_value;
-  if (!args->GetNext(&arg1_value)) {
+  if (!args->GetNext(&arg1_value) ||
+      !blink::IsValidSharedStorageValueStringLength(arg1_value.size())) {
     resolver
         ->Reject(args->GetHolderCreationContext(),
                  gin::StringToV8(isolate,
@@ -147,7 +152,8 @@
   v8::Local<v8::Promise> promise = resolver->GetPromise();
 
   std::u16string arg0_key;
-  if (!args->GetNext(&arg0_key)) {
+  if (!args->GetNext(&arg0_key) ||
+      !blink::IsValidSharedStorageKeyStringLength(arg0_key.size())) {
     resolver
         ->Reject(args->GetHolderCreationContext(),
                  gin::StringToV8(isolate,
@@ -192,7 +198,8 @@
   v8::Local<v8::Promise> promise = resolver->GetPromise();
 
   std::u16string arg0_key;
-  if (!args->GetNext(&arg0_key)) {
+  if (!args->GetNext(&arg0_key) ||
+      !blink::IsValidSharedStorageKeyStringLength(arg0_key.size())) {
     resolver
         ->Reject(
             args->GetHolderCreationContext(),
diff --git a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc
index 3ca6d8b..898c6f6 100644
--- a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc
+++ b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc
@@ -960,6 +960,51 @@
   EXPECT_TRUE(test_client()->observed_set_params().empty());
 }
 
+TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidKey_Empty) {
+  ExecuteScript("sharedStorage.set('', 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.set()");
+  }
+
+  EXPECT_TRUE(test_client()->observed_set_params().empty());
+}
+
+TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidKey_NotAString) {
+  ExecuteScript("sharedStorage.set(123, 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.set()");
+  }
+
+  EXPECT_TRUE(test_client()->observed_set_params().empty());
+}
+
+TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidKey_LengthTooBig) {
+  ExecuteScript("sharedStorage.set('a'.repeat(1025), 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.set()");
+  }
+
+  EXPECT_TRUE(test_client()->observed_set_params().empty());
+}
+
 TEST_F(SharedStorageObjectMethodTest, SetOperation_MissingValue) {
   ExecuteScript("sharedStorage.set('key')");
   EXPECT_TRUE(finished());
@@ -975,7 +1020,7 @@
   EXPECT_TRUE(test_client()->observed_set_params().empty());
 }
 
-TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidValue) {
+TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidValue_NotAString) {
   ExecuteScript("sharedStorage.set('key', 123)");
   EXPECT_TRUE(finished());
   EXPECT_FALSE(fulfilled());
@@ -990,6 +1035,21 @@
   EXPECT_TRUE(test_client()->observed_set_params().empty());
 }
 
+TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidValue_LengthTooBig) {
+  ExecuteScript("sharedStorage.set('key', 'a'.repeat(1025))");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"value\" argument in sharedStorage.set()");
+  }
+
+  EXPECT_TRUE(test_client()->observed_set_params().empty());
+}
+
 TEST_F(SharedStorageObjectMethodTest, SetOperation_InvalidOptions) {
   ExecuteScript("sharedStorage.set('key', 'value', true)");
   EXPECT_TRUE(finished());
@@ -1044,10 +1104,51 @@
   EXPECT_TRUE(finished());
   EXPECT_FALSE(fulfilled());
 
-  WorkletV8Helper::HandleScope scope(Isolate());
-  EXPECT_TRUE(v8_resolved_value()->IsString());
-  EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
-            "Missing or invalid \"key\" argument in sharedStorage.append()");
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.append()");
+  }
+}
+
+TEST_F(SharedStorageObjectMethodTest, AppendOperation_InvalidKey_Empty) {
+  ExecuteScript("sharedStorage.append('', 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.append()");
+  }
+}
+
+TEST_F(SharedStorageObjectMethodTest, AppendOperation_InvalidKey_NotAString) {
+  ExecuteScript("sharedStorage.append(123, 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.append()");
+  }
+}
+
+TEST_F(SharedStorageObjectMethodTest, AppendOperation_InvalidKey_LengthTooBig) {
+  ExecuteScript("sharedStorage.append('a'.repeat(1025), 'value')");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
+              "Missing or invalid \"key\" argument in sharedStorage.append()");
+  }
 }
 
 TEST_F(SharedStorageObjectMethodTest, AppendOperation_MissingValue) {
@@ -1055,10 +1156,42 @@
   EXPECT_TRUE(finished());
   EXPECT_FALSE(fulfilled());
 
-  WorkletV8Helper::HandleScope scope(Isolate());
-  EXPECT_TRUE(v8_resolved_value()->IsString());
-  EXPECT_EQ(gin::V8ToString(Isolate(), v8_resolved_value()),
-            "Missing or invalid \"value\" argument in sharedStorage.append()");
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(
+        gin::V8ToString(Isolate(), v8_resolved_value()),
+        "Missing or invalid \"value\" argument in sharedStorage.append()");
+  }
+}
+
+TEST_F(SharedStorageObjectMethodTest, AppendOperation_InvalidValue_NotAString) {
+  ExecuteScript("sharedStorage.append('key', 123)");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(
+        gin::V8ToString(Isolate(), v8_resolved_value()),
+        "Missing or invalid \"value\" argument in sharedStorage.append()");
+  }
+}
+
+TEST_F(SharedStorageObjectMethodTest,
+       AppendOperation_InvalidValue_LengthTooBig) {
+  ExecuteScript("sharedStorage.append('key', 'a'.repeat(1025))");
+  EXPECT_TRUE(finished());
+  EXPECT_FALSE(fulfilled());
+
+  {
+    WorkletV8Helper::HandleScope scope(Isolate());
+    EXPECT_TRUE(v8_resolved_value()->IsString());
+    EXPECT_EQ(
+        gin::V8ToString(Isolate(), v8_resolved_value()),
+        "Missing or invalid \"value\" argument in sharedStorage.append()");
+  }
 }
 
 TEST_F(SharedStorageObjectMethodTest, AppendOperation_RejectedAsynchronously) {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 86338c9..8aa4da0 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -455,6 +455,7 @@
     "//components/viz/host",
     "//content/app:for_content_tests",
     "//content/browser:for_content_tests",
+    "//content/browser/attribution_reporting:attribution_reporting_proto",
     "//content/child:for_content_tests",
     "//content/gpu",
     "//content/public/browser",
@@ -704,18 +705,9 @@
   }
 }
 
-# Fuchsia gpu integration tests on smart displays use web_engine and a browser
+# Fuchsia performance tests on smart displays use web_engine and a browser
 # like shell instead of an actual browser, so Fuchsia needs a separate target.
 if (is_fuchsia) {
-  group("fuchsia_telemetry_gpu_integration_test") {
-    testonly = true
-    data = [ "//content/test/gpu/run_gpu_integration_test_fuchsia.py" ]
-    data_deps = [
-      ":fuchsia_telemetry_test_data",
-      ":telemetry_gpu_integration_test_scripts_only",
-      ":telemetry_gpu_integration_test_support",
-    ]
-  }
   group("performance_web_engine_test_suite") {
     testonly = true
     data = [ "//content/test/gpu/run_telemetry_benchmark_fuchsia.py" ]
@@ -1437,6 +1429,7 @@
     "//components/web_package",
     "//content/app:for_content_tests",
     "//content/browser:for_content_tests",
+    "//content/browser/attribution_reporting:attribution_reporting_proto",
     "//content/browser/background_sync:background_sync_proto",
     "//content/child:for_content_tests",
     "//content/gpu",
@@ -2495,6 +2488,7 @@
     "//components/viz/test:test_support",
     "//content/app:for_content_tests",
     "//content/browser:for_content_tests",
+    "//content/browser/attribution_reporting:attribution_reporting_proto",
     "//content/browser/background_fetch:background_fetch_proto",
     "//content/browser/cache_storage:cache_storage_proto",
     "//content/browser/devtools:devtools_background_services_proto",
diff --git a/content/test/attribution_simulator_input_parser.cc b/content/test/attribution_simulator_input_parser.cc
index fdee14fe0..1fe2099 100644
--- a/content/test/attribution_simulator_input_parser.cc
+++ b/content/test/attribution_simulator_input_parser.cc
@@ -15,6 +15,7 @@
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "base/values.h"
+#include "content/browser/attribution_reporting/attribution_aggregatable_sources.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
 #include "content/browser/attribution_reporting/common_source_info.h"
 #include "content/browser/attribution_reporting/storable_source.h"
@@ -124,6 +125,8 @@
     int64_t priority = ParseOptionalInt64(*cfg, "priority").value_or(0);
     base::TimeDelta expiry = ParseSourceExpiry(*cfg).value_or(base::Days(30));
 
+    // TODO(linnan): Support aggregatable reports in the simulator.
+
     if (has_error_)
       return;
 
@@ -133,7 +136,8 @@
             std::move(destination_origin), std::move(reporting_origin),
             source_time,
             CommonSourceInfo::GetExpiryTime(expiry, source_time, *source_type),
-            *source_type, priority, debug_key)),
+            *source_type, priority, debug_key,
+            AttributionAggregatableSources())),
         std::move(source));
   }
 
diff --git a/content/test/data/attribution_reporting/databases/version_26.sql b/content/test/data/attribution_reporting/databases/version_26.sql
index af06441bd..3d4d698 100644
--- a/content/test/data/attribution_reporting/databases/version_26.sql
+++ b/content/test/data/attribution_reporting/databases/version_26.sql
@@ -48,4 +48,6 @@
 
 CREATE INDEX contribution_report_time_idx ON aggregatable_contributions(report_time);
 
+INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9);
+
 COMMIT;
diff --git a/content/test/data/attribution_reporting/databases/version_25.sql b/content/test/data/attribution_reporting/databases/version_27.sql
similarity index 92%
rename from content/test/data/attribution_reporting/databases/version_25.sql
rename to content/test/data/attribution_reporting/databases/version_27.sql
index 8d1233b9..f9dd076 100644
--- a/content/test/data/attribution_reporting/databases/version_25.sql
+++ b/content/test/data/attribution_reporting/databases/version_27.sql
@@ -2,7 +2,7 @@
 
 BEGIN TRANSACTION;
 
-CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL);
+CREATE TABLE impressions(impression_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_data INTEGER NOT NULL,impression_origin TEXT NOT NULL,conversion_origin TEXT NOT NULL,reporting_origin TEXT NOT NULL,impression_time INTEGER NOT NULL,expiry_time INTEGER NOT NULL,num_conversions INTEGER DEFAULT 0,active INTEGER DEFAULT 1,conversion_destination TEXT NOT NULL,source_type INTEGER NOT NULL,attributed_truthfully INTEGER NOT NULL,priority INTEGER NOT NULL,impression_site TEXT NOT NULL,debug_key INTEGER,aggregatable_budget_consumed INTEGER NOT NULL,aggregatable_sources BLOB NOT NULL);
 
 CREATE TABLE conversions(conversion_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,impression_id INTEGER NOT NULL,conversion_data INTEGER NOT NULL,conversion_time INTEGER NOT NULL,report_time INTEGER NOT NULL,priority INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,external_report_id TEXT NOT NULL,debug_key INTEGER);
 
@@ -10,15 +10,15 @@
 
 CREATE TABLE dedup_keys(impression_id INTEGER NOT NULL,dedup_key INTEGER NOT NULL,PRIMARY KEY(impression_id,dedup_key))WITHOUT ROWID;
 
-CREATE TABLE aggregatable_report_metadata(aggregation_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_time INTEGER NOT NULL);
+CREATE TABLE aggregatable_report_metadata(aggregation_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,source_id INTEGER NOT NULL,trigger_time INTEGER NOT NULL,debug_key INTEGER);
 
 CREATE TABLE aggregatable_contributions(contribution_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,aggregation_id INTEGER NOT NULL,report_time INTEGER NOT NULL,failed_send_attempts INTEGER NOT NULL,key_high_bits INTEGER NOT NULL,key_low_bits INTEGER NOT NULL,value INTEGER NOT NULL,external_report_id TEXT NOT NULL);
 
 CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR);
 
 INSERT INTO meta VALUES('mmap_status','-1');
-INSERT INTO meta VALUES('version','25');
-INSERT INTO meta VALUES('last_compatible_version','25');
+INSERT INTO meta VALUES('version','27');
+INSERT INTO meta VALUES('last_compatible_version','27');
 
 CREATE INDEX conversion_destination_idx ON impressions(active,conversion_destination,reporting_origin);
 
@@ -48,6 +48,4 @@
 
 CREATE INDEX contribution_report_time_idx ON aggregatable_contributions(report_time);
 
-INSERT INTO conversions VALUES (1,2,3,4,5,6,7,8,9);
-
 COMMIT;
diff --git a/content/test/data/attribution_reporting/register_aggregatable_source_headers.html b/content/test/data/attribution_reporting/register_aggregatable_source_headers.html
new file mode 100644
index 0000000..41425ddb
--- /dev/null
+++ b/content/test/data/attribution_reporting/register_aggregatable_source_headers.html
@@ -0,0 +1 @@
+Registers a source with aggregatable source by providing headers.
diff --git a/content/test/data/attribution_reporting/register_aggregatable_source_headers.html.mock-http-headers b/content/test/data/attribution_reporting/register_aggregatable_source_headers.html.mock-http-headers
new file mode 100644
index 0000000..37674d43
--- /dev/null
+++ b/content/test/data/attribution_reporting/register_aggregatable_source_headers.html.mock-http-headers
@@ -0,0 +1,3 @@
+HTTP/1.1 200 OK
+Attribution-Reporting-Register-Source:{"source_event_id":"5","destination":"https://advertiser.example"}
+Attribution-Reporting-Register-Aggregatable-Source:[{"id":"key1","key_piece":"0x5"},{"id":"key2","key_piece":"0x159"}]
diff --git a/content/test/data/gpu/vc/README.md b/content/test/data/gpu/vc/README.md
index d97875dc..4fa9c19 100644
--- a/content/test/data/gpu/vc/README.md
+++ b/content/test/data/gpu/vc/README.md
@@ -30,7 +30,7 @@
 The image of each video frame is uploaded and rendered by WebGPU. The UI is also
 rendered by WebGPU. The demo uses importExternalTexture API to copy the video
 textures into GPU. The copy method can be changed to createImageBitmap() then
-device.queue.copyImageBitmapToTexture() with a flag.
+device.queue.copyExternalImageToTexture() with a flag.
 
 ## Usage
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
index 98c8cbb..9cd869c 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -77,6 +77,7 @@
 # Non-"Skip" expectations go here to suppress regular flakes/failures.
 
 crbug.com/1208827 [ chromeos-board-amd64-generic ] WebCodecs_Encode_capture_avc1.42001E_prefer-hardware [ RetryOnFailure ]
+crbug.com/1300963 [ chromeos-board-kevin ] WebCodecs_Encode_camera_* [ Failure ]
 
 crbug.com/1207682 [ android ] WebCodecs_* [ RetryOnFailure ]
 
diff --git a/content/test/gpu/run_gpu_integration_test_fuchsia.py b/content/test/gpu/run_gpu_integration_test_fuchsia.py
index 822e03f..a07365b 100755
--- a/content/test/gpu/run_gpu_integration_test_fuchsia.py
+++ b/content/test/gpu/run_gpu_integration_test_fuchsia.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env vpython3
 # 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.
diff --git a/docs/fuchsia/gpu_testing.md b/docs/fuchsia/gpu_testing.md
index 66c65ef0..5a61f03 100644
--- a/docs/fuchsia/gpu_testing.md
+++ b/docs/fuchsia/gpu_testing.md
@@ -3,10 +3,11 @@
 General instruction on running and debugging GPU integration tests can be
 found [here](../gpu/gpu_testing.md).
 
-Fuchsia uses [web_engine_shell](../../fuchsia/engine/test/README.md) to run GPU
-integration tests. For the sake of this example, we will be using `gpu_process`
-as the test suite we wish to execute. Build the target
-`fuchsia_telemetry_gpu_integration_test` and run the appropriate commands:
+Fuchsia uses either [web_engine_shell](../../fuchsia/engine/test/README.md)
+or the Chrome browser to run GPU integration tests. For the sake of this
+example, we will be using `web_engine_shell` as the target browser and
+`gpu_process` as the test suite we wish to execute. Build the target
+`telemetry_gpu_integration_test_fuchsia` and run the appropriate commands:
 
 ## Hermetic emulation
 
diff --git a/docs/ios/build_instructions.md b/docs/ios/build_instructions.md
index 997e917d..3dacc27 100644
--- a/docs/ios/build_instructions.md
+++ b/docs/ios/build_instructions.md
@@ -116,7 +116,7 @@
       "name": "setup_gn",
       "pattern": ".",
       "action": [
-        "python",
+        "python3",
         "src/ios/build/tools/setup-gn.py",
       ]
     }],
@@ -188,8 +188,8 @@
 with Chromium and other applications from the same organisation and can be used
 to send commands to Chromium.
 
-`${prefix}.chrome.ios.dev.CredentialProviderExtension` needs the AutoFill 
-Credential Provider Entitlement, which corresponds to the key 
+`${prefix}.chrome.ios.dev.CredentialProviderExtension` needs the AutoFill
+Credential Provider Entitlement, which corresponds to the key
 `com.apple.developer.authentication-services.autofill-credential-provider`
 Please refer to Apple's documentation on how to set this up.
 
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 67126e2d..dd1e79f 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1075,6 +1075,7 @@
   // If a new toggle is added here, ForceDawnTogglesForWebGPU() which collects
   // info for about:gpu should be updated as well.
   WGPUDawnTogglesDeviceDescriptor dawn_toggles;
+  dawn_toggles.chain.next = nullptr;
   std::vector<const char*> force_enabled_toggles;
   std::vector<const char*> force_disabled_toggles;
 
diff --git a/headless/test/data/structured_doc_only_figure.html b/headless/test/data/structured_doc_only_figure.html
new file mode 100644
index 0000000..f57b635
--- /dev/null
+++ b/headless/test/data/structured_doc_only_figure.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html lang="en">
+<body>
+  <figure>
+    <img src="svg_example_image.png" alt="Sample SVG image">
+    <figcaption>Figure 1: The caption</figcaption>
+  </figure>
+</body>
+</html>
diff --git a/headless/test/data/structured_doc_only_figure_role.html b/headless/test/data/structured_doc_only_figure_role.html
new file mode 100644
index 0000000..f1bb7d2
--- /dev/null
+++ b/headless/test/data/structured_doc_only_figure_role.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html lang="en">
+<body>
+  <div role="figure" aria-labelledby="figure-1">
+    <img src="svg_example_image.png" alt="Sample SVG image">
+    <p id="figure-1">Text that describes the figure.</p>
+  </div>
+</body>
+</html>
diff --git a/headless/test/data/structured_doc_only_image_role.html b/headless/test/data/structured_doc_only_image_role.html
new file mode 100644
index 0000000..a535073
--- /dev/null
+++ b/headless/test/data/structured_doc_only_image_role.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html lang="en">
+<body>
+  <div role="img" aria-label="That cat is so cute">
+    <p>&#x1F408; &#x1F602;</p>
+  </div>
+</body>
+</html>
diff --git a/headless/test/headless_web_contents_browsertest.cc b/headless/test/headless_web_contents_browsertest.cc
index 6e81c29..58390d3b 100644
--- a/headless/test/headless_web_contents_browsertest.cc
+++ b/headless/test/headless_web_contents_browsertest.cc
@@ -570,6 +570,44 @@
 }
 )";
 
+const char kExpectedFigureOnlyStructTreeJSON[] = R"({
+   "lang": "en",
+   "type": "Document",
+   "~children": [ {
+      "alt": "Figure 1: The caption",
+      "type": "Figure",
+      "~children": [ {
+         "alt": "Sample SVG image",
+         "type": "Figure"
+      }, {
+         "type": "NonStruct",
+         "~children": [ {
+            "type": "NonStruct"
+         } ]
+      } ]
+   } ]
+}
+)";
+
+const char kExpectedFigureRoleOnlyStructTreeJSON[] = R"({
+   "lang": "en",
+   "type": "Document",
+   "~children": [ {
+      "alt": "Text that describes the figure.",
+      "type": "Figure",
+      "~children": [ {
+         "alt": "Sample SVG image",
+         "type": "Figure"
+      }, {
+         "type": "P",
+         "~children": [ {
+            "type": "NonStruct"
+         } ]
+      } ]
+   } ]
+}
+)";
+
 const char kExpectedImageOnlyStructTreeJSON[] = R"({
    "lang": "en",
    "type": "Document",
@@ -583,6 +621,22 @@
 }
 )";
 
+const char kExpectedImageRoleOnlyStructTreeJSON[] = R"({
+   "lang": "en",
+   "type": "Document",
+   "~children": [ {
+      "alt": "That cat is so cute",
+      "type": "Figure",
+      "~children": [ {
+         "type": "P",
+         "~children": [ {
+            "type": "NonStruct"
+         } ]
+      } ]
+   } ]
+}
+)";
+
 struct TaggedPDFTestData {
   const char* url;
   const char* expected_json;
@@ -590,7 +644,12 @@
 
 constexpr TaggedPDFTestData kTaggedPDFTestData[] = {
     {"/structured_doc.html", kExpectedStructTreeJSON},
+    {"/structured_doc_only_figure.html", kExpectedFigureOnlyStructTreeJSON},
+    {"/structured_doc_only_figure_role.html",
+     kExpectedFigureRoleOnlyStructTreeJSON},
     {"/structured_doc_only_image.html", kExpectedImageOnlyStructTreeJSON},
+    {"/structured_doc_only_image_role.html",
+     kExpectedImageRoleOnlyStructTreeJSON},
 };
 
 class HeadlessWebContentsTaggedPDFTest
diff --git a/infra/config/generated/builders/ci/android-12-x64-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-12-x64-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-12-x64-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-12-x64-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-annotator-rel/properties.json b/infra/config/generated/builders/ci/android-annotator-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-annotator-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-annotator-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-chrome-pie-x86-wpt-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json b/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json
+++ b/infra/config/generated/builders/ci/android-pie-arm64-wpt-rel-non-cq/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json b/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json
index 486923e..1e3e28e 100644
--- a/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-rust-arm-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-smoketest/properties.json b/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-smoketest/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-smoketest/properties.json
+++ b/infra/config/generated/builders/ci/android-weblayer-pie-x86-wpt-smoketest/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json
index 432cf6b..8252801 100644
--- a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json
@@ -1,10 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "jobs": 150,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 500,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-weblayer-x86-rel/properties.json b/infra/config/generated/builders/ci/android-weblayer-x86-rel/properties.json
index 432cf6b..8252801 100644
--- a/infra/config/generated/builders/ci/android-weblayer-x86-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-weblayer-x86-rel/properties.json
@@ -1,10 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "jobs": 150,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 500,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-webview-pie-x86-wpt-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/android-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/android-x86-fyi-rel/properties.json
index c6534f7..b6e2921 100644
--- a/infra/config/generated/builders/ci/android-x86-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-x86-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index f4c3720..b8794bd4 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -45826,11 +45826,12 @@
     builders {
       name: "Win x64 Builder reclient staging"
       swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:Win x64 Builder reclient staging"
+      dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
       dimensions: "os:Windows"
       dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
         cipd_version: "latest"
@@ -45904,11 +45905,12 @@
     builders {
       name: "Win x64 Builder reclient test"
       swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:Win x64 Builder reclient test"
+      dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
       dimensions: "os:Windows"
       dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
         cipd_version: "latest"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
index 334950b..376532a 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -45,6 +45,9 @@
         category = "builder_tester|arm64",
         short_name = "P-WPT",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -53,6 +56,9 @@
         category = "builder_tester|web-platform",
         short_name = "P",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -71,6 +77,9 @@
         category = "builder_tester|weblayer",
         short_name = "P",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -79,6 +88,9 @@
         category = "builder_tester|weblayer",
         short_name = "P",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -87,6 +99,9 @@
         category = "builder_tester|webview",
         short_name = "P",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -95,6 +110,9 @@
         category = "builder|weblayer_with_aosp_webview",
         short_name = "x86",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -157,6 +175,9 @@
     # vs 1h on Android-11 (For example ci.chromium.org/b/8841899947736889024)
     # TODO(crbug.com/1229245): Look into ways to improve the compile time.
     execution_timeout = 6 * time.hour,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -166,6 +187,9 @@
         short_name = "and",
     ),
     notifies = ["annotator-rel"],
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -174,6 +198,9 @@
         category = "builder|x86",
         short_name = "x86",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 # TODO(crbug.com/1299910): Move to non-FYI once the tester works fine.
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index 95706ded..4ba978b 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -623,6 +623,9 @@
         category = "builder|weblayer_with_aosp_webview",
         short_name = "x86",
     ),
+    goma_backend = None,
+    reclient_instance = rbe_instance.DEFAULT,
+    reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI,
 )
 
 ci.builder(
@@ -631,4 +634,7 @@
         category = "builder|weblayer",
         short_name = "x86",
     ),
+    goma_backend = None,
+    reclient_instance = rbe_instance.DEFAULT,
+    reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.rust.star b/infra/config/subprojects/chromium/ci/chromium.rust.star
index 2dfaf4b..89c651d6 100644
--- a/infra/config/subprojects/chromium/ci/chromium.rust.star
+++ b/infra/config/subprojects/chromium/ci/chromium.rust.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the chromium.rust builder group."""
 
 load("//lib/builders.star", "goma", "os")
-load("//lib/ci.star", "ci")
+load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
 
 ci.defaults.set(
@@ -36,6 +36,9 @@
     ),
     notifies = ["chrome-memory-safety"],
     os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star
index 75a7da9..aa9f76c 100644
--- a/infra/config/subprojects/reclient/reclient.star
+++ b/infra/config/subprojects/reclient/reclient.star
@@ -92,6 +92,7 @@
     name = "Win x64 Builder reclient staging",
     console_view_category = "win",
     cores = 32,
+    builderless = True,
     os = os.WINDOWS_ANY,
 )
 
@@ -99,5 +100,6 @@
     name = "Win x64 Builder reclient test",
     console_view_category = "win",
     cores = 32,
+    builderless = True,
     os = os.WINDOWS_ANY,
 )
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index db7780d..26e7fec96 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -36,6 +36,7 @@
 #include "components/metrics/drive_metrics_provider.h"
 #include "components/metrics/entropy_state_provider.h"
 #include "components/metrics/field_trials_provider.h"
+#include "components/metrics/form_factor_metrics_provider.h"
 #include "components/metrics/metrics_data_validation.h"
 #include "components/metrics/metrics_log_uploader.h"
 #include "components/metrics/metrics_pref_names.h"
@@ -302,6 +303,9 @@
         std::make_unique<metrics::EntropyStateProvider>(local_state));
 
   metrics_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
+
+  metrics_service_->RegisterMetricsProvider(
       std::make_unique<metrics::ScreenInfoMetricsProvider>());
 
   metrics_service_->RegisterMetricsProvider(
@@ -339,6 +343,9 @@
       std::make_unique<metrics::CPUMetricsProvider>());
 
   ukm_service_->RegisterMetricsProvider(
+      std::make_unique<metrics::FormFactorMetricsProvider>());
+
+  ukm_service_->RegisterMetricsProvider(
       std::make_unique<metrics::ScreenInfoMetricsProvider>());
 
   // TODO(crbug.com/754877): Support synthetic trials for UKM.
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm
index 7c630e9..f611699 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client_unittest.mm
@@ -91,7 +91,7 @@
 
   // This is the number of metrics providers that are registered inside
   // IOSChromeMetricsServiceClient::Initialize().
-  expected_providers += 16;
+  expected_providers += 17;
 
   std::unique_ptr<IOSChromeMetricsServiceClient> chrome_metrics_service_client =
       IOSChromeMetricsServiceClient::Create(metrics_state_manager_.get());
@@ -116,8 +116,9 @@
 
   // Number of providers registered by
   // IOSChromeMetricsServiceClient::RegisterMetricsServiceProviders(), namely
-  // CPUMetricsProvider, ScreenInfoMetricsProvider, FieldTrialsProvider.
-  const size_t expected_providers = 3;
+  // CPUMetricsProvider, ScreenInfoMetricsProvider, FormFactorMetricsProvider,
+  // and FieldTrialsProvider.
+  const size_t expected_providers = 4;
 
   EXPECT_EQ(expected_providers,
             ukmService->metrics_providers_.GetProviders().size());
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
index 164ee029..fd813438 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -166,6 +166,9 @@
 // Whether the scroll view is animating its content offset to the current page.
 @property(nonatomic, assign, getter=isScrollViewAnimatingContentOffset)
     BOOL scrollViewAnimatingContentOffset;
+// The height of the bottom of the tab grid which is currently covered by the
+// software keyboard.
+@property(nonatomic, assign) CGFloat keyboardOverlap;
 
 @property(nonatomic, assign) PageChangeInteraction pageChangeInteraction;
 // UIView whose background color changes to create a fade-in / fade-out effect
@@ -275,6 +278,18 @@
       pageViewController.view.accessibilityElementsHidden = YES;
     }
   }
+
+  [[NSNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(handleKeyboardWillShow:)
+             name:UIKeyboardWillShowNotification
+           object:nil];
+
+  [[NSNotificationCenter defaultCenter]
+      addObserver:self
+         selector:@selector(handleKeyboardWillHide:)
+             name:UIKeyboardWillHideNotification
+           object:nil];
 }
 
 - (void)viewDidLayoutSubviews {
@@ -940,11 +955,29 @@
   inset.left = self.scrollView.safeAreaInsets.left;
   inset.right = self.scrollView.safeAreaInsets.right;
   inset.top += self.scrollView.safeAreaInsets.top;
-  inset.bottom += self.scrollView.safeAreaInsets.bottom;
+  if (self.keyboardOverlap > 0) {
+    // Override normal bottom insets which will be behind keyboard.
+    inset.bottom = self.keyboardOverlap;
+  } else {
+    inset.bottom += self.scrollView.safeAreaInsets.bottom;
+  }
   self.incognitoTabsViewController.gridView.contentInset = inset;
   self.regularTabsViewController.gridView.contentInset = inset;
 }
 
+- (void)handleKeyboardWillShow:(NSNotification*)notification {
+  CGRect keyboardFrame =
+      [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
+  CGRect viewFrameInWindow = [self.scrollView convertRect:self.scrollView.bounds
+                                                   toView:nil];
+  self.keyboardOverlap =
+      CGRectIntersection(keyboardFrame, viewFrameInWindow).size.height;
+}
+
+- (void)handleKeyboardWillHide:(NSNotification*)notification {
+  self.keyboardOverlap = 0.0;
+}
+
 // Returns the corresponding GridViewController for |page|. Returns |nil| if
 // page does not have a corresponding GridViewController.
 - (GridViewController*)gridViewControllerForPage:(TabGridPage)page {
diff --git a/ios/web/public/js_messaging/web_frame.h b/ios/web/public/js_messaging/web_frame.h
index c26be12..653885a 100644
--- a/ios/web/public/js_messaging/web_frame.h
+++ b/ios/web/public/js_messaging/web_frame.h
@@ -30,6 +30,7 @@
   // application's lifetime.
   virtual std::string GetFrameId() const = 0;
   // Whether or not the receiver represents the main frame of the webpage.
+  // TODO(crbug.com/1300655): Rename IsMainFrame to IsAnyMainFrame
   virtual bool IsMainFrame() const = 0;
   // The security origin associated with this frame.
   virtual GURL GetSecurityOrigin() const = 0;
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 0fb175a..bf836e9 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -527,7 +527,7 @@
     "VaapiH264TemporalLayerEncoding", base::FEATURE_ENABLED_BY_DEFAULT};
 // Enable VP8 temporal layer encoding with HW encoder on ChromeOS.
 const base::Feature kVaapiVp8TemporalLayerHWEncoding{
-    "VaapiVp8TemporalLayerEncoding", base::FEATURE_ENABLED_BY_DEFAULT};
+    "VaapiVp8TemporalLayerEncoding", base::FEATURE_DISABLED_BY_DEFAULT};
 // Enable VP9 k-SVC encoding with HW encoder for webrtc use case on ChromeOS.
 const base::Feature kVaapiVp9kSVCHWEncoding{"VaapiVp9kSVCHWEncoding",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/media/capture/video/chromeos/camera_app_device_impl.cc b/media/capture/video/chromeos/camera_app_device_impl.cc
index 8164864..c70d144 100644
--- a/media/capture/video/chromeos/camera_app_device_impl.cc
+++ b/media/capture/video/chromeos/camera_app_device_impl.cc
@@ -6,6 +6,7 @@
 
 #include <cmath>
 
+#include "base/cxx17_backports.h"
 #include "base/task/bind_post_task.h"
 #include "base/time/time.h"
 #include "gpu/ipc/common/gpu_memory_buffer_impl.h"
diff --git a/media/gpu/test/video_encoder/video_encoder_test_environment.cc b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
index 93f5c4b..adde0b2 100644
--- a/media/gpu/test/video_encoder/video_encoder_test_environment.cc
+++ b/media/gpu/test/video_encoder/video_encoder_test_environment.cc
@@ -165,6 +165,8 @@
 #if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_VAAPI)
   // TODO(crbug.com/1186051): remove once enabled by default.
   combined_enabled_features.push_back(media::kVaapiVp9kSVCHWEncoding);
+  // TODO(b/202926617): remove once enabled by default.
+  combined_enabled_features.push_back(media::kVaapiVp8TemporalLayerHWEncoding);
 #endif
 
   const uint32_t bitrate = encode_bitrate.value_or(
diff --git a/media/gpu/vaapi/test/vp8_decoder.cc b/media/gpu/vaapi/test/vp8_decoder.cc
index 39cbfe2..57fcd3f 100644
--- a/media/gpu/vaapi/test/vp8_decoder.cc
+++ b/media/gpu/vaapi/test/vp8_decoder.cc
@@ -7,6 +7,7 @@
 #include <va/va.h>
 #include <memory>
 
+#include "base/cxx17_backports.h"
 #include "media/filters/ivf_parser.h"
 #include "media/gpu/vaapi/test/macros.h"
 #include "media/parsers/vp8_parser.h"
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
index 0e607cc..1fd9df7 100644
--- a/media/gpu/vaapi/vaapi_wrapper.cc
+++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -2679,8 +2679,17 @@
   TRACE_EVENT0("media,gpu", "VaapiWrapper::GetEncodedChunkSize");
   base::AutoLockMaybe auto_lock(va_lock_);
   TRACE_EVENT0("media,gpu", "VaapiWrapper::GetEncodedChunkSizeLocked");
-  VAStatus va_res = vaSyncSurface(va_display_, sync_surface_id);
-  VA_SUCCESS_OR_RETURN(va_res, VaapiFunctions::kVASyncSurface, 0u);
+
+  // vaSyncSurface() is not necessary on Intel platforms as long as there is a
+  // vaMapBuffer() like in ScopedVABufferMapping below.
+  // vaSyncSurface() synchronizes all active workloads (potentially many, e.g.
+  // for k-SVC encoding). On Intel, we'd rather use the more fine-grained
+  // vaMapBuffer() in ScopedVABufferMapping below. see b/184312032.
+  if (VaapiWrapper::GetImplementationType() != VAImplementation::kIntelI965 &&
+      VaapiWrapper::GetImplementationType() != VAImplementation::kIntelIHD) {
+    VAStatus va_res = vaSyncSurface(va_display_, sync_surface_id);
+    VA_SUCCESS_OR_RETURN(va_res, VaapiFunctions::kVASyncSurface, 0u);
+  }
 
   ScopedVABufferMapping mapping(va_lock_, va_display_, buffer_id);
   if (!mapping.IsValid())
diff --git a/net/cert/x509_util_mac.cc b/net/cert/x509_util_mac.cc
index 9546a5b..59bb7481 100644
--- a/net/cert/x509_util_mac.cc
+++ b/net/cert/x509_util_mac.cc
@@ -54,12 +54,6 @@
 
 }  // namespace
 
-bool IsValidSecCertificate(SecCertificateRef cert_handle) {
-  const CSSM_X509_NAME* sanity_check = NULL;
-  OSStatus status = SecCertificateGetSubject(cert_handle, &sanity_check);
-  return status == noErr && sanity_check;
-}
-
 base::ScopedCFTypeRef<SecCertificateRef> CreateSecCertificateFromBytes(
     const uint8_t* data,
     size_t length) {
@@ -73,8 +67,6 @@
                                                  cert_handle.InitializeInto());
   if (status != noErr)
     return base::ScopedCFTypeRef<SecCertificateRef>();
-  if (!IsValidSecCertificate(cert_handle.get()))
-    return base::ScopedCFTypeRef<SecCertificateRef>();
   return cert_handle;
 }
 
diff --git a/net/cert/x509_util_mac.h b/net/cert/x509_util_mac.h
index 1a693b5..f2c9e4d 100644
--- a/net/cert/x509_util_mac.h
+++ b/net/cert/x509_util_mac.h
@@ -20,19 +20,6 @@
 
 namespace x509_util {
 
-// Tests that a given |cert_handle| is actually a valid X.509 certificate, and
-// returns true if it is.
-//
-// On OS X, SecCertificateCreateFromData() does not return any errors if
-// called with invalid data, as long as data is present. The actual decoding
-// of the certificate does not happen until an API that requires a CSSM
-// handle is called. While SecCertificateGetCLHandle is the most likely
-// candidate, as it performs the parsing, it does not check whether the
-// parsing was actually successful. Instead, SecCertificateGetSubject is
-// used (supported since 10.3), as a means to check that the certificate
-// parsed as a valid X.509 certificate.
-NET_EXPORT bool IsValidSecCertificate(SecCertificateRef cert_handle);
-
 // Creates a SecCertificate handle from the DER-encoded representation.
 // Returns NULL on failure.
 NET_EXPORT base::ScopedCFTypeRef<SecCertificateRef>
diff --git a/net/http/broken_alternative_services.cc b/net/http/broken_alternative_services.cc
index 1f21e0c..9bde04d 100644
--- a/net/http/broken_alternative_services.cc
+++ b/net/http/broken_alternative_services.cc
@@ -15,19 +15,44 @@
 
 namespace {
 
-// Initial delay for broken alternative services.
-const uint64_t kBrokenAlternativeProtocolDelaySecs = 300;
+// Default broken alternative services, which is used when
+// exponential_backoff_on_initial_delay is false.
+constexpr base::TimeDelta kDefaultBrokenAlternativeProtocolDelay =
+    base::Seconds(300);
 // Subsequent failures result in exponential (base 2) backoff.
-// Limit binary shift to limit delay to approximately 2 days.
-const int kBrokenDelayMaxShift = 9;
+// Given the shortest broken delay is 1s, limit binary shift to limit delay to
+// approximately 2 days.
+const int kBrokenDelayMaxShift = 18;
+// Lower and upper limits of broken alternative service delay.
+constexpr base::TimeDelta kMinBrokenAlternativeProtocolDelay = base::Seconds(1);
+constexpr base::TimeDelta kMaxBrokenAlternativeProtocolDelay = base::Days(2);
 
 base::TimeDelta ComputeBrokenAlternativeServiceExpirationDelay(
-    int broken_count) {
+    int broken_count,
+    base::TimeDelta initial_delay,
+    bool exponential_backoff_on_initial_delay) {
   DCHECK_GE(broken_count, 0);
-  if (broken_count > kBrokenDelayMaxShift)
+  // Make sure initial delay is within [1s, 300s].
+  if (initial_delay < kMinBrokenAlternativeProtocolDelay) {
+    initial_delay = kMinBrokenAlternativeProtocolDelay;
+  }
+  if (initial_delay > kDefaultBrokenAlternativeProtocolDelay) {
+    initial_delay = kDefaultBrokenAlternativeProtocolDelay;
+  }
+  if (broken_count == 0) {
+    return initial_delay;
+  }
+  // Limit broken_count to avoid overflow.
+  if (broken_count > kBrokenDelayMaxShift) {
     broken_count = kBrokenDelayMaxShift;
-  return base::Seconds(kBrokenAlternativeProtocolDelaySecs) *
-         (1 << broken_count);
+  }
+  base::TimeDelta delay;
+  if (exponential_backoff_on_initial_delay) {
+    delay = initial_delay * (1 << broken_count);
+  } else {
+    delay = kDefaultBrokenAlternativeProtocolDelay * (1 << (broken_count - 1));
+  }
+  return std::min(delay, kMaxBrokenAlternativeProtocolDelay);
 }
 
 }  // namespace
@@ -56,7 +81,9 @@
     : delegate_(delegate),
       clock_(clock),
       recently_broken_alternative_services_(
-          max_recently_broken_alternative_service_entries) {
+          max_recently_broken_alternative_service_entries),
+      initial_delay_(kDefaultBrokenAlternativeProtocolDelay),
+      exponential_backoff_on_initial_delay_(true) {
   DCHECK(delegate_);
   DCHECK(clock_);
 }
@@ -109,7 +136,8 @@
   }
   base::TimeTicks expiration =
       clock_->NowTicks() +
-      ComputeBrokenAlternativeServiceExpirationDelay(broken_count);
+      ComputeBrokenAlternativeServiceExpirationDelay(
+          broken_count, initial_delay_, exponential_backoff_on_initial_delay_);
   // Return if alternative service is already in expiration queue.
   BrokenAlternativeServiceList::iterator list_it;
   if (!AddToBrokenListAndMap(broken_alternative_service, expiration,
@@ -287,6 +315,18 @@
     ScheduleBrokenAlternateProtocolMappingsExpiration();
 }
 
+void BrokenAlternativeServices::SetDelayParams(
+    absl::optional<base::TimeDelta> initial_delay,
+    absl::optional<bool> exponential_backoff_on_initial_delay) {
+  if (initial_delay.has_value()) {
+    initial_delay_ = initial_delay.value();
+  }
+  if (exponential_backoff_on_initial_delay.has_value()) {
+    exponential_backoff_on_initial_delay_ =
+        exponential_backoff_on_initial_delay.value();
+  }
+}
+
 const BrokenAlternativeServiceList&
 BrokenAlternativeServices::broken_alternative_service_list() const {
   return broken_alternative_service_list_;
diff --git a/net/http/broken_alternative_services.h b/net/http/broken_alternative_services.h
index c4fd731..56c8dfd 100644
--- a/net/http/broken_alternative_services.h
+++ b/net/http/broken_alternative_services.h
@@ -155,6 +155,13 @@
       std::unique_ptr<RecentlyBrokenAlternativeServices>
           recently_broken_alternative_services);
 
+  // If values are present, sets initial_delay_ and
+  // exponential_backoff_on_initial_delay_ which are used to calculate delay of
+  // broken alternative services.
+  void SetDelayParams(
+      absl::optional<base::TimeDelta> initial_delay,
+      absl::optional<bool> exponential_backoff_on_initial_delay);
+
   const BrokenAlternativeServiceList& broken_alternative_service_list() const;
 
   const RecentlyBrokenAlternativeServices&
@@ -215,6 +222,15 @@
   // services.
   base::OneShotTimer expiration_timer_;
 
+  // Delay for the 1st time alternative service is marked broken.
+  base::TimeDelta initial_delay_;
+
+  // If true, the delay for broken alternative service =
+  // initial_delay_for_broken_alternative_service * (1 << broken_count).
+  // Otherwise, the delay would be initial_delay_for_broken_alternative_service,
+  // 5min, 10min.. and so on.
+  bool exponential_backoff_on_initial_delay_;
+
   base::WeakPtrFactory<BrokenAlternativeServices> weak_ptr_factory_{this};
 };
 
diff --git a/net/http/broken_alternative_services_unittest.cc b/net/http/broken_alternative_services_unittest.cc
index 66e9901..22791cd 100644
--- a/net/http/broken_alternative_services_unittest.cc
+++ b/net/http/broken_alternative_services_unittest.cc
@@ -46,6 +46,9 @@
         true /* use_network_isolation_key */));
   }
 
+  void TestExponentialBackoff(base::TimeDelta initial_delay,
+                              bool exponential_backoff_on_initial_delay);
+
   // All tests will run inside the scope of |test_task_runner_context_|, which
   // means any task posted to the main message loop will run on
   // |test_task_runner_|.
@@ -640,10 +643,89 @@
   // Max expiration delay has been reached; subsequent expiration delays from
   // this point forward should not increase further.
   broken_services_.MarkBroken(alternative_service);
-  test_task_runner_->FastForwardBy(base::Minutes(2560) - base::Seconds(1));
+  test_task_runner_->FastForwardBy(base::Minutes(2880) - base::Seconds(1));
   EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
   test_task_runner_->FastForwardBy(base::Seconds(1));
   EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
+
+  broken_services_.MarkBroken(alternative_service);
+  test_task_runner_->FastForwardBy(base::Minutes(2880) - base::Seconds(1));
+  EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
+  test_task_runner_->FastForwardBy(base::Seconds(1));
+  EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
+}
+
+void BrokenAlternativeServicesTest::TestExponentialBackoff(
+    base::TimeDelta initial_delay,
+    bool exponential_backoff_on_initial_delay) {
+  // Tests the exponential backoff of the computed expiration delay when an
+  // alt svc is marked broken. After being marked broken 10 times, the max
+  // expiration delay will have been reached and exponential backoff will no
+  // longer apply.
+  broken_services_.SetDelayParams(initial_delay,
+                                  exponential_backoff_on_initial_delay);
+
+  BrokenAlternativeService alternative_service(
+      AlternativeService(kProtoQUIC, "foo", 443), NetworkIsolationKey(),
+      true /* use_network_isolation_key */);
+
+  broken_services_.MarkBroken(alternative_service);
+  test_task_runner_->FastForwardBy(initial_delay - base::Seconds(1));
+  EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
+  test_task_runner_->FastForwardBy(base::Seconds(1));
+  EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
+
+  for (size_t broken_count = 1; broken_count < 20; ++broken_count) {
+    broken_services_.MarkBroken(alternative_service);
+    base::TimeDelta broken_delay;
+    if (exponential_backoff_on_initial_delay) {
+      broken_delay = initial_delay * (1 << broken_count);
+    } else {
+      broken_delay = base::Seconds(kBrokenAlternativeProtocolDelaySecs) *
+                     (1 << (broken_count - 1));
+    }
+    if (broken_delay > base::Days(2)) {
+      broken_delay = base::Days(2);
+    }
+    test_task_runner_->FastForwardBy(broken_delay - base::Seconds(1));
+    EXPECT_TRUE(broken_services_.IsBroken(alternative_service));
+    test_task_runner_->FastForwardBy(base::Seconds(1));
+    EXPECT_FALSE(broken_services_.IsBroken(alternative_service));
+  }
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_OneSecond_True) {
+  TestExponentialBackoff(base::Seconds(1), true);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_OneSecond_False) {
+  TestExponentialBackoff(base::Seconds(1), false);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveSeconds_True) {
+  TestExponentialBackoff(base::Seconds(5), true);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveSeconds_False) {
+  TestExponentialBackoff(base::Seconds(5), false);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_TenSeconds_True) {
+  TestExponentialBackoff(base::Seconds(10), true);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_TenSeconds_False) {
+  TestExponentialBackoff(base::Seconds(10), false);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveMinutes_True) {
+  TestExponentialBackoff(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
+                         true);
+}
+
+TEST_F(BrokenAlternativeServicesTest, ExponentialBackoff_FiveMinutes_False) {
+  TestExponentialBackoff(base::Seconds(kBrokenAlternativeProtocolDelaySecs),
+                         false);
 }
 
 TEST_F(BrokenAlternativeServicesTest, RemoveExpiredBrokenAltSvc) {
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 05a4a537..4875abb 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -235,6 +235,10 @@
 
   http_server_properties_->SetMaxServerConfigsStoredInProperties(
       context.quic_context->params()->max_server_configs_stored_in_properties);
+  http_server_properties_->SetBrokenAlternativeServicesDelayParams(
+      context.quic_context->params()
+          ->initial_delay_for_broken_alternative_service,
+      context.quic_context->params()->exponential_backoff_on_initial_delay);
 
   if (!params_.disable_idle_sockets_close_on_memory_pressure) {
     memory_pressure_listener_ = std::make_unique<base::MemoryPressureListener>(
diff --git a/net/http/http_server_properties.cc b/net/http/http_server_properties.cc
index 55d560b0..0ac003c 100644
--- a/net/http/http_server_properties.cc
+++ b/net/http/http_server_properties.cc
@@ -564,6 +564,13 @@
   }
 }
 
+void HttpServerProperties::SetBrokenAlternativeServicesDelayParams(
+    absl::optional<base::TimeDelta> initial_delay,
+    absl::optional<bool> exponential_backoff_on_initial_delay) {
+  broken_alternative_services_.SetDelayParams(
+      initial_delay, exponential_backoff_on_initial_delay);
+}
+
 bool HttpServerProperties::IsInitialized() const {
   return is_initialized_;
 }
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h
index 2ea3bf4..bc4737b 100644
--- a/net/http/http_server_properties.h
+++ b/net/http/http_server_properties.h
@@ -413,6 +413,13 @@
   void SetMaxServerConfigsStoredInProperties(
       size_t max_server_configs_stored_in_properties);
 
+  // If values are present, sets initial_delay and
+  // exponential_backoff_on_initial_delay which are used to calculate delay of
+  // broken alternative services.
+  void SetBrokenAlternativeServicesDelayParams(
+      absl::optional<base::TimeDelta> initial_delay,
+      absl::optional<bool> exponential_backoff_on_initial_delay);
+
   // Returns whether HttpServerProperties is initialized.
   bool IsInitialized() const;
 
diff --git a/net/http/http_server_properties_unittest.cc b/net/http/http_server_properties_unittest.cc
index 91a1dc3..e03d410e 100644
--- a/net/http/http_server_properties_unittest.cc
+++ b/net/http/http_server_properties_unittest.cc
@@ -2178,6 +2178,66 @@
       baz_alternative_service, NetworkIsolationKey()));
 }
 
+TEST_F(AlternateProtocolServerPropertiesTest,
+       SetBrokenAlternativeServicesDelayParams1) {
+  url::SchemeHostPort server("https", "foo", 443);
+  AlternativeService alternative_service(kProtoQUIC, "foo", 443);
+  SetAlternativeService(server, alternative_service);
+
+  const base::TimeDelta initial_delay = base::Seconds(1);
+  impl_.SetBrokenAlternativeServicesDelayParams(initial_delay, true);
+  for (int i = 0; i < 10; ++i) {
+    impl_.MarkAlternativeServiceBroken(alternative_service,
+                                       NetworkIsolationKey());
+    // |impl_| should have posted task to expire the brokenness of
+    // |alternative_service|
+    EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
+    EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service,
+                                                 NetworkIsolationKey()));
+
+    // Advance time by just enough so that |alternative_service|'s brokenness
+    // expires.
+    FastForwardBy(initial_delay * (1 << i));
+
+    // Ensure brokenness of |alternative_service| has expired.
+    EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
+    EXPECT_FALSE(impl_.IsAlternativeServiceBroken(alternative_service,
+                                                  NetworkIsolationKey()));
+  }
+}
+
+TEST_F(AlternateProtocolServerPropertiesTest,
+       SetBrokenAlternativeServicesDelayParams2) {
+  url::SchemeHostPort server("https", "foo", 443);
+  AlternativeService alternative_service(kProtoQUIC, "foo", 443);
+  SetAlternativeService(server, alternative_service);
+
+  const base::TimeDelta initial_delay = base::Seconds(5);
+  impl_.SetBrokenAlternativeServicesDelayParams(initial_delay, false);
+  for (int i = 0; i < 10; ++i) {
+    impl_.MarkAlternativeServiceBroken(alternative_service,
+                                       NetworkIsolationKey());
+    // |impl_| should have posted task to expire the brokenness of
+    // |alternative_service|
+    EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
+    EXPECT_TRUE(impl_.IsAlternativeServiceBroken(alternative_service,
+                                                 NetworkIsolationKey()));
+
+    // Advance time by just enough so that |alternative_service|'s brokenness
+    // expires.
+    if (i == 0) {
+      FastForwardBy(initial_delay);
+    } else {
+      FastForwardBy(base::Seconds(300) * (1 << (i - 1)));
+    }
+
+    // Ensure brokenness of |alternative_service| has expired.
+    EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
+    EXPECT_FALSE(impl_.IsAlternativeServiceBroken(alternative_service,
+                                                  NetworkIsolationKey()));
+  }
+}
+
 // Regression test for https://crbug.com/724302
 TEST_F(AlternateProtocolServerPropertiesTest, RemoveExpiredBrokenAltSvc2) {
   // This test will mark an alternative service A that has already been marked
diff --git a/net/quic/quic_context.h b/net/quic/quic_context.h
index 3c2d24c2..b03c5fa 100644
--- a/net/quic/quic_context.h
+++ b/net/quic/quic_context.h
@@ -179,6 +179,12 @@
   // Network Service Type of the socket for iOS. Default is NET_SERVICE_TYPE_BE
   // (best effort).
   int ios_network_service_type = 0;
+  // Delay for the 1st time the alternative service is marked broken.
+  absl::optional<base::TimeDelta> initial_delay_for_broken_alternative_service;
+  // If true, the delay for broke alternative service would be initial_delay *
+  // (1 << broken_count). Otherwise, the delay would be initial_delay, 5min,
+  // 10min and so on.
+  absl::optional<bool> exponential_backoff_on_initial_delay;
 };
 
 // QuicContext contains QUIC-related variables that are shared across all of the
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index 405767aa..ce4bee7 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1778,7 +1778,7 @@
       {
         "args": [],
         "cros_board": "atlas",
-        "cros_img": "atlas-release/R101-14537.0.0",
+        "cros_img": "atlas-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_ATLAS_LKGM",
         "resultdb": {
           "enable": true,
@@ -1838,7 +1838,7 @@
       {
         "args": [],
         "cros_board": "eve",
-        "cros_img": "eve-release/R101-14537.0.0",
+        "cros_img": "eve-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_EVE_LKGM",
         "resultdb": {
           "enable": true,
@@ -1943,7 +1943,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_KEVIN_LKGM",
         "resultdb": {
           "enable": true,
@@ -1958,7 +1958,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_HANA_LKGM",
         "resultdb": {
           "enable": true,
@@ -1973,7 +1973,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "ozone_unittests_KEVIN_LKGM",
         "resultdb": {
           "enable": true,
@@ -1987,7 +1987,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "ozone_unittests_HANA_LKGM",
         "resultdb": {
           "enable": true,
@@ -2001,7 +2001,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "viz_unittests_KEVIN_LKGM",
         "resultdb": {
           "enable": true,
@@ -2015,7 +2015,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "viz_unittests_HANA_LKGM",
         "resultdb": {
           "enable": true,
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 58e2dc4a..501978b 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -10023,7 +10023,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10045,7 +10045,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10056,7 +10056,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10078,7 +10078,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10089,7 +10089,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10111,7 +10111,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10126,7 +10126,7 @@
           "--expected-device-id",
           "0"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10148,7 +10148,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10157,15 +10157,18 @@
           "--browser=web-engine-shell",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating",
+          "--dont-restore-color-profile-after-test",
+          "--test-machine-name",
+          "${buildername}",
           "--git-revision=${got_revision}"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "maps_tests",
+        "name": "maps_pixel_validating_test",
         "precommit_args": [
           "--gerrit-issue=${patch_issue}",
           "--gerrit-patchset=${patch_set}",
@@ -10187,7 +10190,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10198,7 +10201,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=validating"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10220,7 +10223,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10229,15 +10232,18 @@
           "--browser=web-engine-shell",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating",
+          "--dont-restore-color-profile-after-test",
+          "--test-machine-name",
+          "${buildername}",
           "--git-revision=${got_revision}"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "pixel_tests",
+        "name": "pixel_skia_gold_validating_test",
         "precommit_args": [
           "--gerrit-issue=${patch_issue}",
           "--gerrit-patchset=${patch_set}",
@@ -10259,7 +10265,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10268,14 +10274,15 @@
           "--browser=web-engine-shell",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating",
+          "--dont-restore-color-profile-after-test"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "screenshot_sync_tests",
+        "name": "screenshot_sync_validating_tests",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -10292,7 +10299,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10303,7 +10310,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10325,7 +10332,7 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       },
       {
         "args": [
@@ -10336,7 +10343,7 @@
           "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
         ],
-        "isolate_name": "fuchsia_telemetry_gpu_integration_test",
+        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10359,7 +10366,7 @@
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 18
         },
-        "test_id_prefix": "ninja://content/test:fuchsia_telemetry_gpu_integration_test/"
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 8857996d..b11ce7a 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -4935,6 +4935,50 @@
       }
     ]
   },
+  "Win x64 Builder reclient staging": {
+    "additional_compile_targets": [
+      "pdf_fuzzers"
+    ],
+    "scripts": [
+      {
+        "name": "check_network_annotations",
+        "script": "check_network_annotations.py",
+        "swarming": {}
+      },
+      {
+        "name": "metrics_python_tests",
+        "script": "metrics_python_tests.py",
+        "swarming": {}
+      },
+      {
+        "name": "webkit_lint",
+        "script": "blink_lint_expectations.py",
+        "swarming": {}
+      }
+    ]
+  },
+  "Win x64 Builder reclient test": {
+    "additional_compile_targets": [
+      "pdf_fuzzers"
+    ],
+    "scripts": [
+      {
+        "name": "check_network_annotations",
+        "script": "check_network_annotations.py",
+        "swarming": {}
+      },
+      {
+        "name": "metrics_python_tests",
+        "script": "metrics_python_tests.py",
+        "swarming": {}
+      },
+      {
+        "name": "webkit_lint",
+        "script": "blink_lint_expectations.py",
+        "swarming": {}
+      }
+    ]
+  },
   "Win11 Tests x64": {
     "gtest_tests": [
       {
@@ -24730,39 +24774,6 @@
           "--browser=web-engine-shell",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=web-engine-shell",
-          "--passthrough",
-          "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating",
           "--dont-restore-color-profile-after-test"
         ],
@@ -25204,40 +25215,6 @@
           "--browser=fuchsia-chrome",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
-          "--custom-image=workstation.qemu-x64-release"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test_fuchsia",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_fuchsia/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=fuchsia-chrome",
-          "--passthrough",
-          "-v",
           "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating",
           "--dont-restore-color-profile-after-test",
           "--custom-image=workstation.qemu-x64-release"
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index d793c4f0..89b563c 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -877,16 +877,6 @@
     "label": "//fuchsia/release:fuchsia_sizes",
     "type": "generated_script",
   },
-  "fuchsia_telemetry_gpu_integration_test": {
-    "args": [
-      "../../content/test/gpu/run_gpu_integration_test_fuchsia.py",
-      "--logs-dir",
-      "${ISOLATED_OUTDIR}",
-    ],
-    "label": "//content/test:fuchsia_telemetry_gpu_integration_test",
-    "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py",
-    "type": "script",
-  },
   "gcm_unit_tests": {
     "label": "//google_apis/gcm:gcm_unit_tests",
     "type": "console_test_launcher",
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json
index 3d59bbe8..c414d46a 100644
--- a/testing/buildbot/internal.chromeos.fyi.json
+++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1125,7 +1125,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R101-14537.0.0",
+        "cros_img": "octopus-release/R101-14538.0.0",
         "name": "lacros_fyi_tast_tests_OCTOPUS_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1169,7 +1169,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R101-14537.0.0",
+        "cros_img": "octopus-release/R101-14538.0.0",
         "name": "ozone_unittests_OCTOPUS_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1217,7 +1217,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_KEVIN_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1228,7 +1228,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "lacros_all_tast_tests_HANA_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1239,7 +1239,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "ozone_unittests_KEVIN_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1249,7 +1249,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "ozone_unittests_HANA_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1259,7 +1259,7 @@
       {
         "args": [],
         "cros_board": "kevin",
-        "cros_img": "kevin-release/R101-14537.0.0",
+        "cros_img": "kevin-release/R101-14538.0.0",
         "name": "viz_unittests_KEVIN_LKGM",
         "swarming": {},
         "test": "viz_unittests",
@@ -1269,7 +1269,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R101-14537.0.0",
+        "cros_img": "hana-release/R101-14538.0.0",
         "name": "viz_unittests_HANA_LKGM",
         "swarming": {},
         "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 5847fb65..4424756 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -1842,90 +1842,6 @@
       },
     },
 
-    'fuchsia_gpu_telemetry_tests': {
-      'context_lost_validating': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'name': 'context_lost_validating_tests',
-        'telemetry_test_name': 'context_lost',
-        'args': [
-          '--extra-browser-args=--use-cmd-decoder=validating',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'gpu_process': {
-        'name': 'gpu_process_launch_tests',
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'hardware_accelerated_feature': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'info_collection': {
-        'args': [
-          '--expected-vendor-id',
-          '${gpu_vendor_id}',
-          '$$MAGIC_SUBSTITUTION_GPUExpectedDeviceId',
-        ],
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'maps': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-      },
-      'mediapipe_validating': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'name': 'mediapipe_validating_tests',
-        'telemetry_test_name': 'mediapipe',
-        'args': [
-          '--extra-browser-args=--force_higher_performance_gpu --use-cmd-decoder=validating',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'pixel': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-      },
-      'screenshot_sync': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'trace_test': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'webgl_conformance': {
-        'isolate_name': 'fuchsia_telemetry_gpu_integration_test',
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-        'swarming': {
-          'shards': 18,
-        },
-      }
-    },
-
     'fuchsia_sizes_tests': {
       'fuchsia_sizes': {
         'merge': {
@@ -2767,11 +2683,6 @@
           'has_native_resultdb_integration',
         ],
       },
-      'screenshot_sync': {
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
       'trace_test': {
         'mixins': [
           'has_native_resultdb_integration',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index fd38322d..e44a977 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -588,7 +588,7 @@
     'skylab': {
       'cros_board': 'atlas',
       'cros_chrome_version': '101.0.4907.0',
-      'cros_img': 'atlas-release/R101-14537.0.0',
+      'cros_img': 'atlas-release/R101-14538.0.0',
     },
     'enabled': True,
     'identifier': 'ATLAS_LKGM',
@@ -624,7 +624,7 @@
     'skylab': {
       'cros_board': 'eve',
       'cros_chrome_version': '101.0.4907.0',
-      'cros_img': 'eve-release/R101-14537.0.0',
+      'cros_img': 'eve-release/R101-14538.0.0',
     },
     'enabled': True,
     'identifier': 'EVE_LKGM',
@@ -660,7 +660,7 @@
     'skylab': {
       'cros_board': 'kevin',
       'cros_chrome_version': '101.0.4907.0',
-      'cros_img': 'kevin-release/R101-14537.0.0',
+      'cros_img': 'kevin-release/R101-14538.0.0',
     },
     'enabled': True,
     'identifier': 'KEVIN_LKGM',
@@ -669,7 +669,7 @@
     'skylab': {
       'cros_board': 'hana',
       'cros_chrome_version': '101.0.4907.0',
-      'cros_img': 'hana-release/R101-14537.0.0',
+      'cros_img': 'hana-release/R101-14538.0.0',
     },
     'enabled': True,
     'identifier': 'HANA_LKGM',
@@ -678,7 +678,7 @@
     'skylab': {
       'cros_board': 'octopus',
       'cros_chrome_version': '101.0.4907.0',
-      'cros_img': 'octopus-release/R101-14537.0.0',
+      'cros_img': 'octopus-release/R101-14538.0.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_LKGM',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 016034d9..b2697c4 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1812,7 +1812,7 @@
         'test_suites': {
           'gtest_tests': 'fuchsia_gtests',
           'isolated_scripts': 'fuchsia_isolated_scripts',
-          'gpu_telemetry_tests': 'fuchsia_gpu_telemetry_tests',
+          'gpu_telemetry_tests': 'gpu_fuchsia_telemetry_tests',
         },
       },
       'ToTFuchsiaOfficial': {
@@ -2730,6 +2730,26 @@
           'scripts': 'chromium_win_scripts',
         },
       },
+      'Win x64 Builder reclient staging': {
+        # Copied from
+        # https://source.chromium.org/chromium/chromium/src/+/7b147a6777cb32d6a12e1716c61a0ed50dc1229a:testing/buildbot/waterfalls.pyl;l=6023-6030
+        'additional_compile_targets': [
+          'pdf_fuzzers'
+        ],
+        'test_suites': {
+          'scripts': 'chromium_win_scripts',
+        },
+      },
+      'Win x64 Builder reclient test': {
+        # Copied from
+        # https://source.chromium.org/chromium/chromium/src/+/7b147a6777cb32d6a12e1716c61a0ed50dc1229a:testing/buildbot/waterfalls.pyl;l=6023-6030
+        'additional_compile_targets': [
+          'pdf_fuzzers'
+        ],
+        'test_suites': {
+          'scripts': 'chromium_win_scripts',
+        },
+      },
       'Win11 Tests x64': {
         'mixins': [
           'x86-64',
diff --git a/testing/scripts/wpt_android_lib.py b/testing/scripts/wpt_android_lib.py
index e5954f8..cc0d0492 100644
--- a/testing/scripts/wpt_android_lib.py
+++ b/testing/scripts/wpt_android_lib.py
@@ -333,13 +333,24 @@
     else:
       self.system_webview_shell_pkg = 'org.chromium.webview_shell'
 
+  def _install_webview_from_release(self, serial, channel):
+    path = os.path.join(SRC_DIR, 'clank', 'bin', 'install_webview.py')
+    command = [sys.executable, path, '-s', serial, '--channel', channel]
+    return common.run_command(command)
+
   @contextlib.contextmanager
   def _install_apks(self):
-    install_shell_as_needed = _maybe_install_user_apk(
-        self._devices, self.options.system_webview_shell,
-        self.system_webview_shell_pkg)
-    install_webview_provider_as_needed = _maybe_install_webview_provider(
-        self._devices, self.options.webview_provider)
+    if self.options.release_channel:
+      self._install_webview_from_release(self._device.serial,
+                                         self.options.release_channel)
+      install_shell_as_needed = _no_op()
+      install_webview_provider_as_needed = _no_op()
+    else:
+      install_shell_as_needed = _maybe_install_user_apk(
+          self._device, self.options.system_webview_shell,
+          self.system_webview_shell_pkg)
+      install_webview_provider_as_needed = _maybe_install_webview_provider(
+          self._device, self.options.webview_provider)
     with install_shell_as_needed, install_webview_provider_as_needed:
       yield
 
@@ -355,6 +366,9 @@
                               'will be used.'))
     parser.add_argument('--webview-provider',
                         help='Webview provider APK to install.')
+    parser.add_argument('--release-channel',
+                        default=None,
+                        help='Using WebView from release channel.')
 
   @property
   def rest_args(self):
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template b/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
index 90a7d8e..8e69ddf 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
+++ b/third_party/android_deps/buildSrc/src/main/groovy/3ppFetch.template
@@ -23,7 +23,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py b/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
index ce997d72..d45eec7 100755
--- a/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_core_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py b/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
index e834b1e..a502f502 100755
--- a/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_core_runtime/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
index 184f174..11b563f7 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
index 6760c96..06e46252 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
index 071093f..7e50dec 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_livedata/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
index 955b033b..98aa1ec 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_livedata_core/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
index e03fde21..48f33861 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_runtime/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
index 4ccd108..dfe1df0 100755
--- a/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
+++ b/third_party/android_deps/libs/android_arch_lifecycle_viewmodel/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
index 5cd8f6c96..55a10be2 100755
--- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
index 8785dbe..7f6c562 100755
--- a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
index 52cbf5d2..87e64aa 100755
--- a/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_asynclayoutinflater/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
index 49b746e0..6b6e15c 100755
--- a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
index 2909a6c..2138e5c 100755
--- a/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_collections/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
index 3af3e03..c37512d 100755
--- a/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_coordinatorlayout/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
index 23ab31c..ad36900 100755
--- a/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_cursoradapter/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
index 23a126241..f073671 100755
--- a/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_customview/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
index de4838e..276b7e4c 100755
--- a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
index 0622f6b..8f6fa54b 100755
--- a/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_documentfile/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
index dee4716..a0ca72be 100755
--- a/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_drawerlayout/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
index 9d8ea1ee..1a2df77 100755
--- a/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_interpolator/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
index d2db0ab4..be09e86 100755
--- a/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_loader/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
index ae78eb4..3e084eb 100755
--- a/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_localbroadcastmanager/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
index cb8350e..8c895a2 100755
--- a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
index 87bdf7f..44ac5f4 100755
--- a/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_print/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
index 86ad33c..d9b0326 100755
--- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
index 2a9091f5..6ebd43e12 100755
--- a/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_slidingpanelayout/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
index 80ffbea..c4482d7 100755
--- a/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
index 8afa473..1dd47bd 100755
--- a/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_compat/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
index 7bd9385..573809a3 100755
--- a/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_core_ui/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
index b0c450c..a8d05d7 100755
--- a/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_core_utils/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
index 83d2ab7..488e411 100755
--- a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
index ed4c9084..9475ac6 100755
--- a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
index 263d509..b9471920 100755
--- a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
index 2463b34..6ec9781 100755
--- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
index b9ad24a..1e57da96 100755
--- a/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_swiperefreshlayout/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
index 887d9a2e..662eee2 100755
--- a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
index 4252f22c..f3231002 100755
--- a/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_versionedparcelable/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
index 7567a46..14944ae 100755
--- a/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_support_viewpager/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
index 30ff476f..63c63e1 100755
--- a/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
index b4016e5..688e3b6 100755
--- a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
index f8b0f9d..b01426c2 100755
--- a/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
index bd6c1d5..25f0f9d00 100755
--- a/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py b/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
index ae7340b..6c67b0da 100755
--- a/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_android_tools_sdk_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py b/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
index 2782012b..4ce4e43 100755
--- a/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py b/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
index 6841dff..d73cc52 100755
--- a/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
index f70db9a..391dafa9 100755
--- a/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_datatransport_transport_api/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
index 0270bee7..e4aa278 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
index 57fc7b2..6631451 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
index 747d6d1..289089e 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
index a1e0aed..89d1354 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_base/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
index fd846b1..7a57abc 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_basement/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
index 8d96ece..e70b41f 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cast/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
index 645ae2a1..046ed18 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
index d5a9364..76e195c 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
index 9c23401591..bb791513 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
index df18bb0..1b10e87 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_fido/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
index 05b19ad3..5a6e7076 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_flags/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
index b6b21bb..4dd4f8e7 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_gcm/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
index 5467b0b..6a96d0ef 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_iid/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
index 480c2a19..df982d8 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
index 04afd19..cef3272 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_location/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
index 0130971..7117ff1 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
index ccc11a6..94c30f3 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
index 712fbfd..d1d6269ad 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_stats/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
index 803c619..9fb0ea67 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_tasks/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
index 9ab2407..e029d08 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_vision/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
index 1f7becfd..ac55233 100755
--- a/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
index be61f2ce..bab95fd 100755
--- a/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_material_material/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py b/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
index 8b8a738d..dc79802c 100755
--- a/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_android_play_core/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
index b3d0acb..879d438 100755
--- a/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_auto_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
index 94636b3d..04ad9d5 100755
--- a/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_service_auto_service/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
index 64db5fb..aab71ae 100755
--- a/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
index b8276a2..7b890c3 100755
--- a/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
index 2d8ae17..55ced93 100755
--- a/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_findbugs_jformatstring/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
index 06a89bb2..312cd0ea 100755
--- a/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_findbugs_jsr305/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py b/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
index 0e98bf94..635f087 100755
--- a/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_code_gson_gson/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
index f9d38dc..b76b4d4 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
index 2b665d9..13728ae 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_compiler/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
index fe9e40b..36186f2 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_producers/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py b/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
index 9ec653a..ac230b4 100755
--- a/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_dagger_dagger_spi/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
index da387cc..a1ce1a6b 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
index 2d7d544..d48eb9d 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
index 4bddd60..dc88afd 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
index ac12f857..fd39e59b 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_core/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
index 2d65787b..e9a6323 100755
--- a/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
index bb40ecc8..4e2f6c48 100755
--- a/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_javac/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py b/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
index d8bad61..7b31cd5 100755
--- a/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_errorprone_javac_shaded/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
index 0f67f0ed..562596aa 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
index 23cae1a..9f0b00e 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
index c2aa2e1..86d0639 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_components/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
index f1639887..18ab560 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_encoders/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
index 52cbffea0..f5804c9b 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
index 73947c4..8cb3b7e 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_iid/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
index 12d5630..95969299 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
index 29e1f5a..539de72 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_installations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
index b26349b..b691055 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
index 250fba57..575730ac 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py b/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
index 2794104a..f651543 100755
--- a/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_firebase_firebase_messaging/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py b/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
index 0efc5e1c..244b8794 100755
--- a/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_flatbuffers_flatbuffers_java/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py b/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
index 7988dc37..9186492 100755
--- a/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
index 7cfe14cc..2a22281 100755
--- a/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_failureaccess/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
index a5f082d8..377103e 100755
--- a/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_guava/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
index a5f082d8..377103e 100755
--- a/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_guava_android/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py b/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
index a5291270..0967e6f 100755
--- a/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_guava_listenablefuture/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py b/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
index 22c072b6..5f04843 100755
--- a/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py b/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
index 484c0c5c..db3fce0c 100755
--- a/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_protobuf_protobuf_java/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py b/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
index 7324161..4ad394d 100755
--- a/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py b/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
index 9a942e0..c338015 100755
--- a/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py b/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
index bf9f10e..46645bb 100755
--- a/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_squareup_javapoet/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py b/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
index 04a31d3..2edeeea 100755
--- a/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
+++ b/third_party/android_deps/libs/com_squareup_javawriter/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py b/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
index 5d4559a..1a36ebef 100755
--- a/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py b/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
index 193f7e1..5ea523d40 100755
--- a/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_annotation_javax_annotation_api/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py b/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
index 90ab92a..3add31e 100755
--- a/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_annotation_jsr250_api/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py b/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
index c29a17c..5755ca1 100755
--- a/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
+++ b/third_party/android_deps/libs/javax_inject_javax_inject/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py b/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
index c652b45d..eed69f7c 100755
--- a/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
+++ b/third_party/android_deps/libs/net_ltgt_gradle_incap_incap/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
index 7c7365e..022706b 100755
--- a/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
+++ b/third_party/android_deps/libs/net_sf_kxml_kxml2/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py b/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
index 7e8d3f2..7a82e04 100755
--- a/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
index 6f4d948..9eb380b 100755
--- a/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_checker_compat_qual/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
index 5307393e..841b8bf 100755
--- a/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_checker_qual/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py b/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
index ca499d5..8e9369fd8 100755
--- a/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_checkerframework_dataflow_errorprone/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
index c6c7622..2e689cb2 100755
--- a/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py b/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
index fb584dd3..596ce84 100755
--- a/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
index aded062..a2eaea5 100755
--- a/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
index 09799fa..3c24817 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
index f3ae6ffa..4f1be4a2 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
index adad11c..eb131aa9 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
index 15677e8..d81818a 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
index ea9acdd..9c758c1 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
index a46ffaed..8100a55 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
index d5462e0..41f2111 100755
--- a/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
index 7c17032d..5466a461 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
index e7f6b50..dc5d6e5 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_analysis/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
index 2c8b858..57f8509 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_commons/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
index 70913b0..b198d99 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_tree/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py b/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
index 9e1cacb..43f746b 100755
--- a/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_ow2_asm_asm_util/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py b/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
index 1a52098..078231a9 100755
--- a/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_pcollections_pcollections/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
index 6515c48..de24d3a 100755
--- a/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_annotations/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
index 400dc9fa..09f3d58 100755
--- a/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_junit/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_nativeruntime/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_nativeruntime/3pp/fetch.py
index 5252cac..63a88aaf 100755
--- a/third_party/android_deps/libs/org_robolectric_nativeruntime/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_nativeruntime/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
index 3f95f13..7059407 100755
--- a/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_pluginapi/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
index 66040b1..d159686e 100755
--- a/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
index 85a6a87..a22c844 100755
--- a/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_resources/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
index 5e63558..dfd8673 100755
--- a/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_robolectric/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
index d6b3e8a0..483f817 100755
--- a/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_sandbox/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
index d8a7312..28d1ca6 100755
--- a/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadowapi/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
index cd6b00d..c9e5cbc 100755
--- a/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadows_framework/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_multidex/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadows_multidex/3pp/fetch.py
index ed5f948..00919c3f 100755
--- a/third_party/android_deps/libs/org_robolectric_shadows_multidex/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadows_multidex/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
index f5e0685..6168ea2 100755
--- a/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_shadows_playservices/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
index 068f245..65c4467 100755
--- a/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_utils/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py b/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
index 01ff4aa..345d87f 100755
--- a/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
+++ b/third_party/android_deps/libs/org_robolectric_utils_reflector/3pp/fetch.py
@@ -26,7 +26,8 @@
         return
     maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format(
         _REPO_URL, _GROUP_NAME, _MODULE_NAME)
-    metadata = urllib.request.urlopen(maven_metadata_url).read().decode('utf-8')
+    metadata = urllib.request.urlopen(maven_metadata_url).read().decode(
+        'utf-8')
     # Do not parse xml with the python included parser since it is susceptible
     # to maliciously crafted xmls. Only use regular expression parsing to be
     # safe. RE should be enough to handle what we need to extract.
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn
index 0b40b44..fc53ff5 100644
--- a/third_party/blink/common/BUILD.gn
+++ b/third_party/blink/common/BUILD.gn
@@ -207,6 +207,8 @@
     "service_worker/service_worker_scope_match.cc",
     "service_worker/service_worker_status_code.cc",
     "service_worker/service_worker_type_converters.cc",
+    "shared_storage/shared_storage_mojom_traits.cc",
+    "shared_storage/shared_storage_utils.cc",
     "storage_key/storage_key.cc",
     "storage_key/storage_key_mojom_traits.cc",
     "switches.cc",
@@ -345,6 +347,7 @@
     "scheduler/web_scheduler_tracked_feature_unittest.cc",
     "security/address_space_feature_unittest.cc",
     "service_worker/service_worker_scope_match_unittest.cc",
+    "shared_storage/shared_storage_mojom_traits_unittest.cc",
     "storage_key/storage_key_mojom_traits_unittest.cc",
     "storage_key/storage_key_unittest.cc",
     "test/run_all_unittests.cc",
diff --git a/third_party/blink/common/shared_storage/OWNERS b/third_party/blink/common/shared_storage/OWNERS
new file mode 100644
index 0000000..d4d2ff8d
--- /dev/null
+++ b/third_party/blink/common/shared_storage/OWNERS
@@ -0,0 +1,4 @@
+file://third_party/blink/renderer/modules/shared_storage/OWNERS
+
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/common/shared_storage/shared_storage_mojom_traits.cc b/third_party/blink/common/shared_storage/shared_storage_mojom_traits.cc
new file mode 100644
index 0000000..e904e8f8
--- /dev/null
+++ b/third_party/blink/common/shared_storage/shared_storage_mojom_traits.cc
@@ -0,0 +1,33 @@
+// Copyright 2022 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/public/common/shared_storage/shared_storage_mojom_traits.h"
+
+#include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<
+    blink::mojom::SharedStorageKeyArgumentDataView,
+    std::u16string>::Read(blink::mojom::SharedStorageKeyArgumentDataView data,
+                          std::u16string* out_key) {
+  if (!data.ReadData(out_key))
+    return false;
+
+  return blink::IsValidSharedStorageKeyStringLength(out_key->size());
+}
+
+// static
+bool StructTraits<
+    blink::mojom::SharedStorageValueArgumentDataView,
+    std::u16string>::Read(blink::mojom::SharedStorageValueArgumentDataView data,
+                          std::u16string* out_value) {
+  if (!data.ReadData(out_value))
+    return false;
+
+  return blink::IsValidSharedStorageValueStringLength(out_value->size());
+}
+
+}  // namespace mojo
diff --git a/third_party/blink/common/shared_storage/shared_storage_mojom_traits_unittest.cc b/third_party/blink/common/shared_storage/shared_storage_mojom_traits_unittest.cc
new file mode 100644
index 0000000..0427cfe
--- /dev/null
+++ b/third_party/blink/common/shared_storage/shared_storage_mojom_traits_unittest.cc
@@ -0,0 +1,58 @@
+// Copyright 2022 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/public/common/shared_storage/shared_storage_mojom_traits.h"
+
+#include "mojo/public/cpp/test_support/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/shared_storage/shared_storage.mojom.h"
+
+namespace blink {
+namespace {
+
+TEST(SharedStorageMojomTraitsTest, SerializeAndDeserializeKeyArgument) {
+  std::u16string success_originals[] = {std::u16string(u"c"),
+                                        std::u16string(u"hello world"),
+                                        std::u16string(1024, 'c')};
+  for (auto& original : success_originals) {
+    std::u16string copied;
+    EXPECT_TRUE(
+        mojo::test::SerializeAndDeserialize<mojom::SharedStorageKeyArgument>(
+            original, copied));
+    EXPECT_EQ(original, copied);
+  }
+
+  std::u16string failure_originals[] = {std::u16string(),
+                                        std::u16string(1025, 'c')};
+  for (auto& original : failure_originals) {
+    std::u16string copied;
+    EXPECT_FALSE(
+        mojo::test::SerializeAndDeserialize<mojom::SharedStorageKeyArgument>(
+            original, copied));
+  }
+}
+
+TEST(SharedStorageMojomTraitsTest, SerializeAndDeserializeValueArgument) {
+  std::u16string success_originals[] = {std::u16string(), std::u16string(u"c"),
+                                        std::u16string(u"hello world"),
+                                        std::u16string(1024, 'c')};
+  for (auto& original : success_originals) {
+    std::u16string copied;
+    EXPECT_TRUE(
+        mojo::test::SerializeAndDeserialize<mojom::SharedStorageValueArgument>(
+            original, copied));
+    EXPECT_EQ(original, copied);
+  }
+
+  std::u16string failure_originals[] = {std::u16string(1025, 'c')};
+  for (auto& original : failure_originals) {
+    std::u16string copied;
+    EXPECT_FALSE(
+        mojo::test::SerializeAndDeserialize<mojom::SharedStorageValueArgument>(
+            original, copied));
+  }
+}
+
+}  // namespace
+}  // namespace blink
diff --git a/third_party/blink/common/shared_storage/shared_storage_utils.cc b/third_party/blink/common/shared_storage/shared_storage_utils.cc
new file mode 100644
index 0000000..fe140394
--- /dev/null
+++ b/third_party/blink/common/shared_storage/shared_storage_utils.cc
@@ -0,0 +1,30 @@
+// Copyright 2022 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/public/common/shared_storage/shared_storage_utils.h"
+
+#include "third_party/blink/public/common/features.h"
+
+namespace blink {
+
+bool IsValidSharedStorageURLsArrayLength(size_t length) {
+  return length > 0u &&
+         length <=
+             static_cast<size_t>(
+                 features::kSharedStorageURLSelectionOperationInputURLSizeLimit
+                     .Get());
+}
+
+bool IsValidSharedStorageKeyStringLength(size_t length) {
+  return length > 0u &&
+         length <=
+             static_cast<size_t>(features::kMaxSharedStorageStringLength.Get());
+}
+
+bool IsValidSharedStorageValueStringLength(size_t length) {
+  return length <=
+         static_cast<size_t>(features::kMaxSharedStorageStringLength.Get());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index fd5f2e2..f840b3fe 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -261,6 +261,8 @@
     "service_worker/service_worker_status_code.h",
     "service_worker/service_worker_type_converters.h",
     "service_worker/service_worker_types.h",
+    "shared_storage/shared_storage_mojom_traits.h",
+    "shared_storage/shared_storage_utils.h",
     "sms/webotp_constants.h",
     "sms/webotp_service_outcome.h",
     "storage_key/storage_key.h",
diff --git a/third_party/blink/public/common/attribution_reporting/constants.h b/third_party/blink/public/common/attribution_reporting/constants.h
index 0c6a969..a059dea 100644
--- a/third_party/blink/public/common/attribution_reporting/constants.h
+++ b/third_party/blink/public/common/attribution_reporting/constants.h
@@ -11,6 +11,9 @@
 constexpr size_t kMaxValuesPerAttributionFilter = 50;
 constexpr size_t kMaxAttributionFiltersPerSource = 50;
 
+constexpr size_t kMaxBytesPerAttributionAggregatableKeyId = 25;
+constexpr size_t kMaxAttributionAggregatableKeysPerSource = 50;
+
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_ATTRIBUTION_REPORTING_CONSTANTS_H_
diff --git a/third_party/blink/public/common/shared_storage/OWNERS b/third_party/blink/public/common/shared_storage/OWNERS
new file mode 100644
index 0000000..d4d2ff8d
--- /dev/null
+++ b/third_party/blink/public/common/shared_storage/OWNERS
@@ -0,0 +1,4 @@
+file://third_party/blink/renderer/modules/shared_storage/OWNERS
+
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/common/shared_storage/shared_storage_mojom_traits.h b/third_party/blink/public/common/shared_storage/shared_storage_mojom_traits.h
new file mode 100644
index 0000000..29a50be
--- /dev/null
+++ b/third_party/blink/public/common/shared_storage/shared_storage_mojom_traits.h
@@ -0,0 +1,42 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_MOJOM_TRAITS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_MOJOM_TRAITS_H_
+
+#include <string>
+
+#include "mojo/public/cpp/base/string16_mojom_traits.h"
+#include "third_party/blink/public/common/common_export.h"
+#include "third_party/blink/public/mojom/shared_storage/shared_storage.mojom-shared.h"
+
+namespace mojo {
+
+template <>
+struct BLINK_COMMON_EXPORT
+    StructTraits<blink::mojom::SharedStorageKeyArgumentDataView,
+                 std::u16string> {
+  static bool Read(blink::mojom::SharedStorageKeyArgumentDataView data,
+                   std::u16string* out_key);
+
+  static const std::u16string& data(const std::u16string& input) {
+    return input;
+  }
+};
+
+template <>
+struct BLINK_COMMON_EXPORT
+    StructTraits<blink::mojom::SharedStorageValueArgumentDataView,
+                 std::u16string> {
+  static bool Read(blink::mojom::SharedStorageValueArgumentDataView data,
+                   std::u16string* out_value);
+
+  static const std::u16string& data(const std::u16string& input) {
+    return input;
+  }
+};
+
+}  // namespace mojo
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_MOJOM_TRAITS_H_
diff --git a/third_party/blink/public/common/shared_storage/shared_storage_utils.h b/third_party/blink/public/common/shared_storage/shared_storage_utils.h
new file mode 100644
index 0000000..d7637be5
--- /dev/null
+++ b/third_party/blink/public/common/shared_storage/shared_storage_utils.h
@@ -0,0 +1,26 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_UTILS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_UTILS_H_
+
+#include <cstdlib>
+
+#include "third_party/blink/public/common/common_export.h"
+
+namespace blink {
+
+// Whether the length of the urls input parameter (of the
+// sharedStorage.runURLSelectionOperation method) is valid.
+BLINK_COMMON_EXPORT bool IsValidSharedStorageURLsArrayLength(size_t length);
+
+// Whether the length of a shared storage's key is valid.
+BLINK_COMMON_EXPORT bool IsValidSharedStorageKeyStringLength(size_t length);
+
+// Whether the length of shared storage's value is valid.
+BLINK_COMMON_EXPORT bool IsValidSharedStorageValueStringLength(size_t length);
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_SHARED_STORAGE_SHARED_STORAGE_UTILS_H_
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 43dcd83..8c39a9b 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -402,6 +402,19 @@
     {
       types = [
         {
+          mojom = "blink.mojom.SharedStorageKeyArgument"
+          cpp = "::std::u16string"
+        },
+        {
+          mojom = "blink.mojom.SharedStorageValueArgument"
+          cpp = "::std::u16string"
+        },
+      ]
+      traits_headers = [ "//third_party/blink/public/common/shared_storage/shared_storage_mojom_traits.h" ]
+    },
+    {
+      types = [
+        {
           mojom = "blink.mojom.VisualProperties"
           cpp = "::blink::VisualProperties"
         },
diff --git a/third_party/blink/public/mojom/conversions/attribution_data_host.mojom b/third_party/blink/public/mojom/conversions/attribution_data_host.mojom
index 5c3e743..c3d22019 100644
--- a/third_party/blink/public/mojom/conversions/attribution_data_host.mojom
+++ b/third_party/blink/public/mojom/conversions/attribution_data_host.mojom
@@ -19,6 +19,18 @@
   map<string, array<string>> filter_values;
 };
 
+// The aggregatable key is a 128-bit unsigned integer.
+struct AttributionAggregatableKey {
+  uint64 high_bits;
+  uint64 low_bits;
+};
+
+// Defines a list of named histogram contributions.
+struct AttributionAggregatableSources {
+  // Map of key id to the key.
+  map<string, AttributionAggregatableKey> sources;
+};
+
 struct AttributionSourceData {
   // Target site where this source will be triggered.
   //
@@ -44,6 +56,9 @@
   AttributionDebugKey? debug_key;
 
   AttributionFilterData filter_data;
+
+  // Contains source-side aggregatable key pieces.
+  AttributionAggregatableSources aggregatable_sources;
 };
 
 // Browser-process interface responsible for processing attribution
diff --git a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
index df64fdb..82cb505b 100644
--- a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
+++ b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
@@ -4,8 +4,23 @@
 
 module blink.mojom;
 
+import "mojo/public/mojom/base/string16.mojom";
 import "url/mojom/url.mojom";
 
+// The input argument of the shared storage key. The data will be checked at
+// mojom boundary to ensure it meets the length requirement. Avoid using this
+// type if you don't intend to check the key's length.
+struct SharedStorageKeyArgument {
+  mojo_base.mojom.String16 data;
+};
+
+// The input argument of the shared storage value. The data will be checked at
+// mojom boundary to ensure it meets the length requirement. Avoid using this
+// type if you don't intend to check the value's length.
+struct SharedStorageValueArgument {
+  mojo_base.mojom.String16 data;
+};
+
 // SharedStorage is an origin-keyed storage mechanism where the output is
 // carefully guarded to mitigate the risk of cross-site correlation.
 // See https://github.com/pythagoraskitty/shared-storage/blob/main/README.md
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index ae569364..a0e0e03 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1281,6 +1281,7 @@
     "fragment_directive/text_fragment_selector_generator_test.cc",
     "fragment_directive/text_fragment_selector_test.cc",
     "frame/ad_tracker_test.cc",
+    "frame/attribution_response_parsing_test.cc",
     "frame/browser_controls_test.cc",
     "frame/child_frame_compositing_helper_test.cc",
     "frame/csp/content_security_policy_test.cc",
diff --git a/third_party/blink/renderer/core/css/transition.css b/third_party/blink/renderer/core/css/transition.css
index b39d556..d1dfcc9 100644
--- a/third_party/blink/renderer/core/css/transition.css
+++ b/third_party/blink/renderer/core/css/transition.css
@@ -21,7 +21,7 @@
   will-change: transform;
 }
 
-html::transition-container(root) {
+html::page-transition-container(root) {
   right: 0;
   bottom: 0;
 }
diff --git a/third_party/blink/renderer/core/css/transition_animations.css b/third_party/blink/renderer/core/css/transition_animations.css
index 13a1641..1578bb6 100644
--- a/third_party/blink/renderer/core/css/transition_animations.css
+++ b/third_party/blink/renderer/core/css/transition_animations.css
@@ -16,7 +16,7 @@
 }
 
 html::page-transition-incoming-image(*) {
-  animation: fade-in 0.25s;
+  animation: fade-in 0.25s forwards;
 }
 
 @keyframes fade-out {
@@ -26,5 +26,5 @@
 }
 
 html::page-transition-outgoing-image(*) {
-  animation: fade-out 0.25s;
+  animation: fade-out 0.25s forwards;
 }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
index 5b6a0e7..28e99cb 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
+++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
@@ -525,7 +525,7 @@
       builder.AppendFormat(
           R"CSS(
           html::page-transition-container(%s) {
-            animation: page-transition-container-anim-%s 0.25s
+            animation: page-transition-container-anim-%s 0.25s forwards
           }
           )CSS",
           document_transition_tag.c_str(), document_transition_tag.c_str());
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc
new file mode 100644
index 0000000..b47394f
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc
@@ -0,0 +1,123 @@
+// Copyright 2022 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/core/frame/attribution_response_parsing.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/check.h"
+#include "third_party/blink/public/common/attribution_reporting/constants.h"
+#include "third_party/blink/public/mojom/conversions/attribution_data_host.mojom-blink.h"
+#include "third_party/blink/renderer/platform/json/json_parser.h"
+#include "third_party/blink/renderer/platform/json/json_values.h"
+#include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
+
+namespace blink::attribution_response_parsing {
+
+namespace {
+
+mojom::blink::AttributionAggregatableKeyPtr ParseAttributionAggregatableKey(
+    const JSONObject* object) {
+  String key_piece;
+  if (!object->GetString("key_piece", &key_piece))
+    return nullptr;
+
+  // Final keys will be restricted to a maximum of 128 bits and the hex strings
+  // should be limited to at most 32 digits.
+  if (key_piece.length() < 3 || key_piece.length() > 34 ||
+      !key_piece.StartsWith("0x", kTextCaseASCIIInsensitive)) {
+    return nullptr;
+  }
+
+  for (wtf_size_t i = 2; i < key_piece.length(); ++i) {
+    if (!IsASCIIHexDigit(key_piece[i]))
+      return nullptr;
+  }
+
+  uint64_t low_bits;
+  uint64_t high_bits;
+  bool ok = false;
+
+  // The rightmost 16 digits are low bits, and the rest are high bits.
+  if (key_piece.length() <= 18) {
+    low_bits = key_piece.Substring(2).HexToUInt64Strict(&ok);
+    if (!ok)
+      return nullptr;
+    high_bits = 0;
+  } else {
+    low_bits = key_piece.Right(16).HexToUInt64Strict(&ok);
+    if (!ok)
+      return nullptr;
+    high_bits =
+        key_piece.Substring(2, key_piece.length() - 18).HexToUInt64Strict(&ok);
+    if (!ok)
+      return nullptr;
+  }
+
+  return mojom::blink::AttributionAggregatableKey::New(high_bits, low_bits);
+}
+
+}  // namespace
+
+ResponseParseResult<mojom::blink::AttributionAggregatableSources>
+ParseAttributionAggregatableSources(const AtomicString& json_string) {
+  if (json_string.IsEmpty()) {
+    return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+        ResponseParseStatus::kNotFound);
+  }
+
+  std::unique_ptr<JSONValue> json = ParseJSON(json_string);
+  if (!json) {
+    return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+        ResponseParseStatus::kParseError);
+  }
+
+  const auto* array = JSONArray::Cast(json.get());
+  if (!array || array->size() > kMaxAttributionAggregatableKeysPerSource) {
+    return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+        ResponseParseStatus::kInvalidFormat);
+  }
+
+  const wtf_size_t num_keys = array->size();
+
+  auto sources = mojom::blink::AttributionAggregatableSources::New();
+  sources->sources.ReserveCapacityForSize(num_keys);
+
+  for (wtf_size_t i = 0; i < num_keys; ++i) {
+    JSONValue* value = array->at(i);
+    DCHECK(value);
+
+    const auto* object = JSONObject::Cast(value);
+    if (!object) {
+      return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+          ResponseParseStatus::kInvalidFormat);
+    }
+
+    String key_id;
+    if (!object->GetString("id", &key_id) ||
+        key_id.CharactersSizeInBytes() >
+            kMaxBytesPerAttributionAggregatableKeyId) {
+      return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+          ResponseParseStatus::kInvalidFormat);
+    }
+
+    mojom::blink::AttributionAggregatableKeyPtr key =
+        ParseAttributionAggregatableKey(object);
+    if (!key) {
+      return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+          ResponseParseStatus::kInvalidFormat);
+    }
+
+    sources->sources.insert(std::move(key_id), std::move(key));
+  }
+
+  return ResponseParseResult<mojom::blink::AttributionAggregatableSources>(
+      ResponseParseStatus::kSuccess, std::move(sources));
+}
+
+}  // namespace blink::attribution_response_parsing
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing.h b/third_party/blink/renderer/core/frame/attribution_response_parsing.h
new file mode 100644
index 0000000..d0ce380
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/attribution_response_parsing.h
@@ -0,0 +1,52 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_ATTRIBUTION_RESPONSE_PARSING_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_ATTRIBUTION_RESPONSE_PARSING_H_
+
+#include <utility>
+
+#include "third_party/blink/public/mojom/conversions/attribution_data_host.mojom-blink-forward.h"
+#include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/platform/wtf/forward.h"
+
+namespace blink::attribution_response_parsing {
+
+// TODO(crbug.com/1285319): Add metrics for response parsing.
+enum class ResponseParseStatus {
+  kSuccess = 0,
+  kNotFound = 1,
+  kParseError = 2,
+  kInvalidFormat = 3,
+};
+
+template <class T>
+struct ResponseParseResult {
+  explicit ResponseParseResult(ResponseParseStatus status,
+                               mojo::StructPtr<T> value = T::New())
+      : status(status), value(std::move(value)) {}
+
+  ResponseParseStatus status;
+  mojo::StructPtr<T> value;
+};
+
+// Helper functions to parse response headers. See details in the explainer.
+// https://github.com/WICG/conversion-measurement-api/blob/main/EVENT.md
+// https://github.com/WICG/conversion-measurement-api/blob/main/AGGREGATE.md
+
+// Example JSON schema:
+// [{
+//   "id": "campaignCounts",
+//   "key_piece": "0x159"
+// },
+// {
+//   "id": "geoValue",
+//   "key_piece": "0x5"
+// }]
+CORE_EXPORT ResponseParseResult<mojom::blink::AttributionAggregatableSources>
+ParseAttributionAggregatableSources(const AtomicString& json_string);
+
+}  // namespace blink::attribution_response_parsing
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_ATTRIBUTION_RESPONSE_PARSING_H_
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc
new file mode 100644
index 0000000..7cb102f
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc
@@ -0,0 +1,163 @@
+// Copyright 2022 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/core/frame/attribution_response_parsing.h"
+
+#include <string>
+#include <utility>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/attribution_reporting/constants.h"
+#include "third_party/blink/public/mojom/conversions/attribution_data_host.mojom-blink.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
+#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink::attribution_response_parsing {
+
+namespace {
+
+class AggregatableSourcesBuilder {
+ public:
+  AggregatableSourcesBuilder() = default;
+  ~AggregatableSourcesBuilder() = default;
+
+  AggregatableSourcesBuilder& AddKey(
+      String key_id,
+      mojom::blink::AttributionAggregatableKeyPtr key) {
+    sources_.sources.insert(std::move(key_id), std::move(key));
+    return *this;
+  }
+
+  mojom::blink::AttributionAggregatableSourcesPtr Build() const {
+    return sources_.Clone();
+  }
+
+ private:
+  mojom::blink::AttributionAggregatableSources sources_;
+};
+
+}  // namespace
+
+TEST(AttributionResponseParsingTest, ParseAttributionAggregatableSources) {
+  const struct {
+    String description;
+    AtomicString header;
+    ResponseParseStatus status;
+    mojom::blink::AttributionAggregatableSourcesPtr value;
+  } kTestCases[] = {
+      {"Empty header", "", ResponseParseStatus::kNotFound,
+       mojom::blink::AttributionAggregatableSources::New()},
+      {"Invalid JSON", "{", ResponseParseStatus::kParseError,
+       mojom::blink::AttributionAggregatableSources::New()},
+      {"Missing id field", R"([{"key_piece":"0x159"}])",
+       ResponseParseStatus::kInvalidFormat,
+       mojom::blink::AttributionAggregatableSources::New()},
+      {"Missing key_piece field", R"([{"id":"key"}])",
+       ResponseParseStatus::kInvalidFormat,
+       mojom::blink::AttributionAggregatableSources::New()},
+      {"Invalid key", R"([{"id":"key","key_piece":"0xG59"}])",
+       ResponseParseStatus::kInvalidFormat,
+       mojom::blink::AttributionAggregatableSources::New()},
+      {"One valid key", R"([{"id":"key","key_piece":"0x159"}])",
+       ResponseParseStatus::kSuccess,
+       AggregatableSourcesBuilder()
+           .AddKey(/*key_id=*/"key",
+                   mojom::blink::AttributionAggregatableKey::New(
+                       /*high_bits=*/0, /*low_bits=*/345))
+           .Build()},
+      {"Two valid keys",
+       AtomicString(R"([{"id":"key1","key_piece":"0x159"},)") +
+           R"({"id":"key2","key_piece":"0x50000000000000159"}])",
+       ResponseParseStatus::kSuccess,
+       AggregatableSourcesBuilder()
+           .AddKey(/*key_id=*/"key1",
+                   mojom::blink::AttributionAggregatableKey::New(
+                       /*high_bits=*/0, /*low_bits=*/345))
+           .AddKey(/*key_id=*/"key2",
+                   mojom::blink::AttributionAggregatableKey::New(
+                       /*high_bits=*/5, /*low_bits=*/345))
+           .Build()},
+      {"Second key invalid",
+       AtomicString(R"([{"id":"key1","key_piece":"0x159"},)") +
+           R"({"id":"key2","key_piece":""}])",
+       ResponseParseStatus::kInvalidFormat,
+       mojom::blink::AttributionAggregatableSources::New()},
+  };
+
+  for (const auto& test_case : kTestCases) {
+    auto result = ParseAttributionAggregatableSources(test_case.header);
+    EXPECT_EQ(test_case.status, result.status) << test_case.description;
+    EXPECT_EQ(test_case.value, result.value) << test_case.description;
+  }
+}
+
+TEST(AttributionResponseParsingTest,
+     ParseAttributionAggregatableSources_CheckSize) {
+  struct AttributionAggregatableSourcesSizeTestCase {
+    String description;
+    bool valid;
+    wtf_size_t key_count;
+    wtf_size_t key_size;
+
+    AtomicString GetHeader() const {
+      StringBuilder builder;
+
+      const char* separator = "";
+      for (wtf_size_t i = 0u; i < key_count; ++i) {
+        builder.Append(separator);
+        builder.Append("{\"key_piece\":\"0x1\",\"id\":\"");
+        builder.Append(GetKey(i));
+        builder.Append("\"}");
+        separator = ",";
+      }
+
+      return "[" + builder.ToAtomicString() + "]";
+    }
+
+    mojom::blink::AttributionAggregatableSourcesPtr GetValue() const {
+      AggregatableSourcesBuilder builder;
+      if (!valid)
+        return builder.Build();
+
+      for (wtf_size_t i = 0u; i < key_count; ++i) {
+        builder.AddKey(GetKey(i), mojom::blink::AttributionAggregatableKey::New(
+                                      /*high_bits=*/0, /*low_bits=*/1));
+      }
+
+      return builder.Build();
+    }
+
+   private:
+    String GetKey(wtf_size_t index) const {
+      // Note that this might not be robust as
+      // `blink::kMaxAttributionAggregatableKeysPerSource` varies which might
+      // generate invalid JSON.
+      return String(
+          std::string(key_size, 'A' + index % 26 + 32 * (index / 26)));
+    }
+  };
+
+  const AttributionAggregatableSourcesSizeTestCase kTestCases[] = {
+      {"empty", true, 0, 0},
+      {"max_keys", true, blink::kMaxAttributionAggregatableKeysPerSource, 1},
+      {"too_many_keys", false,
+       blink::kMaxAttributionAggregatableKeysPerSource + 1, 1},
+      {"max_key_size", true, 1,
+       blink::kMaxBytesPerAttributionAggregatableKeyId},
+      {"excessive_key_size", false, 1,
+       blink::kMaxBytesPerAttributionAggregatableKeyId + 1},
+  };
+
+  for (const auto& test_case : kTestCases) {
+    auto result = ParseAttributionAggregatableSources(test_case.GetHeader());
+    EXPECT_EQ(result.status, test_case.valid
+                                 ? ResponseParseStatus::kSuccess
+                                 : ResponseParseStatus::kInvalidFormat)
+        << test_case.description;
+    EXPECT_EQ(result.value, test_case.GetValue()) << test_case.description;
+  }
+}
+
+}  // namespace blink::attribution_response_parsing
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
index 73ff4df..88e348f6 100644
--- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc
+++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/public/mojom/conversions/conversions.mojom-blink.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h"
+#include "third_party/blink/renderer/core/frame/attribution_response_parsing.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
@@ -286,6 +287,13 @@
     return;
   }
 
+  const AtomicString& aggregatable_sources_json = response.HttpHeaderField(
+      http_names::kAttributionReportingRegisterAggregatableSource);
+  auto aggregatable_sources =
+      attribution_response_parsing::ParseAttributionAggregatableSources(
+          aggregatable_sources_json);
+  source_data->aggregatable_sources = std::move(aggregatable_sources.value);
+
   it->value->SourceDataAvailable(std::move(source_data));
 }
 
diff --git a/third_party/blink/renderer/core/frame/build.gni b/third_party/blink/renderer/core/frame/build.gni
index ac3f6ea..d34d4b5 100644
--- a/third_party/blink/renderer/core/frame/build.gni
+++ b/third_party/blink/renderer/core/frame/build.gni
@@ -7,6 +7,8 @@
   "ad_tracker.h",
   "attribution_reporting.cc",
   "attribution_reporting.h",
+  "attribution_response_parsing.cc",
+  "attribution_response_parsing.h",
   "attribution_src_loader.cc",
   "attribution_src_loader.h",
   "bar_prop.cc",
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
index 2a1ca43..da66dac3 100644
--- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
@@ -1344,12 +1344,12 @@
         // Items in a row never have container separation. However, the row
         // itself might. Flex rows do not get laid out, so ensure that if
         // the row has container separation, that the container identifies the
-        // row as the next best breakpoint.
+        // row as the potential next best breakpoint.
         if (flex_item_idx == 0) {
           bool row_container_separation = has_processed_first_line_;
           NGBreakStatus row_break_status = BreakBeforeRowIfNeeded(
               line_output, (*row_break_between_outputs)[flex_line_idx],
-              flex_line_idx, flex_item->ng_input_node,
+              flex_line_idx, flex_item->ng_input_node, *layout_result,
               row_container_separation);
           if (row_break_status == NGBreakStatus::kBrokeBefore) {
             ConsumeRemainingFragmentainerSpace();
@@ -1364,12 +1364,10 @@
         has_container_separation =
             last_line_idx_to_process_first_child_ == flex_line_idx;
       }
-      // TODO(almaher): Do we need to perform all of BreakBeforeChildIfNeeded()
-      // for items in a row?
       break_status = BreakBeforeChildIfNeeded(
           ConstraintSpace(), flex_item->ng_input_node, *layout_result,
           ConstraintSpace().FragmentainerOffsetAtBfc() + offset.block_offset,
-          has_container_separation, &container_builder_);
+          has_container_separation, &container_builder_, is_horizontal_flow_);
     }
 
     if (break_status == NGBreakStatus::kBrokeBefore) {
@@ -1629,7 +1627,8 @@
 
     MinMaxSizesResult child_result =
         ComputeMinAndMaxContentContribution(Style(), child, space);
-    NGBoxStrut child_margins = ComputeMinMaxMargins(Style(), child);
+    NGBoxStrut child_margins =
+        ComputeMarginsFor(space, child.Style(), ConstraintSpace());
     child_result.sizes += child_margins.InlineSum();
 
     depends_on_block_constraints |= child_result.depends_on_block_constraints;
@@ -1681,6 +1680,7 @@
     EBreakBetween row_break_between,
     wtf_size_t row_index,
     NGLayoutInputNode child,
+    const NGLayoutResult& layout_result,
     bool has_container_separation) {
   DCHECK(is_horizontal_flow_);
   DCHECK(involved_in_block_fragmentation_);
@@ -1690,7 +1690,6 @@
   if (BreakToken())
     fragmentainer_block_offset -= BreakToken()->ConsumedBlockSize();
 
-  NGBreakAppeal appeal_before = kBreakAppealPerfect;
   if (has_container_separation) {
     if (IsForcedBreakValue(ConstraintSpace(), row_break_between)) {
       BreakBeforeChild(ConstraintSpace(), child, /* layout_result */ nullptr,
@@ -1699,16 +1698,17 @@
                        row.line_cross_size);
       return NGBreakStatus::kBrokeBefore;
     }
-  } else {
-    // TODO(almaher): Handle IsBreakableAtStartOfResumedContainer()?
-    appeal_before = kBreakAppealLastResort;
   }
 
-  if (IsAvoidBreakValue(ConstraintSpace(), row_break_between)) {
-    // If there's a break-{after,before}:avoid* involved at this breakpoint, its
-    // appeal will decrease.
-    appeal_before = std::min(appeal_before, kBreakAppealViolatingBreakAvoid);
-  }
+  // TODO(almaher): We won't be able to rely solely on checking if the first
+  // child is the first for node once we allow more than one break before for
+  // alignment.
+  bool breakable_at_start_of_container = IsBreakableAtStartOfResumedContainer(
+      ConstraintSpace(), layout_result, container_builder_);
+
+  NGBreakAppeal appeal_before = CalculateBreakAppealBefore(
+      ConstraintSpace(), NGLayoutResult::EStatus::kSuccess, row_break_between,
+      has_container_separation, breakable_at_start_of_container);
 
   // Attempt to move past the break point, and if we can do that, also assess
   // the appeal of breaking there, even if we didn't.
@@ -1741,8 +1741,6 @@
   LayoutUnit space_left =
       FragmentainerCapacity(ConstraintSpace()) - fragmentainer_block_offset;
 
-  // TODO(almaher): Handle IsBreakableAtStartOfResumedContainer()?
-
   // If the row starts past the end of the fragmentainer, we must break before
   // it.
   bool must_break_before = false;
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h
index b3556d31..c7c3cbbe 100644
--- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.h
@@ -123,6 +123,7 @@
                                        EBreakBetween row_break_between,
                                        wtf_size_t row_index,
                                        NGLayoutInputNode child,
+                                       const NGLayoutResult& layout_result,
                                        bool has_container_separation);
 
   // Move past the breakpoint before the row, if possible, and return true. Also
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
index 9008c80..dbabe27 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -1900,7 +1900,7 @@
       const MinMaxSizesResult child_result =
           ComputeMinAndMaxContentContribution(style, float_node, float_space);
       LayoutUnit child_inline_margins =
-          ComputeMinMaxMargins(style, float_node).InlineSum();
+          ComputeMarginsFor(float_space, float_node.Style(), space).InlineSum();
 
       if (depends_on_block_constraints_out) {
         *depends_on_block_constraints_out |=
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
index 465766d..834e1de9 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_layout_utils.cc
@@ -58,7 +58,8 @@
   auto result = ComputeMinAndMaxContentContribution(parent_style, child, space);
 
   // Add margins directly here.
-  result.sizes += ComputeMinMaxMargins(parent_style, child).InlineSum();
+  result.sizes +=
+      ComputeMarginsFor(space, child.Style(), parent_space).InlineSum();
 
   return result;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 3cd41f60..41a5f985 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -329,7 +329,10 @@
         << child.ToString();
 
     // Determine the max inline contribution of the child.
-    NGBoxStrut margins = ComputeMinMaxMargins(Style(), child);
+    NGBoxStrut margins =
+        child.IsInline()
+            ? NGBoxStrut()
+            : ComputeMarginsFor(space, child_style, ConstraintSpace());
     LayoutUnit max_inline_contribution;
 
     if (child.IsFloating()) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index 2735b5e..e3daafa 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -462,7 +462,9 @@
       const auto space = builder.ToConstraintSpace();
 
       result = ComputeMinAndMaxContentContribution(Style(), legend, space);
-      result.sizes += ComputeMinMaxMargins(Style(), legend).InlineSum();
+      result.sizes +=
+          ComputeMarginsFor(space, legend.Style(), ConstraintSpace())
+              .InlineSum();
     }
   }
 
@@ -483,7 +485,8 @@
       MinMaxSizesResult content_result =
           ComputeMinAndMaxContentContribution(Style(), content, space);
       content_result.sizes +=
-          ComputeMinMaxMargins(Style(), content).InlineSum();
+          ComputeMarginsFor(space, content.Style(), ConstraintSpace())
+              .InlineSum();
       result.sizes.Encompass(content_result.sizes);
       result.depends_on_block_constraints |=
           content_result.depends_on_block_constraints;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index 3701f530..bccf74d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -57,30 +57,6 @@
   }
 }
 
-// Return true if the container is being resumed after a fragmentainer break,
-// and the child is at the first fragment of a node, and we are allowed to break
-// before it. Normally, this isn't allowed, as that would take us nowhere,
-// progress-wise, but for multicol in nested fragmentation, we'll allow it in
-// some cases. If we set the appeal of breaking before the first child high
-// enough, we'll automatically discard any subsequent less perfect
-// breakpoints. This will make us push everything that would break with an
-// appeal lower than the minimum appeal (stored in the constraint space) ahead
-// of us, until we reach the next column row (in the next outer fragmentainer).
-// That row may be taller, which might help us avoid breaking violations.
-bool IsBreakableAtStartOfResumedContainer(
-    const NGConstraintSpace& space,
-    const NGLayoutResult& child_layout_result,
-    const NGBoxFragmentBuilder& builder) {
-  if (space.MinBreakAppeal() != kBreakAppealLastResort &&
-      IsResumingLayout(builder.PreviousBreakToken())) {
-    if (const auto* box_fragment = DynamicTo<NGPhysicalBoxFragment>(
-            child_layout_result.PhysicalFragment()))
-      return box_fragment->IsFirstForNode();
-    return true;
-  }
-  return false;
-}
-
 }  // anonymous namespace
 
 EBreakBetween JoinFragmentainerBreakValues(EBreakBetween first_value,
@@ -139,17 +115,51 @@
   return builder.JoinedBreakBetweenValue(break_before);
 }
 
+bool IsBreakableAtStartOfResumedContainer(
+    const NGConstraintSpace& space,
+    const NGLayoutResult& child_layout_result,
+    const NGBoxFragmentBuilder& builder) {
+  if (space.MinBreakAppeal() != kBreakAppealLastResort &&
+      IsResumingLayout(builder.PreviousBreakToken())) {
+    DCHECK_EQ(child_layout_result.Status(), NGLayoutResult::kSuccess);
+    if (const auto* box_fragment = DynamicTo<NGPhysicalBoxFragment>(
+            child_layout_result.PhysicalFragment()))
+      return box_fragment->IsFirstForNode();
+    return true;
+  }
+  return false;
+}
+
 NGBreakAppeal CalculateBreakAppealBefore(const NGConstraintSpace& space,
                                          NGLayoutInputNode child,
                                          const NGLayoutResult& layout_result,
                                          const NGBoxFragmentBuilder& builder,
-                                         bool has_container_separation) {
-  DCHECK(layout_result.Status() == NGLayoutResult::kSuccess ||
-         layout_result.Status() == NGLayoutResult::kOutOfFragmentainerSpace);
+                                         bool has_container_separation,
+                                         bool is_row_item) {
+  // Break-before and break-after for items in a row are handled at the row
+  // level, so |breakable_at_start_of_container| should be false for such items.
+  bool breakable_at_start_of_container =
+      !is_row_item &&
+      IsBreakableAtStartOfResumedContainer(space, layout_result, builder);
+  EBreakBetween break_between =
+      CalculateBreakBetweenValue(child, layout_result, builder);
+  return CalculateBreakAppealBefore(space, layout_result.Status(),
+                                    break_between, has_container_separation,
+                                    breakable_at_start_of_container);
+}
+
+NGBreakAppeal CalculateBreakAppealBefore(
+    const NGConstraintSpace& space,
+    NGLayoutResult::EStatus layout_result_status,
+    EBreakBetween break_between,
+    bool has_container_separation,
+    bool breakable_at_start_of_container) {
+  DCHECK(layout_result_status == NGLayoutResult::kSuccess ||
+         layout_result_status == NGLayoutResult::kOutOfFragmentainerSpace);
   NGBreakAppeal break_appeal = kBreakAppealPerfect;
   if (!has_container_separation &&
-      layout_result.Status() == NGLayoutResult::kSuccess) {
-    if (!IsBreakableAtStartOfResumedContainer(space, layout_result, builder)) {
+      layout_result_status == NGLayoutResult::kSuccess) {
+    if (!breakable_at_start_of_container) {
       // This is not a valid break point. If there's no container separation, it
       // means that we're breaking before the first piece of in-flow content
       // inside this block, even if it's not a valid class C break point [1]. We
@@ -169,8 +179,6 @@
     break_appeal = space.MinBreakAppeal();
   }
 
-  EBreakBetween break_between =
-      CalculateBreakBetweenValue(child, layout_result, builder);
   if (IsAvoidBreakValue(space, break_between)) {
     // If there's a break-{after,before}:avoid* involved at this breakpoint, its
     // appeal will decrease.
@@ -589,9 +597,14 @@
                                        const NGLayoutResult& layout_result,
                                        LayoutUnit fragmentainer_block_offset,
                                        bool has_container_separation,
-                                       NGBoxFragmentBuilder* builder) {
+                                       NGBoxFragmentBuilder* builder,
+                                       bool is_row_item) {
   DCHECK(space.HasBlockFragmentation());
 
+  // Items in a row should never have container separation.
+  DCHECK(!is_row_item || !has_container_separation);
+
+  // Break-before and break-after are handled at the row level.
   if (has_container_separation) {
     EBreakBetween break_between =
         CalculateBreakBetweenValue(child, layout_result, *builder);
@@ -603,13 +616,19 @@
     }
   }
 
-  NGBreakAppeal appeal_before = CalculateBreakAppealBefore(
-      space, child, layout_result, *builder, has_container_separation);
+  NGBreakAppeal appeal_before =
+      CalculateBreakAppealBefore(space, child, layout_result, *builder,
+                                 has_container_separation, is_row_item);
+#if DCHECK_IS_ON()
+  if (is_row_item)
+    DCHECK_EQ(appeal_before, NGBreakAppeal::kBreakAppealLastResort);
+#endif
 
   // Attempt to move past the break point, and if we can do that, also assess
   // the appeal of breaking there, even if we didn't.
   if (MovePastBreakpoint(space, child, layout_result,
-                         fragmentainer_block_offset, appeal_before, builder))
+                         fragmentainer_block_offset, appeal_before, builder,
+                         is_row_item))
     return NGBreakStatus::kContinue;
 
   // Breaking inside the child isn't appealing, and we're out of space. Figure
@@ -709,7 +728,8 @@
                         const NGLayoutResult& layout_result,
                         LayoutUnit fragmentainer_block_offset,
                         NGBreakAppeal appeal_before,
-                        NGBoxFragmentBuilder* builder) {
+                        NGBoxFragmentBuilder* builder,
+                        bool is_row_item) {
   if (layout_result.Status() != NGLayoutResult::kSuccess) {
     // Layout aborted - no fragment was produced. There's nothing to move
     // past. We need to break before.
@@ -826,13 +846,14 @@
     if (move_past) {
       // The child either fits, or we are not allowed to break. So we can move
       // past this breakpoint.
-      if (child.IsBlock() && builder) {
+      if (child.IsBlock() && builder && !is_row_item) {
         // We're tentatively not going to break before or inside this child, but
         // we'll check the appeal of breaking there anyway. It may be the best
         // breakpoint we'll ever find. (Note that we only do this for block
         // children, since, when it comes to inline layout, we first need to lay
         // out all the line boxes, so that we know what do to in order to honor
-        // orphans and widows, if at all possible.)
+        // orphans and widows, if at all possible. We also only do this for
+        // non-row items since items in a row will be parallel to one another.)
         UpdateEarlyBreakAtBlockChild(space, To<NGBlockNode>(child),
                                      layout_result, appeal_before, builder);
       }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
index 0dad67fd..27e5f42b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h
@@ -67,12 +67,34 @@
                                          const NGLayoutResult&,
                                          const NGBoxFragmentBuilder&);
 
+// Return true if the container is being resumed after a fragmentainer break,
+// and the child is at the first fragment of a node, and we are allowed to break
+// before it. Normally, this isn't allowed, as that would take us nowhere,
+// progress-wise, but for multicol in nested fragmentation, we'll allow it in
+// some cases. If we set the appeal of breaking before the first child high
+// enough, we'll automatically discard any subsequent less perfect
+// breakpoints. This will make us push everything that would break with an
+// appeal lower than the minimum appeal (stored in the constraint space) ahead
+// of us, until we reach the next column row (in the next outer fragmentainer).
+// That row may be taller, which might help us avoid breaking violations.
+bool IsBreakableAtStartOfResumedContainer(
+    const NGConstraintSpace& space,
+    const NGLayoutResult& child_layout_result,
+    const NGBoxFragmentBuilder& builder);
+
 // Calculate the appeal of breaking before this child.
 NGBreakAppeal CalculateBreakAppealBefore(const NGConstraintSpace&,
                                          NGLayoutInputNode child,
                                          const NGLayoutResult&,
                                          const NGBoxFragmentBuilder&,
-                                         bool has_container_separation);
+                                         bool has_container_separation,
+                                         bool is_row_item = false);
+NGBreakAppeal CalculateBreakAppealBefore(
+    const NGConstraintSpace&,
+    NGLayoutResult::EStatus layout_result_status,
+    EBreakBetween break_between,
+    bool has_container_separation,
+    bool breakable_at_start_of_container);
 
 // Calculate the appeal of breaking inside this child. The appeal is based on
 // the one stored in the layout result, unless hypothetical_appeal is specified.
@@ -240,7 +262,8 @@
                                        const NGLayoutResult&,
                                        LayoutUnit fragmentainer_block_offset,
                                        bool has_container_separation,
-                                       NGBoxFragmentBuilder*);
+                                       NGBoxFragmentBuilder*,
+                                       bool is_row_item = false);
 
 // Insert a break before the child, and propagate space shortage if needed.
 // |block_size_override| should only be supplied when you wish to propagate a
@@ -293,7 +316,8 @@
                         const NGLayoutResult& layout_result,
                         LayoutUnit fragmentainer_block_offset,
                         NGBreakAppeal appeal_before,
-                        NGBoxFragmentBuilder* builder);
+                        NGBoxFragmentBuilder* builder,
+                        bool is_row_item = false);
 
 // If the appeal of breaking before or inside the child is the same or higher
 // than any previous breakpoint we've found, set a new breakpoint in the
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index c515039..5c8d756 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -1236,29 +1236,6 @@
       .ConvertToLogical(compute_for.GetWritingDirection());
 }
 
-NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style,
-                                NGLayoutInputNode child) {
-  // An inline child just produces line-boxes which don't have any margins.
-  if (child.IsInline() || !child.Style().MayHaveMargin())
-    return NGBoxStrut();
-
-  const Length& inline_start_margin_length =
-      child.Style().MarginStartUsing(parent_style);
-  const Length& inline_end_margin_length =
-      child.Style().MarginEndUsing(parent_style);
-
-  // TODO(ikilpatrick): We may want to re-visit calculated margins at some
-  // point. Currently "margin-left: calc(10px + 50%)" will resolve to 0px, but
-  // 10px would be more correct, (as percentages resolve to zero).
-  NGBoxStrut margins;
-  if (inline_start_margin_length.IsFixed())
-    margins.inline_start = LayoutUnit(inline_start_margin_length.Value());
-  if (inline_end_margin_length.IsFixed())
-    margins.inline_end = LayoutUnit(inline_end_margin_length.Value());
-
-  return margins;
-}
-
 namespace {
 
 NGBoxStrut ComputeBordersInternal(const ComputedStyle& style) {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
index f18109d..8a6e47b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
@@ -513,11 +513,6 @@
           {constraint_space.GetWritingMode(), TextDirection::kLtr});
 }
 
-// Compute margins for a child during the min-max size calculation.
-// TODO(ikilpatrick): Replace this function with ComputeMarginsFor.
-CORE_EXPORT NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style,
-                                            NGLayoutInputNode child);
-
 CORE_EXPORT NGBoxStrut ComputeBorders(const NGConstraintSpace&,
                                       const NGBlockNode&);
 
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
index 6585c73..98a2ab8 100644
--- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -53,7 +53,8 @@
 
     MinMaxSizes min_max_sizes =
         ComputeMinAndMaxContentContribution(table_style, caption, space).sizes;
-    min_max_sizes += ComputeMinMaxMargins(table_style, caption).InlineSum();
+    min_max_sizes +=
+        ComputeMarginsFor(space, caption.Style(), table_space).InlineSum();
     caption_min_max.Encompass(min_max_sizes);
   }
   return caption_min_max;
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store_manager.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store_manager.cc
index 5b78997..6420cdb 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store_manager.cc
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store_manager.cc
@@ -16,7 +16,6 @@
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/cookie_store/cookie_change_event.h"
-#include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
diff --git a/third_party/blink/renderer/modules/service_worker/fetch_event.cc b/third_party/blink/renderer/modules/service_worker/fetch_event.cc
index 6df8cc6..23bfe02 100644
--- a/third_party/blink/renderer/modules/service_worker/fetch_event.cc
+++ b/third_party/blink/renderer/modules/service_worker/fetch_event.cc
@@ -19,9 +19,9 @@
 #include "third_party/blink/renderer/core/timing/performance_mark.h"
 #include "third_party/blink/renderer/core/timing/performance_measure.h"
 #include "third_party/blink/renderer/core/timing/worker_global_scope_performance.h"
+#include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_error.h"
-#include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_load_timing.h"
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
index b42388c..f995694 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
@@ -22,7 +22,6 @@
 #include "third_party/blink/renderer/modules/event_target_modules.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_container.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_error.h"
-#include "third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
index a65013e..7b0381b00 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
@@ -107,6 +108,20 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
 
+  if (!IsValidSharedStorageKeyStringLength(key.length())) {
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        script_state->GetIsolate(), DOMExceptionCode::kDataError,
+        "Length of the \"key\" parameter is not valid."));
+    return promise;
+  }
+
+  if (!IsValidSharedStorageValueStringLength(value.length())) {
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        script_state->GetIsolate(), DOMExceptionCode::kDataError,
+        "Length of the \"value\" parameter is not valid."));
+    return promise;
+  }
+
   // TODO: handle the operation
   resolver->Resolve();
   return promise;
@@ -123,6 +138,20 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
 
+  if (!IsValidSharedStorageKeyStringLength(key.length())) {
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        script_state->GetIsolate(), DOMExceptionCode::kDataError,
+        "Length of the \"key\" parameter is not valid."));
+    return promise;
+  }
+
+  if (!IsValidSharedStorageValueStringLength(value.length())) {
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        script_state->GetIsolate(), DOMExceptionCode::kDataError,
+        "Length of the \"value\" parameter is not valid."));
+    return promise;
+  }
+
   // TODO: handle the operation
   resolver->Resolve();
   return promise;
@@ -138,6 +167,13 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
 
+  if (!IsValidSharedStorageKeyStringLength(key.length())) {
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        script_state->GetIsolate(), DOMExceptionCode::kDataError,
+        "Length of the \"key\" parameter is not valid."));
+    return promise;
+  }
+
   // TODO: handle the operation
   resolver->Resolve();
   return promise;
@@ -180,13 +216,10 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
 
-  if (urls.size() >
-      static_cast<unsigned int>(
-          features::kSharedStorageURLSelectionOperationInputURLSizeLimit
-              .Get())) {
+  if (!IsValidSharedStorageURLsArrayLength(urls.size())) {
     resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
         script_state->GetIsolate(), DOMExceptionCode::kDataError,
-        "Length of the \"urls\" parameter exceeds the size limit."));
+        "Length of the \"urls\" parameter is not valid."));
     return promise;
   }
 
diff --git a/third_party/blink/renderer/modules/wake_lock/wake_lock.h b/third_party/blink/renderer/modules/wake_lock/wake_lock.h
index 0199fd7..758260a 100644
--- a/third_party/blink/renderer/modules/wake_lock/wake_lock.h
+++ b/third_party/blink/renderer/modules/wake_lock/wake_lock.h
@@ -11,7 +11,6 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/page/page_visibility_observer.h"
-#include "third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/modules/wake_lock/wake_lock_type.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
@@ -30,6 +29,7 @@
 
 class ExceptionState;
 class NavigatorBase;
+class ScriptPromiseResolver;
 class ScriptState;
 class WakeLockManager;
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
index efc33014..c47bd18 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -98,25 +98,6 @@
   }
 }
 
-// TODO(crbug.com/1197369)This duplicate code is for supporting deprecated API
-// copyImageBitmapToTexture and should be remove in future.
-bool IsValidCopyIB2TDestinationFormat(WGPUTextureFormat dawn_texture_format) {
-  switch (dawn_texture_format) {
-    case WGPUTextureFormat_RGBA8Unorm:
-    case WGPUTextureFormat_RGBA8UnormSrgb:
-    case WGPUTextureFormat_BGRA8Unorm:
-    case WGPUTextureFormat_BGRA8UnormSrgb:
-    case WGPUTextureFormat_RGB10A2Unorm:
-    case WGPUTextureFormat_RGBA16Float:
-    case WGPUTextureFormat_RGBA32Float:
-    case WGPUTextureFormat_RG8Unorm:
-    case WGPUTextureFormat_RG16Float:
-      return true;
-    default:
-      return false;
-  }
-}
-
 bool IsValidCopyTextureForBrowserFormats(SkColorType src_color_type,
                                          WGPUTextureFormat dst_texture_format) {
   // CopyTextureForBrowser only supports RGBA8Unorm and BGRA8Unorm src texture.
@@ -541,88 +522,6 @@
   }
 }
 
-// TODO(crbug.com/1197369): This API contains duplicated code is to stop
-// breaking current workable codes. Will be removed when it is deprecated.
-void GPUQueue::copyImageBitmapToTexture(GPUImageCopyImageBitmap* source,
-                                        GPUImageCopyTexture* destination,
-                                        const V8GPUExtent3D* copy_size,
-                                        ExceptionState& exception_state) {
-  device_->AddConsoleWarning(
-      "The copyImageBitmapToTexture() has been deprecated in favor of the "
-      "copyExternalImageToTexture() "
-      "and will soon be removed.");
-
-  if (!source->imageBitmap()) {
-    exception_state.ThrowTypeError("No valid imageBitmap");
-    return;
-  }
-
-  // ImageBitmap shouldn't in closed state.
-  if (source->imageBitmap()->IsNeutered()) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
-                                      "ImageBitmap is closed.");
-    return;
-  }
-
-  scoped_refptr<StaticBitmapImage> image = source->imageBitmap()->BitmapImage();
-
-  // TODO(shaobo.yan@intel.com) : Check that the destination GPUTexture has an
-  // appropriate format. Now only support texture format exactly the same. The
-  // compatible formats need to be defined in WebGPU spec.
-
-  WGPUExtent3D dawn_copy_size = AsDawnType(copy_size);
-
-  // Extract imageBitmap attributes
-  WGPUOrigin3D origin_in_image_bitmap =
-      GPUOrigin2DToWGPUOrigin3D(source->origin());
-
-  // Validate copy depth
-  if (dawn_copy_size.depthOrArrayLayers > 1) {
-    GetProcs().deviceInjectError(device_->GetHandle(), WGPUErrorType_Validation,
-                                 "Copy depth is out of bounds of imageBitmap.");
-    return;
-  }
-
-  // Validate origin value
-  if (static_cast<uint32_t>(image->width()) < origin_in_image_bitmap.x ||
-      static_cast<uint32_t>(image->height()) < origin_in_image_bitmap.y) {
-    GetProcs().deviceInjectError(
-        device_->GetHandle(), WGPUErrorType_Validation,
-        "Copy origin is out of bounds of imageBitmap.");
-    return;
-  }
-
-  // Validate the copy rect is inside the imageBitmap
-  if (image->width() - origin_in_image_bitmap.x < dawn_copy_size.width ||
-      image->height() - origin_in_image_bitmap.y < dawn_copy_size.height) {
-    GetProcs().deviceInjectError(device_->GetHandle(), WGPUErrorType_Validation,
-                                 "Copy rect is out of bounds of imageBitmap.");
-    return;
-  }
-
-  WGPUImageCopyTexture dawn_destination = AsDawnType(destination, device_);
-
-  if (!IsValidCopyIB2TDestinationFormat(destination->texture()->Format())) {
-    return exception_state.ThrowTypeError("Invalid gpu texture format.");
-  }
-
-  bool isNoopCopy = dawn_copy_size.width == 0 || dawn_copy_size.height == 0 ||
-                    dawn_copy_size.depthOrArrayLayers == 0;
-
-  if (image->IsTextureBacked() && !isNoopCopy) {  // Try GPU uploading path.
-    // Fallback to CPU path, GPU uploading requests RENDER_ATTACHMENT usage for
-    // dst texture.
-    image = image->MakeUnaccelerated();
-  }
-  // CPU path is the fallback path and should always work.
-  if (!CopyContentFromCPU(image.get(), origin_in_image_bitmap, dawn_copy_size,
-                          dawn_destination, destination->texture()->Format(),
-                          image->IsPremultiplied())) {
-    exception_state.ThrowTypeError("Failed to copy content from imageBitmap.");
-    return;
-  }
-}
-
 bool GPUQueue::CopyContentFromCPU(StaticBitmapImage* image,
                                   const WGPUOrigin3D& origin,
                                   const WGPUExtent3D& copy_size,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.h b/third_party/blink/renderer/modules/webgpu/gpu_queue.h
index cff4a84a..0cda6d9 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.h
@@ -17,7 +17,6 @@
 class ExceptionState;
 class GPUBuffer;
 class GPUCommandBuffer;
-class GPUImageCopyImageBitmap;
 class GPUImageCopyExternalImage;
 class GPUImageCopyTexture;
 class GPUImageCopyTextureTagged;
@@ -74,10 +73,6 @@
                                   GPUImageCopyTextureTagged* destination,
                                   const V8GPUExtent3D* copySize,
                                   ExceptionState& exception_state);
-  void copyImageBitmapToTexture(GPUImageCopyImageBitmap* source,
-                                GPUImageCopyTexture* destination,
-                                const V8GPUExtent3D* copy_size,
-                                ExceptionState& exception_state);
 
  private:
   void OnWorkDoneCallback(ScriptPromiseResolver* resolver,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
index ca3b535..fce3b0f 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
@@ -39,12 +39,6 @@
         GPUImageDataLayout dataLayout,
         GPUExtent3D size);
 
-    // Deprecated
-    [RaisesException] void copyImageBitmapToTexture(
-        GPUImageCopyImageBitmap source,
-        GPUImageCopyTexture destination,
-        GPUExtent3D copySize);
-
     [RaisesException] void copyExternalImageToTexture(
         GPUImageCopyExternalImage source,
         GPUImageCopyTextureTagged destination,
diff --git a/third_party/blink/renderer/platform/network/http_names.json5 b/third_party/blink/renderer/platform/network/http_names.json5
index b2d75e2..9d7ec51 100644
--- a/third_party/blink/renderer/platform/network/http_names.json5
+++ b/third_party/blink/renderer/platform/network/http_names.json5
@@ -23,6 +23,7 @@
     "Access-Control-Request-Headers",
     "Access-Control-Request-Method",
     "Allow-CSP-From",
+    "Attribution-Reporting-Register-Aggregatable-Source",
     "Attribution-Reporting-Register-Source",
     "Cache-Control",
     "Content-DPR",
diff --git a/third_party/blink/renderer/platform/wtf/text/atomic_string_table.cc b/third_party/blink/renderer/platform/wtf/text/atomic_string_table.cc
index f6f8a3ba..16e033e 100644
--- a/third_party/blink/renderer/platform/wtf/text/atomic_string_table.cc
+++ b/third_party/blink/renderer/platform/wtf/text/atomic_string_table.cc
@@ -243,27 +243,23 @@
 }  // namespace
 
 AtomicStringTable::AtomicStringTable() {
+  base::AutoLock auto_lock(lock_);
   for (StringImpl* string : StringImpl::AllStaticStrings().Values()) {
     DCHECK(string->length());
     AddNoLock(string);
   }
 }
 
-AtomicStringTable::~AtomicStringTable() {
-  for (StringImpl* string : table_) {
-    if (!string->IsStatic()) {
-      DCHECK(string->IsAtomic());
-      string->UnsetIsAtomic();
-    }
-  }
-}
-
 void AtomicStringTable::ReserveCapacity(unsigned size) {
+  base::AutoLock auto_lock(lock_);
   table_.ReserveCapacityForSize(size);
 }
 
 template <typename T, typename HashTranslator>
 scoped_refptr<StringImpl> AtomicStringTable::AddToStringTable(const T& value) {
+  // Lock not only protects access to the table, it also guarantees
+  // mutual exclusion with the refcount decrement on removal.
+  base::AutoLock auto_lock(lock_);
   HashSet<StringImpl*>::AddResult add_result =
       table_.AddWithTranslator<HashTranslator>(value);
 
@@ -330,6 +326,9 @@
   if (!string->length())
     return StringImpl::empty_;
 
+  // Lock not only protects access to the table, it also guarantess
+  // mutual exclusion with the refcount decrement on removal.
+  base::AutoLock auto_lock(lock_);
   return base::WrapRefCounted(AddNoLock(string));
 }
 
@@ -338,6 +337,9 @@
   if (!string->length())
     return StringImpl::empty_;
 
+  // Lock not only protects access to the table, it also guarantess
+  // mutual exclusion with the refcount decrement on removal.
+  base::AutoLock auto_lock(lock_);
   StringImpl* entry = AddNoLock(string.get());
   if (entry == string.get())
     return std::move(string);
@@ -360,6 +362,7 @@
 AtomicStringTable::WeakResult AtomicStringTable::WeakFindSlowForTesting(
     const StringView& string) {
   DCHECK(string.length());
+  base::AutoLock auto_lock(lock_);
   const auto& it = table_.Find<StringViewLookupTranslator>(string);
   if (it == table_.end())
     return WeakResult();
@@ -372,6 +375,7 @@
   DCHECK(!string.IsLowerASCII());
   DCHECK(string.length());
   HashTranslatorLowercaseBuffer buffer(string.Impl());
+  base::AutoLock auto_lock(lock_);
   const auto& it = table_.Find<LowercaseLookupTranslator>(buffer);
   if (it == table_.end())
     return WeakResult();
@@ -382,11 +386,10 @@
 
 bool AtomicStringTable::ReleaseAndRemoveIfNeeded(StringImpl* string) {
   DCHECK(string->IsAtomic());
-  // Double check that the refcount is still 0. Because Add() could
-  // have added a new reference after the fetch_sub in
-  // StringImpl::Release. This can be a relaxed load, since both
-  // AtomicStringTable::Add() and this logic will be under a lock.
-  if (!string->HasZeroRefRelaxed())
+  base::AutoLock auto_lock(lock_);
+  // Double check that the refcount is still 1. Because Add() could
+  // have added a new reference after the load in StringImpl::Release.
+  if (string->ref_count_.fetch_sub(1, std::memory_order_acq_rel) != 1)
     return false;
 
   auto iterator = table_.find(string);
diff --git a/third_party/blink/renderer/platform/wtf/text/atomic_string_table.h b/third_party/blink/renderer/platform/wtf/text/atomic_string_table.h
index cc03c40..1ebf2b0 100644
--- a/third_party/blink/renderer/platform/wtf/text/atomic_string_table.h
+++ b/third_party/blink/renderer/platform/wtf/text/atomic_string_table.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_impl.h"
 #include "third_party/blink/renderer/platform/wtf/threading.h"
+#include "third_party/blink/renderer/platform/wtf/threading_primitives.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_export.h"
 
 namespace WTF {
@@ -23,11 +24,12 @@
   AtomicStringTable();
   AtomicStringTable(const AtomicStringTable&) = delete;
   AtomicStringTable& operator=(const AtomicStringTable&) = delete;
-  ~AtomicStringTable();
+  ~AtomicStringTable() = delete;
 
-  // Gets the shared table for the current thread.
+  // Gets the shared table.
   static AtomicStringTable& Instance() {
-    return WtfThreading().GetAtomicStringTable();
+    DEFINE_THREAD_SAFE_STATIC_LOCAL(AtomicStringTable, table, ());
+    return table;
   }
 
   // Used by system initialization to preallocate enough storage for all of
@@ -105,11 +107,14 @@
   template <typename T, typename HashTranslator>
   inline scoped_refptr<StringImpl> AddToStringTable(const T& value);
 
-  StringImpl* AddNoLock(StringImpl*);
+  // AddNoLock does not take the lock itself but expects every caller to
+  // do it before calling it.
+  StringImpl* AddNoLock(StringImpl*) EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
   WeakResult WeakFindSlowForTesting(const StringView&);
 
-  HashSet<StringImpl*> table_;
+  base::Lock lock_;
+  HashSet<StringImpl*> table_ GUARDED_BY(lock_);
 };
 
 inline bool operator==(const AtomicStringTable::WeakResult& lhs,
diff --git a/third_party/blink/renderer/platform/wtf/text/string_impl.cc b/third_party/blink/renderer/platform/wtf/text/string_impl.cc
index fa55072..d86196dd 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_impl.cc
+++ b/third_party/blink/renderer/platform/wtf/text/string_impl.cc
@@ -77,6 +77,7 @@
 
 void StringImpl::DestroyIfNeeded() const {
   if (hash_and_flags_.load(std::memory_order_acquire) & kIsAtomic) {
+    // TODO: Remove const_cast
     if (AtomicStringTable::Instance().ReleaseAndRemoveIfNeeded(
             const_cast<StringImpl*>(this))) {
       delete this;
diff --git a/third_party/blink/renderer/platform/wtf/text/string_impl.h b/third_party/blink/renderer/platform/wtf/text/string_impl.h
index ef386d4e..85602af 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_impl.h
+++ b/third_party/blink/renderer/platform/wtf/text/string_impl.h
@@ -268,10 +268,6 @@
     return ref_count_.load(std::memory_order_acquire) == 1;
   }
 
-  ALWAYS_INLINE bool HasZeroRefRelaxed() const {
-    return ref_count_.load(std::memory_order_relaxed) == 0;
-  }
-
   ALWAYS_INLINE void AddRef() const {
     if (!IsStatic()) {
       uint32_t previous_ref_count =
@@ -283,20 +279,55 @@
     }
   }
 
+  // We explicitly remove the AddRef and Release operations from the tsan
+  // bots because even though all data races in the C++ memory model sense
+  // are undefined behavior, the use of atomics prevents a data race on
+  // ref_count_ itself.
+
+  // Sharing the AtomicStringTable causes other races outside of ref_count_
+  // that could lead to an early deletion of the StringImpl while other
+  // threads are still holding references to it.
+  // Possible races:
+  // 1. Races where ref_count_ doesn't reach zero are not harmful.
+  // 2. Races involving only release calls are not harmful. The
+  //    atomicity of the operations guarantee that only the last subtraction to
+  //    be executed will trigger the deletion of the StringImpl.
+  // 3. A fetch_add on thread A is ordered after a fetch_sub on thread B that
+  //    reaches 0. This can only happen on an AddRef() reached through the
+  //    AtomicStringTable::Add* methods, otherwise there should be another
+  //    reference on thread A, and the Release() on thread B could not have
+  //    reached 0. This race is mitigated by the fact that the Atomic String
+  //    Table Add and Removal operations (including the fetch_sub to 0) are
+  //    done under a lock.
+
   ALWAYS_INLINE void Release() const {
     if (!IsStatic()) {
-      uint32_t previous_ref_count =
-          ref_count_.fetch_sub(1, std::memory_order_acq_rel);
+      // This can be a relaxed load as long as the subtraction is performed
+      // with acq_rel order. Any modification to `ref_count_` reordered after
+      // this load will be caught by the while loop or the fetch_sub inside
+      // DestroyIfNeeded().
+      uint32_t current_ref = ref_count_.load(std::memory_order_relaxed);
 #if DCHECK_IS_ON()
       // In non-DCHECK builds, we can save a bit of time in micro-benchmarks by
       // not checking the arithmetic. We hope that checking in DCHECK builds is
       // enough to catch implementation bugs, and that implementation bugs are
       // the only way we'd experience underflow.
-      DCHECK_NE(previous_ref_count, 0u);
+      DCHECK_NE(current_ref, 0u);
       ref_count_change_count_++;
 #endif
-      if (previous_ref_count == 1)
-        DestroyIfNeeded();
+      // This is a fancy fetch_sub() that allows the actual decrement to 0 to
+      // be delegated to the DestroyIfNeeded() function. The result of this
+      // compare_exchange_weak() will never be 0. Without this, there would be
+      // a potential race by reaching 0 and calling AddRef and Release on
+      // another thread before the deletion of the string in this thread,
+      // triggering the removal and destruction of the string twice.
+      do {
+        if (current_ref == 1) {
+          DestroyIfNeeded();
+          return;
+        }
+      } while (!ref_count_.compare_exchange_weak(current_ref, current_ref - 1,
+                                                 std::memory_order_acq_rel));
     }
   }
 
@@ -464,6 +495,7 @@
   static const UChar kLatin1CaseFoldTable[256];
 
  private:
+  friend class AtomicStringTable;
   enum Flags {
     // These two fields are never modified for the lifetime of the StringImpl.
     // It is therefore safe to read them with a relaxed operation.
diff --git a/third_party/blink/renderer/platform/wtf/threading.cc b/third_party/blink/renderer/platform/wtf/threading.cc
index 7da9fda..56bf9a7 100644
--- a/third_party/blink/renderer/platform/wtf/threading.cc
+++ b/third_party/blink/renderer/platform/wtf/threading.cc
@@ -7,7 +7,6 @@
 #include <atomic>
 #include "build/build_config.h"
 #include "third_party/blink/renderer/platform/wtf/stack_util.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string_table.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_codec_icu.h"
 
 namespace WTF {
@@ -40,8 +39,7 @@
 ThreadSpecific<Threading>* Threading::static_data_;
 
 Threading::Threading()
-    : atomic_string_table_(new AtomicStringTable),
-      cached_converter_icu_(new ICUConverterWrapper),
+    : cached_converter_icu_(new ICUConverterWrapper),
       thread_id_(CurrentThread()) {}
 
 Threading::~Threading() = default;
diff --git a/third_party/blink/renderer/platform/wtf/threading.h b/third_party/blink/renderer/platform/wtf/threading.h
index e9b3fec..302a200 100644
--- a/third_party/blink/renderer/platform/wtf/threading.h
+++ b/third_party/blink/renderer/platform/wtf/threading.h
@@ -59,7 +59,6 @@
 WTF_EXPORT void SetIsBeforeThreadCreatedForTest();
 #endif
 
-class AtomicStringTable;
 struct ICUConverterWrapper;
 
 class WTF_EXPORT Threading {
@@ -71,8 +70,6 @@
   Threading& operator=(const Threading&) = delete;
   ~Threading();
 
-  AtomicStringTable& GetAtomicStringTable() { return *atomic_string_table_; }
-
   ICUConverterWrapper& CachedConverterICU() { return *cached_converter_icu_; }
 
   base::PlatformThreadId ThreadId() const { return thread_id_; }
@@ -85,7 +82,6 @@
 #endif
 
  private:
-  std::unique_ptr<AtomicStringTable> atomic_string_table_;
   std::unique_ptr<ICUConverterWrapper> cached_converter_icu_;
 
   base::PlatformThreadId thread_id_;
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 7b7145b..6d7e8799 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -487,6 +487,7 @@
             "power_scheduler::.+",
 
             # Nested namespaces under the blink namespace
+            'attribution_response_parsing::.+',
             'bindings::.+',
             'canvas_heuristic_parameters::.+',
             'compositor_target_property::.+',
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index ae1e27f..27453d4 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -544,6 +544,11 @@
 crbug.com/1251788 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-004.html [ Failure ]
 crbug.com/1157740 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-024.html [ Failure ]
 crbug.com/1157740 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-026.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/calc-margins-block.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/calc-margins-fieldset-content.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/calc-margins-fieldset-legend.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/calc-margins-flex.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/calc-margins-table-caption.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005.html [ Failure ]
@@ -1412,6 +1417,7 @@
 crbug.com/1178754 external/wpt/html/semantics/interactive-elements/the-popup-element/popup-light-dismiss.tentative.html [ Crash ]
 
 ### external/wpt/layout-instability
+crbug.com/829028 external/wpt/layout-instability/multicol-000.html [ Failure ]
 crbug.com/829028 external/wpt/layout-instability/multicol-001.html [ Failure ]
 
 ### virtual/stable/compositing/filters/
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index b05b6f9..aece3e0 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1633,6 +1633,10 @@
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-035.html [ Pass ]
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-037.html [ Pass ]
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-038.html [ Pass ]
+virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-039.html [ Pass ]
+virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-040.html [ Pass ]
+virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-041.tentative.html [ Pass ]
+virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-042.tentative.html [ Pass ]
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-012.html [ Pass ]
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-014.html [ Pass ]
 virtual/layout_ng_flex_frag/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-015.html [ Pass ]
@@ -3330,6 +3334,7 @@
 crbug.com/626703 [ Linux ] external/wpt/url/a-element-xhtml.xhtml [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/failure.html [ Failure ]
 crbug.com/626703 virtual/prerender/external/wpt/speculation-rules/prerender/workers.html [ Failure ]
+crbug.com/626703 [ Win ] external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
 crbug.com/626703 [ Mac11 ] external/wpt/scroll-to-text-fragment/force-load-at-top.html [ Timeout ]
@@ -4302,6 +4307,10 @@
 crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-035.html [ Failure ]
 crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-037.html [ Failure ]
 crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-038.html [ Failure ]
+crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-039.html [ Failure ]
+crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-040.html [ Failure ]
+crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-041.tentative.html [ Failure ]
+crbug.com/660611 external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-042.tentative.html [ Failure ]
 crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-012.html [ Failure ]
 crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-014.html [ Failure ]
 crbug.com/660611 external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-015.html [ Failure ]
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations
index 8618546..08a794c 100644
--- a/third_party/blink/web_tests/WebGPUExpectations
+++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -155,20 +155,6 @@
 # Failures because readonly storage textures have been removed. https://crbug.com/dawn/1025
 crbug.com/dawn/1025 wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:unused_bindings_in_pipeline:* [ Failure ]
 
-# Failures because of the changes on the validation rules on the texture format of multisampled
-# texture creation.
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="r32sint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="r32uint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rg32float";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rg32sint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rg32uint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rgba32float";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rgba32sint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rgba32uint";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="2d";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="_undef_";* [ Failure ]
-crbug.com/dawn/1244 wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,various_sampleCount_with_all_formats:* [ Failure ]
-
 ###
 ### Test bugs (fixed upstream)
 ###
@@ -400,9 +386,8 @@
 # TODO r8unorm and rg8unorm only
 crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,render_pass,storeOp:render_pass_store_op,color_attachment_only:* [ Failure ]
 crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:mipLevelCount,format:* [ Failure ]
-# TODO recover the below two test expectations after new MSAA rules are implemented (see crbug.com/dawn/1244 for more details)
-# crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="_undef_";* [ Failure ]
-# crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="2d";* [ Failure ]
+crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="_undef_";* [ Failure ]
+crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="2d";* [ Failure ]
 crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="3d";* [ Failure ]
 crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,texture_related:format:method="CopyB2T";* [ Failure ]
 crbug.com/dawn/1071 [ Mac ] wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,texture_related:format:method="CopyT2B";* [ Failure ]
diff --git a/third_party/blink/web_tests/document-transition/paint-order.html b/third_party/blink/web_tests/document-transition/paint-order.html
index 0b06dbfd..5590d8c 100644
--- a/third_party/blink/web_tests/document-transition/paint-order.html
+++ b/third_party/blink/web_tests/document-transition/paint-order.html
@@ -13,10 +13,12 @@
 html::page-transition-outgoing-image(shared-0) {
   opacity: 1;
   mix-blend-mode: normal;
+  animation: unset;
 }
 html::page-transition-incoming-image(shared-0) {
   opacity: 1;
   mix-blend-mode: multiply;
+  animation: unset;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-039.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-039.html
new file mode 100644
index 0000000..4d33426
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-039.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>
+  Multi-line row flex fragmentation: nested column balancing.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#pagination">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+  #flex {
+    display: flex;
+    flex-wrap: wrap;
+    position: relative;
+  }
+  #flex > div {
+    height: 100px;
+    width: 100%;
+    background: green;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns: 2; column-fill: auto; column-gap: 0; width: 100px; height: 100px; background: red;">
+  <div style="height: 50px; background: green;"></div>
+  <div style="columns: 2; column-fill: auto; column-gap: 0;">
+    <div id="flex">
+      <div style="position: absolute; left: 25px; height: 50px;"></div>
+      <div style="height: 50px;"></div>
+      <div style="width: 50%;"></div>
+      <div style="width: 50%; break-inside: avoid;"></div>
+      <div></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-040.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-040.html
new file mode 100644
index 0000000..0eaff879
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-040.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>
+  Multi-line row flex fragmentation: nested column balancing.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#pagination">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+  #flex {
+    display: flex;
+    flex-wrap: wrap;
+    position: relative;
+  }
+  #flex > div {
+    height: 50px;
+    width: 100%;
+    background: green;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="columns: 2; column-fill: auto; column-gap: 0; width: 100px; height: 100px; background: red;">
+  <div style="height: 50px; background: green;"></div>
+  <div style="columns: 2; column-fill: auto; column-gap: 0;">
+    <div id="flex">
+      <div style="position: absolute; left: 25px;"></div>
+      <div></div>
+      <div style="width: 50%;"></div>
+      <div style="width: 50%; break-after: avoid;"></div>
+      <div style="height: 150px;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-041.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-041.tentative.html
new file mode 100644
index 0000000..51f0d74
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-041.tentative.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>
+  Multi-line row flex fragmentation: tall content inside constrained block.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#pagination">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+  #flex {
+    display: flex;
+    flex-wrap: wrap;
+  }
+  #flex > div {
+    width: 100%;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width: 100px; height: 100px; background: red;">
+  <div style="columns: 2; column-fill: auto; column-gap: 0; height: 75px;">
+    <div id="flex">
+      <div style="height: 50px; background: green;"></div>
+      <div style="height: 25px; background: red;">
+        <div style="contain: size; height: 50px; background: green;"></div>
+        <div style="contain: size; height: 100px; background: green;"></div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-042.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-042.tentative.html
new file mode 100644
index 0000000..45844c0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-042.tentative.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>
+  Multi-line row flex fragmentation: tall content inside constrained block.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#pagination">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<style>
+  #flex {
+    display: flex;
+    flex-wrap: wrap;
+    height: 25px;
+    background: red;
+  }
+  #flex > div {
+    width: 100%;
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width: 100px; height: 100px; background: red;">
+  <div style="columns: 2; column-fill: auto; column-gap: 0; height: 75px;">
+    <div style="height: 50px; background: green;"></div>
+    <div id="flex">
+      <div style="contain: size; height: 50px; background: green;"></div>
+      <div style="contain: size; height: 100px; background: green;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-block.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-block.html
new file mode 100644
index 0000000..362d364
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-block.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=823066">
+<meta name="assert" content="Checks that calc() margins are resolved against zero for content sizing.">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="width: min-content; height: 100px; background: green;">
+  <div style="margin-left: calc(10% + 100px);"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-content.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-content.html
new file mode 100644
index 0000000..6a74dd08
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-content.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=823066">
+<meta name="assert" content="Checks that calc() margins are resolved against zero for content sizing.">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<fieldset style="width: min-content; height: 100px; margin: 0; padding: 0; border: none; background: green;">
+  <div style="margin-left: calc(10% + 100px);"></div>
+</fieldset>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-legend.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-legend.html
new file mode 100644
index 0000000..001bcb0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-fieldset-legend.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=823066">
+<meta name="assert" content="Checks that calc() margins are resolved against zero for content sizing.">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<fieldset style="width: min-content; height: 100px; margin: 0; padding: 0; border: none; background: green;">
+  <legend style="margin-left: calc(10% + 100px); padding: 0;"></legend>
+</fieldset>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-flex.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-flex.html
new file mode 100644
index 0000000..d1dbbcf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-flex.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=823066">
+<meta name="assert" content="Checks that calc() margins are resolved against zero for content sizing.">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="display: flex; width: min-content; height: 100px; background: green;">
+  <div style="margin-left: calc(10% + 100px);"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-table-caption.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-table-caption.html
new file mode 100644
index 0000000..dd9ab68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/calc-margins-table-caption.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=823066">
+<meta name="assert" content="Checks that calc() margins are resolved against zero for content sizing.">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="display: table; width: min-content; height: 100px; background: green;">
+  <div style="dipslay: table-caption; margin-left: calc(10% + 100px);"></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
index 0d881b7..9a578cb 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-clip-path.html
@@ -25,10 +25,10 @@
 /* We're verifying what we capture, so just display the new contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
 html::page-transition-image-wrapper(*) { isolation: isolate; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 1; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 0; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 1; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 0; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box></div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
index 01d1ca2..6cd4cb8 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-different-size.html
@@ -34,10 +34,10 @@
 div.dst { background: lightgreen; }
 /* We're verifying what we capture, so just display the new contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 1; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 0; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 1; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 0; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box>one</div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html
index ae759ee..72f348a0 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-captures-opacity.html
@@ -22,10 +22,10 @@
 div.dst { background: lightgreen; }
 /* We're verifying what we capture, so just display the new contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 1; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 0; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 1; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 0; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box></div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html
index cb589cb8..30e7af5 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-clip-path.html
@@ -24,10 +24,10 @@
 div.dst { background: lightgreen; }
 /* We're verifying what we capture, so just display the old contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 0; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 1; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 0; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 1; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box></div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
index 2718056..2c8677a 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-different-size.html
@@ -34,10 +34,10 @@
 div.dst { background: lightgreen; }
 /* We're verifying what we capture, so just display the old contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 0; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 1; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 0; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 1; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box>one</div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
index bdfcdb6..5f02095 100644
--- a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-opacity.html
@@ -23,10 +23,10 @@
 div.dst { background: lightgreen; }
 /* We're verifying what we capture, so just display the old contents for 5 minutes.  */
 html::page-transition-container(*) { animation-duration: 300s; }
-html::page-transition-incoming-image(*) { animation-duration: 0s; opacity: 0; }
-html::page-transition-outgoing-image(*) { animation-duration: 0s; opacity: 1; }
+html::page-transition-incoming-image(*) { animation: unset; opacity: 0; }
+html::page-transition-outgoing-image(*) { animation: unset; opacity: 1; }
 /* hide the root so we show transition background to ensure we're in a transition */
-html::page-transition-container(root) { animation-duration: 0s; opacity: 0; }
+html::page-transition-container(root) { animation: unset; opacity: 0; }
 html::page-transition { background: lightpink; }
 </style>
 <div id=e1 class=box>one</div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root-ref.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root-ref.html
new file mode 100644
index 0000000..d0e020b
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>Shared transitions: capture root elements (ref)</title>
+<link rel="help" href="https://github.com/WICG/shared-element-transitions">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+<style>
+.box {
+  background: lightblue;
+  width: 100px;
+  height: 100px;
+  contain: paint;
+  position: absolute;
+  font-size: 30pt;
+}
+#e1 {
+  top: 20px;
+  left: 20px;
+}
+</style>
+<div id=e1 class=box></div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
new file mode 100644
index 0000000..dac3abab
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/document-transition/old-content-captures-root.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<title>Shared transitions: capture root elements</title>
+<link rel="help" href="https://github.com/WICG/shared-element-transitions">
+<link rel="author" href="mailto:vmpstr@chromium.org">
+<link rel="match" href="old-content-captures-root-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<style>
+.box {
+  background: lightblue;
+  width: 100px;
+  height: 100px;
+  contain: paint;
+  position: absolute;
+  font-size: 30pt;
+}
+#e1 {
+  top: 20px;
+  left: 20px;
+}
+#shared {
+  contain: paint;
+  width: 100px;
+  height: 100px;
+  background: red;
+}
+div.dst { background: lightgreen; }
+/* We're verifying what we capture, so just display the old contents for 5 minutes.  */
+html::page-transition { background: pink; }
+html::page-transition-container(shared-0) { animation-duration: 300s; }
+html::page-transition-image-wrapper(shared-0) { visibility: hidden }
+html::page-transition-outgoing-image(root) { animation: unset; opacity: 1 }
+html::page-transition-incoming-image(root) { animation: unset; opacity: 0 }
+</style>
+<div id=e1 class=box></div>
+<div id=shared></div>
+<script>
+async function runTest() {
+  await document.documentTransition.prepare({
+    rootTransition: "none",
+    sharedElements: [shared]
+  });
+  e1.classList.add("dst");
+  document.documentTransition.start({
+    sharedElements: [shared]
+  });
+
+  requestAnimationFrame(() => requestAnimationFrame(takeScreenshot));
+}
+onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest));
+</script>
+
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
index d7f39fe..d81fc78b 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
@@ -12,5 +12,29 @@
       "test-url-selection-operation", ["resources/frame0.html"]));
 }, 'runURLSelectionOperation without addModule');
 
+promise_test(async t => {
+  try {
+      await sharedStorage.runURLSelectionOperation(
+        "test-url-selection-operation", ["1", "2", "3", "4", "5", "6"]);
+  } catch (e) {
+    assert_equals(e.name, 'DataError');
+    assert_equals(e.message, 'Length of the \"urls\" parameter is not valid.');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'runURLSelectionOperation with urls array length too big');
+
+promise_test(async t => {
+  try {
+      await sharedStorage.runURLSelectionOperation(
+        "test-url-selection-operation", []);
+  } catch (e) {
+    assert_equals(e.name, 'DataError');
+    assert_equals(e.message, 'Length of the \"urls\" parameter is not valid.');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'runURLSelectionOperation with empty urls array');
+
 </script>
 </body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/setters.html b/third_party/blink/web_tests/wpt_internal/shared_storage/setters.html
index 55c3c6e..ffc4bfb 100644
--- a/third_party/blink/web_tests/wpt_internal/shared_storage/setters.html
+++ b/third_party/blink/web_tests/wpt_internal/shared_storage/setters.html
@@ -27,6 +27,40 @@
 }, 'sharedStorage.set with invalid options');
 
 promise_test(() => {
+  return sharedStorage.set('a'.repeat(1024), 'b'.repeat(1024));
+}, 'sharedStorage.set with max allowed key and value length');
+
+promise_test(async t => {
+  try {
+      await sharedStorage.set('', 'b');
+  } catch (e) {
+    assert_equals(e.name, 'DataError');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'sharedStorage.set with empty key');
+
+promise_test(async t => {
+  try {
+      await sharedStorage.set('a'.repeat(1025), 'b');
+  } catch (e) {
+    assert_equals(e.name, 'DataError');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'sharedStorage.set with key length too big');
+
+promise_test(async t => {
+  try {
+      await sharedStorage.set('a', 'b'.repeat(1025));
+  } catch (e) {
+    assert_equals(e.name, 'DataError');
+    return;
+  }
+  assert_unreached("did not reject");
+}, 'sharedStorage.set with value length too big');
+
+promise_test(() => {
   return sharedStorage.append("a", "b");
 }, 'sharedStorage.append');
 
diff --git a/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html b/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html
index 0f994638..e2c3b6582 100644
--- a/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html
+++ b/third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html
@@ -2566,6 +2566,7 @@
 <meta name=variant content='?q=webgpu:api,validation,render_pass_descriptor:use_a_resolve_target_in_a_format_different_than_the_attachment_is_not_allowed:*'>
 <meta name=variant content='?q=webgpu:api,validation,render_pass_descriptor:size_of_the_resolve_target_must_be_the_same_as_the_color_attachment:*'>
 <meta name=variant content='?q=webgpu:api,validation,render_pass_descriptor:check_depth_stencil_attachment_sample_counts_mismatch:*'>
+<meta name=variant content='?q=webgpu:api,validation,render_pass_descriptor:multisample_render_target_formats_support_resolve:*'>
 <meta name=variant content='?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_color:*'>
 <meta name=variant content='?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:compute=false;binding0InBundle=false;*'>
 <meta name=variant content='?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:compute=false;binding0InBundle=true;*'>
diff --git a/third_party/fuchsia-sdk/DIR_METADATA b/third_party/fuchsia-sdk/DIR_METADATA
index d537e1b..f7f8861f 100644
--- a/third_party/fuchsia-sdk/DIR_METADATA
+++ b/third_party/fuchsia-sdk/DIR_METADATA
@@ -1,5 +1,5 @@
 monorail {
   component: "Fuchsia"
 }
-team_email: "cr-fuchsia@chromium.org"
+team_email: "fuchsia-dev@chromium.org"
 os: FUCHSIA
diff --git a/third_party/rust/cxx/v1/BUILD.gn b/third_party/rust/cxx/v1/BUILD.gn
index cefa7947..6998416e 100644
--- a/third_party/rust/cxx/v1/BUILD.gn
+++ b/third_party/rust/cxx/v1/BUILD.gn
@@ -15,7 +15,7 @@
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
   deps = [
-    "//third_party/rust/cxxbridge_macro/v1:lib($host_toolchain)",
+    "//third_party/rust/cxxbridge_macro/v1:lib",
     "//third_party/rust/link_cplusplus/v1:lib",
   ]
   build_root = "crate/build.rs"
diff --git a/third_party/rust/serde/v1/BUILD.gn b/third_party/rust/serde/v1/BUILD.gn
index 2785d65..817cfcfa 100644
--- a/third_party/rust/serde/v1/BUILD.gn
+++ b/third_party/rust/serde/v1/BUILD.gn
@@ -14,7 +14,7 @@
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
-  deps = [ "//third_party/rust/serde_derive/v1:lib($host_toolchain)" ]
+  deps = [ "//third_party/rust/serde_derive/v1:lib" ]
   features = [
     "derive",
     "serde_derive",
diff --git a/third_party/sqlite/sqlite_common_configuration_flags.gni b/third_party/sqlite/sqlite_common_configuration_flags.gni
index 04f1c12..df9552fcb 100644
--- a/third_party/sqlite/sqlite_common_configuration_flags.gni
+++ b/third_party/sqlite/sqlite_common_configuration_flags.gni
@@ -74,6 +74,9 @@
   # Chrome does not use sqlite3_column_decltype().
   "SQLITE_OMIT_DECLTYPE",
 
+  # Chrome does not use SQLite's JSON support.
+  "SQLITE_OMIT_JSON",
+
   # Chrome does not use sqlite3_{enable_}load_extension().
   # Asides from giving us fairly minor code savings, this option disables code
   # that breaks our method for renaming SQLite's exported symbols. Last,
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium
index a03b0ba4..194b573 100644
--- a/third_party/tflite/README.chromium
+++ b/third_party/tflite/README.chromium
@@ -1,8 +1,8 @@
 Name: TensorFlow Lite
 Short Name: tflite
 URL: https://github.com/tensorflow/tensorflow
-Version: 965c39fdf304a80eacd6cdca43241956084301c3
-Date: 2022/02/22
+Version: 3c8e39ece0c32337ac9371a20cdfad888b2539d1
+Date: 2022/02/28
 License: Apache 2.0
 License File: LICENSE
 Security Critical: Yes
diff --git a/third_party/zlib/google/zip_unittest.cc b/third_party/zlib/google/zip_unittest.cc
index 98a5a3d..433555d 100644
--- a/third_party/zlib/google/zip_unittest.cc
+++ b/third_party/zlib/google/zip_unittest.cc
@@ -929,7 +929,7 @@
 // test (crbug.com/1299736, crbug.com/1300448).
 #if defined(THREAD_SANITIZER) || BUILDFLAG(IS_FUCHSIA) ||                \
     BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS) || !defined(NDEBUG)
+    BUILDFLAG(IS_CHROMEOS_LACROS) || !defined(NDEBUG)
 TEST_F(ZipTest, DISABLED_BigFile) {
 #else
 TEST_F(ZipTest, BigFile) {
diff --git a/tools/crates/lib/common.py b/tools/crates/lib/common.py
index 42733ab..3e52da5 100644
--- a/tools/crates/lib/common.py
+++ b/tools/crates/lib/common.py
@@ -111,12 +111,6 @@
     return "//" + "/".join(path + rel_path)
 
 
-def gn_toolchain_for_dep(is_proc_macro: bool) -> str:
-    # proc-macros must be compiled for the host toolchain, not the
-    # target, as they are consumed by the Rust compiler itself.
-    return "($host_toolchain)" if is_proc_macro else ""
-
-
 def os_third_party_dir(rel_path: list[str] = []) -> str:
     """The relative OS disk path to the top of the third party Rust directory
     where all third party crates are found, along with third_party.toml."""
diff --git a/tools/crates/lib/common_test.py b/tools/crates/lib/common_test.py
index 40360aa..b2b6170 100644
--- a/tools/crates/lib/common_test.py
+++ b/tools/crates/lib/common_test.py
@@ -108,12 +108,6 @@
         r = common.gn_crate_path("foo-bar", "5", rel_path=["a", "b"])
         self.assertEqual(r, root + "/foo_bar/v5/a/b")
 
-    def test_gn_toolchain_for_dep(self):
-        r = common.gn_toolchain_for_dep(True)
-        self.assertEqual(r, "($host_toolchain)")
-        r = common.gn_toolchain_for_dep(False)
-        self.assertEqual(r, "")
-
     def test_os_crate_name_dir(self):
         # Test normalization of crate names.
         r = common.os_crate_name_dir("foo-bar")
diff --git a/tools/crates/lib/gen.py b/tools/crates/lib/gen.py
index 196995da..bca4ae6 100644
--- a/tools/crates/lib/gen.py
+++ b/tools/crates/lib/gen.py
@@ -183,8 +183,6 @@
         def __init__(self):
             # The architectures where the dependency is needed.
             self.archset = compiler.ArchSet.EMPTY()
-            # Whether the dependency is a proc-macro.
-            self.is_proc_macro: bool = False
 
     def __init__(self):
         self._map: dict[cargo.CrateKey, DepSet.Data] = {}
@@ -734,14 +732,12 @@
                  full_version: str = None,
                  crate_path: str = None,
                  features: list[str] = [],
-                 is_proc_macro: bool = False,
                  is_for_first_party_code: bool = False,
                  build_script_outputs: set[str] = set()):
         self.key = key
         self.full_version = full_version
         self.crate_path = crate_path
         self.features = features
-        self.is_proc_macro = is_proc_macro
         self.is_for_first_party_code = is_for_first_party_code
         self.build_script_outputs = build_script_outputs
 
@@ -749,18 +745,17 @@
         return (self.key == other.key
                 and self.full_version == other.full_version
                 and self.crate_path == other.crate_path
-                and self.features == other.features
-                and self.is_proc_macro == other.is_proc_macro and
+                and self.features == other.features and
                 self.is_for_first_party_code == other.is_for_first_party_code
                 and self.build_script_outputs == other.build_script_outputs)
 
     def __repr__(self) -> str:
         return "CargoTreeDependency(key={}, full_version={}, crate_path={}, " \
             "features={}, " \
-            "is_proc_macro={}, is_for_first_party_code={}, " \
+            "is_for_first_party_code={}, " \
             "build_script_outputs={})".format(
                 self.key, self.full_version, self.crate_path, self.features,
-                self.is_proc_macro, self.is_for_first_party_code,
+                self.is_for_first_party_code,
                 self.build_script_outputs)
 
 
@@ -809,7 +804,6 @@
                                full_version=dep_version,
                                crate_path=dep_path,
                                features=dep_features,
-                               is_proc_macro=dep_isprocmacro,
                                is_for_first_party_code=for_first_party_code,
                                build_script_outputs=build_script_outputs)
 
@@ -912,9 +906,6 @@
                 # Adds the edge from parent to dependency for all given target
                 # architectures.
                 dep_data.archset.add_archset(archset_for_new_edges)
-                # The parent needs to know if the dependency crate is a
-                # proc-macro.
-                dep_data.is_proc_macro = dep.is_proc_macro
     return
 
 
@@ -1138,8 +1129,7 @@
             build_rule_usage.deps = [{
                 "deppath":
                 common.gn_crate_path(k.name, k.epoch) + ":" +
-                cargo.CrateBuildOutput.NORMAL.gn_target_name_for_dep() +
-                common.gn_toolchain_for_dep(depdata.is_proc_macro),
+                cargo.CrateBuildOutput.NORMAL.gn_target_name_for_dep(),
                 "compile_modes":
                 compiler.BuildConditionSet(depdata.archset),
             } for (k, depdata) in normal_deps.all_deps_data()]
@@ -1147,8 +1137,7 @@
             build_rule_usage.build_deps = [{
                 "deppath":
                 common.gn_crate_path(k.name, k.epoch) + ":" +
-                cargo.CrateBuildOutput.BUILDRS.gn_target_name_for_dep() +
-                common.gn_toolchain_for_dep(depdata.is_proc_macro),
+                cargo.CrateBuildOutput.BUILDRS.gn_target_name_for_dep(),
                 "compile_modes":
                 compiler.BuildConditionSet(depdata.archset),
             } for (k, depdata) in build_deps.all_deps_data()]
@@ -1156,8 +1145,7 @@
             build_rule_usage.dev_deps = [{
                 "deppath":
                 common.gn_crate_path(k.name, k.epoch) + ":" +
-                cargo.CrateBuildOutput.TESTS.gn_target_name_for_dep() +
-                common.gn_toolchain_for_dep(depdata.is_proc_macro),
+                cargo.CrateBuildOutput.TESTS.gn_target_name_for_dep(),
                 "compile_modes":
                 compiler.BuildConditionSet(depdata.archset),
             } for (k, depdata) in dev_deps.all_deps_data()]
diff --git a/tools/json_data_generator/.style.yapf b/tools/json_data_generator/.style.yapf
new file mode 100644
index 0000000..557fa7b
--- /dev/null
+++ b/tools/json_data_generator/.style.yapf
@@ -0,0 +1,2 @@
+[style]
+based_on_style = pep8
diff --git a/tools/json_data_generator/OWNERS b/tools/json_data_generator/OWNERS
new file mode 100644
index 0000000..32c8331
--- /dev/null
+++ b/tools/json_data_generator/OWNERS
@@ -0,0 +1,2 @@
+wenbojie@chromium.org
+file://ui/file_manager/OWNERS
diff --git a/tools/json_data_generator/PRESUBMIT.py b/tools/json_data_generator/PRESUBMIT.py
new file mode 100644
index 0000000..571a21b
--- /dev/null
+++ b/tools/json_data_generator/PRESUBMIT.py
@@ -0,0 +1,38 @@
+# Copyright 2022 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.
+"""Presubmit script for changes affecting tools/json_data_generator/
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+import os
+
+USE_PYTHON3 = True
+
+TEST_PATTERNS = [r'.+_test.py$']
+
+
+def _CommonChecks(input_api, output_api):
+    env = os.environ
+    pythonpath = [os.path.join(os.getcwd(), '..')]
+    if 'PYTHONPATH' in env:
+        pythonpath.append(env.get('PYTHONPATH'))
+    env['PYTHONPATH'] = input_api.os_path.pathsep.join((pythonpath))
+
+    return input_api.canned_checks.RunUnitTestsInDirectory(
+        input_api,
+        output_api,
+        '.',
+        files_to_check=TEST_PATTERNS,
+        env=env,
+        run_on_python2=False,
+        skip_shebang_check=True)
+
+
+def CheckChangeOnUpload(input_api, output_api):
+    return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+    return _CommonChecks(input_api, output_api)
diff --git a/tools/json_data_generator/README.md b/tools/json_data_generator/README.md
new file mode 100644
index 0000000..13d20cb
--- /dev/null
+++ b/tools/json_data_generator/README.md
@@ -0,0 +1,120 @@
+# JSON Data Generator
+
+This GN template will help you share JSON data across multiple languages (e.g
+javascript, c++, etc.), it uses whatever JSON files (`*.json5`) you provided as
+the data sources and generates whatever files you like based on the template
+files (`*.jinja`) you provided.
+
+## When to use?
+
+If you see a comment in a C++ file saying "the data change here should be
+reflected in another file xxx.js", then it's a good chance the shared data can
+be extracted to a standalone JSON file to keep consistency and make it easier to
+maintain.
+
+## Get Started
+
+Simply import the GN template file in your own GN file and pass your JSON data
+source files and template files.
+
+```
+import("//tools/json_data_generator/json_data_generator.gni")
+
+json_data_generator("my_json_data") {
+  sources = [ "my_json_data.json5" ]
+  templates = [
+    "my_json_data.cc.jinja",
+    "my_json_data.js.jinja",
+  ]
+  output_dir = "$root_gen_dir/my_dir"
+}
+
+```
+
+The above GN build task will generate 2 files (given your are building for
+`out/Default`): * `out/Default/gen/my_dir/my_json_data.cc` *
+`out/Default/gen/my_dir/my_json_data.js`
+
+## Available variables
+
+The GN temple supports the following variables:
+
+| Variable Name     | Description                                  | Mandatory |
+| ----------------- | -------------------------------------------- | --------- |
+| `sources`         | An array to include all the JSON data source | Yes       |
+:                   : file paths.                                  :           :
+| `templates`       | An array to include all the template file    | Yes       |
+:                   : paths.                                       :           :
+| `template_helper` | A string represents the template helper file | No        |
+:                   : path.                                        :           :
+| `output_dir`      | A string to indicate the output directory    | No        |
+:                   : for the generated files. The default value   :           :
+:                   : for this is `$target_gen_dir`, which is the  :           :
+:                   : same directory your GN file stays.           :           :
+| `deps`            | Same as the standard `deps` array.           | No        |
+
+## Available `globals` in Jinja templates
+
+The json data will be stored under a key in the template `model`, the key is the
+same as the JSON file name.
+
+```json
+// my_data1.json5
+{
+  "a": 11
+}
+// my_data2.json5
+[
+  22, 33
+]
+```
+
+For example, with the above 2 JSON files as the data sources, we can use these
+expressions in the Jinja template files:
+
+*   `{{ model.my_data1.a }}` will output `11`.
+*   `{{ model.my_data2[1] }}` will output `33`.
+
+Beside the data itself, there are also some other useful globals available:
+
+*   `source_json_files` will give you the JSON paths array (same as `sources`).
+*   `out_file_path` will give you the full path of this generated file.
+
+Check `GetGlobals()` in [generator.py](./generator.py) to see all available
+globals.
+
+## Available `filters` in Jinja templates
+
+*   `to_header_guard` will convert the string path you provide to the upper case
+    with underscore style, which is quite handy if you are generate C++ header
+    files.
+
+Check `GetFilters()` in [generator.py](./generator.py) to see all available
+globals.
+
+## Provide your own custom `globals/filters`
+
+> Check [test/jinja_helper.py](./test/jinja_helper.py) for more examples.
+
+Jinja template language only supports very limited filters and python
+expressions, if you need specific logic to handle your JSON data, you can pass
+an additional python file as `template_helper`, the only requirement for the
+file is it must include 2 functions:
+
+```python
+def get_custom_globals(model):
+    return {
+        # custom globals
+    }
+}
+
+def get_custom_filters(model):
+    return {
+        # custom filters
+    }
+}
+```
+
+This file will be processed when rendering your template, the loaded JSON data
+will be passed in as the `model` parameter, so you can do whatever logic you
+like here and use your custom globals/filters in your template file.
diff --git a/tools/json_data_generator/__init__.py b/tools/json_data_generator/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/json_data_generator/__init__.py
diff --git a/tools/json_data_generator/generator.py b/tools/json_data_generator/generator.py
new file mode 100644
index 0000000..5e92765
--- /dev/null
+++ b/tools/json_data_generator/generator.py
@@ -0,0 +1,107 @@
+# Copyright 2022 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 collections
+import importlib.util
+import os
+import re
+import sys
+from typing import Dict, List
+
+from json_data_generator.util import (GetDirNameFromPath, GetFileNameFromPath,
+                                      GetFileNameWithoutExtensionFromPath,
+                                      JoinPath)
+
+_FILE_PATH = os.path.dirname(os.path.realpath(__file__))
+
+_JSON5_PATH = os.path.join(_FILE_PATH, os.pardir, os.pardir, 'third_party',
+                           'pyjson5', 'src')
+sys.path.insert(1, _JSON5_PATH)
+import json5
+
+_JINJA2_PATH = os.path.join(_FILE_PATH, os.pardir, os.pardir, 'third_party')
+sys.path.insert(1, _JINJA2_PATH)
+import jinja2
+
+
+class JSONDataGenerator(object):
+    '''A generic json data generator.'''
+
+    def __init__(self, out_dir: str):
+        self.out_dir = out_dir
+        self.model: Dict = {}
+        # Store all json sources used in the generator.
+        self.sources: List[str] = list()
+
+    def AddJSONFilesToModel(self, paths: List[str]):
+        '''Adds one or more JSON files to the model.'''
+        for path in paths:
+            try:
+                with open(path, 'r') as f:
+                    self.AddJSONToModel(path, f.read())
+                    self.sources.append(path)
+            except ValueError as err:
+                raise ValueError('\n%s:\n    %s' % (path, err))
+
+    def AddJSONToModel(self, json_path: str, json_string: str):
+        '''Adds a |json_string| with data to the model.
+        Every json file is added to |self.model| with the original file
+        name as the key.
+        '''
+        data = json5.loads(json_string,
+                           object_pairs_hook=collections.OrderedDict)
+        # Use the json file name as the key of the loaded json data.
+        key = GetFileNameWithoutExtensionFromPath(json_path)
+        self.model[key] = data
+
+    def GetGlobals(self, template_path: str):
+        file_name_without_ext = GetFileNameWithoutExtensionFromPath(
+            template_path)
+        out_file_path = JoinPath(self.out_dir, file_name_without_ext)
+        return {
+            'model': self.model,
+            'source_json_files': self.sources,
+            'out_file_path': out_file_path,
+        }
+
+    def GetFilters(self):
+        return {
+            'to_header_guard': self._ToHeaderGuard,
+        }
+
+    def RenderTemplate(self,
+                       path_to_template: str,
+                       path_to_template_helper: str = None):
+        template_dir = GetDirNameFromPath(path_to_template)
+        template_name = GetFileNameFromPath(path_to_template)
+        jinja_env = jinja2.Environment(
+            loader=jinja2.FileSystemLoader(template_dir),
+            keep_trailing_newline=True)
+        jinja_env.globals.update(self.GetGlobals(path_to_template))
+        jinja_env.filters.update(self.GetFilters())
+        if path_to_template_helper:
+            template_helper_module = self._LoadTemplateHelper(
+                path_to_template_helper)
+            jinja_env.globals.update(
+                template_helper_module.get_custom_globals(self.model))
+            jinja_env.filters.update(
+                template_helper_module.get_custom_filters(self.model))
+        template = jinja_env.get_template(template_name)
+        return template.render()
+
+    def _LoadTemplateHelper(self, path_to_template_helper: str):
+        template_helper_dir = GetDirNameFromPath(path_to_template_helper)
+        try:
+            sys.path.append(template_helper_dir)
+            spec = importlib.util.spec_from_file_location(
+                path_to_template_helper, path_to_template_helper)
+            module = importlib.util.module_from_spec(spec)
+            spec.loader.exec_module(module)
+            return module
+        finally:
+            # Restore sys.path to what it was before.
+            sys.path.remove(template_helper_dir)
+
+    def _ToHeaderGuard(self, path: str):
+        return re.sub(r'[\/\.\-]+', '_', path.upper())
diff --git a/tools/json_data_generator/json_data_generator.gni b/tools/json_data_generator/json_data_generator.gni
new file mode 100644
index 0000000..e7ea7a6
--- /dev/null
+++ b/tools/json_data_generator/json_data_generator.gni
@@ -0,0 +1,81 @@
+# Copyright 2022 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.
+
+# Generates cross-language JSON data from json5 files. Use this generator
+# if you want to share JSON data between different languages. The generator
+# will render your designate template file with the JSON content.
+#
+# Variables:
+#   sources: (mandatory)
+#     The json data source files.
+#
+#   output_dir: (optional)
+#     The output directory for the generated files. By default it will be the
+#     $target_gen_dir, which is the directory where the gn task is invoked.
+#
+#   templates: (mandatory)
+#     List of Jinja template files to be generated. The generated file name
+#     will be the template file name without the '.jinja' suffix, e.g. template
+#     'abc.cc.jinja' will generate 'abc.cc'.
+#   template_helper: (optional)
+#     A python file to provide custom globals and filters for Jinja templates.
+#     Jinja template only supports very limited python expressions, to provide
+#     custom globals/filter specific to your source JSON files, you can pass a
+#     additional python path to this parameter, the python file you pass must
+#     include 2 functions: `get_custom_globals(model)` and
+#     `get_custom_filters(model)`, the parsed JSON model will be passed to your
+#     custom functions.
+#
+# Example:
+#   json_data_generator("my_json_data") {
+#     sources = [ "my_json_data.json5" ]
+#     templates = [
+#       "my_json_data.cc.jinja",
+#       "my_json_data.js.jinja",
+#     ]
+#     output_dir = "$root_gen_dir/my_dir"
+#   }
+#
+# See README.md for more information.
+
+template("json_data_generator") {
+  script_file = "//tools/json_data_generator/main.py"
+  common_inputs = [ "//tools/json_data_generator/generator.py" ]
+
+  action(target_name) {
+    script = script_file
+    forward_variables_from(invoker,
+                           [
+                             "deps",
+                             "sources",
+                           ])
+
+    assert(defined(sources), "Source json files must be defined.")
+    assert(defined(invoker.templates), "Template files must be defined.")
+
+    inputs = common_inputs + invoker.templates
+    output_dir = invoker.output_dir
+    if (!defined(invoker.output_dir)) {
+      output_dir = target_gen_dir
+    }
+    outputs = []
+    foreach(t, get_path_info(invoker.templates, "name")) {
+      outputs += [ "$output_dir/$t" ]
+    }
+
+    args =
+        [ "--templates" ] + rebase_path(invoker.templates, root_build_dir) + [
+          "--out-dir",
+          rebase_path(output_dir, root_build_dir),
+          "--sources",
+        ] + rebase_path(sources, root_build_dir)
+
+    if (defined(invoker.template_helper)) {
+      args += [
+        "--template-helper",
+        rebase_path(invoker.template_helper, root_build_dir),
+      ]
+    }
+  }
+}
diff --git a/tools/json_data_generator/json_data_generator_test.py b/tools/json_data_generator/json_data_generator_test.py
new file mode 100755
index 0000000..e2259fe5
--- /dev/null
+++ b/tools/json_data_generator/json_data_generator_test.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+# Copyright 2022 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 sys
+import os
+sys.path += [os.path.dirname(os.path.dirname(__file__))]
+
+from json_data_generator.generator import JSONDataGenerator
+import unittest
+
+
+class JSONDataGeneratorTest(unittest.TestCase):
+    def assertEqualToFile(self, value, filename):
+        with open(filename, 'r') as f:
+            self.maxDiff = None
+            self.assertEqual(value, f.read())
+
+    def setUp(self):
+        self.generator = JSONDataGenerator('test')
+        self.generator.AddJSONFilesToModel(
+            ['test/test_data1.json5', 'test/test_data2.json5'])
+
+    def testFileGeneration(self):
+        generated_content = self.generator.RenderTemplate(
+            'test/template.test.jinja', 'test/jinja_helper.py')
+        self.assertEqualToFile(generated_content, 'test/expected.generated')
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/tools/json_data_generator/main.py b/tools/json_data_generator/main.py
new file mode 100755
index 0000000..34831f4
--- /dev/null
+++ b/tools/json_data_generator/main.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import os
+import sys
+
+sys.path += [os.path.dirname(os.path.dirname(__file__))]
+
+from json_data_generator.generator import JSONDataGenerator
+from json_data_generator.util import (GetFileNameWithoutExtensionFromPath,
+                                      JoinPath)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description='Generate data from JSON5 file.')
+
+    parser.add_argument('--templates',
+                        nargs='+',
+                        help="Jinja template files (*.jinja)")
+    parser.add_argument(
+        '--template-helper',
+        help='additional python file to provide custom Jinja globals/filters')
+    parser.add_argument('--out-dir', help='directory to write output to')
+    parser.add_argument('--sources', nargs='+', help='source json5 data files')
+
+    args = parser.parse_args()
+
+    generator = JSONDataGenerator(args.out_dir)
+    generator.AddJSONFilesToModel(args.sources)
+    generator.out_dir = args.out_dir
+
+    os.makedirs(args.out_dir, exist_ok=True)
+
+    for template_path in args.templates:
+        out_file_path = JoinPath(
+            args.out_dir, GetFileNameWithoutExtensionFromPath(template_path))
+
+        with open(out_file_path, 'w') as f:
+            f.write(
+                generator.RenderTemplate(template_path, args.template_helper))
+
+    return 0
+
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/tools/json_data_generator/test/expected.generated b/tools/json_data_generator/test/expected.generated
new file mode 100644
index 0000000..3ddd991
--- /dev/null
+++ b/tools/json_data_generator/test/expected.generated
@@ -0,0 +1,22 @@
+//  Copyright 2022 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.
+
+// You can print out the json data source file paths
+//   test/test_data1.json5
+//   test/test_data2.json5
+
+// You can print out the header guard for C++ header files
+#ifndef TEST_TEMPLATE_TEST_
+#define TEST_TEMPLATE_TEST_
+#endif // TEST_TEMPLATE_TEST_
+
+// Access the data
+Name1
+Name2
+30
+game,hiking
+
+// Custom globals/filters
+Mr Name1
+NAME2
diff --git a/tools/json_data_generator/test/jinja_helper.py b/tools/json_data_generator/test/jinja_helper.py
new file mode 100644
index 0000000..85819b49
--- /dev/null
+++ b/tools/json_data_generator/test/jinja_helper.py
@@ -0,0 +1,19 @@
+# Copyright 2022 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.
+
+
+def _custom_upper(name: str):
+    return name.upper()
+
+
+def get_custom_globals(model):
+    return {
+        'name_with_title': 'Mr ' + model['test_data1']['name'],
+    }
+
+
+def get_custom_filters(model):
+    return {
+        'custom_upper': _custom_upper,
+    }
diff --git a/tools/json_data_generator/test/template.test.jinja b/tools/json_data_generator/test/template.test.jinja
new file mode 100644
index 0000000..121c762a
--- /dev/null
+++ b/tools/json_data_generator/test/template.test.jinja
@@ -0,0 +1,26 @@
+//  Copyright 2022 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.
+
+// You can print out the json data source file paths
+
+{%- for path in source_json_files %}
+//   {{ path }}
+{%- endfor %}
+
+// You can print out the header guard for C++ header files
+
+{%- set header_guard = "%s_" | format(out_file_path | to_header_guard ) %}
+#ifndef {{ header_guard }}
+#define {{ header_guard }}
+#endif // {{ header_guard }}
+
+// Access the data
+{{ model.test_data1.name }}
+{{ model.test_data2[0].name }}
+{{ model.test_data2[1].age }}
+{{ model.test_data2[0].habits | join(',') }}
+
+// Custom globals/filters
+{{ name_with_title }}
+{{ model.test_data2[0].name | custom_upper }}
diff --git a/tools/json_data_generator/test/test_data1.json5 b/tools/json_data_generator/test/test_data1.json5
new file mode 100644
index 0000000..de3789c
--- /dev/null
+++ b/tools/json_data_generator/test/test_data1.json5
@@ -0,0 +1,10 @@
+//  Copyright 2022 The Chromium Authors. All rights reserved.
+//  Use of this source code is governed by a BSD-style license that can be
+//  found in the LICENSE file.
+
+// This is a test json data file whose content is an object.
+{
+  "name": "Name1",
+  "age": 20,
+  "habits": [ "coding", "skating" ]
+}
diff --git a/tools/json_data_generator/test/test_data2.json5 b/tools/json_data_generator/test/test_data2.json5
new file mode 100644
index 0000000..8fff0f4
--- /dev/null
+++ b/tools/json_data_generator/test/test_data2.json5
@@ -0,0 +1,17 @@
+//  Copyright 2022 The Chromium Authors. All rights reserved.
+//  Use of this source code is governed by a BSD-style license that can be
+//  found in the LICENSE file.
+
+// This is a test json data file whose content is an array.
+[
+  {
+    "name": "Name2",
+    "age": 25,
+    "habits": [ "game", "hiking" ]
+  },
+  {
+    "name": "Name3",
+    "age": 30,
+    "habits": [ "tennis" ]
+  }
+]
diff --git a/tools/json_data_generator/util.py b/tools/json_data_generator/util.py
new file mode 100644
index 0000000..e205fba
--- /dev/null
+++ b/tools/json_data_generator/util.py
@@ -0,0 +1,21 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from pathlib import Path
+
+
+def GetFileNameFromPath(file_path: str) -> str:
+    return Path(file_path).name
+
+
+def GetFileNameWithoutExtensionFromPath(file_path: str) -> str:
+    return Path(file_path).stem
+
+
+def GetDirNameFromPath(file_path: str) -> str:
+    return str(Path(file_path).parent)
+
+
+def JoinPath(dir_path: str, file_name: str) -> str:
+    return str(Path(dir_path).joinpath(file_name))
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 7e12610d..6bd8167 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -108,9 +108,9 @@
       'android-pie-arm64-coverage-experimental-rel': 'android_release_bot_arm64_webview_monochrome_expectations_reclient',
       'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient',
       'android-pie-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
-      'android-weblayer-with-aosp-webview-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google',
+      'android-weblayer-with-aosp-webview-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google_reclient',
       # Use webview_monochrome as this builder triggers tests on Android O & P
-      'android-weblayer-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome',
+      'android-weblayer-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome_reclient',
       'android-10-arm64-rel': 'android_release_bot_minimal_symbols_arm64_fastbuild_webview_trichrome_reclient',
       'android-11-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_reclient',
     },
@@ -119,16 +119,16 @@
       'Android ASAN (dbg) (reclient)': 'android_clang_asan_debug_bot_reclient',
       'Android arm64 Builder (dbg) (reclient)': 'android_webview_google_debug_static_bot_arm64_reclient',
       'Android WebView P FYI (rel)': 'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient',
-      'android-12-x64-fyi-rel': 'android_release_bot_minimal_symbols_x64_fastbuild_webview_trichrome',
-      'android-annotator-rel': 'android_release_bot_minimal_symbols_arm64_webview_google',
+      'android-12-x64-fyi-rel': 'android_release_bot_minimal_symbols_x64_fastbuild_webview_trichrome_reclient',
+      'android-annotator-rel': 'android_release_bot_minimal_symbols_arm64_webview_google_reclient',
       'android-pie-arm64-wpt-rel-non-cq': 'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient',
-      'android-chrome-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome',
-      'android-weblayer-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome',
-      'android-weblayer-pie-x86-wpt-smoketest': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome',
-      'android-webview-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_webview_shell',
-      'android-weblayer-with-aosp-webview-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google',
+      'android-chrome-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
+      'android-weblayer-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
+      'android-weblayer-pie-x86-wpt-smoketest': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
+      'android-webview-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_webview_shell_reclient',
+      'android-weblayer-with-aosp-webview-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google_reclient',
       # Use webview_trichrome as this builder triggers tests on Android 10
-      'android-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_webview_shell',
+      'android-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_webview_shell_reclient',
     },
 
     'chromium.angle': {
@@ -319,8 +319,8 @@
       'Win x64 Builder (reclient)(cross)': 'gpu_tests_release_bot_minimal_symbols_reclient_win_cross',
       'android-code-coverage': 'gpu_tests_android_release_bot_minimal_symbols_arm64_fastbuild_java_coverage_reclient',
       'android-code-coverage-native': 'gpu_tests_android_release_bot_no_symbols_arm64_fastbuild_native_coverage_reclient',
-      'android-backuprefptr-arm-fyi-rel': 'release_trybot_backuprefptr_arm',
-      'android-backuprefptr-arm64-fyi-rel': 'release_trybot_backuprefptr_arm64',
+      'android-backuprefptr-arm-fyi-rel': 'release_trybot_backuprefptr_arm_reclient',
+      'android-backuprefptr-arm64-fyi-rel': 'release_trybot_backuprefptr_arm64_reclient',
       'chromeos-amd64-generic-rel (reclient)': 'chromeos_amd64-generic_use_fake_dbus_clients_reclient',
       # TODO(crbug.com/1235218): remove after the migration.
       'chromeos-amd64-generic-rel (reclient compare)': 'chromeos_amd64-generic_use_fake_dbus_clients_reclient',
@@ -573,15 +573,21 @@
       'Android Builder Perf': 'official_goma_minimal_symbols_android',
       'Android arm64 Builder Perf': 'official_goma_minimal_symbols_android_arm64',
       'android_arm64-builder-perf': 'official_goma_minimal_symbols_android_arm64',
+      'android_arm64-builder-perf-pgo': 'official_goma_minimal_symbols_android_arm64_pgo',
       'android-builder-perf': 'official_goma_minimal_symbols_android',
       'chromecast-linux-builder-perf': 'cast_binary_size',
       'chromeos-amd64-generic-lacros-builder-perf': 'chromeos_amd64-generic_lacros_official',
       'linux-builder-perf': 'official_goma_linux_perf',
       'linux-builder-perf-rel': 'official_goma_linux_perf',
+      'linux-builder-perf-pgo': 'official_goma_linux_perf_pgo',
       'mac-builder-perf': 'official_goma_mac_perf',
+      'mac-builder-perf-pgo': 'official_goma_mac_perf_pgo',
       'mac-arm-builder-perf': 'official_goma_mac_arm_perf',
+      'mac-arm-builder-perf-pgo': 'official_goma_mac_arm_perf_pgo',
       'win32-builder-perf': 'official_goma_x86_perf',
+      'win32-builder-perf-pgo': 'official_goma_x86_perf_pgo',
       'win64-builder-perf': 'official_goma_perf',
+      'win64-builder-perf-pgo': 'official_goma_perf_pgo',
     },
 
     'chromium.perf.calibration': {
@@ -606,7 +612,7 @@
 
     'chromium.rust': {
       'linux-rust-x64-rel': 'release_rust_linux_x64',
-      'android-rust-arm-rel': 'release_rust_android_arm',
+      'android-rust-arm-rel': 'release_rust_android_arm_reclient',
     },
 
     'chromium.swangle': {
@@ -1489,14 +1495,14 @@
       'strip_debug_info', 'android_fastbuild', 'webview_monochrome', 'webview_shell',
     ],
 
-    'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_webview_shell': [
-      'android', 'release_bot', 'minimal_symbols', 'x86',
-      'strip_debug_info', 'android_fastbuild', 'webview_trichrome', 'webview_shell',
+    'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_webview_shell_reclient': [
+      'android', 'release_bot_reclient', 'minimal_symbols', 'x86',
+      'strip_debug_info', 'android_fastbuild', 'webview_monochrome', 'webview_shell',
     ],
 
-    'android_release_bot_minimal_symbols_arm64_webview_google': [
-      'android', 'release_bot', 'minimal_symbols', 'arm64',
-      'strip_debug_info', 'webview_google',
+    'android_release_bot_minimal_symbols_x86_fastbuild_webview_trichrome_webview_shell_reclient': [
+      'android', 'release_bot_reclient', 'minimal_symbols', 'x86',
+      'strip_debug_info', 'android_fastbuild', 'webview_trichrome', 'webview_shell',
     ],
 
     'android_release_bot_minimal_symbols_arm64_webview_google_reclient': [
@@ -1509,14 +1515,14 @@
       'strip_debug_info', 'webview_monochrome',
     ],
 
-    'android_release_bot_minimal_symbols_x64_fastbuild_webview_trichrome': [
-      'android', 'release_bot', 'minimal_symbols', 'x64',
+    'android_release_bot_minimal_symbols_x64_fastbuild_webview_trichrome_reclient': [
+      'android', 'release_bot_reclient', 'minimal_symbols', 'x64',
       'strip_debug_info', 'android_fastbuild', 'webview_trichrome',
       'no_secondary_abi',
     ],
 
-    'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google': [
-      'android', 'release_bot', 'minimal_symbols',
+    'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google_reclient': [
+      'android', 'release_bot_reclient', 'minimal_symbols',
       'android_fastbuild', 'x86', 'resource_allowlisting', 'disable_proguard',
       'chrome_google'
     ],
@@ -1526,11 +1532,6 @@
       'android_fastbuild', 'strip_debug_info', 'webview_google',
     ],
 
-    'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome': [
-      'android', 'release_bot', 'minimal_symbols', 'x86',
-      'strip_debug_info', 'android_fastbuild', 'webview_monochrome',
-    ],
-
     'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient': [
       'android', 'release_bot_reclient', 'minimal_symbols', 'x86',
       'strip_debug_info', 'android_fastbuild', 'webview_monochrome',
@@ -1541,8 +1542,8 @@
       'strip_debug_info', 'android_fastbuild', 'webview_trichrome',
     ],
 
-    'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome': [
-      'android', 'release_bot', 'minimal_symbols', 'x86',
+    'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_monochrome_reclient': [
+      'android', 'release_bot_reclient', 'minimal_symbols', 'x86',
       'strip_debug_info', 'android_fastbuild', 'webview_monochrome',
       'disable_proguard'
     ],
@@ -3140,12 +3141,12 @@
       'release_trybot_minimal_symbols', 'backuprefptr', 'x64',
     ],
 
-    'release_trybot_backuprefptr_arm': [
-      'release_trybot_minimal_symbols', 'backuprefptr', 'android', 'arm',
+    'release_trybot_backuprefptr_arm_reclient': [
+      'release_trybot_minimal_symbols_reclient', 'backuprefptr', 'android', 'arm',
     ],
 
-    'release_trybot_backuprefptr_arm64': [
-      'release_trybot_minimal_symbols', 'backuprefptr', 'android', 'arm64',
+    'release_trybot_backuprefptr_arm64_reclient': [
+      'release_trybot_minimal_symbols_reclient', 'backuprefptr', 'android', 'arm64',
     ],
 
     'release_trybot_paeverywhere_x64': [
@@ -3156,6 +3157,10 @@
       'release_trybot_minimal_symbols', 'enable_rust', 'android', 'arm',
     ],
 
+    'release_rust_android_arm_reclient': [
+      'release_trybot_minimal_symbols_reclient', 'enable_rust', 'android', 'arm',
+    ],
+
     'release_rust_linux_x64': [
       'release_trybot_minimal_symbols', 'enable_rust', 'x64',
     ],
diff --git a/tools/mb/mb_config_expectations/chromium.android.fyi.json b/tools/mb/mb_config_expectations/chromium.android.fyi.json
index 9638943..0f9ba26 100644
--- a/tools/mb/mb_config_expectations/chromium.android.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.android.fyi.json
@@ -59,7 +59,8 @@
       "target_cpu": "x64",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-annotator-rel": {
@@ -74,7 +75,8 @@
       "system_webview_package_name": "com.google.android.webview",
       "target_cpu": "arm64",
       "target_os": "android",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-chrome-pie-x86-wpt-fyi-rel": {
@@ -91,7 +93,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-pie-arm64-wpt-rel-non-cq": {
@@ -124,7 +127,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-weblayer-pie-x86-wpt-smoketest": {
@@ -141,7 +145,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-weblayer-with-aosp-webview-x86-fyi-rel": {
@@ -159,7 +164,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-webview-pie-x86-wpt-fyi-rel": {
@@ -177,7 +183,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-x86-fyi-rel": {
@@ -195,7 +202,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json
index bb481ef..5b42495f 100644
--- a/tools/mb/mb_config_expectations/chromium.android.json
+++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -548,7 +548,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-weblayer-x86-rel": {
@@ -566,7 +567,8 @@
       "target_cpu": "x86",
       "target_os": "android",
       "use_errorprone_java_compiler": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 312e0019..da0d7811 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -403,7 +403,8 @@
       "target_os": "android",
       "use_allocator": "partition",
       "use_backup_ref_ptr": true,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-backuprefptr-arm64-fyi-rel": {
@@ -420,7 +421,8 @@
       "target_os": "android",
       "use_allocator": "partition",
       "use_backup_ref_ptr": true,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "android-code-coverage": {
diff --git a/tools/mb/mb_config_expectations/chromium.perf.json b/tools/mb/mb_config_expectations/chromium.perf.json
index 9ae4f326..f620b9d0 100644
--- a/tools/mb/mb_config_expectations/chromium.perf.json
+++ b/tools/mb/mb_config_expectations/chromium.perf.json
@@ -57,6 +57,21 @@
       "use_goma": true
     }
   },
+  "android_arm64-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "clang_use_default_sample_profile": false,
+      "ffmpeg_branding": "Chrome",
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "proprietary_codecs": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 1,
+      "target_cpu": "arm64",
+      "target_os": "android",
+      "use_goma": true
+    }
+  },
   "chromecast-linux-builder-perf": {
     "gn_args": {
       "dcheck_always_on": false,
@@ -96,6 +111,17 @@
       "use_goma": true
     }
   },
+  "linux-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 1,
+      "use_gnome_keyring": false,
+      "use_goma": true
+    }
+  },
   "linux-builder-perf-rel": {
     "gn_args": {
       "chrome_pgo_phase": 0,
@@ -120,6 +146,19 @@
       "use_goma": true
     }
   },
+  "mac-arm-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "enable_keystone_registration_framework": false,
+      "ignore_missing_widevine_signing_cert": true,
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 2,
+      "target_cpu": "arm64",
+      "use_goma": true
+    }
+  },
   "mac-builder-perf": {
     "gn_args": {
       "chrome_pgo_phase": 0,
@@ -132,6 +171,18 @@
       "use_goma": true
     }
   },
+  "mac-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "enable_keystone_registration_framework": false,
+      "ignore_missing_widevine_signing_cert": true,
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 2,
+      "use_goma": true
+    }
+  },
   "win32-builder-perf": {
     "gn_args": {
       "chrome_pgo_phase": 0,
@@ -143,6 +194,17 @@
       "use_goma": true
     }
   },
+  "win32-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 1,
+      "target_cpu": "x86",
+      "use_goma": true
+    }
+  },
   "win64-builder-perf": {
     "gn_args": {
       "chrome_pgo_phase": 0,
@@ -152,5 +214,15 @@
       "symbol_level": 1,
       "use_goma": true
     }
+  },
+  "win64-builder-perf-pgo": {
+    "gn_args": {
+      "chrome_pgo_phase": 1,
+      "is_chrome_branded": true,
+      "is_official_build": true,
+      "strip_absolute_paths_from_debug_symbols": true,
+      "symbol_level": 1,
+      "use_goma": true
+    }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.rust.json b/tools/mb/mb_config_expectations/chromium.rust.json
index 0382051..b9ca679 100644
--- a/tools/mb/mb_config_expectations/chromium.rust.json
+++ b/tools/mb/mb_config_expectations/chromium.rust.json
@@ -11,7 +11,8 @@
       "symbol_level": 1,
       "target_cpu": "arm",
       "target_os": "android",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "linux-rust-x64-rel": {
diff --git a/tools/mb/rts_banned_suites.json b/tools/mb/rts_banned_suites.json
index c157678a..89e33f5 100644
--- a/tools/mb/rts_banned_suites.json
+++ b/tools/mb/rts_banned_suites.json
@@ -24,7 +24,6 @@
     "monochrome_public_apk_checker"
   ],
   "fuchsia_x64_rts": [
-    "blink_web_tests",
-    "fuchsia_telemetry_gpu_integration_test"
+    "blink_web_tests"
   ]
 }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index cc5bd026..1269962 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -7021,6 +7021,14 @@
   </description>
 </action>
 
+<action name="DesktopFeed.FollowSite">
+  <owner>jianli@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user followed the web feed for the website (Desktop only).
+  </description>
+</action>
+
 <action name="DesktopReadingList.AddItem.FromBookmarkIcon">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 1936fd59..6ccf1be 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -51489,6 +51489,8 @@
   <int value="-2044939529" label="CrostiniResetLxdDb:disabled"/>
   <int value="-2044252895"
       label="QuickActionSearchWidgetAndroidDinoVariant:disabled"/>
+  <int value="-2043440755"
+      label="EnableBackForwardCacheForScreenReader:enabled"/>
   <int value="-2043331707" label="PasswordScriptsFetching:disabled"/>
   <int value="-2043128632" label="enable-tab-switcher-in-document-mode"/>
   <int value="-2042278511" label="SmartSuggestionForLargeDownloads:disabled"/>
@@ -53389,6 +53391,8 @@
   <int value="-763759697" label="enable-audio-support-for-desktop-share"/>
   <int value="-763730918" label="CCTTargetTranslateLanguage:disabled"/>
   <int value="-763640405" label="WebXRARModule:enabled"/>
+  <int value="-762785269"
+      label="EnableBackForwardCacheForScreenReader:disabled"/>
   <int value="-762738927" label="LogJsConsoleMessages:enabled"/>
   <int value="-762687134" label="ExperimentalCrostiniUI:enabled"/>
   <int value="-762541013" label="enable-bluetooth-spp-in-serial-api"/>
@@ -53682,6 +53686,7 @@
   <int value="-557742250" label="ContentSuggestionsCategories:disabled"/>
   <int value="-556662059" label="AuraWindowSubtreeCapture:enabled"/>
   <int value="-556218705" label="SlowDCTimerInterruptsWin:enabled"/>
+  <int value="-556021689" label="ArcEnableVirtioBlkForData:disabled"/>
   <int value="-555341956" label="AutofillSaveAndFillVPA:enabled"/>
   <int value="-552407626" label="ContextualSearchNewSettings:disabled"/>
   <int value="-551434067"
@@ -53813,6 +53818,7 @@
       label="OminboxUIExperimentUseGenericSearchEngineIcon:enabled"/>
   <int value="-462404204" label="CryptAuthV2DeviceSync:disabled"/>
   <int value="-462205750" label="enable-service-worker-sync"/>
+  <int value="-461713516" label="ArcEnableVirtioBlkForData:enabled"/>
   <int value="-461568027" label="EcheSWADebugMode:disabled"/>
   <int value="-461292699" label="ContentSuggestionsCategoryOrder:enabled"/>
   <int value="-460702745" label="ExportTaggedPDF:disabled"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 96e81ef..703a2e0 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -2247,6 +2247,16 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.Notification.CountOfNotificationsInOneGroup"
+    units="Notifications" expires_after="2023-02-27">
+  <owner>leandre@chromium.org</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>
+    The number of notification contained in one group. Emitted when a
+    notification is added or removed from a group.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Notification.ExpandOrCollapse.AnimationSmoothness"
     units="%" expires_after="2022-07-02">
   <owner>leandre@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/crostini/histograms.xml b/tools/metrics/histograms/metadata/crostini/histograms.xml
index f5a1ad86..470d8db1 100644
--- a/tools/metrics/histograms/metadata/crostini/histograms.xml
+++ b/tools/metrics/histograms/metadata/crostini/histograms.xml
@@ -178,7 +178,7 @@
 </histogram>
 
 <histogram name="Crostini.ContainerOsVersion" enum="CrostiniContainerOsVersion"
-    expires_after="2022-04-10">
+    expires_after="2023-04-10">
   <owner>clumptini@google.com</owner>
   <owner>laurentt@google.com</owner>
   <summary>
@@ -265,7 +265,7 @@
 </histogram>
 
 <histogram name="Crostini.InstallSource" enum="CrostiniInstallSource"
-    expires_after="2022-04-10">
+    expires_after="2023-04-10">
   <owner>clumptini@google.com</owner>
   <owner>sidereal@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 1544199..8c8e4d8 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -1985,6 +1985,19 @@
   </summary>
 </histogram>
 
+<histogram name="EnterpriseCheck.AzureADJoinStatusCheckTime" units="ms"
+    expires_after="2022-12-12">
+  <owner>igorruvinov@chromium.org</owner>
+  <owner>ydago@chromium.org</owner>
+  <owner>pastarmovj@chromium.org</owner>
+  <owner>rogerta@chromium.org</owner>
+  <owner>zmin@chromium.org</owner>
+  <summary>
+    Time elapsed for checking the Azure AD join status. This is only recorded
+    once during the first successful join status check.
+  </summary>
+</histogram>
+
 <histogram name="EnterpriseCheck.InDomain" enum="BooleanEnabled"
     expires_after="2022-04-30">
   <owner>pastarmovj@chromium.org</owner>
@@ -2064,6 +2077,20 @@
   </summary>
 </histogram>
 
+<histogram name="EnterpriseCheck.IsJoinedToAzureAD" enum="BooleanEnabled"
+    expires_after="2022-12-12">
+  <owner>igorruvinov@chromium.org</owner>
+  <owner>ydago@chromium.org</owner>
+  <owner>pastarmovj@chromium.org</owner>
+  <owner>rogerta@chromium.org</owner>
+  <owner>zmin@chromium.org</owner>
+  <summary>
+    Whether the machine is joined to an Azure AD domain or the user has added
+    one or more work/school accounts to their login session. This check is
+    performed once at start-up on Windows.
+  </summary>
+</histogram>
+
 <histogram name="EnterpriseCheck.IsLocalMachine" enum="Boolean"
     expires_after="2022-10-01">
   <owner>rogerta@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index e7b09dd..62c4dd9 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -273,7 +273,7 @@
 
 <histogram
     name="FileBrowser.HoldingSpace.TimeFromFirstWelcomeBannerShowToFirstPin"
-    units="ms" expires_after="2022-04-10">
+    units="ms" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/holding_space/OWNER b/tools/metrics/histograms/metadata/holding_space/OWNERS
similarity index 100%
rename from tools/metrics/histograms/metadata/holding_space/OWNER
rename to tools/metrics/histograms/metadata/holding_space/OWNERS
diff --git a/tools/metrics/histograms/metadata/holding_space/histograms.xml b/tools/metrics/histograms/metadata/holding_space/histograms.xml
index c0ae48a..2644a7a78 100644
--- a/tools/metrics/histograms/metadata/holding_space/histograms.xml
+++ b/tools/metrics/histograms/metadata/holding_space/histograms.xml
@@ -58,7 +58,7 @@
 </variants>
 
 <histogram name="HoldingSpace.Animation.BubbleResize.Smoothness" units="%"
-    expires_after="2022-04-10">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -70,7 +70,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Animation.PodResize.Smoothness" units="%"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -82,7 +82,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Downloads.Action.All"
-    enum="HoldingSpaceDownloadsAction" expires_after="2022-04-10">
+    enum="HoldingSpaceDownloadsAction" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -92,7 +92,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.FilesAppChip.Action.All"
-    enum="HoldingSpaceFilesAppChipAction" expires_after="2022-04-10">
+    enum="HoldingSpaceFilesAppChipAction" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -102,7 +102,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.All" enum="HoldingSpaceItemAction"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -112,7 +112,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}" enum="HoldingSpaceItemType"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -123,7 +123,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}.Extension"
-    enum="HoldingSpaceExtension" expires_after="2022-04-24">
+    enum="HoldingSpaceExtension" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -134,7 +134,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Count.{type}" units="items"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -145,7 +145,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.FailureToLaunch" enum="HoldingSpaceItemType"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -155,7 +155,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.FailureToLaunch.Extension"
-    enum="HoldingSpaceExtension" expires_after="2022-04-24">
+    enum="HoldingSpaceExtension" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -165,7 +165,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.FailureToLaunch.Reason"
-    enum="HoldingSpaceItemFailureToLaunchReason" expires_after="2022-04-24">
+    enum="HoldingSpaceItemFailureToLaunchReason" expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -175,7 +175,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Pod.Action.All" enum="HoldingSpacePodAction"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -185,7 +185,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.TimeFromFirstAvailabilityToFirstAdd" units="ms"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -195,7 +195,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.TimeFromFirstAvailabilityToFirstEntry" units="ms"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -205,7 +205,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.TimeFromFirstEntryToFirstPin" units="ms"
-    expires_after="2022-04-24">
+    expires_after="2022-10-10">
   <owner>dmblack@google.com</owner>
   <owner>gzadina@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/nearby/histograms.xml b/tools/metrics/histograms/metadata/nearby/histograms.xml
index 8a9aeee2..74540c1 100644
--- a/tools/metrics/histograms/metadata/nearby/histograms.xml
+++ b/tools/metrics/histograms/metadata/nearby/histograms.xml
@@ -271,6 +271,17 @@
   </summary>
 </histogram>
 
+<histogram name="Nearby.Connections.WifiLan.TimeToConnect" units="ms"
+    expires_after="2023-02-01">
+  <owner>nohle@chromium.org</owner>
+  <owner>nearby-share-chromeos-eng@google.com</owner>
+  <summary>
+    Records the time it takes to successfully connect to another device's TCP
+    server socket. Emitted after a cross-device connection is established over
+    TCP sockets. Not emitted on failure.
+  </summary>
+</histogram>
+
 <histogram name="Nearby.Connections.{Medium}.Socket.{Operation}.Result"
     enum="BooleanSuccess" expires_after="2023-02-01">
   <owner>hansenmichael@google.com</owner>
diff --git a/ui/aura/window_event_dispatcher.h b/ui/aura/window_event_dispatcher.h
index bff3906e..8bcc4ec 100644
--- a/ui/aura/window_event_dispatcher.h
+++ b/ui/aura/window_event_dispatcher.h
@@ -66,6 +66,7 @@
 
   // Stops dispatching/synthesizing mouse events.
   void Shutdown();
+  bool in_shutdown() const { return in_shutdown_; }
 
   WindowTreeHost* host() { return host_; }
 
diff --git a/ui/gl/gl_implementation.cc b/ui/gl/gl_implementation.cc
index 1d6c4103..2a752bff 100644
--- a/ui/gl/gl_implementation.cc
+++ b/ui/gl/gl_implementation.cc
@@ -26,29 +26,6 @@
 
 namespace gl {
 
-ANGLEImplementation MakeANGLEImplementation(
-    const GLImplementation gl_impl,
-    const ANGLEImplementation angle_impl) {
-  if (gl_impl == kGLImplementationEGLANGLE) {
-    if (angle_impl == ANGLEImplementation::kNone) {
-      return ANGLEImplementation::kDefault;
-    } else {
-      return angle_impl;
-    }
-  } else {
-    return ANGLEImplementation::kNone;
-  }
-}
-
-GLImplementationParts::GLImplementationParts(
-    const ANGLEImplementation angle_impl)
-    : gl(kGLImplementationEGLANGLE),
-      angle(MakeANGLEImplementation(kGLImplementationEGLANGLE, angle_impl)) {}
-
-GLImplementationParts::GLImplementationParts(const GLImplementation gl_impl)
-    : gl(gl_impl),
-      angle(MakeANGLEImplementation(gl_impl, ANGLEImplementation::kDefault)) {}
-
 bool GLImplementationParts::IsValid() const {
   if (angle == ANGLEImplementation::kNone) {
     return (gl != kGLImplementationEGLANGLE);
diff --git a/ui/gl/gl_implementation.h b/ui/gl/gl_implementation.h
index dffa099..c4e6aae 100644
--- a/ui/gl/gl_implementation.h
+++ b/ui/gl/gl_implementation.h
@@ -59,8 +59,14 @@
 };
 
 struct GL_EXPORT GLImplementationParts {
-  explicit GLImplementationParts(const ANGLEImplementation angle_impl);
-  explicit GLImplementationParts(const GLImplementation gl_impl);
+  constexpr explicit GLImplementationParts(const ANGLEImplementation angle_impl)
+      : gl(kGLImplementationEGLANGLE),
+        angle(MakeANGLEImplementation(kGLImplementationEGLANGLE, angle_impl)) {}
+
+  constexpr explicit GLImplementationParts(const GLImplementation gl_impl)
+      : gl(gl_impl),
+        angle(MakeANGLEImplementation(gl_impl, ANGLEImplementation::kDefault)) {
+  }
 
   GLImplementation gl = kGLImplementationNone;
   ANGLEImplementation angle = ANGLEImplementation::kNone;
@@ -80,6 +86,21 @@
   bool IsValid() const;
   bool IsAllowed(const std::vector<GLImplementationParts>& allowed_impls) const;
   std::string ToString() const;
+
+ private:
+  static constexpr ANGLEImplementation MakeANGLEImplementation(
+      const GLImplementation gl_impl,
+      const ANGLEImplementation angle_impl) {
+    if (gl_impl == kGLImplementationEGLANGLE) {
+      if (angle_impl == ANGLEImplementation::kNone) {
+        return ANGLEImplementation::kDefault;
+      } else {
+        return angle_impl;
+      }
+    } else {
+      return ANGLEImplementation::kNone;
+    }
+  }
 };
 
 struct GL_EXPORT GLWindowSystemBindingInfo {
diff --git a/ui/views/input_event_activation_protector.cc b/ui/views/input_event_activation_protector.cc
index fd907009..bb0b441 100644
--- a/ui/views/input_event_activation_protector.cc
+++ b/ui/views/input_event_activation_protector.cc
@@ -9,6 +9,10 @@
 
 namespace views {
 
+namespace {
+bool g_disable_for_testing = false;
+}  // namespace
+
 void InputEventActivationProtector::VisibilityChanged(bool is_visible) {
   if (is_visible)
     view_shown_time_stamp_ = base::TimeTicks::Now();
@@ -16,6 +20,9 @@
 
 bool InputEventActivationProtector::IsPossiblyUnintendedInteraction(
     const ui::Event& event) {
+  if (g_disable_for_testing)
+    return false;
+
   if (view_shown_time_stamp_ == base::TimeTicks()) {
     // The UI was never shown, ignore. This can happen in tests.
     return false;
@@ -52,4 +59,8 @@
   repeated_event_count_ = 0;
 }
 
+void InputEventActivationProtector::DisableForTesting() {
+  g_disable_for_testing = true;
+}
+
 }  // namespace views
diff --git a/ui/views/input_event_activation_protector.h b/ui/views/input_event_activation_protector.h
index 42ffd02..4f6154a7 100644
--- a/ui/views/input_event_activation_protector.h
+++ b/ui/views/input_event_activation_protector.h
@@ -37,6 +37,9 @@
   // Resets the state for click tracking.
   void ResetForTesting();
 
+  // Integration tests can disable all input event activation protectors.
+  static void DisableForTesting();
+
  private:
   // Timestamp of when the view being tracked is first shown.
   base::TimeTicks view_shown_time_stamp_;
diff --git a/ui/webui/resources/cr_components/app_management/OWNERS b/ui/webui/resources/cr_components/app_management/OWNERS
index d3f5d59..dc73ed8 100644
--- a/ui/webui/resources/cr_components/app_management/OWNERS
+++ b/ui/webui/resources/cr_components/app_management/OWNERS
@@ -1,4 +1,7 @@
-file://chrome/browser/resources/settings/chromeos/os_apps_page/OWNERS
+jshikaram@chromium.org
+
+# For backup
+dominickn@chromium.org
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS