diff --git a/DEPS b/DEPS
index d1ee856..cbd7179 100644
--- a/DEPS
+++ b/DEPS
@@ -304,7 +304,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': '13266cc111b94a8a29bf8ef1d86f39db3e5d124e',
+  'skia_revision': 'b06e934cb6374a2a741a5b5c727c2abfad719665',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '341dabf8e58e999974d70295ee498cc10b266c17',
+  'angle_revision': 'af1768a4875660cf8b08fcec75066a275ebc33e7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -375,7 +375,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': 'ca32af6260e4fbe258113f0563b3678924e5cb0f',
+  'catapult_revision': 'c684fe0312182df04f259e1b03a2acb41b34406f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -391,7 +391,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'ce4ba169ed6f00e60a797a829d15b5cc8675e392',
+  'devtools_frontend_revision': '4d2c9fc82e14d16e286d2633d3a753dd68d7483a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -812,11 +812,11 @@
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '8baa1dd892d545b1dd5464ade2904c79ed2d9b51',
+    'url': Var('chromium_git') + '/website.git' + '@' + '3a2072ce6c0d103649676683a7805b42031ff495',
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '3b368a2418585a66a2ea2d957001e91aa895c829',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '90fa652f6ba7ee1db976f176b574bc6e205bcedf',
       'condition': 'checkout_ios',
   },
 
@@ -906,7 +906,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'HFsh1P6Q9AZxEBnZbZ8zC_v5zztnXXWNmyjn0MaThHUC',
+          'version': '6NdT2C0XTtRJKYySVpFn-NtX6WEjOK2MlXPTs5LaqVcC',
         },
       ],
       'dep_type': 'cipd',
@@ -917,7 +917,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': '9rAXeZlEUT08AdM7PN2TtSEqW7a2DWPdWcPA9AF5IqMC',
+          'version': 'egCFe24NDoUekIFph8bPWB6yY3Z4wgnF7xfe5zOoWIwC',
         },
       ],
       'dep_type': 'cipd',
@@ -928,7 +928,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': '8lKx6IDFtNPp1wUoEzdh8TChcpYO7mxFW6EiSyHdCzgC',
+          'version': 'BRg1F6qOO4fhwj34n4Q7h013V0BdjAiXJxwuHssMCH0C',
         },
       ],
       'dep_type': 'cipd',
@@ -1243,13 +1243,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2b19afb82030a638f8a3d8f592fa25269b924800',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f407ae35d322e21364ea96a05e0ba4577ffa200d',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '7a7573005bba31d7ae3c2698ca065865fa17242f',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '78fc3badfe464c86799425f41059de8cc66cc9a5',
     'condition': 'checkout_src_internal',
   },
 
@@ -1507,7 +1507,7 @@
     Var('chromium_git') + '/external/libaddressinput.git' + '@' + 'e8712e415627f22d0b00ebee8db99547077f39bd',
 
   'src/third_party/libaom/source/libaom':
-    Var('aomedia_git') + '/aom.git' + '@' +  'b6ead6c2763416c98277c299cfd92befa1376fd6',
+    Var('aomedia_git') + '/aom.git' + '@' +  '233000f66e9ff0bb09226a2f222a029bb4c89de6',
 
   'src/third_party/libavif/src':
     Var('chromium_git') + '/external/github.com/AOMediaCodec/libavif.git' + '@' + Var('libavif_revision'),
@@ -1716,7 +1716,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '49f628ceb9c9a69c1a92f08eeafa26e715f8ad46',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e314b79bfe9e5d5cd0cf47a146175d8d8e3190b2',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1861,7 +1861,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@16ff5c9d2ecbdcfdc33565bfd66f1c8bbe91dba0',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@cebf5626ca506bce289b618dbf933b704610604b',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1901,7 +1901,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e957d8fd868b0793b5e9f14fd523f436ac3f761c',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'b7af6b963bedfa9015d015f4b08d9b1e7766bcda',
+    Var('webrtc_git') + '/src.git' + '@' + '8f1903e3cff7ca9169c3704e73420dd24c34bb08',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index bee8c655..5ea9cfe2 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -112,7 +112,7 @@
                     "Disables WebView from checking for app recovery mitigations."),
             Flag.commandLine(AwSwitches.WEBVIEW_ENABLE_APP_RECOVERY,
                     "Enables WebView to check for app recovery mitigations."),
-            Flag.commandLine(BlinkFeatures.USER_AGENT_CLIENT_HINT,
+            Flag.baseFeature(BlinkFeatures.USER_AGENT_CLIENT_HINT,
                     "Enables user-agent client hints in WebView."),
             Flag.baseFeature("DefaultPassthroughCommandDecoder",
                     "Use the passthrough GLES2 command decoder."),
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
index 6c90d32..39a508dc 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
@@ -94,8 +94,11 @@
             @Override
             public void evaluate() throws Throwable {
                 setUp();
-                base.evaluate();
-                tearDown();
+                try {
+                    base.evaluate();
+                } finally {
+                    tearDown();
+                }
             }
         }, description);
     }
diff --git a/ash/capture_mode/stop_recording_button_tray.h b/ash/capture_mode/stop_recording_button_tray.h
index a7333d9a..48c370b 100644
--- a/ash/capture_mode/stop_recording_button_tray.h
+++ b/ash/capture_mode/stop_recording_button_tray.h
@@ -30,6 +30,9 @@
  private:
   // TrayBackgroundView:
   void ClickedOutsideBubble() override {}
+  // No need to override since this view doesn't have an active/inactive state
+  // Clicking on it will stop the recording and make this view disappear.
+  void UpdateTrayItemColor(bool is_active) override {}
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override {}
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override {}
diff --git a/ash/components/arc/ime/arc_ime_service.cc b/ash/components/arc/ime/arc_ime_service.cc
index 5aa1a41..90ab516c 100644
--- a/ash/components/arc/ime/arc_ime_service.cc
+++ b/ash/components/arc/ime/arc_ime_service.cc
@@ -473,7 +473,7 @@
 
   if (IsCharacterKeyEvent(&event)) {
     has_composition_text_ = false;
-    ime_bridge_->SendInsertText(std::u16string(1, event.GetText()),
+    ime_bridge_->SendInsertText(std::u16string(1, event.GetCharacter()),
                                 /*new_cursor_position=*/1);
   }
 }
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index 22ef817..a993d789 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -135,7 +135,7 @@
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
-    return gfx::kNullCursor;
+    return gfx::NativeCursor{};
   }
   int GetNonClientComponent(const gfx::Point& point) const override {
     return HTNOWHERE;
diff --git a/ash/drag_drop/drag_drop_tracker.cc b/ash/drag_drop/drag_drop_tracker.cc
index a8644f4..e0bbe856 100644
--- a/ash/drag_drop/drag_drop_tracker.cc
+++ b/ash/drag_drop/drag_drop_tracker.cc
@@ -36,7 +36,7 @@
   void OnBoundsChanged(const gfx::Rect& old_bounds,
                        const gfx::Rect& new_bounds) override {}
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
-    return gfx::kNullCursor;
+    return gfx::NativeCursor{};
   }
   int GetNonClientComponent(const gfx::Point& point) const override {
     return HTCAPTION;
diff --git a/ash/login/login_screen_test_api.cc b/ash/login/login_screen_test_api.cc
index 3d59b083..e12f886 100644
--- a/ash/login/login_screen_test_api.cc
+++ b/ash/login/login_screen_test_api.cc
@@ -348,8 +348,8 @@
     return false;
   }
   LoginUserView::TestApi user_test(big_user_view->GetUserView());
-  auto* enterprise_icon = user_test.enterprise_icon();
-  return enterprise_icon->GetVisible();
+  auto* enterprise_icon_container = user_test.enterprise_icon_container();
+  return enterprise_icon_container->GetVisible();
 }
 
 // static
diff --git a/ash/login/ui/arrow_button_view.cc b/ash/login/ui/arrow_button_view.cc
index 4e28889d..981de29 100644
--- a/ash/login/ui/arrow_button_view.cc
+++ b/ash/login/ui/arrow_button_view.cc
@@ -22,6 +22,7 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/skia_conversions.h"
+#include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/focus_ring.h"
 #include "ui/views/controls/highlight_path_generator.h"
@@ -78,7 +79,7 @@
   SetPreferredSize(gfx::Size(size + 2 * kBorderForFocusRingDp,
                              size + 2 * kBorderForFocusRingDp));
   SetFocusBehavior(FocusBehavior::ALWAYS);
-
+  SetBackgroundColorId(kColorAshControlBackgroundColorInactive);
   // Layer rendering is needed for animation.
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
@@ -99,26 +100,12 @@
 ArrowButtonView::~ArrowButtonView() = default;
 
 void ArrowButtonView::PaintButtonContents(gfx::Canvas* canvas) {
-  const gfx::Rect rect(GetContentsBounds());
-
-  // Draw background.
-  cc::PaintFlags flags;
-  flags.setAntiAlias(true);
-  SkColor background_color =
-      background_color_id_ ? GetColorProvider()->GetColor(*background_color_id_)
-                           : AshColorProvider::Get()->GetControlsLayerColor(
-                                 AshColorProvider::ControlsLayerType::
-                                     kControlBackgroundColorInactive);
-
-  flags.setColor(background_color);
-  flags.setStyle(cc::PaintFlags::kFill_Style);
-  canvas->DrawCircle(gfx::PointF(rect.CenterPoint()), rect.width() / 2, flags);
-
   // Draw arrow icon.
   views::ImageButton::PaintButtonContents(canvas);
 
   // Draw the arc of the loading animation.
   if (loading_animation_) {
+    const gfx::Rect rect(GetContentsBounds());
     PaintLoadingArc(canvas, rect, loading_animation_->GetCurrentValue());
   }
 }
@@ -208,6 +195,11 @@
   owner_->SchedulePaint();
 }
 
+void ArrowButtonView::SetBackgroundColorId(ui::ColorId color_id) {
+  SetBackground(views::CreateThemedRoundedRectBackground(
+      color_id, GetPreferredSize().width() / 2, 2 * kBorderForFocusRingDp));
+}
+
 BEGIN_METADATA(ArrowButtonView, LoginButton)
 END_METADATA
 
diff --git a/ash/login/ui/arrow_button_view.h b/ash/login/ui/arrow_button_view.h
index f8e6f3b..f7649ad 100644
--- a/ash/login/ui/arrow_button_view.h
+++ b/ash/login/ui/arrow_button_view.h
@@ -48,9 +48,7 @@
   // the animation is looped.
   void EnableLoadingAnimation(bool enabled);
 
-  void SetBackgroundColorId(ui::ColorId color_id) {
-    background_color_id_ = color_id;
-  }
+  void SetBackgroundColorId(ui::ColorId color_id);
 
  private:
   // Helper class that translates events from the loading animation events into
@@ -72,7 +70,6 @@
 
   LoadingAnimationDelegate loading_animation_delegate_{this};
   std::unique_ptr<gfx::MultiAnimation> loading_animation_;
-  absl::optional<ui::ColorId> background_color_id_;
 };
 
 }  // namespace ash
diff --git a/ash/login/ui/login_expanded_public_account_view.cc b/ash/login/ui/login_expanded_public_account_view.cc
index 459bb80..01bb386 100644
--- a/ash/login/ui/login_expanded_public_account_view.cc
+++ b/ash/login/ui/login_expanded_public_account_view.cc
@@ -21,17 +21,20 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_id.h"
 #include "ash/style/ash_color_provider.h"
+#include "ash/style/system_shadow.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/image_model.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/text_constants.h"
@@ -39,6 +42,7 @@
 #include "ui/views/border.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
+#include "ui/views/highlight_border.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/layout_provider.h"
@@ -69,11 +73,14 @@
 
 constexpr int kTextLineHeightDp = 16;
 constexpr int kRoundRectCornerRadiusDp = 2;
+constexpr int kJellyRoundRectCornerRadiusDp = 8;
 
 constexpr int kDropDownIconSizeDp = 16;
+constexpr int kJellyDropDownIconSizeDp = 20;
 constexpr int kArrowButtonSizeDp = 48;
 constexpr int kAdvancedViewButtonWidthDp = 190;
 constexpr int kAdvancedViewButtonHeightDp = 16;
+constexpr int kJellyAdvancedViewButtonHeightDp = 20;
 constexpr int kSpacingBetweenSelectionTitleAndButtonDp = 4;
 
 constexpr int kNonEmptyWidth = 1;
@@ -163,7 +170,10 @@
         views::BoxLayout::MainAxisAlignment::kStart);
     AddChildView(label_container);
 
-    label_ = CreateLabel(text, kColorAshTextColorPrimary);
+    const bool is_jelly = chromeos::features::IsJellyrollEnabled();
+    label_ = CreateLabel(text, is_jelly ? static_cast<ui::ColorId>(
+                                              cros_tokens::kCrosSysOnSurface)
+                                        : kColorAshTextColorPrimary);
     left_margin_view_ = add_horizontal_margin(left_margin_, label_container);
     label_container->AddChildView(label_.get());
 
@@ -178,8 +188,8 @@
 
     icon_ = new views::ImageView;
     icon_->SetVerticalAlignment(views::ImageView::Alignment::kCenter);
-    icon_->SetPreferredSize(
-        gfx::Size(kDropDownIconSizeDp, kDropDownIconSizeDp));
+    int icon_size = is_jelly ? kJellyDropDownIconSizeDp : kDropDownIconSizeDp;
+    icon_->SetPreferredSize(gfx::Size(icon_size, icon_size));
 
     icon_container->AddChildView(icon_.get());
     right_margin_view_ = add_horizontal_margin(right_margin_, icon_container);
@@ -244,16 +254,22 @@
   MonitoringWarningView()
       : NonAccessibleView(kMonitoringWarningClassName),
         warning_type_(WarningType::kNone) {
+    const bool is_jelly = chromeos::features::IsJellyrollEnabled();
     image_ = new views::ImageView();
     image_->SetImage(ui::ImageModel::FromVectorIcon(
-        vector_icons::kWarningIcon, kColorAshIconColorWarning,
+        vector_icons::kWarningIcon,
+        is_jelly ? static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)
+                 : kColorAshIconColorWarning,
         kMonitoringWarningIconSizeDp));
     image_->SetVisible(false);
     AddChildView(image_.get());
 
     const std::u16string label_text = l10n_util::GetStringUTF16(
         IDS_ASH_LOGIN_PUBLIC_ACCOUNT_MONITORING_WARNING);
-    label_ = CreateLabel(label_text, kColorAshTextColorPrimary);
+    label_ = CreateLabel(
+        label_text,
+        is_jelly ? static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)
+                 : kColorAshTextColorPrimary);
     label_->SetMultiLine(true);
     label_->SetLineHeight(kTextLineHeightDp);
     AddChildView(label_.get());
@@ -353,18 +369,21 @@
     learn_more_label_ = AddChildView(std::make_unique<views::StyledLabel>());
     learn_more_label_->SetText(text);
 
+    const bool is_jelly = chromeos::features::IsJellyrollEnabled();
+
     views::StyledLabel::RangeStyleInfo style;
     style.custom_font = learn_more_label_->GetFontList().Derive(
         0, gfx::Font::FontStyle::NORMAL, gfx::Font::Weight::NORMAL);
-    style.override_color = AshColorProvider::Get()->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kTextColorPrimary);
+    style.override_color_id =
+        is_jelly ? static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)
+                 : kColorAshTextColorPrimary;
     learn_more_label_->AddStyleRange(gfx::Range(0, offset), style);
 
     views::StyledLabel::RangeStyleInfo link_style =
         views::StyledLabel::RangeStyleInfo::CreateForLink(on_learn_more_tapped);
-    const SkColor blue = AshColorProvider::Get()->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kButtonLabelColorBlue);
-    link_style.override_color = blue;
+    link_style.override_color_id =
+        is_jelly ? static_cast<ui::ColorId>(cros_tokens::kCrosSysPrimary)
+                 : kColorAshButtonLabelColorBlue;
     learn_more_label_->AddStyleRange(gfx::Range(offset, offset + link.length()),
                                      link_style);
     learn_more_label_->SetAutoColorReadabilityEnabled(false);
@@ -381,11 +400,18 @@
                             base::Unretained(this)),
         l10n_util::GetStringUTF16(
             IDS_ASH_LOGIN_PUBLIC_SESSION_LANGUAGE_AND_INPUT));
-    advanced_view_button_->SetTextColorId(kColorAshButtonLabelColorBlue);
+    ui::ColorId advanced_view_button_color_id =
+        is_jelly ? static_cast<ui::ColorId>(cros_tokens::kCrosSysPrimary)
+                 : kColorAshButtonLabelColorBlue;
+    int advanced_view_button_icon_size = is_jelly
+                                             ? kJellyAdvancedViewButtonHeightDp
+                                             : kAdvancedViewButtonHeightDp;
+    advanced_view_button_->SetTextColorId(advanced_view_button_color_id);
     advanced_view_button_->SetIcon(kLoginScreenButtonDropdownIcon,
-                                   kColorAshButtonLabelColorBlue);
+                                   advanced_view_button_color_id);
+
     advanced_view_button_->SetPreferredSize(
-        gfx::Size(kAdvancedViewButtonWidthDp, kAdvancedViewButtonHeightDp));
+        gfx::Size(kAdvancedViewButtonWidthDp, advanced_view_button_icon_size));
     AddChildView(advanced_view_button_.get());
 
     advanced_view_button_->SetProperty(
@@ -708,6 +734,21 @@
       on_dismissed_(on_dismissed),
       event_handler_(
           std::make_unique<LoginExpandedPublicAccountEventHandler>(this)) {
+  if (chromeos::features::IsJellyrollEnabled()) {
+    SetBackground(views::CreateThemedRoundedRectBackground(
+        cros_tokens::kCrosSysSystemBaseElevated,
+        kJellyRoundRectCornerRadiusDp));
+    SetBorder(std::make_unique<views::HighlightBorder>(
+        kJellyRoundRectCornerRadiusDp,
+        views::HighlightBorder::Type::kHighlightBorder1));
+    shadow_ = SystemShadow::CreateShadowOnNinePatchLayerForView(
+        this, SystemShadow::Type::kElevation12);
+    shadow_->SetRoundedCornerRadius(kJellyRoundRectCornerRadiusDp);
+  } else {
+    SetBackground(views::CreateThemedRoundedRectBackground(
+        kColorAshShieldAndBase80, kRoundRectCornerRadiusDp));
+  }
+
   SetPreferredSize(GetPreferredSizeLandscape());
   layout_ = SetLayoutManager(std::make_unique<views::BoxLayout>());
 
@@ -735,8 +776,12 @@
   }
 
   separator_ = AddChildView(std::make_unique<views::View>());
+  ui::ColorId separator_color_id =
+      chromeos::features::IsJellyrollEnabled()
+          ? static_cast<ui::ColorId>(cros_tokens::kCrosSysSeparator)
+          : kColorAshSeparatorColor;
   separator_->SetBackground(
-      views::CreateThemedSolidBackground(kColorAshSeparatorColor));
+      views::CreateThemedSolidBackground(separator_color_id));
 
   right_pane_ = new RightPaneView(
       base::BindRepeating(&LoginExpandedPublicAccountView::ShowWarningDialog,
@@ -748,6 +793,10 @@
       kArrowButtonSizeDp));
   submit_button_->SetAccessibleName(l10n_util::GetStringUTF16(
       IDS_ASH_LOGIN_PUBLIC_ACCOUNT_LOG_IN_BUTTON_ACCESSIBLE_NAME));
+  if (chromeos::features::IsJellyrollEnabled()) {
+    submit_button_->SetBackgroundColorId(
+        cros_tokens::kCrosSysSystemPrimaryContainer);
+  }
   // `submit_button_` has absolute position and is laid out in our `Layout()`
   // override.
   submit_button_->SetProperty(views::kViewIgnoredByLayoutKey, true);
@@ -815,6 +864,7 @@
 }
 
 void LoginExpandedPublicAccountView::Hide() {
+  shadow_.reset();
   SetVisible(false);
   right_pane_->Reset();
   on_dismissed_.Run();
@@ -875,16 +925,6 @@
   submit_button_->SetPosition(gfx::Point{submit_button_x, submit_button_y});
 }
 
-void LoginExpandedPublicAccountView::OnPaint(gfx::Canvas* canvas) {
-  views::View::OnPaint(canvas);
-
-  cc::PaintFlags flags;
-  flags.setStyle(cc::PaintFlags::kFill_Style);
-  flags.setColor(GetColorProvider()->GetColor(kColorAshShieldAndBase80));
-  flags.setAntiAlias(true);
-  canvas->DrawRoundRect(GetContentsBounds(), kRoundRectCornerRadiusDp, flags);
-}
-
 void LoginExpandedPublicAccountView::OnKeyEvent(ui::KeyEvent* event) {
   if (!GetVisible() || event->type() != ui::ET_KEY_PRESSED) {
     return;
diff --git a/ash/login/ui/login_expanded_public_account_view.h b/ash/login/ui/login_expanded_public_account_view.h
index d286101..5422af0 100644
--- a/ash/login/ui/login_expanded_public_account_view.h
+++ b/ash/login/ui/login_expanded_public_account_view.h
@@ -10,6 +10,7 @@
 #include "ash/ash_export.h"
 #include "ash/login/ui/non_accessible_view.h"
 #include "ash/login/ui/public_account_menu_view.h"
+#include "ash/style/system_shadow.h"
 #include "base/memory/raw_ptr.h"
 #include "ui/events/event_handler.h"
 #include "ui/views/controls/image_view.h"
@@ -89,7 +90,6 @@
   int GetHeightForWidth(int width) const override;
   void Layout() override;
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
-  void OnPaint(gfx::Canvas* canvas) override;
 
   // ui::EventHandler:
   void OnKeyEvent(ui::KeyEvent* event) override;
@@ -111,6 +111,7 @@
   raw_ptr<PublicAccountMonitoringInfoDialog, ExperimentalAsh>
       learn_more_dialog_ = nullptr;
   std::unique_ptr<ui::EventHandler> event_handler_;
+  std::unique_ptr<SystemShadow> shadow_;
 
   base::WeakPtrFactory<LoginExpandedPublicAccountView> weak_factory_{this};
 };
diff --git a/ash/login/ui/login_user_view.cc b/ash/login/ui/login_user_view.cc
index ca51597..556f4c952 100644
--- a/ash/login/ui/login_user_view.cc
+++ b/ash/login/ui/login_user_view.cc
@@ -109,54 +109,31 @@
   AnimationFrames frames_;
 };
 
-class IconRoundedView : public views::View {
+class EnterpriseBadgeLayout : public views::LayoutManager {
  public:
-  explicit IconRoundedView(int size) : size_(size) {}
-  ~IconRoundedView() override = default;
+  explicit EnterpriseBadgeLayout(int size) : size_(size) {}
 
-  IconRoundedView(const IconRoundedView&) = delete;
-  IconRoundedView& operator=(const IconRoundedView&) = delete;
+  EnterpriseBadgeLayout(const EnterpriseBadgeLayout&) = delete;
+  EnterpriseBadgeLayout& operator=(const EnterpriseBadgeLayout&) = delete;
 
-  void OnPaint(gfx::Canvas* canvas) override {
-    View::OnPaint(canvas);
+  ~EnterpriseBadgeLayout() override = default;
 
-    const int radius = size_ / 2;
-    const gfx::Rect content_bounds(GetContentsBounds());
-    const gfx::Point center_circle(content_bounds.width() - radius,
-                                   content_bounds.height() - radius);
-    const gfx::Point left_corner_icon(
-        std::round(content_bounds.width() - radius * (1 + kIconProportion)),
-        std::round(content_bounds.height() - radius * (1 + kIconProportion)));
-    gfx::Rect image_bounds(left_corner_icon, icon_.size());
-    SkPath path;
-    path.addRect(gfx::RectToSkRect(image_bounds));
-    cc::PaintFlags flags;
-    flags.setAntiAlias(true);
-    flags.setColor(AshColorProvider::Get()->GetContentLayerColor(
-        AshColorProvider::ContentLayerType::kIconColorSecondaryBackground));
-    flags.setStyle(cc::PaintFlags::kFill_Style);
-    // The colored circle on which we paint the icon.
-    canvas->DrawCircle(center_circle, radius, flags);
-    canvas->DrawImageInPath(icon_, image_bounds.x(), image_bounds.y(), path,
-                            flags);
+  // views::LayoutManager:
+  void Layout(views::View* host) override {
+    DCHECK_EQ(host->children().size(), 1U);
+    const gfx::Rect content_bounds(host->GetContentsBounds());
+    const int offset = content_bounds.width() - size_;
+    auto* child = host->children()[0];
+    child->SetPosition({offset, offset});
+    child->SetSize({size_, size_});
   }
 
-  // views::View:
-  void OnThemeChanged() override {
-    views::View::OnThemeChanged();
-    icon_ = gfx::ImageSkiaOperations::CreateResizedImage(
-        gfx::CreateVectorIcon(
-            chromeos::kEnterpriseIcon,
-            AshColorProvider::Get()->GetContentLayerColor(
-                AshColorProvider::ContentLayerType::kIconColorSecondary)),
-        skia::ImageOperations::RESIZE_BEST,
-        gfx::Size(size_ * kIconProportion, size_ * kIconProportion));
-    SchedulePaint();
+  gfx::Size GetPreferredSize(const views::View* host) const override {
+    return gfx::Size(size_, size_);
   }
 
  private:
   const int size_;
-  gfx::ImageSkia icon_;
 };
 
 }  // namespace
@@ -169,7 +146,9 @@
     explicit TestApi(LoginUserView::UserImage* view) : view_(view) {}
     ~TestApi() = default;
 
-    views::View* enterprise_icon() const { return view_->enterprise_icon_; }
+    views::View* enterprise_icon_container() const {
+      return view_->enterprise_icon_container_;
+    }
 
    private:
     const raw_ptr<LoginUserView::UserImage, ExperimentalAsh> view_;
@@ -183,11 +162,17 @@
     image_ = new AnimatedRoundedImageView(gfx::Size(image_size, image_size),
                                           image_size / 2);
     AddChildView(image_.get());
-
+    enterprise_icon_container_ = AddChildView(std::make_unique<views::View>());
     const int icon_size = GetIconSize(style);
-    enterprise_icon_ = new IconRoundedView(icon_size);
-    enterprise_icon_->SetVisible(false);
-    AddChildView(enterprise_icon_.get());
+    enterprise_icon_container_->SetLayoutManager(
+        std::make_unique<EnterpriseBadgeLayout>(icon_size));
+
+    views::ImageView* icon_ = enterprise_icon_container_->AddChildView(
+        std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon(
+            chromeos::kEnterpriseIcon, kColorAshIconColorSecondary,
+            icon_size * kIconProportion)));
+    icon_->SetBackground(views::CreateThemedRoundedRectBackground(
+        kColorAshIconColorSecondaryBackground, icon_size / 2));
   }
 
   UserImage(const UserImage&) = delete;
@@ -214,7 +199,7 @@
     bool is_managed =
         user.user_account_manager ||
         user.basic_user_info.type == user_manager::USER_TYPE_PUBLIC_ACCOUNT;
-    enterprise_icon_->SetVisible(is_managed);
+    enterprise_icon_container_->SetVisible(is_managed);
   }
 
   void SetAnimationEnabled(bool enable) {
@@ -263,7 +248,7 @@
   }
 
   raw_ptr<AnimatedRoundedImageView, ExperimentalAsh> image_ = nullptr;
-  raw_ptr<IconRoundedView, ExperimentalAsh> enterprise_icon_ = nullptr;
+  raw_ptr<views::View, ExperimentalAsh> enterprise_icon_container_ = nullptr;
   bool animation_enabled_ = false;
 
   base::WeakPtrFactory<UserImage> weak_factory_{this};
@@ -398,9 +383,9 @@
   return view_->remove_account_dialog_;
 }
 
-views::View* LoginUserView::TestApi::enterprise_icon() const {
+views::View* LoginUserView::TestApi::enterprise_icon_container() const {
   return LoginUserView::UserImage::TestApi(view_->user_image_)
-      .enterprise_icon();
+      .enterprise_icon_container();
 }
 
 void LoginUserView::TestApi::OnTap() const {
diff --git a/ash/login/ui/login_user_view.h b/ash/login/ui/login_user_view.h
index 9c23eb8..ce95199 100644
--- a/ash/login/ui/login_user_view.h
+++ b/ash/login/ui/login_user_view.h
@@ -39,7 +39,7 @@
     views::View* tap_button() const;
     views::View* dropdown() const;
     LoginRemoveAccountDialog* remove_account_dialog() const;
-    views::View* enterprise_icon() const;
+    views::View* enterprise_icon_container() const;
 
     void OnTap() const;
 
diff --git a/ash/projector/projector_annotation_tray.cc b/ash/projector/projector_annotation_tray.cc
index d051666..3bd49019 100644
--- a/ash/projector/projector_annotation_tray.cc
+++ b/ash/projector/projector_annotation_tray.cc
@@ -20,8 +20,11 @@
 #include "ash/system/tray/tray_container.h"
 #include "ash/system/tray/tray_popup_utils.h"
 #include "ash/system/tray/tray_utils.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "components/prefs/pref_service.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/image_model.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -150,6 +153,14 @@
   CloseBubble();
 }
 
+void ProjectorAnnotationTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  image_view_->SetImage(ui::ImageModel::FromVectorIcon(
+      GetIconForTool(GetCurrentTool(), current_pen_color_),
+      is_active ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                : cros_tokens::kCrosSysOnSurface));
+}
+
 std::u16string ProjectorAnnotationTray::GetAccessibleNameForTray() {
   std::u16string enabled_state = l10n_util::GetStringUTF16(
       GetCurrentTool() == kToolNone
@@ -171,7 +182,7 @@
 void ProjectorAnnotationTray::CloseBubble() {
   pen_view_ = nullptr;
   bubble_.reset();
-
+  SetIsActive(false);
   shelf()->UpdateAutoHideState();
 }
 
@@ -294,12 +305,16 @@
 
 void ProjectorAnnotationTray::UpdateIcon() {
   const ProjectorTool tool = GetCurrentTool();
-  image_view_->SetImage(gfx::CreateVectorIcon(
-      GetIconForTool(tool, current_pen_color_),
-      AshColorProvider::Get()->GetContentLayerColor(
-          AshColorProvider::ContentLayerType::kIconColorPrimary)));
-  image_view_->SetTooltipText(GetTooltip());
   SetIsActive(tool != kToolNone);
+  // Only sets the image if Jelly is not enabled, since `UpdateTrayItemColor()`
+  // will be called in `SetIsActive()` to set the image for Jelly.
+  if (!chromeos::features::IsJellyEnabled()) {
+    image_view_->SetImage(gfx::CreateVectorIcon(
+        GetIconForTool(tool, current_pen_color_),
+        AshColorProvider::Get()->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kIconColorPrimary)));
+  }
+  image_view_->SetTooltipText(GetTooltip());
 }
 
 void ProjectorAnnotationTray::OnPenColorPressed(SkColor color) {
diff --git a/ash/projector/projector_annotation_tray.h b/ash/projector/projector_annotation_tray.h
index b9e80cd..7e574f7 100644
--- a/ash/projector/projector_annotation_tray.h
+++ b/ash/projector/projector_annotation_tray.h
@@ -46,6 +46,7 @@
   // TrayBackgroundView:
   void OnGestureEvent(ui::GestureEvent* event) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
@@ -68,7 +69,7 @@
   // UI.
   void DeactivateActiveTool();
 
-  // Updates the icon in the status area.
+  // Updates the icon and tooltip of `image_view_` in the status area.
   void UpdateIcon();
 
   void OnPenColorPressed(SkColor color);
diff --git a/ash/public/cpp/test/in_process_image_decoder.cc b/ash/public/cpp/test/in_process_image_decoder.cc
index 3e8316e..72cd3eb 100644
--- a/ash/public/cpp/test/in_process_image_decoder.cc
+++ b/ash/public/cpp/test/in_process_image_decoder.cc
@@ -112,6 +112,10 @@
       mojo::PendingReceiver<data_decoder::mojom::Gzipper> receiver) override {
     FAIL();
   }
+  void BindCborParser(mojo::PendingReceiver<data_decoder::mojom::CborParser>
+                          receiver) override {
+    FAIL();
+  }
   void BindBleScanParser(
       mojo::PendingReceiver<data_decoder::mojom::BleScanParser> receiver)
       override {
diff --git a/ash/public/cpp/test/test_image_decoder.cc b/ash/public/cpp/test/test_image_decoder.cc
index 1d3c06d..df46831 100644
--- a/ash/public/cpp/test/test_image_decoder.cc
+++ b/ash/public/cpp/test/test_image_decoder.cc
@@ -4,7 +4,9 @@
 
 #include "ash/public/cpp/test/test_image_decoder.h"
 
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "services/data_decoder/public/mojom/cbor_parser.mojom.h"
 #include "services/data_decoder/public/mojom/image_decoder.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -91,6 +93,10 @@
       mojo::PendingReceiver<data_decoder::mojom::Gzipper> receiver) override {
     FAIL();
   }
+  void BindCborParser(mojo::PendingReceiver<data_decoder::mojom::CborParser>
+                          receiver) override {
+    FAIL();
+  }
   void BindBleScanParser(
       mojo::PendingReceiver<data_decoder::mojom::BleScanParser> receiver)
       override {
diff --git a/ash/system/accessibility/dictation_button_tray.cc b/ash/system/accessibility/dictation_button_tray.cc
index ff094a4..8dccbd7 100644
--- a/ash/system/accessibility/dictation_button_tray.cc
+++ b/ash/system/accessibility/dictation_button_tray.cc
@@ -19,6 +19,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_container.h"
 #include "ash/system/tray/tray_utils.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "components/prefs/pref_service.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/base/ime/text_input_client.h"
@@ -40,8 +41,17 @@
 // |enabled| indicates whether the tray button is enabled, i.e. clickable.
 // A secondary color is used to indicate the icon is not enabled.
 ui::ImageModel GetIconImage(bool active, bool enabled) {
-  const ui::ColorId color_id =
-      enabled ? kColorAshIconColorPrimary : kColorAshIconColorSecondary;
+  ui::ColorId color_id;
+  if (chromeos::features::IsJellyEnabled()) {
+    // For Jelly: the color will change based on whether this tray is active or
+    // not.
+    color_id = enabled ? (active ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                                 : cros_tokens::kCrosSysOnSurface)
+                       : cros_tokens::kCrosSysSecondary;
+  } else {
+    color_id =
+        enabled ? kColorAshIconColorPrimary : kColorAshIconColorSecondary;
+  }
   return active
              ? ui::ImageModel::FromVectorIcon(kDictationOnNewuiIcon, color_id)
              : ui::ImageModel::FromVectorIcon(kDictationOffNewuiIcon, color_id);
diff --git a/ash/system/accessibility/dictation_button_tray.h b/ash/system/accessibility/dictation_button_tray.h
index bb4ad48..684fabb 100644
--- a/ash/system/accessibility/dictation_button_tray.h
+++ b/ash/system/accessibility/dictation_button_tray.h
@@ -59,6 +59,9 @@
   // TrayBackgroundView:
   void Initialize() override;
   void ClickedOutsideBubble() override;
+  // No need to override since the icon gets updated in `UpdateIcon()` along
+  // with the activation state change.
+  void UpdateTrayItemColor(bool is_active) override {}
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
diff --git a/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc b/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc
index 452ca759..8267fdf5 100644
--- a/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc
+++ b/ash/system/accessibility/select_to_speak/select_to_speak_tray.cc
@@ -14,6 +14,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_container.h"
 #include "ash/system/tray/tray_utils.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
@@ -33,16 +34,29 @@
 
 ui::ImageModel GetImageOnCurrentSelectToSpeakStatus(
     const SelectToSpeakState& select_to_speak_state) {
+  const bool is_jelly_enabled = chromeos::features::IsJellyEnabled();
+  // For Jelly: `kSelectToSpeakStateInactive` means the tray is inactive and
+  // will have a different icon color. `kSelectToSpeakStateSelecting` and
+  // `kSelectToSpeakStateSpeaking` means the tray is active.
   switch (select_to_speak_state) {
     case SelectToSpeakState::kSelectToSpeakStateInactive:
-      return ui::ImageModel::FromVectorIcon(kSystemTraySelectToSpeakNewuiIcon,
-                                            kColorAshIconColorPrimary);
+      return ui::ImageModel::FromVectorIcon(
+          kSystemTraySelectToSpeakNewuiIcon,
+          is_jelly_enabled
+              ? static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)
+              : kColorAshIconColorPrimary);
     case SelectToSpeakState::kSelectToSpeakStateSelecting:
       return ui::ImageModel::FromVectorIcon(
-          kSystemTraySelectToSpeakActiveNewuiIcon, kColorAshIconColorPrimary);
+          kSystemTraySelectToSpeakActiveNewuiIcon,
+          is_jelly_enabled ? static_cast<ui::ColorId>(
+                                 cros_tokens::kCrosSysSystemOnPrimaryContainer)
+                           : kColorAshIconColorPrimary);
     case SelectToSpeakState::kSelectToSpeakStateSpeaking:
-      return ui::ImageModel::FromVectorIcon(kSystemTrayStopNewuiIcon,
-                                            kColorAshIconColorPrimary);
+      return ui::ImageModel::FromVectorIcon(
+          kSystemTrayStopNewuiIcon,
+          is_jelly_enabled ? static_cast<ui::ColorId>(
+                                 cros_tokens::kCrosSysSystemOnPrimaryContainer)
+                           : kColorAshIconColorPrimary);
   }
 }
 
diff --git a/ash/system/accessibility/select_to_speak/select_to_speak_tray.h b/ash/system/accessibility/select_to_speak/select_to_speak_tray.h
index afdedf1..92a52514 100644
--- a/ash/system/accessibility/select_to_speak/select_to_speak_tray.h
+++ b/ash/system/accessibility/select_to_speak/select_to_speak_tray.h
@@ -42,6 +42,9 @@
   // no-ops.
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override {}
   void ClickedOutsideBubble() override {}
+  // No need to override since the icon and tray activation state will change
+  // and get updated simultaneously in `UpdateUXOnCurrentStatus()`.
+  void UpdateTrayItemColor(bool is_active) override {}
 
   // AccessibilityObserver:
   void OnAccessibilityStatusChanged() override;
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc
index a7a25a7..57964c4f 100644
--- a/ash/system/eche/eche_tray.cc
+++ b/ash/system/eche/eche_tray.cc
@@ -254,8 +254,13 @@
   // Note: `ScreenLayoutObserver` starts observing at its constructor.
   observed_session_.Observe(Shell::Get()->session_controller());
   icon_->SetTooltipText(GetAccessibleNameForTray());
-  icon_->SetImage(ui::ImageModel::FromVectorIcon(kPhoneHubPhoneIcon,
-                                                 kColorAshIconColorPrimary));
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active());
+  } else {
+    icon_->SetImage(ui::ImageModel::FromVectorIcon(kPhoneHubPhoneIcon,
+                                                   kColorAshIconColorPrimary));
+  }
+
   shelf_observation_.Observe(shelf);
   tablet_mode_observation_.Observe(Shell::Get()->tablet_mode_controller());
   shell_observer_.Observe(Shell::Get());
@@ -280,6 +285,14 @@
   //  Do nothing
 }
 
+void EcheTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  icon_->SetImage(ui::ImageModel::FromVectorIcon(
+      kPhoneHubPhoneIcon, is_active
+                              ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                              : cros_tokens::kCrosSysOnSurface));
+}
+
 std::u16string EcheTray::GetAccessibleNameForTray() {
   // TODO(nayebi): Change this based on the final model of interaction
   // between phone hub and Eche.
diff --git a/ash/system/eche/eche_tray.h b/ash/system/eche/eche_tray.h
index 7e89e79..c87a0104 100644
--- a/ash/system/eche/eche_tray.h
+++ b/ash/system/eche/eche_tray.h
@@ -126,6 +126,7 @@
 
   // TrayBackgroundView:
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
diff --git a/ash/system/holding_space/holding_space_tray.h b/ash/system/holding_space/holding_space_tray.h
index af4443b1..76f455c 100644
--- a/ash/system/holding_space/holding_space_tray.h
+++ b/ash/system/holding_space/holding_space_tray.h
@@ -67,6 +67,9 @@
   // TrayBackgroundView:
   void Initialize() override;
   void ClickedOutsideBubble() override;
+  // TODO(http://b/287098833): No need to override since the update will be
+  // handled in the linked bug.
+  void UpdateTrayItemColor(bool is_active) override {}
   std::u16string GetAccessibleNameForTray() override;
   views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override;
   std::u16string GetTooltipText(const gfx::Point& point) const override;
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index e0017436d..c4fd02c 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -51,6 +51,7 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/models/image_model.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -502,6 +503,12 @@
   CloseBubble();
 }
 
+void ImeMenuTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  UpdateTrayImageOrLabelColor(
+      extension_ime_util::IsArcIME(ime_controller_->current_ime().id));
+}
+
 void ImeMenuTray::OnTrayActivated(const ui::Event& event) {
   if (!event.IsMouseEvent() && !event.IsGestureEvent())
     return;
@@ -608,15 +615,22 @@
   // IME.
   if (extension_ime_util::IsArcIME(current_ime.id)) {
     CreateImageView();
-    image_view_->SetImage(ui::ImageModel::FromVectorIcon(
-        kShelfGlobeIcon, kColorAshIconColorPrimary));
+    if (chromeos::features::IsJellyEnabled()) {
+      UpdateTrayImageOrLabelColor(/*is_image=*/true);
+    } else {
+      image_view_->SetImage(ui::ImageModel::FromVectorIcon(
+          kShelfGlobeIcon, kColorAshIconColorPrimary));
+    }
     return;
   }
 
   // Updates the tray label based on the current input method.
   CreateLabel();
-
-  label_->SetEnabledColorId(kColorAshIconColorPrimary);
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayImageOrLabelColor(/*is_image=*/false);
+  } else {
+    label_->SetEnabledColorId(kColorAshIconColorPrimary);
+  }
 
   if (current_ime.third_party)
     label_->SetText(current_ime.short_name + u"*");
@@ -655,6 +669,21 @@
   tray_container()->AddChildView(image_view_.get());
 }
 
+void ImeMenuTray::UpdateTrayImageOrLabelColor(bool is_image) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  const ui::ColorId color_id =
+      is_active() ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                  : cros_tokens::kCrosSysOnSurface;
+
+  if (is_image) {
+    image_view_->SetImage(
+        ui::ImageModel::FromVectorIcon(kShelfGlobeIcon, color_id));
+    return;
+  }
+
+  label_->SetEnabledColorId(color_id);
+}
+
 BEGIN_METADATA(ImeMenuTray, TrayBackgroundView)
 END_METADATA
 
diff --git a/ash/system/ime_menu/ime_menu_tray.h b/ash/system/ime_menu/ime_menu_tray.h
index b4557e27..b8651ca 100644
--- a/ash/system/ime_menu/ime_menu_tray.h
+++ b/ash/system/ime_menu/ime_menu_tray.h
@@ -60,6 +60,7 @@
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   void OnTrayActivated(const ui::Event& event) override;
   void CloseBubble() override;
   void ShowBubble() override;
@@ -93,6 +94,10 @@
   void CreateLabel();
   void CreateImageView();
 
+  // For Jelly: Updates the color of `image_view_` if `is_image` is true or the
+  // color of `label_` otherwise.
+  void UpdateTrayImageOrLabelColor(bool is_image);
+
   raw_ptr<ImeControllerImpl, ExperimentalAsh> ime_controller_;
 
   // Bubble for default and detailed views.
diff --git a/ash/system/media/media_tray.cc b/ash/system/media/media_tray.cc
index 5ae18dd..21243203 100644
--- a/ash/system/media/media_tray.cc
+++ b/ash/system/media/media_tray.cc
@@ -224,9 +224,13 @@
   auto icon = std::make_unique<views::ImageView>();
   icon->SetTooltipText(l10n_util::GetStringUTF16(
       IDS_ASH_GLOBAL_MEDIA_CONTROLS_BUTTON_TOOLTIP_TEXT));
-  icon->SetImage(ui::ImageModel::FromVectorIcon(kGlobalMediaControlsIcon,
-                                                kColorAshIconColorPrimary));
   icon_ = tray_container()->AddChildView(std::move(icon));
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active());
+  } else {
+    icon_->SetImage(ui::ImageModel::FromVectorIcon(kGlobalMediaControlsIcon,
+                                                   kColorAshIconColorPrimary));
+  }
 }
 
 MediaTray::~MediaTray() {
@@ -295,6 +299,14 @@
   CloseBubble();
 }
 
+void MediaTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  icon_->SetImage(ui::ImageModel::FromVectorIcon(
+      kGlobalMediaControlsIcon,
+      is_active ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                : cros_tokens::kCrosSysOnSurface));
+}
+
 void MediaTray::OnLockStateChanged(bool locked) {
   UpdateDisplayState();
 }
diff --git a/ash/system/media/media_tray.h b/ash/system/media/media_tray.h
index 9d64a77..0dff4211 100644
--- a/ash/system/media/media_tray.h
+++ b/ash/system/media/media_tray.h
@@ -73,6 +73,7 @@
   void CloseBubble() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   void AnchorUpdated() override;
 
   // SessionObserver:
diff --git a/ash/system/media/media_tray_unittest.cc b/ash/system/media/media_tray_unittest.cc
index 44d0eda..55f2d18 100644
--- a/ash/system/media/media_tray_unittest.cc
+++ b/ash/system/media/media_tray_unittest.cc
@@ -85,6 +85,7 @@
   void HandleLocaleChange() override {}
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override {}
   void ClickedOutsideBubble() override {}
+  void UpdateTrayItemColor(bool is_active) override {}
 };
 
 }  // namespace
diff --git a/ash/system/notification_center/notification_center_tray.cc b/ash/system/notification_center/notification_center_tray.cc
index 8342d791..0b4a3fc 100644
--- a/ash/system/notification_center/notification_center_tray.cc
+++ b/ash/system/notification_center/notification_center_tray.cc
@@ -141,6 +141,14 @@
   CloseBubble();
 }
 
+void NotificationCenterTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  for (auto* tray_item : tray_container()->children()) {
+    static_cast<TrayItemView*>(tray_item)->UpdateLabelOrImageViewColor(
+        is_active);
+  }
+}
+
 void NotificationCenterTray::CloseBubble() {
   if (!bubble_) {
     return;
@@ -148,7 +156,6 @@
 
   bubble_.reset();
   SetIsActive(false);
-  UpdateTrayItemsColor(/*active=*/false);
 
   // Inform the message center that the bubble has closed so that popups are
   // created for new notifications.
@@ -174,7 +181,6 @@
   bubble_->ShowBubble();
 
   SetIsActive(true);
-  UpdateTrayItemsColor(/*active=*/true);
 }
 
 void NotificationCenterTray::UpdateAfterLoginStatusChange() {
@@ -222,7 +228,9 @@
       message_center::MessageCenter::Get()->NotificationCount() > 0 &&
       system_tray_visible_;
   SetVisiblePreferred(new_visibility);
-  UpdateTrayItemsColor(is_active());
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active());
+  }
 
   // We should close the bubble if there are no more notifications to show.
   if (!new_visibility && bubble_) {
@@ -230,15 +238,6 @@
   }
 }
 
-void NotificationCenterTray::UpdateTrayItemsColor(bool active) {
-  if (!chromeos::features::IsJellyEnabled()) {
-    return;
-  }
-  for (auto* tray_item : tray_container()->children()) {
-    static_cast<TrayItemView*>(tray_item)->UpdateLabelOrImageViewColor(active);
-  }
-}
-
 BEGIN_METADATA(NotificationCenterTray, TrayBackgroundView)
 END_METADATA
 
diff --git a/ash/system/notification_center/notification_center_tray.h b/ash/system/notification_center/notification_center_tray.h
index 6a564dbf..693c5c3 100644
--- a/ash/system/notification_center/notification_center_tray.h
+++ b/ash/system/notification_center/notification_center_tray.h
@@ -72,6 +72,7 @@
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   void CloseBubble() override;
   void ShowBubble() override;
   void UpdateAfterLoginStatusChange() override;
@@ -97,10 +98,6 @@
   friend class NotificationCounterViewTest;
   friend class NotificationIconsControllerTest;
 
-  // Updates the color of all tray item views in `tray_container()` based on the
-  // active status.
-  void UpdateTrayItemsColor(bool active);
-
   // Manages notification metrics.
   const std::unique_ptr<NotificationMetricsRecorder>
       notification_metrics_recorder_;
diff --git a/ash/system/overview/overview_button_tray.cc b/ash/system/overview/overview_button_tray.cc
index 9ad1f6d..4b00ad2d4 100644
--- a/ash/system/overview/overview_button_tray.cc
+++ b/ash/system/overview/overview_button_tray.cc
@@ -23,8 +23,12 @@
 #include "ash/wm/window_state.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/animation/ink_drop.h"
 #include "ui/views/border.h"
@@ -35,13 +39,6 @@
 
 namespace {
 
-gfx::ImageSkia GetIconImage() {
-  return gfx::CreateVectorIcon(
-      kShelfOverviewIcon,
-      AshColorProvider::Get()->GetContentLayerColor(
-          AshColorProvider::ContentLayerType::kButtonIconColor));
-}
-
 bool ShouldButtonBeVisible() {
   auto* shell = Shell::Get();
   SessionControllerImpl* session_controller = shell->session_controller();
@@ -154,6 +151,11 @@
 
 void OverviewButtonTray::ClickedOutsideBubble() {}
 
+void OverviewButtonTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  icon_->SetImage(GetIconImage());
+}
+
 std::u16string OverviewButtonTray::GetAccessibleNameForTray() {
   return l10n_util::GetStringUTF16(IDS_ASH_OVERVIEW_BUTTON_ACCESSIBLE_NAME);
 }
@@ -239,6 +241,19 @@
   SetVisiblePreferred(ShouldButtonBeVisible());
 }
 
+gfx::ImageSkia OverviewButtonTray::GetIconImage() {
+  SkColor color;
+  if (GetColorProvider() && chromeos::features::IsJellyEnabled()) {
+    color = GetColorProvider()->GetColor(
+        is_active() ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                    : cros_tokens::kCrosSysOnSurface);
+  } else {
+    color = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kButtonIconColor);
+  }
+  return gfx::CreateVectorIcon(kShelfOverviewIcon, color);
+}
+
 BEGIN_METADATA(OverviewButtonTray, TrayBackgroundView)
 END_METADATA
 
diff --git a/ash/system/overview/overview_button_tray.h b/ash/system/overview/overview_button_tray.h
index 49d4e4a..4518553 100644
--- a/ash/system/overview/overview_button_tray.h
+++ b/ash/system/overview/overview_button_tray.h
@@ -81,6 +81,7 @@
   // TrayBackgroundView:
   void UpdateAfterLoginStatusChange() override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
@@ -95,6 +96,9 @@
 
   void UpdateIconVisibility();
 
+  // Gets the icon image of `icon_`.
+  gfx::ImageSkia GetIconImage();
+
   // Weak pointer, will be parented by TrayContainer for its lifetime.
   raw_ptr<views::ImageView, ExperimentalAsh> icon_;
 
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc
index 9b4e729..5cd2bf9 100644
--- a/ash/system/palette/palette_tray.cc
+++ b/ash/system/palette/palette_tray.cc
@@ -46,6 +46,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/color/color_id.h"
 #include "ui/compositor/layer.h"
 #include "ui/display/display.h"
@@ -276,7 +277,6 @@
   icon->SetTooltipText(l10n_util::GetStringUTF16(IDS_ASH_STYLUS_TOOLS_TITLE));
   tray_container()->SetMargin(kTrayIconMainAxisInset, kTrayIconCrossAxisInset);
   icon_ = tray_container()->AddChildView(std::move(icon));
-  UpdateTrayIcon();
 
   Shell::Get()->AddShellObserver(this);
   Shell::Get()->window_tree_host_manager()->AddObserver(this);
@@ -464,6 +464,11 @@
   HidePalette();
 }
 
+void PaletteTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  UpdateTrayIcon();
+}
+
 void PaletteTray::OnThemeChanged() {
   TrayBackgroundView::OnThemeChanged();
   UpdateTrayIcon();
@@ -702,12 +707,19 @@
 }
 
 void PaletteTray::UpdateTrayIcon() {
+  SkColor color;
+  if (chromeos::features::IsJellyEnabled()) {
+    color = GetColorProvider()->GetColor(
+        is_active() ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                    : cros_tokens::kCrosSysOnSurface);
+  } else {
+    color = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kIconColorPrimary);
+  }
   icon_->SetImage(CreateVectorIcon(
       palette_tool_manager_->GetActiveTrayIcon(
           palette_tool_manager_->GetActiveTool(PaletteGroup::MODE)),
-      kTrayIconSize,
-      AshColorProvider::Get()->GetContentLayerColor(
-          AshColorProvider::ContentLayerType::kIconColorPrimary)));
+      kTrayIconSize, color));
 }
 
 void PaletteTray::OnPaletteEnabledPrefChanged() {
diff --git a/ash/system/palette/palette_tray.h b/ash/system/palette/palette_tray.h
index e8519a55..e214caa96 100644
--- a/ash/system/palette/palette_tray.h
+++ b/ash/system/palette/palette_tray.h
@@ -98,6 +98,7 @@
 
   // TrayBackgroundView:
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   void OnThemeChanged() override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
diff --git a/ash/system/phonehub/phone_hub_tray.cc b/ash/system/phonehub/phone_hub_tray.cc
index d64d7d4..576b1a1 100644
--- a/ash/system/phonehub/phone_hub_tray.cc
+++ b/ash/system/phonehub/phone_hub_tray.cc
@@ -115,16 +115,15 @@
       views::ImageButton::VerticalAlignment::ALIGN_MIDDLE);
   icon->SetImageHorizontalAlignment(
       views::ImageButton::HorizontalAlignment::ALIGN_CENTER);
-
-  icon->SetImageModel(
-      views::ImageButton::STATE_NORMAL,
-      ui::ImageModel::FromVectorIcon(
-          kPhoneHubPhoneIcon,
-          chromeos::features::IsJellyrollEnabled()
-              ? static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)
-              : kColorAshIconColorPrimary));
-
   icon_ = tray_container()->AddChildView(std::move(icon));
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active());
+  } else {
+    icon_->SetImageModel(views::ImageButton::STATE_NORMAL,
+                         ui::ImageModel::FromVectorIcon(
+                             kPhoneHubPhoneIcon, kColorAshIconColorPrimary));
+  }
+
   Shell::Get()->window_tree_host_manager()->AddObserver(this);
 }
 
@@ -153,6 +152,16 @@
   CloseBubble();
 }
 
+void PhoneHubTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  icon_->SetImageModel(
+      views::ImageButton::STATE_NORMAL,
+      ui::ImageModel::FromVectorIcon(
+          kPhoneHubPhoneIcon,
+          is_active ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                    : cros_tokens::kCrosSysOnSurface));
+}
+
 std::u16string PhoneHubTray::GetAccessibleNameForTray() {
   return l10n_util::GetStringUTF16(IDS_ASH_PHONE_HUB_TRAY_ACCESSIBLE_NAME);
 }
diff --git a/ash/system/phonehub/phone_hub_tray.h b/ash/system/phonehub/phone_hub_tray.h
index 0895f693..b39e67fd 100644
--- a/ash/system/phonehub/phone_hub_tray.h
+++ b/ash/system/phonehub/phone_hub_tray.h
@@ -65,6 +65,7 @@
 
   // TrayBackgroundView:
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
diff --git a/ash/system/session/logout_button_tray.h b/ash/system/session/logout_button_tray.h
index 7c7d0f6..375684d8 100644
--- a/ash/system/session/logout_button_tray.h
+++ b/ash/system/session/logout_button_tray.h
@@ -44,6 +44,9 @@
   void UpdateLayout() override;
   void UpdateBackground() override;
   void ClickedOutsideBubble() override;
+  // No need to override since this view doesn't have an active/inactive state.
+  // Clicking on it will log out of the session and make this view disappear.
+  void UpdateTrayItemColor(bool is_active) override {}
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
diff --git a/ash/system/tray/status_area_overflow_button_tray.h b/ash/system/tray/status_area_overflow_button_tray.h
index 6ed539e..0d6de2c2 100644
--- a/ash/system/tray/status_area_overflow_button_tray.h
+++ b/ash/system/tray/status_area_overflow_button_tray.h
@@ -43,6 +43,8 @@
 
   // TrayBackgroundView:
   void ClickedOutsideBubble() override;
+  // No need to override since this view doesn't have an active/inactive state.
+  void UpdateTrayItemColor(bool is_active) override {}
   std::u16string GetAccessibleNameForTray() override;
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc
index 413c094..4a5ea8c 100644
--- a/ash/system/tray/tray_background_view.cc
+++ b/ash/system/tray/tray_background_view.cc
@@ -863,13 +863,15 @@
     return;
   }
   is_active_ = is_active;
-  if (!chromeos::features::IsJellyEnabled()) {
+  UpdateBackgroundColor(is_active);
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active);
+  } else {
     views::InkDrop::Get(this)->AnimateToState(
         is_active_ ? views::InkDropState::ACTIVATED
                    : views::InkDropState::DEACTIVATED,
         nullptr);
   }
-  UpdateBackgroundColor(is_active);
 }
 
 views::View* TrayBackgroundView::GetBubbleAnchor() const {
diff --git a/ash/system/tray/tray_background_view.h b/ash/system/tray/tray_background_view.h
index a4ed7bc..261a10b 100644
--- a/ash/system/tray/tray_background_view.h
+++ b/ash/system/tray/tray_background_view.h
@@ -161,6 +161,10 @@
   // Updates the background layer.
   virtual void UpdateBackground();
 
+  // For Jelly: updates the color of either the icon or the label of this view
+  // based on the active state specified by `is_active`.
+  virtual void UpdateTrayItemColor(bool is_active) = 0;
+
   // Gets the anchor for bubbles, which is tray_container().
   views::View* GetBubbleAnchor() const;
 
diff --git a/ash/system/tray/tray_background_view_unittest.cc b/ash/system/tray/tray_background_view_unittest.cc
index 86ecc715..13a3d2c 100644
--- a/ash/system/tray/tray_background_view_unittest.cc
+++ b/ash/system/tray/tray_background_view_unittest.cc
@@ -38,6 +38,7 @@
 
   // TrayBackgroundView:
   void ClickedOutsideBubble() override {}
+  void UpdateTrayItemColor(bool is_active) override {}
   std::u16string GetAccessibleNameForTray() override {
     return u"TestTrayBackgroundView";
   }
diff --git a/ash/system/unified/date_tray.cc b/ash/system/unified/date_tray.cc
index 04d34cea..0b32fe52 100644
--- a/ash/system/unified/date_tray.cc
+++ b/ash/system/unified/date_tray.cc
@@ -106,14 +106,16 @@
   }
 }
 
+void DateTray::UpdateTrayItemColor(bool is_active) {
+  time_view_->UpdateLabelOrImageViewColor(is_active);
+}
+
 void DateTray::OnOpeningCalendarView() {
   SetIsActive(true);
-  time_view_->UpdateLabelOrImageViewColor(/*active=*/true);
 }
 
 void DateTray::OnLeavingCalendarView() {
   SetIsActive(false);
-  time_view_->UpdateLabelOrImageViewColor(/*active=*/false);
 }
 
 void DateTray::OnButtonPressed(const ui::Event& event) {
diff --git a/ash/system/unified/date_tray.h b/ash/system/unified/date_tray.h
index b7c4254..265c821 100644
--- a/ash/system/unified/date_tray.h
+++ b/ash/system/unified/date_tray.h
@@ -50,6 +50,7 @@
   void CloseBubble() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override {}
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
 
   // UnifiedSystemTray::Observer:
   void OnOpeningCalendarView() override;
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index 64b20bab..30fd46a 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -541,7 +541,6 @@
 
 void UnifiedSystemTray::OnOpeningCalendarView() {
   SetIsActive(false);
-  UpdateTrayItemsColor(/*active=*/false);
   for (auto& observer : observers_) {
     observer.OnOpeningCalendarView();
   }
@@ -549,7 +548,6 @@
 
 void UnifiedSystemTray::OnTransitioningFromCalendarToMainView() {
   SetIsActive(true);
-  UpdateTrayItemsColor(/*active=*/true);
   for (auto& observer : observers_) {
     observer.OnLeavingCalendarView();
   }
@@ -792,13 +790,11 @@
     return;
   }
   SetIsActive(true);
-  UpdateTrayItemsColor(/*active=*/true);
 }
 
 void UnifiedSystemTray::HideBubbleInternal() {
   DestroyBubbles();
   SetIsActive(false);
-  UpdateTrayItemsColor(/*active=*/false);
 }
 
 void UnifiedSystemTray::UpdateNotificationInternal() {
@@ -863,12 +859,10 @@
   bubble_.reset();
 }
 
-void UnifiedSystemTray::UpdateTrayItemsColor(bool active) {
-  if (!chromeos::features::IsJellyEnabled()) {
-    return;
-  }
+void UnifiedSystemTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
   for (auto* tray_item : tray_items_) {
-    tray_item->UpdateLabelOrImageViewColor(active);
+    tray_item->UpdateLabelOrImageViewColor(is_active);
   }
 }
 
diff --git a/ash/system/unified/unified_system_tray.h b/ash/system/unified/unified_system_tray.h
index 3bc0856..b9a0cf7 100644
--- a/ash/system/unified/unified_system_tray.h
+++ b/ash/system/unified/unified_system_tray.h
@@ -208,6 +208,7 @@
   void HideBubble(const TrayBubbleView* bubble_view) override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
   void UpdateLayout() override;
   void UpdateAfterLoginStatusChange() override;
   bool ShouldEnableExtraKeyboardAccessibility() override;
@@ -300,10 +301,6 @@
   // removing bubble related observers.
   void DestroyBubbles();
 
-  // Updates the color of all tray item views in `tray_container()` based on the
-  // active status.
-  void UpdateTrayItemsColor(bool active);
-
   std::unique_ptr<UiDelegate> ui_delegate_;
 
   std::unique_ptr<UnifiedSystemTrayBubble> bubble_;
diff --git a/ash/system/video_conference/video_conference_tray.h b/ash/system/video_conference/video_conference_tray.h
index fd116d9d..df196ac 100644
--- a/ash/system/video_conference/video_conference_tray.h
+++ b/ash/system/video_conference/video_conference_tray.h
@@ -126,6 +126,8 @@
   std::u16string GetAccessibleNameForBubble() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  // No need to override since this view doesn't have an active/inactive state.
+  void UpdateTrayItemColor(bool is_active) override {}
   void HandleLocaleChange() override;
   void AnchorUpdated() override;
   void OnAnimationEnded() override;
diff --git a/ash/system/virtual_keyboard/virtual_keyboard_tray.cc b/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
index d215a63c..858ae22 100644
--- a/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
+++ b/ash/system/virtual_keyboard/virtual_keyboard_tray.cc
@@ -17,6 +17,7 @@
 #include "ash/style/ash_color_id.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_container.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/models/image_model.h"
@@ -52,6 +53,12 @@
   icon->SetBorder(views::CreateEmptyBorder(
       gfx::Insets::VH(vertical_padding, horizontal_padding)));
   icon_ = tray_container()->AddChildView(std::move(icon));
+  // First sets the image with non-Jelly color to get the image dimension and
+  // create the correct paddings, and then updates the color if Jelly is
+  // enabled.
+  if (chromeos::features::IsJellyEnabled()) {
+    UpdateTrayItemColor(is_active());
+  }
 
   // The Shell may not exist in some unit tests.
   if (Shell::HasInstance()) {
@@ -119,6 +126,14 @@
 
 void VirtualKeyboardTray::ClickedOutsideBubble() {}
 
+void VirtualKeyboardTray::UpdateTrayItemColor(bool is_active) {
+  DCHECK(chromeos::features::IsJellyEnabled());
+  icon_->SetImage(ui::ImageModel::FromVectorIcon(
+      kShelfKeyboardNewuiIcon,
+      is_active ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                : cros_tokens::kCrosSysOnSurface));
+}
+
 void VirtualKeyboardTray::OnAccessibilityStatusChanged() {
   bool new_enabled =
       Shell::Get()->accessibility_controller()->virtual_keyboard().enabled();
diff --git a/ash/system/virtual_keyboard/virtual_keyboard_tray.h b/ash/system/virtual_keyboard/virtual_keyboard_tray.h
index a0e247e8..631d3d5 100644
--- a/ash/system/virtual_keyboard/virtual_keyboard_tray.h
+++ b/ash/system/virtual_keyboard/virtual_keyboard_tray.h
@@ -42,6 +42,7 @@
   void HandleLocaleChange() override;
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override;
   void ClickedOutsideBubble() override;
+  void UpdateTrayItemColor(bool is_active) override;
 
   // AccessibilityObserver:
   void OnAccessibilityStatusChanged() override;
diff --git a/ash/webui/camera_app_ui/resources/js/main.ts b/ash/webui/camera_app_ui/resources/js/main.ts
index d6ce35b..731a0de 100644
--- a/ash/webui/camera_app_ui/resources/js/main.ts
+++ b/ash/webui/camera_app_ui/resources/js/main.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {
-  startColorChangeUpdater,
+  ColorChangeUpdater,
 } from
     'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
@@ -516,7 +516,7 @@
     });
   }
   if (loadTimeData.getChromeFlag(Flag.JELLY)) {
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
     await loadCSS('chrome://theme/colors.css?sets=ref,sys');
   } else {
     await loadCSS('/css/colors_default.css');
diff --git a/ash/webui/color_internals/resources/index.ts b/ash/webui/color_internals/resources/index.ts
index c16766f9..271f4114 100644
--- a/ash/webui/color_internals/resources/index.ts
+++ b/ash/webui/color_internals/resources/index.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 {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {getRGBAFromComputedStyle} from './utils.js';
 import {startObservingWallpaperColors} from './wallpaper_colors.js';
@@ -104,7 +104,7 @@
 
 window.onload = () => {
   populateTokenTable();
-  startColorChangeUpdater();
+  ColorChangeUpdater.forDocument().start();
   startObservingWallpaperColors();
   ColorChangeUpdater.forDocument().eventTarget.addEventListener(
       COLOR_PROVIDER_CHANGED, onColorChange);
diff --git a/ash/webui/common/resources/cellular_setup/base_page.html b/ash/webui/common/resources/cellular_setup/base_page.html
index 8b5a558..a945978 100644
--- a/ash/webui/common/resources/cellular_setup/base_page.html
+++ b/ash/webui/common/resources/cellular_setup/base_page.html
@@ -1,4 +1,4 @@
-<style include="iron-positioning">
+<style include="iron-positioning cros-color-overrides">
   :host {
     display: flex;
     flex-direction: column;
diff --git a/ash/webui/common/resources/cellular_setup/base_page.js b/ash/webui/common/resources/cellular_setup/base_page.js
index 7c2cfe12..7e096d0 100644
--- a/ash/webui/common/resources/cellular_setup/base_page.js
+++ b/ash/webui/common/resources/cellular_setup/base_page.js
@@ -3,8 +3,9 @@
 // found in the LICENSE file.
 
 /** Base template with elements common to all Cellular Setup flow sub-pages. */
-import '//resources/cr_elements/cr_shared_vars.css.js';
 import '//resources/ash/common/cellular_setup/cellular_setup_icons.html.js';
+import '//resources/cr_elements/chromeos/cros_color_overrides.css.js';
+import '//resources/cr_elements/cr_shared_vars.css.js';
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 
 import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
diff --git a/ash/webui/common/resources/cellular_setup/button_bar.html b/ash/webui/common/resources/cellular_setup/button_bar.html
index 5f068e7..ce392974 100644
--- a/ash/webui/common/resources/cellular_setup/button_bar.html
+++ b/ash/webui/common/resources/cellular_setup/button_bar.html
@@ -1,4 +1,4 @@
-<style>
+<style include="cros-color-overrides">
   :host {
     display: flex;
     justify-content: flex-end;
diff --git a/ash/webui/common/resources/cellular_setup/button_bar.js b/ash/webui/common/resources/cellular_setup/button_bar.js
index 03b6b0b..a8ec87f 100644
--- a/ash/webui/common/resources/cellular_setup/button_bar.js
+++ b/ash/webui/common/resources/cellular_setup/button_bar.js
@@ -3,13 +3,14 @@
 // found in the LICENSE file.
 
 /** Element containing navigation buttons for the Cellular Setup flow. */
+import '//resources/cr_elements/chromeos/cros_color_overrides.css.js';
 import '//resources/cr_elements/cr_button/cr_button.js';
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
+import {assert, assertNotReached} from '//resources/ash/common/assert.js';
 import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js';
 import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
-import {assert, assertNotReached} from '//resources/ash/common/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './button_bar.html.js';
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
index 1aa1d5af..2f1a53a 100644
--- a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
+++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
@@ -14,7 +14,7 @@
 import {assert} from '//resources/ash/common/assert.js';
 import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {HostDevice} from 'chrome://resources/mojo/chromeos/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-webui.js';
 
@@ -192,7 +192,10 @@
       link.href = 'chrome://theme/colors.css?sets=legacy,sys';
       document.head.appendChild(link);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
   },
 
diff --git a/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts b/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
index 09fef3f8..b83c725 100644
--- a/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
+++ b/ash/webui/common/resources/office_fallback/office_fallback_dialog.ts
@@ -6,7 +6,7 @@
 import './strings.m.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 
 import {DialogChoice} from './office_fallback.mojom-webui.js';
@@ -17,7 +17,7 @@
   const jellyEnabled = loadTimeData.getBoolean('isJellyEnabled');
   const theme = jellyEnabled ? 'refresh23' : 'legacy';
   document.documentElement.setAttribute('theme', theme);
-  startColorChangeUpdater();
+  ColorChangeUpdater.forDocument().start();
 });
 
 /**
diff --git a/ash/webui/diagnostics_ui/resources/diagnostics_app.ts b/ash/webui/diagnostics_ui/resources/diagnostics_app.ts
index 18f1caa..6fff07e 100644
--- a/ash/webui/diagnostics_ui/resources/diagnostics_app.ts
+++ b/ash/webui/diagnostics_ui/resources/diagnostics_app.ts
@@ -16,7 +16,7 @@
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {SelectorItem} from 'chrome://resources/ash/common/navigation_selector.js';
 import {NavigationViewPanelElement} from 'chrome://resources/ash/common/navigation_view_panel.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
@@ -210,7 +210,7 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      ColorChangeUpdater.forDocument().start();
     }
 
     this.createNavigationPanel();
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_app.js b/ash/webui/firmware_update_ui/resources/firmware_update_app.js
index ec59d854..1605aa8f 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_app.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_app.js
@@ -11,7 +11,7 @@
 
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -52,9 +52,12 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
   }
 }
 
-customElements.define(FirmwareUpdateAppElement.is, FirmwareUpdateAppElement);
\ No newline at end of file
+customElements.define(FirmwareUpdateAppElement.is, FirmwareUpdateAppElement);
diff --git a/ash/webui/help_app_ui/resources/receiver.js b/ash/webui/help_app_ui/resources/receiver.js
index 163f938..779a113 100644
--- a/ash/webui/help_app_ui/resources/receiver.js
+++ b/ash/webui/help_app_ui/resources/receiver.js
@@ -8,7 +8,7 @@
  */
 import './sandboxed_load_time_data.js';
 
-import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {MessagePipe} from './message_pipe.js';
 import {Message} from './message_types.js';
@@ -89,11 +89,12 @@
   delegate: DELEGATE,
 };
 
-window.addEventListener('DOMContentLoaded', () => {
-  // Start listening to color change events. These events get picked up by logic
-  // in ts_helpers.ts on the google3 side.
-  startColorChangeUpdater();
-});
+window.addEventListener(
+    'DOMContentLoaded', /** @suppress {checkTypes} */ function() {
+      // Start listening to color change events. These events get picked up by
+      // logic in ts_helpers.ts on the google3 side.
+      ColorChangeUpdater.forDocument().start();
+    });
 // Expose functions to bind to color change events to window so they can be
 // automatically picked up by installColors(). See ts_helpers.ts in google3.
 window['addColorChangeListener'] =
diff --git a/ash/webui/media_app_ui/resources/js/receiver.js b/ash/webui/media_app_ui/resources/js/receiver.js
index 7759a35..c6e299b 100644
--- a/ash/webui/media_app_ui/resources/js/receiver.js
+++ b/ash/webui/media_app_ui/resources/js/receiver.js
@@ -4,7 +4,7 @@
 
 import './sandboxed_load_time_data.js';
 
-import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {assertCast, MessagePipe} from './message_pipe.js';
 import {EditInPhotosMessage, FileContext, IsFileArcWritableMessage, IsFileArcWritableResponse, IsFileBrowserWritableMessage, IsFileBrowserWritableResponse, LoadFilesMessage, Message, OpenAllowedFileMessage, OpenAllowedFileResponse, OpenFilesWithPickerMessage, OverwriteFileMessage, OverwriteViaFilePickerResponse, RenameFileResponse, RenameResult, RequestSaveFileMessage, RequestSaveFileResponse, SaveAsMessage, SaveAsResponse} from './message_types.js';
@@ -440,7 +440,10 @@
 window.addEventListener('DOMContentLoaded', () => {
   // Start listening to color change events. These events get picked up by logic
   // in ts_helpers.ts on the google3 side.
-  startColorChangeUpdater();
+  /** @suppress {checkTypes} */
+  (function() {
+    ColorChangeUpdater.forDocument().start();
+  })();
 
   const app = getApp();
   if (app) {
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js
index ca009bf..c8d1fc9 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -10,7 +10,7 @@
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FeedbackAppExitPath, FeedbackAppHelpContentOutcome, FeedbackAppPreSubmitAction, FeedbackContext, FeedbackServiceProviderInterface, Report, SendReportStatus} from './feedback_types.js';
@@ -279,7 +279,10 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
   }
 
diff --git a/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js b/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
index aa672a4..e638ebc 100644
--- a/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
+++ b/ash/webui/os_feedback_ui/untrusted_resources/untrusted_index.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {HelpContentElement} from './help_content.js';
 
@@ -48,8 +48,8 @@
     typographyLink.rel = 'stylesheet';
     document.head.appendChild(typographyLink);
     document.body.classList.add('jelly-enabled');
-    startColorChangeUpdater();
-    // Post a message to parent to make testing `startColorChangeUpdater()`
+    ColorChangeUpdater.forDocument().start();
+    // Post a message to parent to make testing `ColorChangeUpdater#start()`
     // called from untrusted ui easier.
     window.parent.postMessage(
         {
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts
index 70254c01..c1b5b0d 100644
--- a/ash/webui/personalization_app/resources/js/personalization_app.ts
+++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -44,7 +44,7 @@
 import './wallpaper/index.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {isPersonalizationJellyEnabled} from './load_time_booleans.js';
 import {emptyState} from './personalization_state.js';
@@ -146,5 +146,5 @@
   fontLink.href = 'chrome://theme/typography.css';
   document.head.appendChild(fontLink);
   document.body.classList.add('jelly-enabled');
-  startColorChangeUpdater();
+  ColorChangeUpdater.forDocument().start();
 }
diff --git a/ash/webui/print_management/resources/print_management.ts b/ash/webui/print_management/resources/print_management.ts
index 557137e..671440c 100644
--- a/ash/webui/print_management/resources/print_management.ts
+++ b/ash/webui/print_management/resources/print_management.ts
@@ -18,7 +18,7 @@
 
 import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js';
@@ -194,7 +194,7 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      ColorChangeUpdater.forDocument().start();
     }
   }
 
diff --git a/ash/webui/sample_system_web_app_ui/resources/trusted/page_handler.ts b/ash/webui/sample_system_web_app_ui/resources/trusted/page_handler.ts
index 5bdb52e..48bc27b32 100644
--- a/ash/webui/sample_system_web_app_ui/resources/trusted/page_handler.ts
+++ b/ash/webui/sample_system_web_app_ui/resources/trusted/page_handler.ts
@@ -36,7 +36,7 @@
  */
 
 import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from '/ash/webui/sample_system_web_app_ui/mojom/sample_system_web_app_ui.mojom-webui.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
 // Used to make calls on the remote PageHandler interface. Singleton that client
 // modules can use directly.
@@ -52,4 +52,4 @@
     pageHandler.$.bindNewPipeAndPassReceiver(),
     callbackRouter.$.bindNewPipeAndPassRemote());
 
-startColorChangeUpdater();
+ColorChangeUpdater.forDocument().start();
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js
index 568c984..77ef945b 100644
--- a/ash/webui/scanning/resources/scanning_app.js
+++ b/ash/webui/scanning/resources/scanning_app.js
@@ -32,7 +32,7 @@
 import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js';
 import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getScanService} from './mojo_interface_provider.js';
@@ -414,7 +414,10 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
   },
 
diff --git a/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.ts b/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.ts
index b77d341..0c863f9d 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/shortcut_customization_app.ts
@@ -16,7 +16,7 @@
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {NavigationViewPanelElement} from 'chrome://resources/ash/common/navigation_view_panel.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElementProperties} from 'chrome://resources/polymer/v3_0/polymer/interfaces.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -125,7 +125,7 @@
       typographyLink.rel = 'stylesheet';
       document.head.appendChild(typographyLink);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      ColorChangeUpdater.forDocument().start();
     }
 
     this.fetchAccelerators();
diff --git a/ash/wm_mode/wm_mode_button_tray.cc b/ash/wm_mode/wm_mode_button_tray.cc
index c903f9c..a3481e8 100644
--- a/ash/wm_mode/wm_mode_button_tray.cc
+++ b/ash/wm_mode/wm_mode_button_tray.cc
@@ -13,7 +13,9 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_container.h"
 #include "ash/wm_mode/wm_mode_controller.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "ui/base/models/image_model.h"
+#include "ui/color/color_id.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -49,9 +51,15 @@
 }
 
 void WmModeButtonTray::UpdateButtonVisuals(bool is_wm_mode_active) {
+  const ui::ColorId color_id =
+      chromeos::features::IsJellyEnabled()
+          ? static_cast<ui::ColorId>(
+                is_wm_mode_active
+                    ? cros_tokens::kCrosSysSystemOnPrimaryContainer
+                    : cros_tokens::kCrosSysOnSurface)
+          : kColorAshIconColorPrimary;
   image_view_->SetImage(ui::ImageModel::FromVectorIcon(
-      is_wm_mode_active ? kWmModeOnIcon : kWmModeOffIcon,
-      GetColorProvider()->GetColor(kColorAshIconColorPrimary)));
+      is_wm_mode_active ? kWmModeOnIcon : kWmModeOffIcon, color_id));
   SetIsActive(is_wm_mode_active);
 }
 
diff --git a/ash/wm_mode/wm_mode_button_tray.h b/ash/wm_mode/wm_mode_button_tray.h
index fd8f19a6..d2f0e15 100644
--- a/ash/wm_mode/wm_mode_button_tray.h
+++ b/ash/wm_mode/wm_mode_button_tray.h
@@ -37,6 +37,9 @@
   void HandleLocaleChange() override {}
   void HideBubbleWithView(const TrayBubbleView* bubble_view) override {}
   void ClickedOutsideBubble() override {}
+  // No need to override since the icon and activation state of this tray will
+  // change and get updated simultaneously in `UpdateButtonVisuals()`.
+  void UpdateTrayItemColor(bool is_active) override {}
 
   // SessionObserver:
   void OnSessionStateChanged(session_manager::SessionState state) override;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index ba907d5..0ab0665 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2131,7 +2131,13 @@
       "profiler/module_cache_mac.cc",
       "synchronization/waitable_event_mac.cc",
     ]
-    frameworks += [ "Security.framework" ]
+    frameworks += [
+      "CoreFoundation.framework",
+      "CoreGraphics.framework",
+      "CoreText.framework",
+      "Foundation.framework",
+      "Security.framework",
+    ]
     public_deps += [ ":base_arc" ]
     allow_circular_includes_from = [ ":base_arc" ]
   }
diff --git a/base/apple/owned_objc.h b/base/apple/owned_objc.h
index 52aff36..6366a8e 100644
--- a/base/apple/owned_objc.h
+++ b/base/apple/owned_objc.h
@@ -38,24 +38,27 @@
 #define OWNED_TYPE_DECL_OBJC_ADDITIONS(name, objctype)
 #endif  // __OBJC__
 
-#define OWNED_OBJC_DECL(name, objctype)                      \
-  namespace base::apple {                                    \
-  class BASE_EXPORT Owned##name {                            \
-   public:                                                   \
-    /* Default-construct in a null state. */                 \
-    Owned##name();                                           \
-    ~Owned##name();                                          \
-    Owned##name(const Owned##name&);                         \
-    Owned##name& operator=(const Owned##name&);              \
-    /* Returns whether the object contains a valid object.*/ \
-    bool IsValid() const;                                    \
-    /* Objective-C-only constructor and getter. */           \
-    OWNED_TYPE_DECL_OBJC_ADDITIONS(name, objctype)           \
-                                                             \
-   private:                                                  \
-    struct ObjCStorage;                                      \
-    std::unique_ptr<ObjCStorage> objc_storage_;              \
-  };                                                         \
+#define OWNED_OBJC_DECL(name, objctype)                       \
+  namespace base::apple {                                     \
+  class BASE_EXPORT Owned##name {                             \
+   public:                                                    \
+    /* Default-construct in a null state. */                  \
+    Owned##name();                                            \
+    ~Owned##name();                                           \
+    Owned##name(const Owned##name&);                          \
+    Owned##name& operator=(const Owned##name&);               \
+    /* Returns whether the object contains a valid object. */ \
+    bool IsValid() const;                                     \
+    /* Comparisons. */                                        \
+    bool operator==(const Owned##name& other) const;          \
+    bool operator!=(const Owned##name& other) const;          \
+    /* Objective-C-only constructor and getter. */            \
+    OWNED_TYPE_DECL_OBJC_ADDITIONS(name, objctype)            \
+                                                              \
+   private:                                                   \
+    struct ObjCStorage;                                       \
+    std::unique_ptr<ObjCStorage> objc_storage_;               \
+  };                                                          \
   }  // namespace base::apple
 
 #define GENERATE_OWNED_OBJC_TYPE(name) OWNED_OBJC_DECL(name, name*)
diff --git a/base/apple/owned_objc.mm b/base/apple/owned_objc.mm
index f919df9..7e68609 100644
--- a/base/apple/owned_objc.mm
+++ b/base/apple/owned_objc.mm
@@ -33,6 +33,12 @@
   bool Owned##name::IsValid() const {                                  \
     return objc_storage_->obj != nil;                                  \
   }                                                                    \
+  bool Owned##name::operator==(const Owned##name& other) const {       \
+    return objc_storage_->obj == other.objc_storage_->obj;             \
+  }                                                                    \
+  bool Owned##name::operator!=(const Owned##name& other) const {       \
+    return !this->operator==(other);                                   \
+  }                                                                    \
   objctype Owned##name::Get() const {                                  \
     return objc_storage_->obj;                                         \
   }                                                                    \
diff --git a/base/apple/owned_objc_types.h b/base/apple/owned_objc_types.h
index 68be95d..e0e3d950 100644
--- a/base/apple/owned_objc_types.h
+++ b/base/apple/owned_objc_types.h
@@ -14,6 +14,7 @@
 #endif
 
 #if BUILDFLAG(IS_MAC)
+GENERATE_OWNED_OBJC_TYPE(NSCursor)
 GENERATE_OWNED_OBJC_TYPE(NSEvent)
 #elif BUILDFLAG(IS_IOS)
 GENERATE_OWNED_OBJC_TYPE(UIEvent)
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn
index dc8034f..53511ac 100644
--- a/build/config/BUILD.gn
+++ b/build/config/BUILD.gn
@@ -211,14 +211,9 @@
     # linking can have run-time side effects, nothing should be listed here.
     libs = []
   } else if (is_ios) {
-    # The libraries listed here will be specified for both the target and the
-    # host. Only the common ones should be listed here.
-    frameworks = [
-      "CoreFoundation.framework",
-      "CoreGraphics.framework",
-      "CoreText.framework",
-      "Foundation.framework",
-    ]
+    # Targets should choose to explicitly link frameworks they require. Since
+    # linking can have run-time side effects, nothing should be listed here.
+    libs = []
   } else if (is_linux || is_chromeos) {
     libs = [
       "dl",
diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni
index 1561058..68523b9 100644
--- a/build/config/ios/rules.gni
+++ b/build/config/ios/rules.gni
@@ -598,11 +598,6 @@
       visibility += [ ":${_variant.target_name}" ]
     }
 
-    if (!defined(frameworks)) {
-      frameworks = []
-    }
-    frameworks += [ "UIKit.framework" ]
-
     if (target_environment == "simulator") {
       if (!defined(deps)) {
         deps = []
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 20926a1..57d6f9ca 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -1439,6 +1439,10 @@
     layer_tree_host()->SetNeedsUpdateLayers();
 }
 
+bool Layer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
+  return false;
+}
+
 bool Layer::IsSnappedToPixelGridInTarget() const {
   return false;
 }
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 890978a..9805082 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -272,6 +272,10 @@
   // SetNeedsDisplay() that have not been committed to the compositor thread.
   const gfx::Rect& update_rect() const { return update_rect_.Read(*this); }
 
+  // If this returns true, then `SetNeedsDisplay` will be called in response to
+  // the HDR headroom of the display that the content is rendering to changing.
+  virtual bool RequiresSetNeedsDisplayOnHdrHeadroomChange() const;
+
   void ResetUpdateRectForTesting() { update_rect_.Write(*this) = gfx::Rect(); }
 
   // For layer tree mode only.
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 85b4412..6254839 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -117,6 +117,16 @@
   Layer::SetNeedsDisplayRect(layer_rect);
 }
 
+bool PictureLayer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
+  const auto& display_list = picture_layer_inputs_.display_list;
+  if (display_list &&
+      display_list->discardable_image_map().content_color_usage() ==
+          gfx::ContentColorUsage::kHDR) {
+    return true;
+  }
+  return false;
+}
+
 bool PictureLayer::Update() {
   update_source_frame_number_.Write(*this) =
       layer_tree_host()->SourceFrameNumber();
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h
index 1d1e837..a29c6792 100644
--- a/cc/layers/picture_layer.h
+++ b/cc/layers/picture_layer.h
@@ -47,6 +47,7 @@
                         const CommitState& commit_state,
                         const ThreadUnsafeCommitState& unsafe_state) override;
   void SetNeedsDisplayRect(const gfx::Rect& layer_rect) override;
+  bool RequiresSetNeedsDisplayOnHdrHeadroomChange() const override;
   sk_sp<const SkPicture> GetPicture() const override;
   bool Update() override;
   void RunMicroBenchmark(MicroBenchmark* benchmark) override;
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
index 18f4b9a..d2e3231 100644
--- a/cc/layers/texture_layer.cc
+++ b/cc/layers/texture_layer.cc
@@ -174,6 +174,12 @@
          Layer::HasDrawableContent();
 }
 
+bool TextureLayer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
+  // TODO(https://crbug.com/1450807): Only return true if the contents of the
+  // video are HDR.
+  return true;
+}
+
 bool TextureLayer::Update() {
   bool updated = Layer::Update();
   if (client_.Read(*this)) {
diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h
index a53478d..c0e5a0d4 100644
--- a/cc/layers/texture_layer.h
+++ b/cc/layers/texture_layer.h
@@ -131,6 +131,7 @@
                            absl::optional<gfx::HDRMetadata> hdr_metadata);
 
   void SetLayerTreeHost(LayerTreeHost* layer_tree_host) override;
+  bool RequiresSetNeedsDisplayOnHdrHeadroomChange() const override;
   bool Update() override;
   bool IsSnappedToPixelGridInTarget() const override;
   void PushPropertiesTo(LayerImpl* layer,
diff --git a/cc/layers/video_layer.cc b/cc/layers/video_layer.cc
index 0d86a39..21b6d7de 100644
--- a/cc/layers/video_layer.cc
+++ b/cc/layers/video_layer.cc
@@ -29,6 +29,12 @@
                                 transform_);
 }
 
+bool VideoLayer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
+  // TODO(https://crbug.com/1450807): Only return true if the contents of the
+  // video are HDR.
+  return true;
+}
+
 bool VideoLayer::Update() {
   bool updated = Layer::Update();
 
diff --git a/cc/layers/video_layer.h b/cc/layers/video_layer.h
index 5bbdc83..c8f3ea42 100644
--- a/cc/layers/video_layer.h
+++ b/cc/layers/video_layer.h
@@ -31,7 +31,7 @@
 
   std::unique_ptr<LayerImpl> CreateLayerImpl(
       LayerTreeImpl* tree_impl) const override;
-
+  bool RequiresSetNeedsDisplayOnHdrHeadroomChange() const override;
   bool Update() override;
 
   // Clears |provider_| to ensure it is not used after destruction.
diff --git a/cc/test/fake_picture_layer.cc b/cc/test/fake_picture_layer.cc
index 13e331f..6fe92926 100644
--- a/cc/test/fake_picture_layer.cc
+++ b/cc/test/fake_picture_layer.cc
@@ -41,4 +41,8 @@
   return updated || always_update_resources_;
 }
 
+bool FakePictureLayer::RequiresSetNeedsDisplayOnHdrHeadroomChange() const {
+  return reraster_on_hdr_change_;
+}
+
 }  // namespace cc
diff --git a/cc/test/fake_picture_layer.h b/cc/test/fake_picture_layer.h
index b7eb6ca5..e3a7c322 100644
--- a/cc/test/fake_picture_layer.h
+++ b/cc/test/fake_picture_layer.h
@@ -32,6 +32,7 @@
   std::unique_ptr<LayerImpl> CreateLayerImpl(
       LayerTreeImpl* tree_impl) const override;
   bool Update() override;
+  bool RequiresSetNeedsDisplayOnHdrHeadroomChange() const override;
 
   int update_count() const { return update_count_; }
   void reset_update_count() { update_count_ = 0; }
@@ -40,6 +41,10 @@
     always_update_resources_ = always_update_resources;
   }
 
+  void set_reraster_on_hdr_change(bool reraster_on_hdr_change) {
+    reraster_on_hdr_change_ = reraster_on_hdr_change;
+  }
+
   void set_fixed_tile_size(gfx::Size fixed_tile_size) {
     fixed_tile_size_ = fixed_tile_size;
   }
@@ -52,6 +57,7 @@
 
   int update_count_ = 0;
   bool always_update_resources_ = false;
+  bool reraster_on_hdr_change_ = false;
 
   gfx::Size fixed_tile_size_;
 };
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index cbd4b51..2ac8e68 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1500,9 +1500,16 @@
     const gfx::DisplayColorSpaces& display_color_spaces) {
   if (pending_commit_state()->display_color_spaces == display_color_spaces)
     return;
+  bool only_hdr_changed = gfx::DisplayColorSpaces::EqualExceptForHdrParameters(
+      pending_commit_state()->display_color_spaces, display_color_spaces);
   pending_commit_state()->display_color_spaces = display_color_spaces;
-  for (auto* layer : *this)
-    layer->SetNeedsDisplay();
+
+  for (auto* layer : *this) {
+    if (!only_hdr_changed ||
+        layer->RequiresSetNeedsDisplayOnHdrHeadroomChange()) {
+      layer->SetNeedsDisplay();
+    }
+  }
 }
 
 void LayerTreeHost::UpdateViewportIsMobileOptimized(
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 258a66d..d663b4b 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -795,9 +795,6 @@
 }
 
 void LayerTreeHostImpl::UpdateSyncTreeAfterCommitOrImplSideInvalidation() {
-  // LayerTreeHost may have changed the GPU rasterization flags state, which
-  // may require an update of the tree resources.
-  UpdateTreeResourcesForGpuRasterizationIfNeeded();
   sync_tree()->set_needs_update_draw_properties();
 
   // We need an update immediately post-commit to have the opportunity to create
@@ -2861,17 +2858,7 @@
 }
 
 bool LayerTreeHostImpl::UpdateGpuRasterizationStatus() {
-  if (!raster_caps().need_update_gpu_rasterization_status) {
-    return false;
-  }
-  raster_caps_.need_update_gpu_rasterization_status = false;
-
-  // TODO(danakj): Can we avoid having this run when there's no
-  // LayerTreeFrameSink?
-  // For now just early out and leave things unchanged, we'll come back here
-  // when we get a LayerTreeFrameSink.
-  if (!layer_tree_frame_sink_)
-    return false;
+  CHECK(layer_tree_frame_sink_);
 
   RasterCapabilities new_raster_caps;
   [this](RasterCapabilities& gpu_caps) {
@@ -2879,8 +2866,7 @@
       return;
     }
 
-    if (!(layer_tree_frame_sink_ &&
-          layer_tree_frame_sink_->context_provider() &&
+    if (!(layer_tree_frame_sink_->context_provider() &&
           layer_tree_frame_sink_->worker_context_provider())) {
       return;
     }
@@ -2915,28 +2901,6 @@
   return true;
 }
 
-void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() {
-  if (!UpdateGpuRasterizationStatus())
-    return;
-
-  // Clean up and replace existing tile manager with another one that uses
-  // appropriate rasterizer. Only do this however if we already have a
-  // resource pool, since otherwise we might not be able to create a new
-  // one.
-  ReleaseTileResources();
-  if (resource_pool_) {
-    CleanUpTileManagerResources();
-    CreateTileManagerResources();
-  }
-  RecreateTileResources();
-
-  // We have released tilings for both active and pending tree.
-  // We would not have any content to draw until the pending tree is activated.
-  // Prevent the active tree from drawing until activation.
-  // TODO(crbug.com/469175): Replace with RequiresHighResToDraw.
-  SetRequiresHighResToDraw();
-}
-
 ImageDecodeCache* LayerTreeHostImpl::GetImageDecodeCache() const {
   return image_decode_cache_holder_
              ? image_decode_cache_holder_->image_decode_cache()
@@ -3930,7 +3894,6 @@
   // Since the new context may support GPU raster or be capable of MSAA, update
   // status here. We don't need to check the return value since we are
   // recreating all resources already.
-  SetNeedUpdateGpuRasterizationStatus();
   UpdateGpuRasterizationStatus();
 
   // See note in LayerTreeImpl::UpdateDrawProperties, new LayerTreeFrameSink
@@ -4972,10 +4935,6 @@
       element_id, scroll_node->id, scroll_offset, tree);
 }
 
-void LayerTreeHostImpl::SetNeedUpdateGpuRasterizationStatus() {
-  raster_caps_.need_update_gpu_rasterization_status = true;
-}
-
 void LayerTreeHostImpl::SetElementFilterMutated(
     ElementId element_id,
     ElementListType list_type,
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 63418e8..097f74fa 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -414,10 +414,6 @@
   void SetTreeLayerScrollOffsetMutated(ElementId element_id,
                                        LayerTreeImpl* tree,
                                        const gfx::PointF& scroll_offset);
-  void SetNeedUpdateGpuRasterizationStatus();
-  bool NeedUpdateGpuRasterizationStatusForTesting() const {
-    return raster_caps().need_update_gpu_rasterization_status;
-  }
 
   // ProtectedSequenceSynchronizer implementation.
   bool IsOwnerThread() const override;
@@ -973,7 +969,6 @@
 
   // Returns true if status changed.
   bool UpdateGpuRasterizationStatus();
-  void UpdateTreeResourcesForGpuRasterizationIfNeeded();
 
   bool AnimatePageScale(base::TimeTicks monotonic_time);
   bool AnimateScrollbars(base::TimeTicks monotonic_time);
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index abe07b9..c56a353 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -2797,6 +2797,8 @@
   void SetupTree() override {
     space1_ = gfx::DisplayColorSpaces(gfx::ColorSpace::CreateXYZD50());
     space2_ = gfx::DisplayColorSpaces(gfx::ColorSpace::CreateSRGB());
+    space2_with_hdr_ = space2_;
+    space2_with_hdr_.SetHDRMaxLuminanceRelative(2.f);
 
     root_layer_ = Layer::Create();
     root_layer_->SetBounds(gfx::Size(10, 20));
@@ -2819,6 +2821,7 @@
     EXPECT_EQ(DRAW_SUCCESS, draw_result);
 
     int source_frame = host_impl->active_tree()->source_frame_number();
+    gfx::Rect expected_root_damage_rect;
     switch (source_frame) {
       case 0:
         // The first frame will have full damage, and should be in the initial
@@ -2826,6 +2829,8 @@
         EXPECT_FALSE(frame_data->has_no_damage);
         EXPECT_TRUE(space1_ ==
                     host_impl->active_tree()->display_color_spaces());
+        expected_root_damage_rect =
+            gfx::Rect(host_impl->active_tree()->root_layer()->bounds());
         break;
       case 1:
         // Empty commit.
@@ -2838,6 +2843,8 @@
         EXPECT_FALSE(frame_data->has_no_damage);
         EXPECT_TRUE(space2_ ==
                     host_impl->active_tree()->display_color_spaces());
+        expected_root_damage_rect =
+            gfx::Rect(host_impl->active_tree()->root_layer()->bounds());
         break;
       case 3:
         // Empty commit with the color space set to space2 redundantly.
@@ -2846,15 +2853,16 @@
                     host_impl->active_tree()->display_color_spaces());
         break;
       case 4:
-        // The change from space2 to space1 should cause full damage.
+        // The change from space2 to space2_with_hdr should cause full damage.
         EXPECT_FALSE(frame_data->has_no_damage);
-        EXPECT_TRUE(space1_ ==
+        EXPECT_TRUE(space2_with_hdr_ ==
                     host_impl->active_tree()->display_color_spaces());
+        expected_root_damage_rect = gfx::Rect(0, 0, 10, 10);
         break;
       case 5:
         // Empty commit.
         EXPECT_TRUE(frame_data->has_no_damage);
-        EXPECT_TRUE(space1_ ==
+        EXPECT_TRUE(space2_with_hdr_ ==
                     host_impl->active_tree()->display_color_spaces());
         EndTest();
         break;
@@ -2866,8 +2874,7 @@
     if (!frame_data->has_no_damage) {
       gfx::Rect root_damage_rect =
           frame_data->render_passes.back()->damage_rect;
-      EXPECT_EQ(gfx::Rect(host_impl->active_tree()->root_layer()->bounds()),
-                root_damage_rect);
+      EXPECT_EQ(expected_root_damage_rect, root_damage_rect);
     }
 
     return draw_result;
@@ -2892,7 +2899,17 @@
         break;
       case 4:
         EXPECT_TRUE(child_layer_->update_rect().IsEmpty());
-        layer_tree_host()->SetDisplayColorSpaces(space1_);
+        // Setting to space2_with_hdr_ should be a no-op, because there is
+        // no HDR content.
+        layer_tree_host()->SetDisplayColorSpaces(space2_with_hdr_);
+        EXPECT_TRUE(child_layer_->update_rect().IsEmpty());
+        // Same with setting back to space2_.
+        layer_tree_host()->SetDisplayColorSpaces(space2_);
+        EXPECT_TRUE(child_layer_->update_rect().IsEmpty());
+        // Now set the content to be HDR, and set to space2_with_hdr. This
+        // should trigger a commit.
+        child_layer_->set_reraster_on_hdr_change(true);
+        layer_tree_host()->SetDisplayColorSpaces(space2_with_hdr_);
         EXPECT_FALSE(child_layer_->update_rect().IsEmpty());
         break;
       case 5:
@@ -2910,9 +2927,10 @@
  private:
   gfx::DisplayColorSpaces space1_;
   gfx::DisplayColorSpaces space2_;
+  gfx::DisplayColorSpaces space2_with_hdr_;
   FakeContentLayerClient client_;
   scoped_refptr<Layer> root_layer_;
-  scoped_refptr<Layer> child_layer_;
+  scoped_refptr<FakePictureLayer> child_layer_;
 };
 
 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestRasterColorSpaceChange);
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 44984b4c0..47f7ef72 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1409,7 +1409,6 @@
   set_needs_update_draw_properties();
   if (IsActiveTree())
     host_impl_->SetViewportDamage(GetDeviceViewport());
-  host_impl_->SetNeedUpdateGpuRasterizationStatus();
 }
 
 void LayerTreeImpl::SetLocalSurfaceIdFromParent(
diff --git a/cc/trees/raster_capabilities.h b/cc/trees/raster_capabilities.h
index 3815d8f0..80a79ee1 100644
--- a/cc/trees/raster_capabilities.h
+++ b/cc/trees/raster_capabilities.h
@@ -15,7 +15,6 @@
   RasterCapabilities& operator=(const RasterCapabilities& other) = delete;
   ~RasterCapabilities() = default;
 
-  bool need_update_gpu_rasterization_status = false;
   bool use_gpu_rasterization = false;
 
   bool can_use_msaa = false;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
index 09ffcc6..046b626 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
@@ -13,10 +13,8 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabs;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher;
-import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.leaveTabSwitcher;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabSwitcherCardCount;
 
 import android.content.Context;
@@ -26,31 +24,27 @@
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 
 import androidx.annotation.IntDef;
-import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.test.filters.MediumTest;
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.layouts.LayoutType;
+import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
-import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.ActivityTestUtils;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.ui.test.util.UiRestriction;
@@ -66,11 +60,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
-// START_SURFACE_REFACTOR is required to have stable parent id logic.
-@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
-                          ChromeFeatureList.START_SURFACE_REFACTOR,
-                          ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
-@Batch(Batch.PER_CLASS)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class TabGridAccessibilityHelperTest {
     // clang-format on
     @IntDef({TabMovementDirection.LEFT, TabMovementDirection.RIGHT, TabMovementDirection.UP,
@@ -84,38 +74,29 @@
         int NUM_ENTRIES = 4;
     }
 
-    @ClassRule
-    public static ChromeTabbedActivityTestRule sActivityTestRule =
-            new ChromeTabbedActivityTestRule();
-
     @Rule
-    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
-            new BlankCTATabInitialStateRule(sActivityTestRule, false);
+    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
     @Before
     public void setUp() {
-        Layout layout =
-                sActivityTestRule.getActivity().getLayoutManager().getTabSwitcherLayoutForTesting();
-        assertTrue(layout instanceof TabSwitcherLayout);
+        mActivityTestRule.startMainActivityFromLauncher();
+        Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
+        assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout);
         CriteriaHelper.pollUiThread(
-                sActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized);
+                mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized);
     }
 
     @After
     public void tearDown() {
-        ActivityTestUtils.clearActivityOrientation(sActivityTestRule.getActivity());
-        final ChromeTabbedActivity cta = sActivityTestRule.getActivity();
-        if (cta != null && cta.getLayoutManager().isLayoutVisible(LayoutType.TAB_SWITCHER)) {
-            leaveTabSwitcher(cta);
-        }
+        ActivityTestUtils.clearActivityOrientation(mActivityTestRule.getActivity());
     }
 
     @Test
     @MediumTest
-    // Low-end uses list mode.
-    @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
+    @DisabledTest(message = "https://crbug.com/1318376")
     public void testGetPotentialActionsForView() {
-        final ChromeTabbedActivity cta = sActivityTestRule.getActivity();
+        // clang-format on
+        final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         final AccessibilityActionChecker checker = new AccessibilityActionChecker(cta);
         createTabs(cta, false, 5);
         enterTabSwitcher(cta);
@@ -128,13 +109,8 @@
         // Verify action list in portrait mode with span count = 2.
         onView(allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)))
                 .check((v, noMatchingViewException) -> {
-                    if (noMatchingViewException != null) {
-                        throw noMatchingViewException;
-                    }
                     assertTrue(v instanceof RecyclerView);
                     RecyclerView recyclerView = (RecyclerView) v;
-                    assertEquals(2,
-                            ((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount());
 
                     View item1 = getItemViewForPosition(recyclerView, 0);
                     checker.verifyListOfAccessibilityAction(
@@ -171,15 +147,8 @@
         // Verify action list in landscape mode with span count = 3.
         onView(allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)))
                 .check((v, noMatchingViewException) -> {
-                    if (noMatchingViewException != null) {
-                        throw noMatchingViewException;
-                    }
                     assertTrue(v instanceof RecyclerView);
                     RecyclerView recyclerView = (RecyclerView) v;
-                    // This case only applies for a span of 3.
-                    if (((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount() != 3) {
-                        return;
-                    }
 
                     View item1 = getItemViewForPosition(recyclerView, 0);
                     checker.verifyListOfAccessibilityAction(
@@ -214,10 +183,9 @@
 
     @Test
     @MediumTest
-    // Low-end uses list mode.
-    @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
+    @DisabledTest(message = "https://crbug.com/1318394")
     public void testGetPositionsOfReorderAction() {
-        final ChromeTabbedActivity cta = sActivityTestRule.getActivity();
+        final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         int leftActionId = R.id.move_tab_left;
         int rightActionId = R.id.move_tab_right;
         int upActionId = R.id.move_tab_up;
@@ -230,17 +198,10 @@
                            instanceof TabListMediator.TabGridAccessibilityHelper);
         TabListMediator.TabGridAccessibilityHelper helper = cta.findViewById(R.id.tab_list_view);
 
-        // Span count 2.
         onView(allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)))
                 .check((v, noMatchingViewException) -> {
-                    if (noMatchingViewException != null) {
-                        throw noMatchingViewException;
-                    }
                     assertTrue(v instanceof RecyclerView);
                     RecyclerView recyclerView = (RecyclerView) v;
-                    assertEquals(2,
-                            ((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount());
-
                     Pair<Integer, Integer> positions;
 
                     View item1 = getItemViewForPosition(recyclerView, 0);
@@ -264,19 +225,10 @@
 
         ActivityTestUtils.rotateActivityToOrientation(cta, Configuration.ORIENTATION_LANDSCAPE);
 
-        // Span count 3.
         onView(allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)))
                 .check((v, noMatchingViewException) -> {
-                    if (noMatchingViewException != null) {
-                        throw noMatchingViewException;
-                    }
                     assertTrue(v instanceof RecyclerView);
                     RecyclerView recyclerView = (RecyclerView) v;
-                    // This case only applies for a span of 3.
-                    if (((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount() != 3) {
-                        return;
-                    }
-
                     Pair<Integer, Integer> positions;
 
                     View item2 = getItemViewForPosition(recyclerView, 1);
@@ -304,8 +256,6 @@
     }
 
     private View getItemViewForPosition(RecyclerView recyclerView, int position) {
-        // Scroll to position to ensure the ViewHolder is not recycled.
-        ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPosition(position);
         RecyclerView.ViewHolder viewHolder =
                 recyclerView.findViewHolderForAdapterPosition(position);
         assertNotNull(viewHolder);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
index f3654ea9..0a99bd9 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -16,6 +16,7 @@
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstCardFromTabSwitcher;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstTabInDialog;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher;
+import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.leaveTabSwitcher;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.mergeAllIncognitoTabsToAGroup;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.mergeAllNormalTabsToAGroup;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.switchTabModel;
@@ -27,21 +28,26 @@
 import androidx.test.filters.MediumTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.ApplicationTestUtils;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.R;
+import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
 import org.chromium.chrome.test.util.MenuUtils;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.ui.test.util.UiRestriction;
@@ -53,211 +59,229 @@
         ChromeSwitches.DISABLE_TAB_MERGING_FOR_TESTING})
 @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE})
 @Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
+@Batch(Batch.PER_CLASS)
 public class TabSwitcherMultiWindowTest {
     // clang-format on
+    @ClassRule
+    public static ChromeTabbedActivityTestRule sActivityTestRule =
+            new ChromeTabbedActivityTestRule();
+
     @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+    public BlankCTATabInitialStateRule mBlankCTATabInitialStateRule =
+            new BlankCTATabInitialStateRule(sActivityTestRule, true);
+
+    private ChromeTabbedActivity mCta1;
+    private ChromeTabbedActivity mCta2;
 
     @Before
     public void setUp() {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        TabUiTestHelper.verifyTabSwitcherLayoutType(mActivityTestRule.getActivity());
-        CriteriaHelper.pollUiThread(
-                mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized);
+        TabUiTestHelper.verifyTabSwitcherLayoutType(sActivityTestRule.getActivity());
+        mCta1 = sActivityTestRule.getActivity();
+        CriteriaHelper.pollUiThread(mCta1.getTabModelSelector()::isTabStateInitialized);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        if (mCta2 != null) {
+            ApplicationTestUtils.finishActivity(mCta2);
+        }
+        if (mCta1 != null) {
+            moveActivityToFront(mCta1);
+            if (mCta1.getLayoutManager().isLayoutVisible(LayoutType.TAB_SWITCHER)) {
+                leaveTabSwitcher(mCta1);
+            }
+        }
     }
 
     @Test
     @LargeTest
-    @DisabledTest(message = "https://crbug.com/1382930")
     public void testMoveTabsAcrossWindow_GTS_WithoutGroup() {
-        final ChromeTabbedActivity cta1 = mActivityTestRule.getActivity();
         // Initially, we have 4 normal tabs (including the one created at activity start) and 3
-        // incognito tabs in cta1.
-        TabUiTestHelper.addBlankTabs(cta1, false, 3);
-        TabUiTestHelper.addBlankTabs(cta1, true, 3);
-        verifyTabModelTabCount(cta1, 4, 3);
+        // incognito tabs in mCta1.
+        TabUiTestHelper.addBlankTabs(mCta1, false, 3);
+        TabUiTestHelper.addBlankTabs(mCta1, true, 3);
+        verifyTabModelTabCount(mCta1, 4, 3);
 
-        // Enter tab switcher in cta1 in incognito mode.
-        enterTabSwitcher(cta1);
-        assertTrue(cta1.getTabModelSelector().getCurrentModel().isIncognito());
+        // Enter tab switcher in mCta1 in incognito mode.
+        enterTabSwitcher(mCta1);
+        assertTrue(mCta1.getTabModelSelector().getCurrentModel().isIncognito());
 
-        // Before move, there are 3 incognito tabs in cta1.
-        verifyTabSwitcherCardCount(cta1, 3);
+        // Before move, there are 3 incognito tabs in mCta1.
+        verifyTabSwitcherCardCount(mCta1, 3);
 
-        // Move 2 incognito tabs to cta2.
-        clickFirstCardFromTabSwitcher(cta1);
-        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta1,
+        // Move 2 incognito tabs to mCta2.
+        clickFirstCardFromTabSwitcher(mCta1);
+        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), mCta1,
                 R.id.move_to_other_window_menu_id);
-        final ChromeTabbedActivity cta2 = waitForSecondChromeTabbedActivity();
-        moveActivityToFront(cta1);
-        moveTabsToOtherWindow(cta1, 1);
+        mCta2 = waitForSecondChromeTabbedActivity();
+        CriteriaHelper.pollUiThread(mCta2.getTabModelSelector()::isTabStateInitialized);
+        moveActivityToFront(mCta1);
+        moveTabsToOtherWindow(mCta1, 1);
 
-        // After move, there are 1 incognito tab in cta1 and 2 incognito tabs in cta2.
-        enterTabSwitcher(cta1);
-        verifyTabSwitcherCardCount(cta1, 1);
-        clickFirstCardFromTabSwitcher(cta1);
-        moveActivityToFront(cta2);
-        enterTabSwitcher(cta2);
-        verifyTabSwitcherCardCount(cta2, 2);
-        verifyTabModelTabCount(cta1, 4, 1);
-        verifyTabModelTabCount(cta2, 0, 2);
+        // After move, there are 1 incognito tab in mCta1 and 2 incognito tabs in mCta2.
+        enterTabSwitcher(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 1);
+        clickFirstCardFromTabSwitcher(mCta1);
+        moveActivityToFront(mCta2);
+        enterTabSwitcher(mCta2);
+        verifyTabSwitcherCardCount(mCta2, 2);
+        verifyTabModelTabCount(mCta1, 4, 1);
+        verifyTabModelTabCount(mCta2, 0, 2);
 
-        // Move 1 incognito tab back to cta1.
-        clickFirstCardFromTabSwitcher(cta2);
-        moveTabsToOtherWindow(cta2, 1);
+        // Move 1 incognito tab back to mCta1.
+        clickFirstCardFromTabSwitcher(mCta2);
+        moveTabsToOtherWindow(mCta2, 1);
 
-        // After move, there are 2 incognito tabs in cta1 and 1 incognito tab in cta2.
-        enterTabSwitcher(cta2);
-        verifyTabSwitcherCardCount(cta2, 1);
-        clickFirstCardFromTabSwitcher(cta2);
-        moveActivityToFront(cta1);
-        enterTabSwitcher(cta1);
-        verifyTabSwitcherCardCount(cta1, 2);
-        verifyTabModelTabCount(cta1, 4, 2);
-        verifyTabModelTabCount(cta2, 0, 1);
+        // After move, there are 2 incognito tabs in mCta1 and 1 incognito tab in mCta2.
+        enterTabSwitcher(mCta2);
+        verifyTabSwitcherCardCount(mCta2, 1);
+        clickFirstCardFromTabSwitcher(mCta2);
+        moveActivityToFront(mCta1);
+        enterTabSwitcher(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 2);
+        verifyTabModelTabCount(mCta1, 4, 2);
+        verifyTabModelTabCount(mCta2, 0, 1);
 
-        // Switch to normal tab list in cta1.
-        switchTabModel(cta1, false);
-        assertFalse(cta1.getTabModelSelector().getCurrentModel().isIncognito());
+        // Switch to normal tab list in mCta1.
+        switchTabModel(mCta1, false);
+        assertFalse(mCta1.getTabModelSelector().getCurrentModel().isIncognito());
 
-        // Move 3 normal tabs to cta2.
-        clickFirstCardFromTabSwitcher(cta1);
-        moveTabsToOtherWindow(cta1, 3);
+        // Move 3 normal tabs to mCta2.
+        clickFirstCardFromTabSwitcher(mCta1);
+        moveTabsToOtherWindow(mCta1, 3);
 
-        // After move, there are 1 normal tab in cta1 and 3 normal tabs in cta2.
-        enterTabSwitcher(cta1);
-        verifyTabSwitcherCardCount(cta1, 1);
-        clickFirstCardFromTabSwitcher(cta1);
-        moveActivityToFront(cta2);
-        enterTabSwitcher(cta2);
-        verifyTabSwitcherCardCount(cta2, 3);
-        verifyTabModelTabCount(cta1, 1, 2);
-        verifyTabModelTabCount(cta2, 3, 1);
+        // After move, there are 1 normal tab in mCta1 and 3 normal tabs in mCta2.
+        enterTabSwitcher(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 1);
+        clickFirstCardFromTabSwitcher(mCta1);
+        moveActivityToFront(mCta2);
+        enterTabSwitcher(mCta2);
+        verifyTabSwitcherCardCount(mCta2, 3);
+        verifyTabModelTabCount(mCta1, 1, 2);
+        verifyTabModelTabCount(mCta2, 3, 1);
 
-        // Move 2 normal tabs back to cta1.
-        clickFirstCardFromTabSwitcher(cta2);
-        moveTabsToOtherWindow(cta2, 2);
+        // Move 2 normal tabs back to mCta1.
+        clickFirstCardFromTabSwitcher(mCta2);
+        moveTabsToOtherWindow(mCta2, 2);
 
-        // After move, there are 3 normal tabs in cta1 and 1 normal tab in cta2.
-        enterTabSwitcher(cta2);
-        verifyTabSwitcherCardCount(cta2, 1);
-        clickFirstCardFromTabSwitcher(cta2);
-        moveActivityToFront(cta1);
-        enterTabSwitcher(cta1);
-        verifyTabSwitcherCardCount(cta1, 3);
-        verifyTabModelTabCount(cta1, 3, 2);
-        verifyTabModelTabCount(cta2, 1, 1);
+        // After move, there are 3 normal tabs in mCta1 and 1 normal tab in mCta2.
+        enterTabSwitcher(mCta2);
+        verifyTabSwitcherCardCount(mCta2, 1);
+        clickFirstCardFromTabSwitcher(mCta2);
+        moveActivityToFront(mCta1);
+        enterTabSwitcher(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 3);
+        verifyTabModelTabCount(mCta1, 3, 2);
+        verifyTabModelTabCount(mCta2, 1, 1);
     }
 
     @Test
     @LargeTest
     @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
-    @DisabledTest(message = "https://crbug.com/1413875")
     public void testMoveTabsAcrossWindow_GTS_WithGroup() {
         // Initially, we have 5 normal tabs (including the one created at activity start) and 5
-        // incognito tabs in cta1.
-        final ChromeTabbedActivity cta1 = mActivityTestRule.getActivity();
-        TabUiTestHelper.addBlankTabs(cta1, false, 4);
-        TabUiTestHelper.addBlankTabs(cta1, true, 5);
-        verifyTabModelTabCount(cta1, 5, 5);
+        // incognito tabs in mCta1.
+        TabUiTestHelper.addBlankTabs(mCta1, false, 4);
+        TabUiTestHelper.addBlankTabs(mCta1, true, 5);
+        verifyTabModelTabCount(mCta1, 5, 5);
 
-        // Enter tab switcher in cta1 in incognito mode.
-        enterTabSwitcher(cta1);
-        assertTrue(cta1.getTabModelSelector().getCurrentModel().isIncognito());
+        // Enter tab switcher in mCta1 in incognito mode.
+        enterTabSwitcher(mCta1);
+        assertTrue(mCta1.getTabModelSelector().getCurrentModel().isIncognito());
 
         // Merge all incognito tabs into one group.
-        mergeAllIncognitoTabsToAGroup(cta1);
-        verifyTabSwitcherCardCount(cta1, 1);
+        mergeAllIncognitoTabsToAGroup(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 1);
 
         // Enter group and verify there are 5 favicons in tab strip.
-        clickFirstCardFromTabSwitcher(cta1);
-        clickFirstTabInDialog(cta1);
-        verifyTabStripFaviconCount(cta1, 5);
+        clickFirstCardFromTabSwitcher(mCta1);
+        clickFirstTabInDialog(mCta1);
+        verifyTabStripFaviconCount(mCta1, 5);
 
-        // Move 3 incognito tabs in this group to cta2.
-        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta1,
+        // Move 3 incognito tabs in this group to mCta2.
+        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), mCta1,
                 R.id.move_to_other_window_menu_id);
-        final ChromeTabbedActivity cta2 = waitForSecondChromeTabbedActivity();
-        moveActivityToFront(cta1);
-        moveTabsToOtherWindow(cta1, 2);
+        mCta2 = waitForSecondChromeTabbedActivity();
+        CriteriaHelper.pollUiThread(mCta2.getTabModelSelector()::isTabStateInitialized);
+        moveActivityToFront(mCta1);
+        moveTabsToOtherWindow(mCta1, 2);
 
-        // After move, there is a group of 2 incognito tabs in cta1 and a group of 3 incognito tabs
-        // in cta2.
-        verifyTabStripFaviconCount(cta1, 2);
-        moveActivityToFront(cta2);
-        verifyTabStripFaviconCount(cta2, 3);
-        verifyTabModelTabCount(cta1, 5, 2);
-        verifyTabModelTabCount(cta2, 0, 3);
+        // After move, there is a group of 2 incognito tabs in mCta1 and a group of 3 incognito tabs
+        // in mCta2.
+        verifyTabStripFaviconCount(mCta1, 2);
+        moveActivityToFront(mCta2);
+        verifyTabStripFaviconCount(mCta2, 3);
+        verifyTabModelTabCount(mCta1, 5, 2);
+        verifyTabModelTabCount(mCta2, 0, 3);
 
-        // Move one incognito tab in group back to cta1.
-        moveTabsToOtherWindow(cta2, 1);
+        // Move one incognito tab in group back to mCta1.
+        moveTabsToOtherWindow(mCta2, 1);
 
-        // After move, there is group of 3 incognito tabs in cta1 and a group of 2 incognito tabs in
-        // cta2.
-        verifyTabStripFaviconCount(cta2, 2);
-        moveActivityToFront(cta1);
-        verifyTabStripFaviconCount(cta1, 3);
-        verifyTabModelTabCount(cta1, 5, 3);
-        verifyTabModelTabCount(cta2, 0, 2);
+        // After move, there is group of 3 incognito tabs in mCta1 and a group of 2 incognito tabs
+        // in mCta2.
+        verifyTabStripFaviconCount(mCta2, 2);
+        moveActivityToFront(mCta1);
+        verifyTabStripFaviconCount(mCta1, 3);
+        verifyTabModelTabCount(mCta1, 5, 3);
+        verifyTabModelTabCount(mCta2, 0, 2);
 
-        // Switch to normal tab model in cta1 and create a tab group with 5 normal tabs.
-        enterTabSwitcher(cta1);
-        switchTabModel(cta1, false);
-        mergeAllNormalTabsToAGroup(cta1);
-        verifyTabSwitcherCardCount(cta1, 1);
+        // Switch to normal tab model in mCta1 and create a tab group with 5 normal tabs.
+        enterTabSwitcher(mCta1);
+        switchTabModel(mCta1, false);
+        mergeAllNormalTabsToAGroup(mCta1);
+        verifyTabSwitcherCardCount(mCta1, 1);
 
         // Enter group and verify there are 5 favicons in tab strip.
-        clickFirstCardFromTabSwitcher(cta1);
-        clickFirstTabInDialog(cta1);
-        verifyTabStripFaviconCount(cta1, 5);
+        clickFirstCardFromTabSwitcher(mCta1);
+        clickFirstTabInDialog(mCta1);
+        verifyTabStripFaviconCount(mCta1, 5);
 
-        // Move 3 normal tabs in this group to cta2.
-        moveTabsToOtherWindow(cta1, 3);
+        // Move 3 normal tabs in this group to mCta2.
+        moveTabsToOtherWindow(mCta1, 3);
 
-        // After move, there is a group of 2 normal tabs in cta1 and a group of 3 normal tabs in
-        // cta2.
-        verifyTabStripFaviconCount(cta1, 2);
-        moveActivityToFront(cta2);
-        verifyTabStripFaviconCount(cta2, 3);
-        verifyTabModelTabCount(cta1, 2, 3);
-        verifyTabModelTabCount(cta2, 3, 2);
+        // After move, there is a group of 2 normal tabs in mCta1 and a group of 3 normal tabs in
+        // mCta2.
+        verifyTabStripFaviconCount(mCta1, 2);
+        moveActivityToFront(mCta2);
+        verifyTabStripFaviconCount(mCta2, 3);
+        verifyTabModelTabCount(mCta1, 2, 3);
+        verifyTabModelTabCount(mCta2, 3, 2);
 
-        // Move one normal tab in group back to cta1.
-        moveTabsToOtherWindow(cta2, 1);
+        // Move one normal tab in group back to mCta1.
+        moveTabsToOtherWindow(mCta2, 1);
 
-        // After move, there is a group of 3 normal tabs in cta1 and a group of 2 normal tabs in
-        // cta2.
-        verifyTabStripFaviconCount(cta2, 2);
-        moveActivityToFront(cta1);
-        verifyTabStripFaviconCount(cta1, 3);
-        verifyTabModelTabCount(cta1, 3, 3);
-        verifyTabModelTabCount(cta2, 2, 2);
+        // After move, there is a group of 3 normal tabs in mCta1 and a group of 2 normal tabs in
+        // mCta2.
+        verifyTabStripFaviconCount(mCta2, 2);
+        moveActivityToFront(mCta1);
+        verifyTabStripFaviconCount(mCta1, 3);
+        verifyTabModelTabCount(mCta1, 3, 3);
+        verifyTabModelTabCount(mCta2, 2, 2);
     }
 
     @Test
     @MediumTest
-    @DisabledTest(message = "https://crbug.com/1363248")
     // clang-format off
     @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testMoveLastIncognitoTab() {
         // clang-format on
-        // Initially, we have 1 normal tab (created in #setup()) and 1 incognito tab in cta1.
-        final ChromeTabbedActivity cta1 = mActivityTestRule.getActivity();
-        TabUiTestHelper.addBlankTabs(cta1, true, 1);
-        verifyTabModelTabCount(cta1, 1, 1);
+        // Initially, we have 1 normal tab (created in #setup()) and 1 incognito tab in mCta1.
+        TabUiTestHelper.addBlankTabs(mCta1, true, 1);
+        verifyTabModelTabCount(mCta1, 1, 1);
 
-        // Move the incognito tab to cta2.
-        assertTrue(cta1.getTabModelSelector().getCurrentModel().isIncognito());
-        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta1,
+        // Move the incognito tab to mCta2.
+        assertTrue(mCta1.getTabModelSelector().getCurrentModel().isIncognito());
+        MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), mCta1,
                 R.id.move_to_other_window_menu_id);
-        final ChromeTabbedActivity cta2 = waitForSecondChromeTabbedActivity();
+        mCta2 = waitForSecondChromeTabbedActivity();
+        CriteriaHelper.pollUiThread(mCta2.getTabModelSelector()::isTabStateInitialized);
 
-        assertThat(cta1.getTabModelSelector()
+        assertThat(mCta1.getTabModelSelector()
                            .getTabModelFilterProvider()
                            .getTabModelFilter(true)
                            .getCount(),
                 is(0));
-        assertThat(cta2.getTabModelSelector()
+        assertThat(mCta2.getTabModelSelector()
                            .getTabModelFilterProvider()
                            .getTabModelFilter(true)
                            .getCount(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
index aa90d3a..2aea6b1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
@@ -1,4 +1,5 @@
 wenyufu@chromium.org
 
 #Backup
+skym@chromium.org
 twellington@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
index 57ef28d..df3890a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -469,11 +469,9 @@
      * Test if an action button is shown with correct image and size, and clicking it sends the
      * correct {@link PendingIntent}.
      */
-    // TODO(crbug.com/1420991): Re-enable this test after fixing/diagnosing flakiness.
     @Test
     @SmallTest
     @Feature({"UiCatalogue"})
-    @DisabledTest(message = "https://crbug.com/1420991")
     public void testActionButton() throws TimeoutException {
         Bitmap expectedIcon = createVectorDrawableBitmap(R.drawable.ic_credit_card_black, 77, 48);
         Intent intent = createMinimalCustomTabIntent();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java
index b6a3565..e4c916b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java
@@ -4,7 +4,11 @@
 
 package org.chromium.chrome.browser.permissions;
 
-import android.view.View;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.hamcrest.CoreMatchers.allOf;
 
 import androidx.annotation.IdRes;
 
@@ -25,13 +29,13 @@
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
 import org.chromium.chrome.test.util.InfoBarUtil;
 import org.chromium.components.browser_ui.modaldialog.ModalDialogTestUtils;
-import org.chromium.components.browser_ui.modaldialog.TabModalPresenter;
 import org.chromium.components.infobars.InfoBar;
 import org.chromium.components.permissions.PermissionDialogController;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.browser.test.util.TouchCommon;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
+import org.chromium.ui.test.util.ViewUtils;
 
 /**
  * TestRule for permissions UI testing on Android.
@@ -293,16 +297,7 @@
         // only then add modal dialog view into the container.
         @IdRes
         int buttonId = allow ? R.id.positive_button : R.id.negative_button;
-        CriteriaHelper.pollUiThread(() -> {
-            TabModalPresenter presenter = (TabModalPresenter) activity.getModalDialogManager()
-                                                  .getCurrentPresenterForTest();
-            View buttonView = presenter.getDialogContainerForTest().findViewById(buttonId);
-            if (buttonView == null) {
-                return false;
-            }
-            TouchCommon.singleClickView(buttonView);
-            return true;
-        });
+        ViewUtils.onViewWaiting(allOf(withId(buttonId), isDisplayed())).perform(click());
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java
index c5bc81d..7c0dba7e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/RuntimePermissionTestUtils.java
@@ -122,12 +122,12 @@
     }
 
     private static void waitUntilDifferentDialogIsShowing(
-            final PermissionTestRule permissionTestRule, final PropertyModel currentDialog) {
+            final PermissionTestRule permissionTestRule, final PropertyModel previousDialog) {
         CriteriaHelper.pollUiThread(() -> {
             final ModalDialogManager manager =
                     permissionTestRule.getActivity().getModalDialogManager();
             Criteria.checkThat(manager.isShowing(), Matchers.is(true));
-            Criteria.checkThat(manager.getCurrentDialogForTest(), Matchers.not(currentDialog));
+            Criteria.checkThat(manager.getCurrentDialogForTest(), Matchers.not(previousDialog));
         });
     }
 
@@ -171,18 +171,20 @@
             permissionTestRule.runJavaScriptCodeInCurrentTabWithGesture(javascriptToExecute);
         }
 
+        PropertyModel askPermissionDialogModel = null;
         if (permissionPromptAllow != null) {
             // A permission prompt dialog is expected. Wait for chrome to display and accept or
             // deny.
             PermissionTestRule.waitForDialog(activity);
+            final ModalDialogManager manager = TestThreadUtils.runOnUiThreadBlockingNoException(
+                    activity::getModalDialogManager);
+            askPermissionDialogModel = manager.getCurrentDialogForTest();
+
             PermissionTestRule.replyToDialog(permissionPromptAllow, activity);
 
             if (waitForMissingPermissionPrompt) {
                 // Wait for Chrome to inform user that a permission is missing --> different dialog
-                final ModalDialogManager manager = TestThreadUtils.runOnUiThreadBlockingNoException(
-                        activity::getModalDialogManager);
-                waitUntilDifferentDialogIsShowing(
-                        permissionTestRule, manager.getCurrentDialogForTest());
+                waitUntilDifferentDialogIsShowing(permissionTestRule, askPermissionDialogModel);
             }
         }
 
@@ -193,8 +195,7 @@
             // Wait for the dialog that informs the user permissions are missing, when the initial 
             // prompt is rejected or expected to not be shown.
             if (!Boolean.TRUE.equals(permissionPromptAllow)) {
-                waitUntilDifferentDialogIsShowing(
-                        permissionTestRule, manager.getCurrentDialogForTest());
+                waitUntilDifferentDialogIsShowing(permissionTestRule, askPermissionDialogModel);
             }
 
             // Verify the correct missing permission string resource is displayed.
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5f804ba..924e58a 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -8244,6 +8244,10 @@
 
   if (safe_browsing_mode == 1) {
     sources += [
+      "enterprise/connectors/analysis/fake_content_analysis_delegate.cc",
+      "enterprise/connectors/analysis/fake_content_analysis_delegate.h",
+      "enterprise/connectors/analysis/fake_files_request_handler.cc",
+      "enterprise/connectors/analysis/fake_files_request_handler.h",
       "extensions/fake_safe_browsing_database_manager.cc",
       "extensions/fake_safe_browsing_database_manager.h",
     ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 6a3b1ad..2c75aba3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3362,6 +3362,19 @@
      std::size(kHeuristicMemorySaverConservative), nullptr},
 };
 
+const FeatureEntry::FeatureParam
+    kHighEfficiencyMultistateModeDefaultHeuristic[] = {
+        {"default_heuristic_mode", "true"},
+};
+// TODO(charlesmeng): rename option after default_heuristic_mode feature param
+// actually sets the default pref value
+const FeatureEntry::FeatureVariation kHighEfficiencyMultistateModeVariations[] =
+    {
+        {"With Recommended Badge",
+         kHighEfficiencyMultistateModeDefaultHeuristic,
+         std::size(kHighEfficiencyMultistateModeDefaultHeuristic), nullptr},
+};
+
 const FeatureEntry::FeatureParam kDiscardedTabTreatmentWithRing30Opacity[] = {
     {"discard_tab_treatment_option", "2"},
     {"discard_tab_treatment_opacity", "0.3"}};
@@ -9858,8 +9871,10 @@
      flag_descriptions::kHighEfficiencyMultistateModeAvailableName,
      flag_descriptions::kHighEfficiencyMultistateModeAvailableDescription,
      kOsDesktop,
-     FEATURE_VALUE_TYPE(
-         performance_manager::features::kHighEfficiencyMultistateMode)},
+     FEATURE_WITH_PARAMS_VALUE_TYPE(
+         performance_manager::features::kHighEfficiencyMultistateMode,
+         kHighEfficiencyMultistateModeVariations,
+         "HighEfficiencyMultistateMode")},
 
     {"memory-saver-discarded-tab-treatment",
      flag_descriptions::kHighEfficiencyDiscardedTabTreatmentName,
diff --git a/chrome/browser/android/vr/gvr_scheduler_delegate.cc b/chrome/browser/android/vr/gvr_scheduler_delegate.cc
index 88fac2a..14dc2248 100644
--- a/chrome/browser/android/vr/gvr_scheduler_delegate.cc
+++ b/chrome/browser/android/vr/gvr_scheduler_delegate.cc
@@ -1329,11 +1329,4 @@
       "Environment integration is not supported.");
 }
 
-void GvrSchedulerDelegate::SetInputSourceButtonListener(
-    mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>) {
-  // Input eventing is not supported. This call should not
-  // be made on this device.
-  frame_data_receiver_.ReportBadMessage("Input eventing is not supported.");
-}
-
 }  // namespace vr
diff --git a/chrome/browser/android/vr/gvr_scheduler_delegate.h b/chrome/browser/android/vr/gvr_scheduler_delegate.h
index e06014aa..83afcaf 100644
--- a/chrome/browser/android/vr/gvr_scheduler_delegate.h
+++ b/chrome/browser/android/vr/gvr_scheduler_delegate.h
@@ -146,9 +146,6 @@
       mojo::PendingAssociatedReceiver<
           device::mojom::XREnvironmentIntegrationProvider> environment_provider)
       override;
-  void SetInputSourceButtonListener(
-      mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>)
-      override;
 
   // XRPresentationProvider
   void SubmitFrameMissing(int16_t frame_index, const gpu::SyncToken&) override;
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index c518982..f3a7273 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -5824,7 +5824,6 @@
     "//chrome/browser/chromeos:test_support",
     "//chrome/browser/chromeos/drivefs",
     "//chrome/browser/chromeos/launcher_search:search_util",
-    "//chrome/browser/enterprise/connectors/test:test_support",
     "//chrome/browser/extensions",
     "//chrome/browser/extensions:test_support",
     "//chrome/browser/image_decoder",
diff --git a/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc b/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
index c5c8f20..a741f807 100644
--- a/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
+++ b/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
@@ -29,8 +29,8 @@
 #include "chrome/browser/enterprise/connectors/analysis/mock_file_transfer_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/analysis/source_destination_test_util.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -620,9 +620,9 @@
     // Set the analysis connector (enterprise_connectors) for FILE_TRANSFER.
     // It is also required for FileTransferAnalysisDelegate::IsEnabled() to
     // return a meaningful result.
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_TRANSFER,
-        kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                        enterprise_connectors::FILE_TRANSFER,
+                                        kBlockingScansForDlpAndMalware);
 
     source_destination_testing_helper_ =
         std::make_unique<enterprise_connectors::SourceDestinationTestingHelper>(
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 94227a7..9a9f2fa2 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -27,14 +27,14 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h"
 #include "chrome/browser/chromeos/policy/dlp/mock_dlp_rules_manager.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "chrome/browser/enterprise/connectors/analysis/mock_file_transfer_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
-#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
@@ -762,12 +762,11 @@
     SetDMTokenForTesting(policy::DMToken::CreateValidToken("dm_token"));
 
     // Enable reporting.
-    enterprise_connectors::test::SetOnSecurityEventReporting(
-        profile()->GetPrefs(),
-        /*enabled*/ true,
-        /*enabled_event_names*/ {},
-        /*enabled_opt_in_events*/ {},
-        /*machine_scope*/ false);
+    safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(),
+                                               /*enabled*/ true,
+                                               /*enabled_event_names*/ {},
+                                               /*enabled_opt_in_events*/ {},
+                                               /*machine_scope*/ false);
     // Add mock to check reports.
     cloud_policy_client_ = std::make_unique<policy::MockCloudPolicyClient>();
     cloud_policy_client_->SetDMToken("dm_token");
@@ -855,7 +854,7 @@
       CHECK(destination);
       LOG(INFO) << "Setting file transfer policy for transfers from " << *source
                 << " to " << *destination;
-      enterprise_connectors::test::SetAnalysisConnector(
+      safe_browsing::SetAnalysisConnector(
           profile()->GetPrefs(), enterprise_connectors::FILE_TRANSFER,
           base::StringPrintf(kFileTransferConnectorSettingsForDlp,
                              source->c_str(), destination->c_str(),
@@ -865,7 +864,7 @@
       // responses.
       enterprise_connectors::FilesRequestHandler::SetFactoryForTesting(
           base::BindRepeating(
-              &enterprise_connectors::test::FakeFilesRequestHandler::Create,
+              &enterprise_connectors::FakeFilesRequestHandler::Create,
               base::BindRepeating(&FileTransferConnectorFilesAppBrowserTest::
                                       FakeFileUploadCallback,
                                   base::Unretained(this), *source,
@@ -969,9 +968,8 @@
         expected_scan_ids.push_back(GetScanIDForFileName(file_name));
       }
 
-      validator_ =
-          std::make_unique<enterprise_connectors::test::EventReportValidator>(
-              cloud_policy_client());
+      validator_ = std::make_unique<safe_browsing::EventReportValidator>(
+          cloud_policy_client());
       validator_->ExpectSensitiveDataEvents(
           /*url*/ "",
           /*source*/ *source_volume_name,
@@ -1003,8 +1001,8 @@
       safe_browsing::BinaryUploadService::Result result,
       const base::FilePath& path,
       std::unique_ptr<safe_browsing::BinaryUploadService::Request> request,
-      enterprise_connectors::test::FakeFilesRequestHandler::
-          FakeFileRequestCallback callback) {
+      enterprise_connectors::FakeFilesRequestHandler::FakeFileRequestCallback
+          callback) {
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
     EXPECT_FALSE(path.empty());
     EXPECT_EQ(request->device_token(), "dm_token");
@@ -1050,12 +1048,12 @@
     enterprise_connectors::ContentAnalysisResponse response;
     // We return a block verdict if the basename contains "blocked".
     if (base::Contains(path.BaseName().value(), "blocked")) {
-      response = enterprise_connectors::test::FakeContentAnalysisDelegate::
+      response = enterprise_connectors::FakeContentAnalysisDelegate::
           FakeContentAnalysisDelegate::DlpResponse(
               enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS,
               "rule", enterprise_connectors::TriggeredRule::BLOCK);
     } else {
-      response = enterprise_connectors::test::FakeContentAnalysisDelegate::
+      response = enterprise_connectors::FakeContentAnalysisDelegate::
           SuccessfulResponse({"dlp"});
     }
     response.set_request_token(
@@ -1070,7 +1068,7 @@
   // Used to test reporting.
   std::unique_ptr<policy::MockCloudPolicyClient> cloud_policy_client_;
   std::unique_ptr<signin::IdentityTestEnvironment> identity_test_environment_;
-  std::unique_ptr<enterprise_connectors::test::EventReportValidator> validator_;
+  std::unique_ptr<safe_browsing::EventReportValidator> validator_;
   static constexpr char kUserName[] = "test@chromium.org";
   static constexpr char kScanId[] = "scan id";
 
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.cc
index 2ca1680..300346f 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.cc
@@ -4,9 +4,10 @@
 
 #include "chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker.h"
 
-#include "base/base64url.h"
+#include "base/base64.h"
 #include "base/hash/sha1.h"
 #include "base/strings/string_number_conversions.h"
+#include "url/url_util.h"
 
 namespace ash::quick_start {
 
@@ -50,12 +51,16 @@
     const SharedSecret shared_secret) const {
   std::string shared_secret_str(shared_secret.begin(), shared_secret.end());
   std::string shared_secret_base64;
-  base::Base64UrlEncode(shared_secret_str,
-                        base::Base64UrlEncodePolicy::OMIT_PADDING,
-                        &shared_secret_base64);
+  base::Base64Encode(shared_secret_str, &shared_secret_base64);
+  url::RawCanonOutputT<char> shared_secret_base64_uriencoded;
+  url::EncodeURIComponent(shared_secret_base64.data(),
+                          shared_secret_base64.size(),
+                          &shared_secret_base64_uriencoded);
 
   std::string url = "https://signin.google/qs/" + random_session_id.ToString() +
-                    "?key=" + shared_secret_base64;
+                    "?key=" +
+                    std::string(shared_secret_base64_uriencoded.data(),
+                                shared_secret_base64_uriencoded.length());
 
   return std::vector<uint8_t>(url.begin(), url.end());
 }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc
index d99d473..b3a4b53d 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc
@@ -64,7 +64,7 @@
 
 // Base64 representation of kSharedSecret.
 constexpr char kSharedSecretBase64[] =
-    "VL1Az4p8L2rKFVnP8-sxCJBz79qH1CPAVdWDWwQoSfI";
+    "VL1Az4p8L2rKFVnP8%2BsxCJBz79qH1CPAVdWDWwQoSfI%3D";
 
 // Arbitrary string to use as the endpoint id.
 constexpr char kEndpointId[] = "endpoint_id";
diff --git a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
index 95b0b12..2c9f355 100644
--- a/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
+++ b/chrome/browser/ash/login/oobe_quick_start/target_device_bootstrap_controller.cc
@@ -100,7 +100,7 @@
 
   status_.step = Step::ADVERTISING;
   connection_broker_->StartAdvertising(
-      this, /*use_pin_authentication=*/true,
+      this, /*use_pin_authentication=*/false,
       base::BindOnce(&TargetDeviceBootstrapController::OnStartAdvertisingResult,
                      weak_ptr_factory_.GetWeakPtr()));
   NotifyObservers();
diff --git a/chrome/browser/ash/login/screens/choobe_screen.cc b/chrome/browser/ash/login/screens/choobe_screen.cc
index 8fc4e9d6..7b60f958 100644
--- a/chrome/browser/ash/login/screens/choobe_screen.cc
+++ b/chrome/browser/ash/login/screens/choobe_screen.cc
@@ -43,7 +43,8 @@
 
 // to check with the ChoobeFlowController whether to skip CHOOBE screen.
 bool ChoobeScreen::MaybeSkip(WizardContext& context) {
-  if (context.skip_post_login_screens_for_tests) {
+  if (context.skip_post_login_screens_for_tests ||
+      context.skip_choobe_for_tests) {
     exit_callback_.Run(Result::NOT_APPLICABLE);
     return true;
   }
diff --git a/chrome/browser/ash/login/screens/display_size_screen_browsertest.cc b/chrome/browser/ash/login/screens/display_size_screen_browsertest.cc
index 5f615e0..8b2e09c7 100644
--- a/chrome/browser/ash/login/screens/display_size_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/display_size_screen_browsertest.cc
@@ -54,6 +54,10 @@
   }
 
   void ShowDisplaySizeScreen() {
+    LoginDisplayHost::default_host()
+        ->GetWizardContextForTesting()
+        ->skip_choobe_for_tests = true;
+
     login_manager_mixin_.LoginAsNewRegularUser();
     OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
     WizardController::default_controller()->AdvanceToScreen(
diff --git a/chrome/browser/ash/login/screens/drive_pinning_screen_browsertest.cc b/chrome/browser/ash/login/screens/drive_pinning_screen_browsertest.cc
index a1e3a626..42eebd33 100644
--- a/chrome/browser/ash/login/screens/drive_pinning_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/drive_pinning_screen_browsertest.cc
@@ -71,6 +71,10 @@
   }
 
   void ShowDrivePinningScreen() {
+    LoginDisplayHost::default_host()
+        ->GetWizardContextForTesting()
+        ->skip_choobe_for_tests = true;
+
     login_manager_mixin_.LoginAsNewRegularUser();
     OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
     WizardController::default_controller()->AdvanceToScreen(
diff --git a/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc b/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
index 76cb561..8c4c7d3 100644
--- a/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/quick_start_screen_browsertest.cc
@@ -134,8 +134,10 @@
 
   WaitForVerificationStep();
 
-  test::OobeJS().ExpectAttributeEQ("canvasSize_",
-                                   {QuickStartView::kScreenId.name}, 185);
+  int canvas_size = test::OobeJS().GetAttributeInt(
+      "canvasSize_", {QuickStartView::kScreenId.name});
+  EXPECT_GE(canvas_size, 185);
+  EXPECT_LE(canvas_size, 265);
 }
 
 IN_PROC_BROWSER_TEST_F(QuickStartBrowserTest, PinCode) {
diff --git a/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc b/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc
index ed59f531..6ebfa8f 100644
--- a/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/theme_selection_screen_browsertest.cc
@@ -77,6 +77,10 @@
   }
 
   void ShowThemeSelectionScreen() {
+    LoginDisplayHost::default_host()
+        ->GetWizardContextForTesting()
+        ->skip_choobe_for_tests = true;
+
     login_manager_mixin_.LoginAsNewRegularUser();
     OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
     WizardController::default_controller()->AdvanceToScreen(
@@ -233,6 +237,10 @@
 };
 
 IN_PROC_BROWSER_TEST_P(ThemeSelectionScreenResumeTest, PRE_ResumedScreen) {
+  LoginDisplayHost::default_host()
+      ->GetWizardContextForTesting()
+      ->skip_choobe_for_tests = true;
+
   OobeScreenWaiter(UserCreationView::kScreenId).Wait();
   LoginManagerMixin::TestUserInfo test_user(user_);
   login_mixin_.LoginWithDefaultContext(test_user);
diff --git a/chrome/browser/ash/login/screens/touchpad_scroll_screen_browsertest.cc b/chrome/browser/ash/login/screens/touchpad_scroll_screen_browsertest.cc
index 1e7064a..6bb1323 100644
--- a/chrome/browser/ash/login/screens/touchpad_scroll_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/touchpad_scroll_screen_browsertest.cc
@@ -66,6 +66,10 @@
   }
 
   void ShowTouchpadScrollScreen() {
+    LoginDisplayHost::default_host()
+        ->GetWizardContextForTesting()
+        ->skip_choobe_for_tests = true;
+
     login_manager_mixin_.LoginAsNewRegularUser();
     OobeScreenExitWaiter(GetFirstSigninScreen()).Wait();
     WizardController::default_controller()->AdvanceToScreen(
diff --git a/chrome/browser/ash/login/wizard_context.h b/chrome/browser/ash/login/wizard_context.h
index d859bc80..b436f62 100644
--- a/chrome/browser/ash/login/wizard_context.h
+++ b/chrome/browser/ash/login/wizard_context.h
@@ -82,6 +82,12 @@
   // screens in tests. Is set by WizardController::SkipPostLoginScreensForTests.
   bool skip_post_login_screens_for_tests = false;
 
+  // Whether CHOOBE screen should be skipped. Setting this flag will force skip
+  // CHOOBE screen regardless of the number of eligible optional screens.
+  // To test an optional screen without selecting the screen from CHOOBE screen,
+  // set this flag to true before logging in as a new user.
+  bool skip_choobe_for_tests = false;
+
   // Whether user creation screen is enabled (could be disabled due to disabled
   // feature or on managed device). It determines the behavior of back button
   // for GaiaScreen and OfflineLoginScreen. Value is set to true in
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index 200d071..c22a098c 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -3073,6 +3073,10 @@
 
 IN_PROC_BROWSER_TEST_F(WizardControllerThemeSelectionTest,
                        TransitionToMarketingOptIn) {
+  LoginDisplayHost::default_host()
+      ->GetWizardContextForTesting()
+      ->skip_choobe_for_tests = true;
+
   LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build = true;
   login_mixin_.LoginAsNewRegularUser();
   WizardController::default_controller()->AdvanceToScreen(
@@ -3083,6 +3087,10 @@
 
 IN_PROC_BROWSER_TEST_F(WizardControllerThemeSelectionTest,
                        TransitionToThemeSelection) {
+  LoginDisplayHost::default_host()
+      ->GetWizardContextForTesting()
+      ->skip_choobe_for_tests = true;
+
   login_mixin_.LoginAsNewRegularUser();
   WizardController::default_controller()->AdvanceToScreen(
       GestureNavigationScreenView::kScreenId);
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index 0ddadba3..7cf4ffd 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -1388,6 +1388,22 @@
   EXPECT_EQ(kDefaultAddressValues.state_short, GetFieldValueById("state"));
 }
 
+// Test that hidden selectmenus get filled. Selectmenus should have the same
+// autofill behaviour as selects for the sake of simplicity.
+IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, FillHiddenSelectMenu) {
+  CreateTestProfile();
+  GURL url = embedded_test_server()->GetURL(
+      "a.com", "/autofill/form_hidden_selectmenu.html");
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+  ASSERT_TRUE(AutofillFlow(GetElementById("firstname"), this));
+
+  // Make sure the form was filled correctly.
+  EXPECT_EQ(kDefaultAddressValues.first_name, GetFieldValueById("firstname"));
+  EXPECT_EQ(kDefaultAddressValues.address1, GetFieldValueById("address1"));
+  EXPECT_EQ(kDefaultAddressValues.city, GetFieldValueById("city"));
+  EXPECT_EQ(kDefaultAddressValues.state_short, GetFieldValueById("state"));
+}
+
 // AutofillInteractiveTest subclass which disables autofilling <selectmenu>.
 class AutofillInteractiveDisableAutofillSelectMenuTest
     : public AutofillInteractiveTest {
diff --git a/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc b/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc
index d38e0a4..1df86ef 100644
--- a/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc
+++ b/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc
@@ -30,6 +30,8 @@
 #include "components/optimization_guide/core/test_model_info_builder.h"
 #include "components/optimization_guide/core/test_optimization_guide_model_provider.h"
 #include "components/optimization_guide/proto/page_topics_model_metadata.pb.h"
+#include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
 #include "components/privacy_sandbox/privacy_sandbox_settings.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/browsing_topics_site_data_manager.h"
@@ -41,6 +43,7 @@
 #include "content/public/test/fenced_frame_test_util.h"
 #include "content/public/test/prerender_test_util.h"
 #include "content/public/test/test_navigation_observer.h"
+#include "net/base/schemeful_site.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/request_handler_util.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -484,6 +487,10 @@
     return browsing_topics_service()->browsing_topics_state();
   }
 
+  privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings() {
+    return PrivacySandboxSettingsFactory::GetForProfile(browser()->profile());
+  }
+
   content::test::PrerenderTestHelper& prerender_helper() {
     return prerender_helper_;
   }
@@ -2337,4 +2344,81 @@
   EXPECT_EQ(api_usage_contexts[2].hashed_context_domain, HashedDomain(1));
 }
 
+// Tests that the Topics API abides by the Privacy Sandbox Enrollment framework.
+class AttestationBrowsingTopicsBrowserTest : public BrowsingTopicsBrowserTest {
+ public:
+  AttestationBrowsingTopicsBrowserTest() {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/
+        {blink::features::kBrowsingTopics, blink::features::kBrowsingTopicsXHR,
+         blink::features::kBrowsingTopicsBypassIPIsPubliclyRoutableCheck,
+         features::kPrivacySandboxAdsAPIsOverride,
+         privacy_sandbox::kEnforcePrivacySandboxAttestations},
+        /*disabled_features=*/{});
+  }
+
+  ~AttestationBrowsingTopicsBrowserTest() override = default;
+
+ protected:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Site a.test is attested for Topics, so it should receive a valid response.
+IN_PROC_BROWSER_TEST_F(AttestationBrowsingTopicsBrowserTest,
+                       AttestedSiteCanGetBrowsingTopics) {
+  privacy_sandbox::PrivacySandboxAttestationsMap map;
+  map.insert_or_assign(
+      net::SchemefulSite(GURL("https://a.test")),
+      privacy_sandbox::PrivacySandboxAttestationsGatedAPISet{
+          privacy_sandbox::PrivacySandboxAttestationsGatedAPI::kTopics});
+  privacy_sandbox_settings()->SetPrivacySandboxAttestationsMapForTesting(map);
+
+  GURL main_frame_url =
+      https_server_.GetURL("a.test", "/browsing_topics/one_iframe_page.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_frame_url));
+
+  std::string result = InvokeTopicsAPI(web_contents());
+  EXPECT_EQ(result, kExpectedApiResult);
+}
+
+// Site b.test is not attested for Topics, so it should receive no topics. Note:
+// Attestation failure works differently from other failure modes like operating
+// in an insecure context. In this case, the API is still exposed, but handling
+// will exit before any topics are filled.
+IN_PROC_BROWSER_TEST_F(AttestationBrowsingTopicsBrowserTest,
+                       UnattestedSiteCannotGetBrowsingTopics) {
+  privacy_sandbox::PrivacySandboxAttestationsMap map;
+  map.insert_or_assign(
+      net::SchemefulSite(GURL("https://a.test")),
+      privacy_sandbox::PrivacySandboxAttestationsGatedAPISet{
+          privacy_sandbox::PrivacySandboxAttestationsGatedAPI::kTopics});
+  privacy_sandbox_settings()->SetPrivacySandboxAttestationsMapForTesting(map);
+
+  GURL main_frame_url =
+      https_server_.GetURL("b.test", "/browsing_topics/one_iframe_page.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_frame_url));
+
+  EXPECT_EQ("[]", InvokeTopicsAPI(web_contents()));
+}
+
+// Site a.test is attested, but not for Topics, so no topics should be returned.
+IN_PROC_BROWSER_TEST_F(AttestationBrowsingTopicsBrowserTest,
+                       AttestedSiteCannotGetBrowsingTopicsWithMismatchedMap) {
+  privacy_sandbox::PrivacySandboxAttestationsMap map;
+  map.insert_or_assign(net::SchemefulSite(GURL("https://a.test")),
+                       privacy_sandbox::PrivacySandboxAttestationsGatedAPISet{
+                           privacy_sandbox::PrivacySandboxAttestationsGatedAPI::
+                               kProtectedAudience});
+  privacy_sandbox_settings()->SetPrivacySandboxAttestationsMapForTesting(map);
+
+  GURL main_frame_url =
+      https_server_.GetURL("a.test", "/browsing_topics/one_iframe_page.html");
+
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), main_frame_url));
+
+  EXPECT_EQ("[]", InvokeTopicsAPI(web_contents()));
+}
+
 }  // namespace browsing_topics
diff --git a/chrome/browser/chrome_content_browser_client_browsertest.cc b/chrome/browser/chrome_content_browser_client_browsertest.cc
index 21c8c170..6415cdc 100644
--- a/chrome/browser/chrome_content_browser_client_browsertest.cc
+++ b/chrome/browser/chrome_content_browser_client_browsertest.cc
@@ -72,26 +72,20 @@
 #include "chrome/test/base/launchservices_utils_mac.h"
 #endif
 
-// TODO(b/283093731): Replace this macro with cloud content analysis equivalent
-// buildflag condition.
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(FULL_SAFE_BROWSING)
 #include "base/files/scoped_temp_dir.h"
 #include "base/test/bind.h"
 #include "base/threading/scoped_blocking_call.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"  // nogncheck
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"  // nogncheck
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "ui/base/clipboard/clipboard_format_type.h"
 
-// TODO(b/283093731): Replace this macro with local content analysis equivalent
-// buildflag condition.
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_manager.h"  // nogncheck
 #endif
 
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS)
+#endif  // BUILDFLAG(FULL_SAFE_BROWSING)
 
 namespace {
 
@@ -688,8 +682,7 @@
 
 #endif  // !BUILDFLAG(IS_ANDROID)
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(FULL_SAFE_BROWSING)
 
 class IsClipboardPasteContentAllowedTest : public InProcessBrowserTest {
  public:
@@ -701,16 +694,16 @@
     InProcessBrowserTest::SetUpOnMainThread();
 
     // Make sure enterprise policies are set to turn on content analysis.
-    enterprise_connectors::test::SetAnalysisConnector(
-        browser()->profile()->GetPrefs(),
-        enterprise_connectors::BULK_DATA_ENTRY, kBulkDataEntryPolicyValue);
-    enterprise_connectors::test::SetAnalysisConnector(
-        browser()->profile()->GetPrefs(), enterprise_connectors::FILE_ATTACHED,
-        kFileAttachedPolicyValue);
+    safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                        enterprise_connectors::BULK_DATA_ENTRY,
+                                        kBulkDataEntryPolicyValue);
+    safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                        enterprise_connectors::FILE_ATTACHED,
+                                        kFileAttachedPolicyValue);
 
     enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
         base::BindRepeating(
-            &enterprise_connectors::test::FakeContentAnalysisDelegate::Create,
+            &enterprise_connectors::FakeContentAnalysisDelegate::Create,
             base::DoNothing(),
             base::BindRepeating([](const std::string& contents,
                                    const base::FilePath& path) {
@@ -722,11 +715,10 @@
                     path.BaseName().AsUTF8Unsafe().substr(0, 5) == "allow";
               }
               return success
-                         ? enterprise_connectors::test::
-                               FakeContentAnalysisDelegate::SuccessfulResponse(
-                                   {"dlp"})
-                         : enterprise_connectors::test::
-                               FakeContentAnalysisDelegate::DlpResponse(
+                         ? enterprise_connectors::FakeContentAnalysisDelegate::
+                               SuccessfulResponse({"dlp"})
+                         : enterprise_connectors::FakeContentAnalysisDelegate::
+                               DlpResponse(
                                    enterprise_connectors::
                                        ContentAnalysisResponse::Result::SUCCESS,
                                    "rule-name",
@@ -891,7 +883,6 @@
             EXPECT_EQ(clipboard_paste_data->file_paths[0], paths[0]);
           }));
 }
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS)
+#endif
 
 }  // namespace
diff --git a/chrome/browser/download/notification/download_item_notification_unittest.cc b/chrome/browser/download/notification/download_item_notification_unittest.cc
index 42331f2f..5e6e7a2c5 100644
--- a/chrome/browser/download/notification/download_item_notification_unittest.cc
+++ b/chrome/browser/download/notification/download_item_notification_unittest.cc
@@ -24,13 +24,13 @@
 #include "chrome/browser/download/download_commands.h"
 #include "chrome/browser/download/notification/download_notification_manager.h"
 #include "chrome/browser/download/offline_item_utils.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/notifications/notification_handler.h"
 #include "chrome/browser/notifications/notification_test_util.h"
 #include "chrome/browser/notifications/platform_notification_service_impl.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
@@ -426,9 +426,9 @@
   CreateDownloadItemNotification();
 
   // Can't open while scanning.
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      enterprise_connectors::FILE_DOWNLOADED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [{"url_list": ["*"], "tags": ["malware"]}],
@@ -441,9 +441,9 @@
   download_item_notification_->Click(absl::nullopt, absl::nullopt);
 
   // Can be opened while scanning.
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      enterprise_connectors::FILE_DOWNLOADED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [{"url_list": ["*"], "tags": ["malware"]}],
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
index 94f59af6..484ad64 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
@@ -20,13 +20,13 @@
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/enterprise/identifiers/profile_id_service_factory.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_paths.h"
@@ -278,7 +278,7 @@
 // Tests the behavior of the dialog delegate with minimal overriding of methods.
 // Only responses obtained via the BinaryUploadService are faked.
 class ContentAnalysisDelegateBrowserTestBase
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver {
  public:
   explicit ContentAnalysisDelegateBrowserTestBase(bool machine_scope)
@@ -293,7 +293,7 @@
     if (machine_scope_) {
       SetDMTokenForTesting(policy::DMToken::CreateValidToken(kBrowserDMToken));
     } else {
-      test::SetProfileDMToken(browser()->profile(), kProfileDMToken);
+      safe_browsing::SetProfileDMToken(browser()->profile(), kProfileDMToken);
     }
 #endif
 
@@ -307,20 +307,20 @@
       ],
       "block_until_verdict": 1
     })";
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         browser()->profile()->GetPrefs(), FILE_ATTACHED,
         kBlockingScansForDlpAndMalware, machine_scope_);
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         browser()->profile()->GetPrefs(), BULK_DATA_ENTRY,
         kBlockingScansForDlpAndMalware, machine_scope_);
-    test::SetOnSecurityEventReporting(browser()->profile()->GetPrefs(),
-                                      /*enabled*/ true,
-                                      /*enabled_event_names*/ {},
-                                      /*enabled_opt_in_events*/ {},
+    safe_browsing::SetOnSecurityEventReporting(browser()->profile()->GetPrefs(),
+                                               /*enabled*/ true,
+                                               /*enabled_event_names*/ {},
+                                               /*enabled_opt_in_events*/ {},
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-                                      /*machine_scope*/ false);
+                                               /*machine_scope*/ false);
 #else
-                                      machine_scope_);
+                                               machine_scope_);
 #endif
 
     client_ = std::make_unique<policy::MockCloudPolicyClient>();
@@ -425,7 +425,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // Nothing should be reported for unauthorized users.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   validator.ExpectNoReport();
 
   ContentAnalysisDelegate::CreateForWebContents(
@@ -477,7 +477,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // The malware verdict means an event should be reported.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   validator.ExpectDangerousDeepScanningResult(
       /*url*/ "about:blank",
       /*source*/ "",
@@ -568,7 +568,7 @@
 
   FakeBinaryUploadServiceStorage()->SetAuthorized(true);
 
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   // Prepare a complex DLP response to test that the verdict is reported
   // correctly in the sensitive data event.
   ContentAnalysisResponse response;
@@ -910,7 +910,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // The malware verdict means an event should be reported.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   validator.ExpectUnscannedFileEvents(
       /*url*/ "about:blank",
       /*source*/ "",
@@ -1032,7 +1032,7 @@
     "block_until_verdict": 1,
     "block_password_protected": %s
   })";
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       browser()->profile()->GetPrefs(), FILE_ATTACHED,
       base::StringPrintf(kPasswordProtectedPref, bool_setting_value()),
       machine_scope());
@@ -1055,7 +1055,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // The file should be reported as unscanned.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   validator.ExpectUnscannedFileEvent(
       /*url*/ "about:blank",
       /*source*/ "",
@@ -1117,7 +1117,7 @@
     "block_until_verdict": 1,
     "block_large_files": %s
   })";
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       browser()->profile()->GetPrefs(), FILE_ATTACHED,
       base::StringPrintf(kBlockLargeFilesPref, bool_setting_value()),
       machine_scope());
@@ -1145,7 +1145,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // The file should be reported as unscanned.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   validator.ExpectUnscannedFileEvent(
       /*url*/ "about:blank",
       /*source*/ "",
@@ -1209,7 +1209,7 @@
     "block_until_verdict": 1,
     "block_large_files": %s
   })";
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       browser()->profile()->GetPrefs(), PRINT,
       base::StringPrintf(kBlockLargePagesPref, bool_setting_value()),
       machine_scope());
@@ -1275,7 +1275,7 @@
     ],
     "block_until_verdict": %s
   })";
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       browser()->profile()->GetPrefs(), FILE_ATTACHED,
       base::StringPrintf(kBlockUntilVerdictPref, int_setting_value()),
       machine_scope());
@@ -1296,7 +1296,7 @@
       browser()->profile(), GURL(kTestUrl), &data, FILE_ATTACHED));
 
   // The file should be reported as malware and sensitive content.
-  test::EventReportValidator validator(client());
+  safe_browsing::EventReportValidator validator(client());
   ContentAnalysisResponse response;
   response.set_request_token(kScanId1);
 
@@ -1406,7 +1406,7 @@
     if (machine_scope()) {
       SetDMTokenForTesting(policy::DMToken::CreateValidToken(dm_token()));
     } else {
-      test::SetProfileDMToken(browser()->profile(), dm_token());
+      safe_browsing::SetProfileDMToken(browser()->profile(), dm_token());
     }
 #endif
 
@@ -1423,7 +1423,7 @@
         })",
         blocking_scan() ? 1 : 0);
 
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         browser()->profile()->GetPrefs(),
         file_scan ? FILE_ATTACHED : BULK_DATA_ENTRY, pref, machine_scope());
     file_scan_ = file_scan;
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc
index d37b347c..20ff092 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc
@@ -23,12 +23,12 @@
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/enterprise/connectors/analysis/analysis_settings.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -218,8 +218,8 @@
 }
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, NoDMToken) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kBlockingScansForDlpAndMalware);
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateInvalidToken());
 
   ContentAnalysisDelegate::Data data;
@@ -241,8 +241,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpNoPref2) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kNothingEnabled);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kNothingEnabled);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_FALSE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -253,8 +253,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpNoPref3) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_DOWNLOADED, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                      kBlockingScansForDlpAndMalware);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_FALSE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -265,8 +265,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpEnabled) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kBlockingScansForDlp);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_TRUE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -277,10 +277,10 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpEnabled2) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlp);
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_DOWNLOADED, kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                      kBlockingScansForDlp);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_TRUE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -291,10 +291,10 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpEnabledWithUrl) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlp);
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_DOWNLOADED, kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                      kBlockingScansForDlp);
   GURL url(kTestUrl);
 
   ContentAnalysisDelegate::Data data;
@@ -307,9 +307,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpDisabledByList) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED,
-                                                    R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [
@@ -336,9 +335,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, DlpDisabledByListWithPatterns) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED,
-                                                    R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [
@@ -396,8 +394,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, MalwareNoPref2) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kNothingEnabled);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kNothingEnabled);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_FALSE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -408,8 +406,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, MalwareNoPref3) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_DOWNLOADED, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                      kBlockingScansForDlpAndMalware);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_FALSE(ContentAnalysisDelegate::IsEnabled(profile(), GURL(), &data,
@@ -420,9 +418,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, MalwareEnabled) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED,
-                                                    R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [
@@ -444,8 +441,8 @@
 TEST_F(ContentAnalysisDelegateIsEnabledTest, NoScanInIncognito) {
   GURL url(kTestUrl);
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      kBlockingScansForDlpAndMalware);
 
   ContentAnalysisDelegate::Data data;
   EXPECT_TRUE(
@@ -466,9 +463,8 @@
 
 TEST_F(ContentAnalysisDelegateIsEnabledTest, MalwareEnabledWithPatterns) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED,
-                                                    R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                      R"(
         {
           "service_provider": "google",
           "enable": [
@@ -530,17 +526,17 @@
 
     for (auto connector : {FILE_ATTACHED, BULK_DATA_ENTRY, PRINT}) {
       if (include_dlp_ && include_malware_) {
-        enterprise_connectors::test::SetAnalysisConnector(
-            profile_->GetPrefs(), connector, kBlockingScansForDlpAndMalware);
+        safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), connector,
+                                            kBlockingScansForDlpAndMalware);
       } else if (include_dlp_) {
-        enterprise_connectors::test::SetAnalysisConnector(
-            profile_->GetPrefs(), connector, kBlockingScansForDlp);
+        safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), connector,
+                                            kBlockingScansForDlp);
       } else if (include_malware_) {
-        enterprise_connectors::test::SetAnalysisConnector(
-            profile_->GetPrefs(), connector, kBlockingScansForMalware);
+        safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), connector,
+                                            kBlockingScansForMalware);
       } else {
-        enterprise_connectors::test::SetAnalysisConnector(
-            profile_->GetPrefs(), connector, kNothingEnabled);
+        safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), connector,
+                                            kNothingEnabled);
       }
     }
   }
@@ -548,21 +544,20 @@
   void SetUp() override {
     BaseTest::SetUp();
 
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlpAndMalware);
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), BULK_DATA_ENTRY, kBlockingScansForDlpAndMalware);
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), PRINT, kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED,
+                                        kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), BULK_DATA_ENTRY,
+                                        kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), PRINT,
+                                        kBlockingScansForDlpAndMalware);
 
     ContentAnalysisDelegate::SetFactoryForTesting(base::BindRepeating(
-        &test::FakeContentAnalysisDelegate::Create, run_loop_.QuitClosure(),
+        &FakeContentAnalysisDelegate::Create, run_loop_.QuitClosure(),
         base::BindRepeating(
             &ContentAnalysisDelegateAuditOnlyTest::ConnectorStatusCallback,
             base::Unretained(this)),
         kDmToken));
-    test::FakeContentAnalysisDelegate::
-        ResetStaticDialogFlagsAndTotalRequestsCount();
+    FakeContentAnalysisDelegate::ResetStaticDialogFlagsAndTotalRequestsCount();
   }
 
   ContentAnalysisResponse ConnectorStatusCallback(const std::string& contents,
@@ -572,7 +567,7 @@
     ContentAnalysisResponse response =
         it != failures_.end()
             ? it->second
-            : test::FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
+            : FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
                 std::set<std::string> tags;
                 if (include_dlp_ && !dlp_response_.has_value())
                   tags.insert("dlp");
@@ -623,8 +618,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(0,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(0, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -650,8 +644,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -679,8 +672,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -695,7 +687,7 @@
   data.text.emplace_back(small_text());
   data.text.emplace_back(small_text());
 
-  SetDLPResponse(test::FakeContentAnalysisDelegate::DlpResponse(
+  SetDLPResponse(FakeContentAnalysisDelegate::DlpResponse(
       ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK));
 
   bool called = false;
@@ -714,8 +706,7 @@
                  &called));
   RunUntilDone();
   // Text too small, no analysis request is created.
-  EXPECT_EQ(0,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(0, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -746,8 +737,7 @@
           &called),
       safe_browsing::DeepScanAccessPoint::PRINT);
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -758,7 +748,7 @@
 
   data.page = normal_page();
   ASSERT_TRUE(data.page.IsValid());
-  SetDLPResponse(test::FakeContentAnalysisDelegate::DlpResponse(
+  SetDLPResponse(FakeContentAnalysisDelegate::DlpResponse(
       ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK));
 
   bool called = false;
@@ -780,8 +770,7 @@
           &called),
       safe_browsing::DeepScanAccessPoint::PRINT);
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -808,8 +797,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -838,8 +826,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -868,16 +855,14 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
 TEST_F(ContentAnalysisDelegateAuditOnlyTest, FileIsEncrypted) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED, R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -916,16 +901,14 @@
                  &called));
   RunUntilDone();
   // "FILE_ATTACHED" is exempt from scanning.
-  EXPECT_EQ(0,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(0, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
 TEST_F(ContentAnalysisDelegateAuditOnlyTest, FileIsEncrypted_PolicyAllows) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED, R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -964,8 +947,7 @@
                  &called));
   RunUntilDone();
   // "FILE_ATTACHED" is exempt from scanning.
-  EXPECT_EQ(0,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(0, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -978,9 +960,8 @@
 
   CreateFilesForTest(
       {FILE_PATH_LITERAL("good.doc"), FILE_PATH_LITERAL("bad.doc")}, &data);
-  PathFailsDeepScan(
-      data.paths[1],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[1], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::BLOCK));
 
   bool called = false;
   ScanUpload(contents(), std::move(data),
@@ -997,8 +978,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1027,8 +1007,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1042,10 +1021,9 @@
   CreateFilesForTest(
       {FILE_PATH_LITERAL("good.doc"), FILE_PATH_LITERAL("bad.doc")}, &data);
 
-  PathFailsDeepScan(data.paths[1],
-                    test::FakeContentAnalysisDelegate::DlpResponse(
-                        ContentAnalysisResponse::Result::SUCCESS, "rule",
-                        TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[1], FakeContentAnalysisDelegate::DlpResponse(
+                                       ContentAnalysisResponse::Result::SUCCESS,
+                                       "rule", TriggeredRule::BLOCK));
 
   bool called = false;
   ScanUpload(contents(), std::move(data),
@@ -1062,8 +1040,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1080,7 +1057,7 @@
 
   PathFailsDeepScan(
       data.paths[1],
-      test::FakeContentAnalysisDelegate::MalwareAndDlpResponse(
+      FakeContentAnalysisDelegate::MalwareAndDlpResponse(
           TriggeredRule::BLOCK, ContentAnalysisResponse::Result::SUCCESS,
           "rule", TriggeredRule::BLOCK));
 
@@ -1099,8 +1076,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1130,8 +1106,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(3,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(3, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1165,8 +1140,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(3,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(3, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1190,8 +1164,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1215,8 +1188,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(2,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(2, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1230,7 +1202,7 @@
   data.text.emplace_back(large_text());
   data.text.emplace_back(large_text());
 
-  SetDLPResponse(test::FakeContentAnalysisDelegate::DlpResponse(
+  SetDLPResponse(FakeContentAnalysisDelegate::DlpResponse(
       ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK));
 
   bool called = false;
@@ -1248,8 +1220,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(1,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(1, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1268,20 +1239,16 @@
                      &data);
 
   // Mark some files with failed scans.
-  PathFailsDeepScan(
-      data.paths[1],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::WARN));
-  PathFailsDeepScan(
-      data.paths[2],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
-  PathFailsDeepScan(data.paths[3],
-                    test::FakeContentAnalysisDelegate::DlpResponse(
-                        ContentAnalysisResponse::Result::FAILURE, "",
-                        TriggeredRule::REPORT_ONLY));
-  PathFailsDeepScan(data.paths[4],
-                    test::FakeContentAnalysisDelegate::DlpResponse(
-                        ContentAnalysisResponse::Result::SUCCESS, "rule",
-                        TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[1], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::WARN));
+  PathFailsDeepScan(data.paths[2], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[3], FakeContentAnalysisDelegate::DlpResponse(
+                                       ContentAnalysisResponse::Result::FAILURE,
+                                       "", TriggeredRule::REPORT_ONLY));
+  PathFailsDeepScan(data.paths[4], FakeContentAnalysisDelegate::DlpResponse(
+                                       ContentAnalysisResponse::Result::SUCCESS,
+                                       "rule", TriggeredRule::BLOCK));
 
   bool called = false;
   ScanUpload(contents(), std::move(data),
@@ -1302,14 +1269,12 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(6,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(6, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
 TEST_F(ContentAnalysisDelegateAuditOnlyTest, NoDelay) {
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_ATTACHED, R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -1334,25 +1299,20 @@
                      &data);
 
   // Mark all files and text with failed scans.
-  SetDLPResponse(test::FakeContentAnalysisDelegate::DlpResponse(
+  SetDLPResponse(FakeContentAnalysisDelegate::DlpResponse(
       ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK));
-  PathFailsDeepScan(
-      data.paths[0],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
-  PathFailsDeepScan(
-      data.paths[1],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::WARN));
-  PathFailsDeepScan(
-      data.paths[2],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
-  PathFailsDeepScan(data.paths[3],
-                    test::FakeContentAnalysisDelegate::DlpResponse(
-                        ContentAnalysisResponse::Result::FAILURE, "",
-                        TriggeredRule::REPORT_ONLY));
-  PathFailsDeepScan(data.paths[4],
-                    test::FakeContentAnalysisDelegate::DlpResponse(
-                        ContentAnalysisResponse::Result::SUCCESS, "rule",
-                        TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[0], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[1], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::WARN));
+  PathFailsDeepScan(data.paths[2], FakeContentAnalysisDelegate::MalwareResponse(
+                                       TriggeredRule::BLOCK));
+  PathFailsDeepScan(data.paths[3], FakeContentAnalysisDelegate::DlpResponse(
+                                       ContentAnalysisResponse::Result::FAILURE,
+                                       "", TriggeredRule::REPORT_ONLY));
+  PathFailsDeepScan(data.paths[4], FakeContentAnalysisDelegate::DlpResponse(
+                                       ContentAnalysisResponse::Result::SUCCESS,
+                                       "rule", TriggeredRule::BLOCK));
 
   bool called = false;
   ScanUpload(contents(), std::move(data),
@@ -1377,8 +1337,7 @@
                  &called));
   RunUntilDone();
   // Text too small, only file analysis requests are created.
-  EXPECT_EQ(5,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(5, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1401,8 +1360,7 @@
                  },
                  &called));
   RunUntilDone();
-  EXPECT_EQ(0,
-            test::FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
+  EXPECT_EQ(0, FakeContentAnalysisDelegate::GetTotalAnalysisRequestsCount());
   EXPECT_TRUE(called);
 }
 
@@ -1418,19 +1376,18 @@
 
   void SetUp() override {
     BaseTest::SetUp();
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         profile_->GetPrefs(), FILE_ATTACHED,
         is_cloud() ? kBlockingScansForDlpAndMalware
                    : kLocalBlockingScansForDlpAndMalware);
 
     ContentAnalysisDelegate::SetFactoryForTesting(base::BindRepeating(
-        &test::FakeContentAnalysisDelegate::Create, run_loop_.QuitClosure(),
+        &FakeContentAnalysisDelegate::Create, run_loop_.QuitClosure(),
         base::BindRepeating(
             &ContentAnalysisDelegateResultHandlingTest::ConnectorStatusCallback,
             base::Unretained(this)),
         kDmToken));
-    test::FakeContentAnalysisDelegate::
-        ResetStaticDialogFlagsAndTotalRequestsCount();
+    FakeContentAnalysisDelegate::ResetStaticDialogFlagsAndTotalRequestsCount();
   }
 
   safe_browsing::BinaryUploadService::Result result() const {
@@ -1441,8 +1398,7 @@
 
   ContentAnalysisResponse ConnectorStatusCallback(const std::string& contents,
                                                   const base::FilePath& path) {
-    return test::FakeContentAnalysisDelegate::SuccessfulResponse(
-        {"dlp", "malware"});
+    return FakeContentAnalysisDelegate::SuccessfulResponse({"dlp", "malware"});
   }
 
  protected:
@@ -1466,7 +1422,7 @@
 
   GURL url(kTestUrl);
   ContentAnalysisDelegate::Data data;
-  test::FakeContentAnalysisDelegate::SetResponseResult(result());
+  FakeContentAnalysisDelegate::SetResponseResult(result());
   ASSERT_TRUE(
       ContentAnalysisDelegate::IsEnabled(profile(), url, &data, FILE_ATTACHED));
 
@@ -1490,8 +1446,8 @@
   RunUntilDone();
   EXPECT_TRUE(called);
 
-  EXPECT_EQ(is_cloud(), test::FakeContentAnalysisDelegate::WasDialogShown());
-  EXPECT_NE(is_cloud(), test::FakeContentAnalysisDelegate::WasDialogCanceled());
+  EXPECT_EQ(is_cloud(), FakeContentAnalysisDelegate::WasDialogShown());
+  EXPECT_NE(is_cloud(), FakeContentAnalysisDelegate::WasDialogCanceled());
 }
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
index 15b66319..8e31e6d 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -13,9 +13,9 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h"
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
@@ -95,7 +95,7 @@
 //   observer.
 // - It sends accessibility events correctly.
 class ContentAnalysisDialogBehaviorBrowserTest
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver,
       public testing::WithParamInterface<
           std::tuple<bool, bool, base::TimeDelta>> {
@@ -277,7 +277,7 @@
 // - It returns a negative verdict on the scanned content.
 // - The "CancelledByUser" metrics are recorded.
 class ContentAnalysisDialogCancelPendingScanBrowserTest
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver {
  public:
   ContentAnalysisDialogCancelPendingScanBrowserTest() {
@@ -319,7 +319,7 @@
 // - It calls the appropriate methods when the user bypasses/respects the
 //   warning.
 class ContentAnalysisDialogWarningBrowserTest
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver,
       public testing::WithParamInterface<bool> {
  public:
@@ -365,7 +365,7 @@
 //   type.
 // - It shows the appropriate spinner depending on its state.
 class ContentAnalysisDialogAppearanceBrowserTest
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver,
       public testing::WithParamInterface<
           std::tuple<bool, bool, safe_browsing::DeepScanAccessPoint>> {
@@ -495,15 +495,15 @@
 
   // Setup policies to enable deep scanning, its UI and the responses to be
   // simulated.
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), FILE_ATTACHED,
-      kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      FILE_ATTACHED,
+                                      kBlockingScansForDlpAndMalware);
   SetStatusCallbackResponse(
       safe_browsing::SimpleContentAnalysisResponseForTesting(
           dlp_success(), malware_success()));
 
   // Set up delegate test values.
-  test::FakeContentAnalysisDelegate::SetResponseDelay(response_delay());
+  FakeContentAnalysisDelegate::SetResponseDelay(response_delay());
   SetUpDelegate();
 
   bool called = false;
@@ -558,15 +558,15 @@
 
   // Setup policies to enable deep scanning, its UI and the responses to be
   // simulated.
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      FILE_ATTACHED, kBlockingScansForDlp);
   SetStatusCallbackResponse(
       safe_browsing::SimpleContentAnalysisResponseForTesting(
           /*dlp=*/true, /*malware=*/absl::nullopt));
 
   // Set up delegate test values. An unresponsive delegate is set up to avoid
   // a race between the file responses and the "Cancel" button being clicked.
-  test::FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
+  FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
   SetUpUnresponsiveDelegate();
 
   bool called = false;
@@ -601,8 +601,8 @@
   base::ScopedAllowBlockingForTesting allow_blocking;
 
   // Setup policies.
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), FILE_ATTACHED, kBlockingScansForDlp);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      FILE_ATTACHED, kBlockingScansForDlp);
 
   // Setup the DLP warning response.
   enterprise_connectors::ContentAnalysisResponse response;
@@ -659,16 +659,16 @@
 
   // Setup policies to enable deep scanning, its UI and the responses to be
   // simulated.
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), FILE_ATTACHED,
-      kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      FILE_ATTACHED,
+                                      kBlockingScansForDlpAndMalware);
 
   SetStatusCallbackResponse(
       safe_browsing::SimpleContentAnalysisResponseForTesting(success(),
                                                              success()));
 
   // Set up delegate test values.
-  test::FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
+  FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
   SetUpDelegate();
 
   bool called = false;
@@ -719,7 +719,7 @@
 
   // Setup policies to enable deep scanning, its UI and the responses to be
   // simulated.
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       browser()->profile()->GetPrefs(), FILE_ATTACHED,
       kBlockingScansForDlpAndMalwareWithCustomMessage);
 
@@ -728,7 +728,7 @@
                                                              success()));
 
   // Set up delegate test values.
-  test::FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
+  FakeContentAnalysisDelegate::SetResponseDelay(kSmallDelay);
   SetUpDelegate();
 
   bool called = false;
@@ -1143,7 +1143,7 @@
                              /*bypass_justification_enabled*/ testing::Bool()));
 
 class ContentAnalysysDialogDownloadObserverTest
-    : public test::DeepScanningBrowserTestBase,
+    : public safe_browsing::DeepScanningBrowserTestBase,
       public ContentAnalysisDialog::TestObserver {
  public:
   ContentAnalysysDialogDownloadObserverTest() {
diff --git a/chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
similarity index 84%
rename from chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.cc
rename to chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
index 55a5ca6..d1d6e16a 100644
--- a/chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.cc
+++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc
@@ -2,17 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
+#include "base/logging.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/bind.h"
 #include "base/time/time.h"
-#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
 #include "components/enterprise/common/proto/connectors.pb.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace enterprise_connectors::test {
+namespace enterprise_connectors {
 
 namespace {
 
@@ -43,9 +47,8 @@
       dm_token_(std::move(dm_token)) {}
 
 FakeContentAnalysisDelegate::~FakeContentAnalysisDelegate() {
-  if (!delete_closure_.is_null()) {
+  if (!delete_closure_.is_null())
     delete_closure_.Run();
-  }
 }
 
 // static
@@ -101,26 +104,29 @@
 }
 
 // static
-ContentAnalysisResponse FakeContentAnalysisDelegate::SuccessfulResponse(
+enterprise_connectors::ContentAnalysisResponse
+FakeContentAnalysisDelegate::SuccessfulResponse(
     const std::set<std::string>& tags) {
-  ContentAnalysisResponse response;
+  enterprise_connectors::ContentAnalysisResponse response;
 
   auto* result = response.mutable_results()->Add();
-  result->set_status(ContentAnalysisResponse::Result::SUCCESS);
-  for (const std::string& tag : tags) {
+  result->set_status(
+      enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
+  for (const std::string& tag : tags)
     result->set_tag(tag);
-  }
 
   return response;
 }
 
 // static
-ContentAnalysisResponse FakeContentAnalysisDelegate::MalwareResponse(
-    TriggeredRule::Action action) {
-  ContentAnalysisResponse response;
+enterprise_connectors::ContentAnalysisResponse
+FakeContentAnalysisDelegate::MalwareResponse(
+    enterprise_connectors::TriggeredRule::Action action) {
+  enterprise_connectors::ContentAnalysisResponse response;
 
   auto* result = response.mutable_results()->Add();
-  result->set_status(ContentAnalysisResponse::Result::SUCCESS);
+  result->set_status(
+      enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
   result->set_tag("malware");
 
   auto* rule = result->add_triggered_rules();
@@ -130,11 +136,12 @@
 }
 
 // static
-ContentAnalysisResponse FakeContentAnalysisDelegate::DlpResponse(
-    ContentAnalysisResponse::Result::Status status,
+enterprise_connectors::ContentAnalysisResponse
+FakeContentAnalysisDelegate::DlpResponse(
+    enterprise_connectors::ContentAnalysisResponse::Result::Status status,
     const std::string& rule_name,
-    TriggeredRule::Action action) {
-  ContentAnalysisResponse response;
+    enterprise_connectors::TriggeredRule::Action action) {
+  enterprise_connectors::ContentAnalysisResponse response;
 
   auto* result = response.mutable_results()->Add();
   result->set_status(status);
@@ -148,15 +155,17 @@
 }
 
 // static
-ContentAnalysisResponse FakeContentAnalysisDelegate::MalwareAndDlpResponse(
-    TriggeredRule::Action malware_action,
-    ContentAnalysisResponse::Result::Status dlp_status,
+enterprise_connectors::ContentAnalysisResponse
+FakeContentAnalysisDelegate::MalwareAndDlpResponse(
+    enterprise_connectors::TriggeredRule::Action malware_action,
+    enterprise_connectors::ContentAnalysisResponse::Result::Status dlp_status,
     const std::string& dlp_rule_name,
-    TriggeredRule::Action dlp_action) {
-  ContentAnalysisResponse response;
+    enterprise_connectors::TriggeredRule::Action dlp_action) {
+  enterprise_connectors::ContentAnalysisResponse response;
 
   auto* malware_result = response.add_results();
-  malware_result->set_status(ContentAnalysisResponse::Result::SUCCESS);
+  malware_result->set_status(
+      enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
   malware_result->set_tag("malware");
   auto* malware_rule = malware_result->add_triggered_rules();
   malware_rule->set_action(malware_action);
@@ -181,7 +190,7 @@
   auto response =
       (status_callback_.is_null() ||
        result_ != safe_browsing::BinaryUploadService::Result::SUCCESS)
-          ? ContentAnalysisResponse()
+          ? enterprise_connectors::ContentAnalysisResponse()
           : status_callback_.Run(contents, path);
   if (request->IsAuthRequest()) {
     StringRequestCallback(result_, response);
@@ -324,4 +333,4 @@
   return nullptr;
 }
 
-}  // namespace enterprise_connectors::test
+}  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h
similarity index 78%
rename from chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h
rename to chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h
index bbda8914..65309c15 100644
--- a/chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h
+++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.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_ENTERPRISE_CONNECTORS_TEST_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
-#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
+#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
 
 #include <memory>
 
@@ -11,7 +11,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h"
-#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
 #include "components/enterprise/common/proto/connectors.pb.h"
 
@@ -19,7 +19,7 @@
 class WebContents;
 }
 
-namespace enterprise_connectors::test {
+namespace enterprise_connectors {
 
 // A derivative of ContentAnalysisDelegate that overrides calls to the
 // real binary upload service and re-implements them locally.
@@ -33,9 +33,10 @@
   //
   // For text requests, contents is not empty and path is empty.
   // For print requests, both contents and path are empty.
-  using StatusCallback = base::RepeatingCallback<ContentAnalysisResponse(
-      const std::string& contents,
-      const base::FilePath&)>;
+  using StatusCallback =
+      base::RepeatingCallback<enterprise_connectors::ContentAnalysisResponse(
+          const std::string& contents,
+          const base::FilePath&)>;
 
   FakeContentAnalysisDelegate(base::RepeatingClosure delete_closure,
                               StatusCallback status_callback,
@@ -62,24 +63,25 @@
 
   // Returns a content analysis response that represents a successful scan and
   // includes the given tags.
-  static ContentAnalysisResponse SuccessfulResponse(
+  static enterprise_connectors::ContentAnalysisResponse SuccessfulResponse(
       const std::set<std::string>& tags);
 
   // Returns a content analysis response with a specific malware action.
-  static ContentAnalysisResponse MalwareResponse(TriggeredRule::Action action);
+  static enterprise_connectors::ContentAnalysisResponse MalwareResponse(
+      enterprise_connectors::TriggeredRule::Action action);
 
   // Returns a content analysis response with a specific DLP action.
-  static ContentAnalysisResponse DlpResponse(
-      ContentAnalysisResponse::Result::Status status,
+  static enterprise_connectors::ContentAnalysisResponse DlpResponse(
+      enterprise_connectors::ContentAnalysisResponse::Result::Status status,
       const std::string& rule_name,
-      TriggeredRule::Action action);
+      enterprise_connectors::TriggeredRule::Action action);
 
   // Returns a content analysis response with specific malware and DLP actions.
-  static ContentAnalysisResponse MalwareAndDlpResponse(
-      TriggeredRule::Action malware_action,
-      ContentAnalysisResponse::Result::Status dlp_status,
+  static enterprise_connectors::ContentAnalysisResponse MalwareAndDlpResponse(
+      enterprise_connectors::TriggeredRule::Action malware_action,
+      enterprise_connectors::ContentAnalysisResponse::Result::Status dlp_status,
       const std::string& dlp_rule_name,
-      TriggeredRule::Action dlp_action);
+      enterprise_connectors::TriggeredRule::Action dlp_action);
 
   // Sets the BinaryUploadService::Result to use in the next response callback.
   static void SetResponseResult(
@@ -136,6 +138,6 @@
   base::WeakPtrFactory<FakeContentAnalysisDelegate> weakptr_factory_{this};
 };
 
-}  // namespace enterprise_connectors::test
+}  // namespace enterprise_connectors
 
-#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
diff --git a/chrome/browser/enterprise/connectors/test/fake_files_request_handler.cc b/chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.cc
similarity index 63%
rename from chrome/browser/enterprise/connectors/test/fake_files_request_handler.cc
rename to chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.cc
index 7327fe8..a26eb67 100644
--- a/chrome/browser/enterprise/connectors/test/fake_files_request_handler.cc
+++ b/chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.cc
@@ -2,17 +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/enterprise/connectors/test/fake_files_request_handler.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "base/functional/bind.h"
 #include "base/memory/weak_ptr.h"
 
-namespace enterprise_connectors::test {
+namespace enterprise_connectors {
 
 FakeFilesRequestHandler::FakeFilesRequestHandler(
     FakeFileUploadCallback fake_file_upload_callback,
     safe_browsing::BinaryUploadService* upload_service,
     Profile* profile,
-    const AnalysisSettings& analysis_settings,
+    const enterprise_connectors::AnalysisSettings& analysis_settings,
     GURL url,
     const std::string& source,
     const std::string& destination,
@@ -21,27 +21,28 @@
     safe_browsing::DeepScanAccessPoint access_point,
     const std::vector<base::FilePath>& paths,
     CompletionCallback callback)
-    : FilesRequestHandler(upload_service,
-                          profile,
-                          analysis_settings,
-                          url,
-                          source,
-                          destination,
-                          user_action_id,
-                          tab_title,
-                          access_point,
-                          paths,
-                          std::move(callback)),
+    : enterprise_connectors::FilesRequestHandler(upload_service,
+                                                 profile,
+                                                 analysis_settings,
+                                                 url,
+                                                 source,
+                                                 destination,
+                                                 user_action_id,
+                                                 tab_title,
+                                                 access_point,
+                                                 paths,
+                                                 std::move(callback)),
       fake_file_upload_callback_(fake_file_upload_callback) {}
 
 FakeFilesRequestHandler::~FakeFilesRequestHandler() = default;
 
 // static
-std::unique_ptr<FilesRequestHandler> FakeFilesRequestHandler::Create(
+std::unique_ptr<enterprise_connectors::FilesRequestHandler>
+FakeFilesRequestHandler::Create(
     FakeFileUploadCallback fake_file_upload_callback,
     safe_browsing::BinaryUploadService* upload_service,
     Profile* profile,
-    const AnalysisSettings& analysis_settings,
+    const enterprise_connectors::AnalysisSettings& analysis_settings,
     GURL url,
     const std::string& source,
     const std::string& destination,
@@ -49,7 +50,7 @@
     const std::string& tab_title,
     safe_browsing::DeepScanAccessPoint access_point,
     const std::vector<base::FilePath>& paths,
-    FilesRequestHandler::CompletionCallback callback) {
+    enterprise_connectors::FilesRequestHandler::CompletionCallback callback) {
   return std::make_unique<FakeFilesRequestHandler>(
       fake_file_upload_callback, upload_service, profile, analysis_settings,
       url, source, destination, user_action_id, tab_title, access_point, paths,
@@ -70,4 +71,4 @@
   return weak_ptr_factory_.GetWeakPtr();
 }
 
-}  // namespace enterprise_connectors::test
+}  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h b/chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h
new file mode 100644
index 0000000..2cc129f
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h
@@ -0,0 +1,72 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_FILES_REQUEST_HANDLER_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_FILES_REQUEST_HANDLER_H_
+
+#include "base/functional/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/enterprise/connectors/analysis/files_request_handler.h"
+
+namespace enterprise_connectors {
+
+class FakeFilesRequestHandler : public FilesRequestHandler {
+ public:
+  using FakeFileRequestCallback = base::OnceCallback<void(
+      base::FilePath path,
+      safe_browsing::BinaryUploadService::Result result,
+      enterprise_connectors::ContentAnalysisResponse response)>;
+
+  using FakeFileUploadCallback = base::RepeatingCallback<void(
+      safe_browsing::BinaryUploadService::Result result,
+      const base::FilePath& path,
+      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request,
+      FakeFileRequestCallback callback)>;
+
+  FakeFilesRequestHandler(
+      FakeFileUploadCallback fake_file_upload_callback,
+      safe_browsing::BinaryUploadService* upload_service,
+      Profile* profile,
+      const enterprise_connectors::AnalysisSettings& analysis_settings,
+      GURL url,
+      const std::string& source,
+      const std::string& destination,
+      const std::string& user_action_id,
+      const std::string& tab_title,
+      safe_browsing::DeepScanAccessPoint access_point,
+      const std::vector<base::FilePath>& paths,
+      CompletionCallback callback);
+
+  ~FakeFilesRequestHandler() override;
+
+  static std::unique_ptr<enterprise_connectors::FilesRequestHandler> Create(
+      FakeFileUploadCallback fake_file_upload_callback,
+      safe_browsing::BinaryUploadService* upload_service,
+      Profile* profile,
+      const enterprise_connectors::AnalysisSettings& analysis_settings,
+      GURL url,
+      const std::string& source,
+      const std::string& destination,
+      const std::string& user_action_id,
+      const std::string& tab_title,
+      safe_browsing::DeepScanAccessPoint access_point,
+      const std::vector<base::FilePath>& paths,
+      enterprise_connectors::FilesRequestHandler::CompletionCallback callback);
+
+  base::WeakPtr<FakeFilesRequestHandler> GetWeakPtr();
+
+ private:
+  void UploadFileForDeepScanning(
+      safe_browsing::BinaryUploadService::Result result,
+      const base::FilePath& path,
+      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request)
+      override;
+
+  FakeFileUploadCallback fake_file_upload_callback_;
+  base::WeakPtrFactory<FakeFilesRequestHandler> weak_ptr_factory_{this};
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_FILES_REQUEST_HANDLER_H_
diff --git a/chrome/browser/enterprise/connectors/analysis/file_transfer_analysis_delegate_unittest.cc b/chrome/browser/enterprise/connectors/analysis/file_transfer_analysis_delegate_unittest.cc
index dec4c76..aa6b2d6 100644
--- a/chrome/browser/enterprise/connectors/analysis/file_transfer_analysis_delegate_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/file_transfer_analysis_delegate_unittest.cc
@@ -21,17 +21,17 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "chrome/browser/enterprise/connectors/analysis/files_request_handler.h"
 #include "chrome/browser/enterprise/connectors/analysis/source_destination_test_util.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
-#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/safe_browsing/test_extension_event_observer.h"
 #include "chrome/common/chrome_paths.h"
@@ -360,26 +360,26 @@
     case NO_PREF:
       break;
     case NOTHING_ENABLED_PREF:
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), FILE_TRANSFER, kNothingEnabled);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                          kNothingEnabled);
       break;
     case DLP_PREF:
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForDlp);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                          kBlockingScansForDlp);
       break;
     case MALWARE_PREF:
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForMalware);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                          kBlockingScansForMalware);
       break;
     case DLP_MALWARE_PREF:
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForDlpAndMalware);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                          kBlockingScansForDlpAndMalware);
       break;
   }
   if (GetUnrelatedPrefEnabled()) {
     // Set for wrong policy (FILE_DOWNLOADED instead of FILE_TRANSFER)!
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), FILE_DOWNLOADED, kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                        kBlockingScansForDlpAndMalware);
   }
 
   auto settings = FileTransferAnalysisDelegate::IsEnabledVec(
@@ -406,8 +406,8 @@
 TEST_F(FileTransferAnalysisDelegateIsEnabledTestSameFileSystem,
        DlpMalwareDisabledForSameFileSystem) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      kBlockingScansForDlpAndMalware);
 
   auto settings = FileTransferAnalysisDelegate::IsEnabledVec(
       profile(),
@@ -425,9 +425,8 @@
 TEST_F(FileTransferAnalysisDelegateIsEnabledTestMultiple, Test) {
   ScopedSetDMToken scoped_dm_token(policy::DMToken::CreateValidToken(kDmToken));
 
-  enterprise_connectors::test::SetAnalysisConnector(profile_->GetPrefs(),
-                                                    FILE_TRANSFER,
-                                                    R"({
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      R"({
           "service_provider": "google",
           "enable": [
             {
@@ -486,8 +485,8 @@
 
   VolumeInfo source_volume = GetParam();
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForDlpAndMalware);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      kBlockingScansForDlpAndMalware);
 
   VolumeInfo dest_volume = GetParam();
 
@@ -505,7 +504,7 @@
 
   VolumeInfo source_volume = GetParam();
 
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       profile_->GetPrefs(), FILE_TRANSFER,
       base::StringPrintf(R"(
         {
@@ -560,7 +559,7 @@
 
   VolumeInfo dest_volume = GetParam();
 
-  enterprise_connectors::test::SetAnalysisConnector(
+  safe_browsing::SetAnalysisConnector(
       profile_->GetPrefs(), FILE_TRANSFER,
       base::StringPrintf(R"(
         {
@@ -615,10 +614,9 @@
 
   VolumeInfo source_volume = GetParam();
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_TRANSFER,
-      base::StringPrintf(
-          R"({
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      base::StringPrintf(
+                                          R"({
           "service_provider": "google",
           "enable": [
             {
@@ -637,7 +635,7 @@
           ],
           "block_until_verdict": 1
         })",
-          source_volume.fs_config_string));
+                                          source_volume.fs_config_string));
 
   VolumeInfo dest_volume = GetAnyOtherVolume(source_volume);
 
@@ -655,10 +653,9 @@
 
   VolumeInfo dest_volume = GetParam();
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_TRANSFER,
-      base::StringPrintf(
-          R"({
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      base::StringPrintf(
+                                          R"({
           "service_provider": "google",
           "enable": [
             {
@@ -677,7 +674,7 @@
           ],
           "block_until_verdict": 1
         })",
-          dest_volume.fs_config_string));
+                                          dest_volume.fs_config_string));
 
   VolumeInfo source_volume = GetAnyOtherVolume(dest_volume);
 
@@ -701,15 +698,15 @@
   void SetUp() override {
     BaseTest::SetUp();
 
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), FILE_TRANSFER, kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                        kBlockingScansForDlpAndMalware);
 
     // Setup reporting:
-    test::SetOnSecurityEventReporting(profile()->GetPrefs(),
-                                      /*enabled*/ true,
-                                      /*enabled_event_names*/ {},
-                                      /*enabled_opt_in_events*/ {},
-                                      /*machine_scope*/ false);
+    safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(),
+                                               /*enabled*/ true,
+                                               /*enabled_event_names*/ {},
+                                               /*enabled_opt_in_events*/ {},
+                                               /*machine_scope*/ false);
     cloud_policy_client_ = std::make_unique<policy::MockCloudPolicyClient>();
     cloud_policy_client_->SetDMToken(kDmToken);
     extensions::SafeBrowsingPrivateEventRouterFactory::GetInstance()
@@ -730,7 +727,7 @@
             identity_test_environment_->identity_manager());
 
     FilesRequestHandler::SetFactoryForTesting(base::BindRepeating(
-        &test::FakeFilesRequestHandler::Create,
+        &FakeFilesRequestHandler::Create,
         base::BindRepeating(
             &FileTransferAnalysisDelegateAuditOnlyTest::FakeFileUploadCallback,
             base::Unretained(this))));
@@ -796,7 +793,7 @@
       safe_browsing::BinaryUploadService::Result result,
       const base::FilePath& path,
       std::unique_ptr<safe_browsing::BinaryUploadService::Request> request,
-      test::FakeFilesRequestHandler::FakeFileRequestCallback callback) {
+      FakeFilesRequestHandler::FakeFileRequestCallback callback) {
     EXPECT_FALSE(path.empty());
     EXPECT_EQ(request->device_token(), kDmToken);
 
@@ -820,7 +817,7 @@
     ContentAnalysisResponse response =
         it != failures_.end()
             ? it->second
-            : test::FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
+            : FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
                 std::set<std::string> tags;
                 if (!dlp_response_.has_value()) {
                   tags.insert("dlp");
@@ -897,7 +894,7 @@
   storage::FileSystemURL source_url = GetEmptyTestSrcUrl();
   storage::FileSystemURL destination_url = GetEmptyTestDestUrl();
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_url, destination_url);
@@ -914,7 +911,7 @@
   storage::FileSystemURL source_url = PathToFileSystemURL(
       source_directory_url_.path().Append("does_not_exist"));
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_url, destination_directory_url_);
@@ -929,7 +926,7 @@
 }
 
 TEST_F(FileTransferAnalysisDelegateAuditOnlyTest, EmptyDirectory) {
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_directory_url_, destination_directory_url_);
@@ -949,7 +946,7 @@
 
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_url, destination_directory_url_);
@@ -971,10 +968,8 @@
 
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
-  ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::DlpResponse(
-          ContentAnalysisResponse::Result::SUCCESS, "rule",
-          TriggeredRule::BLOCK);
+  ContentAnalysisResponse response = FakeContentAnalysisDelegate::DlpResponse(
+      ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK);
   response.set_request_token(scan_id);
 
   SetDLPResponse(response);
@@ -982,7 +977,7 @@
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
   // Check reporting.
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvent(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1017,9 +1012,8 @@
 
 TEST_F(FileTransferAnalysisDelegateAuditOnlyTest,
        SingleFileBlockedDlpReportOnly) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), FILE_TRANSFER,
-      kBlockingScansForDlpAndMalwareReportOnly);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_TRANSFER,
+                                      kBlockingScansForDlpAndMalwareReportOnly);
 
   // For report-only mode, the destination is scanned, because we perform the
   // scan after a transfer. So we create the file at the destination.
@@ -1028,10 +1022,8 @@
 
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
-  ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::DlpResponse(
-          ContentAnalysisResponse::Result::SUCCESS, "rule",
-          TriggeredRule::BLOCK);
+  ContentAnalysisResponse response = FakeContentAnalysisDelegate::DlpResponse(
+      ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK);
   response.set_request_token(scan_id);
 
   SetDLPResponse(response);
@@ -1041,7 +1033,7 @@
   storage::FileSystemURL destination_url = PathToFileSystemURL(paths[0]);
 
   // Check reporting.
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvent(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1078,7 +1070,7 @@
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
   ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK);
+      FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK);
 
   // Setting the rule_name is required for a correct value of thread_type in the
   // report.
@@ -1093,7 +1085,7 @@
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
   // Check reporting.
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectDangerousDeepScanningResult(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1140,10 +1132,8 @@
 
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
-  ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::DlpResponse(
-          ContentAnalysisResponse::Result::SUCCESS, "rule",
-          TriggeredRule::BLOCK);
+  ContentAnalysisResponse response = FakeContentAnalysisDelegate::DlpResponse(
+      ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK);
   response.set_request_token(scan_id);
 
   SetDLPResponse(response);
@@ -1151,7 +1141,7 @@
   storage::FileSystemURL source_url = PathToFileSystemURL(path);
 
   // Check reporting.
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectUnscannedFileEvent(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1190,7 +1180,7 @@
 
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_directory_url_, destination_directory_url_);
@@ -1213,15 +1203,13 @@
 
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
-  ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::DlpResponse(
-          ContentAnalysisResponse::Result::SUCCESS, "rule",
-          TriggeredRule::BLOCK);
+  ContentAnalysisResponse response = FakeContentAnalysisDelegate::DlpResponse(
+      ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK);
   response.set_request_token(scan_id);
   SetDLPResponse(response);
 
   // Check reporting.
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvent(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1261,7 +1249,7 @@
        FILE_PATH_LITERAL("blub.doc")},
       source_directory_url_.path());
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectNoReport();
 
   ScanUpload(source_directory_url_, destination_directory_url_);
@@ -1288,16 +1276,14 @@
 
   // Mark all files and text with failed scans.
   std::string scan_id = "scan_id";
-  ContentAnalysisResponse response =
-      test::FakeContentAnalysisDelegate::DlpResponse(
-          ContentAnalysisResponse::Result::SUCCESS, "rule",
-          TriggeredRule::BLOCK);
+  ContentAnalysisResponse response = FakeContentAnalysisDelegate::DlpResponse(
+      ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK);
   response.set_request_token(scan_id);
   SetDLPResponse(response);
 
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvents(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1351,7 +1337,7 @@
   for (const auto& path : paths) {
     if (path.value().find("bad") != std::string::npos) {
       ContentAnalysisResponse response =
-          test::FakeContentAnalysisDelegate::DlpResponse(
+          FakeContentAnalysisDelegate::DlpResponse(
               ContentAnalysisResponse::Result::SUCCESS, "rule",
               TriggeredRule::BLOCK);
       response.set_request_token(scan_id);
@@ -1362,7 +1348,7 @@
 
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvents(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
@@ -1429,7 +1415,7 @@
     auto&& path = paths[i];
     if (path.value().find("bad") != std::string::npos) {
       ContentAnalysisResponse response =
-          test::FakeContentAnalysisDelegate::DlpResponse(
+          FakeContentAnalysisDelegate::DlpResponse(
               ContentAnalysisResponse::Result::SUCCESS,
               base::StrCat({"rule", base::NumberToString(i)}),
               TriggeredRule::BLOCK);
@@ -1450,7 +1436,7 @@
 
   storage::FileSystemURL source_url = PathToFileSystemURL(paths[0]);
 
-  test::EventReportValidator validator(cloud_policy_client());
+  safe_browsing::EventReportValidator validator(cloud_policy_client());
   validator.ExpectSensitiveDataEvents(
       /*url*/ "",
       /*source*/ kSourceVolumeInfo.fs_config_string,
diff --git a/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc b/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc
index 4a6d0f9..66619e5 100644
--- a/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/files_request_handler_unittest.cc
@@ -21,13 +21,13 @@
 #include "base/test/gmock_callback_support.h"
 #include "base/test/test_future.h"
 #include "build/build_config.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_files_request_handler.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
-#include "chrome/browser/enterprise/connectors/test/fake_files_request_handler.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -139,7 +139,7 @@
   TestingProfileManager profile_manager_;
   raw_ptr<TestingProfile> profile_;
   base::ScopedTempDir temp_dir_;
-  std::unique_ptr<test::FakeFilesRequestHandler> fake_files_request_handler_;
+  std::unique_ptr<FakeFilesRequestHandler> fake_files_request_handler_;
 };
 
 MATCHER_P3(MatchesRequestHandlerResult, complies, final_result, tag, "") {
@@ -192,8 +192,7 @@
   absl::optional<std::vector<RequestHandlerResult>> ScanUpload(
       const std::vector<base::FilePath>& paths) {
     // The settings need to exist until the "scanning" has completed, we can
-    // thus not pass it into test::FakeFilesRequestHandler as a rvalue
-    // reference.
+    // thus not pass it into FakeFilesRequestHandler as a rvalue reference.
     absl::optional<AnalysisSettings> settings = GetSettings();
     if (!settings.has_value()) {
       return absl::nullopt;
@@ -205,16 +204,14 @@
 
     // The access point is only used for metrics, so its value doesn't affect
     // the tests in this file and can always be the same.
-    fake_files_request_handler_ =
-        std::make_unique<test::FakeFilesRequestHandler>(
-            base::BindRepeating(
-                &FilesRequestHandlerTest::FakeFileUploadCallback,
-                weak_ptr_factory_.GetWeakPtr(),
-                settings->cloud_or_local_settings.is_cloud_analysis()),
-            /*upload_service=*/nullptr, profile_, *settings, GURL(kTestUrl), "",
-            "", kUserActionId, kTabTitle,
-            safe_browsing::DeepScanAccessPoint::UPLOAD, paths,
-            future.GetCallback());
+    fake_files_request_handler_ = std::make_unique<FakeFilesRequestHandler>(
+        base::BindRepeating(
+            &FilesRequestHandlerTest::FakeFileUploadCallback,
+            weak_ptr_factory_.GetWeakPtr(),
+            settings->cloud_or_local_settings.is_cloud_analysis()),
+        /*upload_service=*/nullptr, profile_, *settings, GURL(kTestUrl), "", "",
+        kUserActionId, kTabTitle, safe_browsing::DeepScanAccessPoint::UPLOAD,
+        paths, future.GetCallback());
 
     fake_files_request_handler_->UploadData();
 
@@ -266,30 +263,30 @@
     include_malware_ = malware;
 
     if (include_dlp_ && include_malware_) {
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-          kBlockingScansForDlpAndMalware);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                          AnalysisConnector::FILE_ATTACHED,
+                                          kBlockingScansForDlpAndMalware);
     } else if (include_dlp_) {
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-          kBlockingScansForDlp);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                          AnalysisConnector::FILE_ATTACHED,
+                                          kBlockingScansForDlp);
     } else if (include_malware_) {
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-          kBlockingScansForMalware);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                          AnalysisConnector::FILE_ATTACHED,
+                                          kBlockingScansForMalware);
     } else {
-      enterprise_connectors::test::SetAnalysisConnector(
-          profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-          kNothingEnabled);
+      safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                          AnalysisConnector::FILE_ATTACHED,
+                                          kNothingEnabled);
     }
   }
 
   void SetUp() override {
     BaseTest::SetUp();
 
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-        kBlockingScansForDlpAndMalware);
+    safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                        AnalysisConnector::FILE_ATTACHED,
+                                        kBlockingScansForDlpAndMalware);
   }
 
   void FakeFileUploadCallback(
@@ -297,7 +294,7 @@
       safe_browsing::BinaryUploadService::Result result,
       const base::FilePath& path,
       std::unique_ptr<safe_browsing::BinaryUploadService::Request> request,
-      test::FakeFilesRequestHandler::FakeFileRequestCallback callback) {
+      FakeFilesRequestHandler::FakeFileRequestCallback callback) {
     EXPECT_FALSE(path.empty());
     if (is_cloud_analysis) {
       EXPECT_EQ(request->device_token(), kDmToken);
@@ -323,7 +320,7 @@
     ContentAnalysisResponse response =
         it != failures_.end()
             ? it->second
-            : test::FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
+            : FakeContentAnalysisDelegate::SuccessfulResponse([this]() {
                 std::set<std::string> tags;
                 if (include_dlp_ && !dlp_response_.has_value()) {
                   tags.insert("dlp");
@@ -425,9 +422,8 @@
 TEST_F(FilesRequestHandlerTest, FileIsEncrypted) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -462,9 +458,9 @@
 TEST_F(FilesRequestHandlerTest, FileIsEncrypted_LocalAnalysis) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      kLocalServiceProvider);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED,
+                                      kLocalServiceProvider);
   GURL url(kTestUrl);
   std::vector<base::FilePath> paths;
 
@@ -487,9 +483,8 @@
 TEST_F(FilesRequestHandlerTest, FileIsEncrypted_PolicyAllows) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -524,9 +519,9 @@
 TEST_F(FilesRequestHandlerTest, FileIsLarge_LocalAnalysis) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      kLocalServiceProvider);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED,
+                                      kLocalServiceProvider);
   GURL url(kTestUrl);
   std::vector<base::FilePath> paths;
 
@@ -552,9 +547,9 @@
 TEST_F(FilesRequestHandlerTest, MultipleFilesUpload_LocalAnalysis) {
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper;
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      kLocalServiceProvider);
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED,
+                                      kLocalServiceProvider);
   GURL url(kTestUrl);
   std::vector<base::FilePath> paths = CreateFilesForTest(
       {FILE_PATH_LITERAL("good.doc"), FILE_PATH_LITERAL("good2.doc")});
@@ -577,9 +572,8 @@
 
   std::vector<base::FilePath> paths = CreateFilesForTest(
       {FILE_PATH_LITERAL("good.doc"), FILE_PATH_LITERAL("bad.doc")});
-  PathFailsDeepScan(
-      paths[1],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
+  PathFailsDeepScan(paths[1], FakeContentAnalysisDelegate::MalwareResponse(
+                                  TriggeredRule::BLOCK));
 
   auto results = ScanUpload(paths);
   ASSERT_TRUE(results.has_value());
@@ -645,7 +639,7 @@
   std::vector<base::FilePath> paths = CreateFilesForTest(
       {FILE_PATH_LITERAL("good.doc"), FILE_PATH_LITERAL("bad.doc")});
 
-  PathFailsDeepScan(paths[1], test::FakeContentAnalysisDelegate::DlpResponse(
+  PathFailsDeepScan(paths[1], FakeContentAnalysisDelegate::DlpResponse(
                                   ContentAnalysisResponse::Result::SUCCESS,
                                   "rule", TriggeredRule::BLOCK));
 
@@ -669,7 +663,7 @@
 
   PathFailsDeepScan(
       paths[1],
-      test::FakeContentAnalysisDelegate::MalwareAndDlpResponse(
+      FakeContentAnalysisDelegate::MalwareAndDlpResponse(
           TriggeredRule::BLOCK, ContentAnalysisResponse::Result::SUCCESS,
           "rule", TriggeredRule::BLOCK));
 
@@ -693,9 +687,8 @@
   // Note that this behavior is different compared to the
   // ContentAnalysisDelegateUnittest which checks that the Delegate allows
   // access to all data for block_until_verdict==0.
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), AnalysisConnector::FILE_ATTACHED,
-      R"(
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(),
+                                      AnalysisConnector::FILE_ATTACHED, R"(
     {
       "service_provider": "google",
       "enable": [
@@ -716,21 +709,18 @@
                           FILE_PATH_LITERAL("foo_fail_dlp_rule.doc")});
 
   // Mark all files and text with failed scans.
-  SetDLPResponse(test::FakeContentAnalysisDelegate::DlpResponse(
+  SetDLPResponse(FakeContentAnalysisDelegate::DlpResponse(
       ContentAnalysisResponse::Result::SUCCESS, "rule", TriggeredRule::BLOCK));
-  PathFailsDeepScan(
-      paths[0],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
-  PathFailsDeepScan(
-      paths[1],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::WARN));
-  PathFailsDeepScan(
-      paths[2],
-      test::FakeContentAnalysisDelegate::MalwareResponse(TriggeredRule::BLOCK));
-  PathFailsDeepScan(paths[3], test::FakeContentAnalysisDelegate::DlpResponse(
+  PathFailsDeepScan(paths[0], FakeContentAnalysisDelegate::MalwareResponse(
+                                  TriggeredRule::BLOCK));
+  PathFailsDeepScan(paths[1], FakeContentAnalysisDelegate::MalwareResponse(
+                                  TriggeredRule::WARN));
+  PathFailsDeepScan(paths[2], FakeContentAnalysisDelegate::MalwareResponse(
+                                  TriggeredRule::BLOCK));
+  PathFailsDeepScan(paths[3], FakeContentAnalysisDelegate::DlpResponse(
                                   ContentAnalysisResponse::Result::FAILURE, "",
                                   TriggeredRule::REPORT_ONLY));
-  PathFailsDeepScan(paths[4], test::FakeContentAnalysisDelegate::DlpResponse(
+  PathFailsDeepScan(paths[4], FakeContentAnalysisDelegate::DlpResponse(
                                   ContentAnalysisResponse::Result::SUCCESS,
                                   "dlp", TriggeredRule::BLOCK));
 
diff --git a/chrome/browser/enterprise/connectors/analysis/print_content_analysis_utils_unittest.cc b/chrome/browser/enterprise/connectors/analysis/print_content_analysis_utils_unittest.cc
index e7570d6..d6ed06e 100644
--- a/chrome/browser/enterprise/connectors/analysis/print_content_analysis_utils_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/print_content_analysis_utils_unittest.cc
@@ -10,11 +10,11 @@
 #include "build/build_config.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/printing/print_preview_test.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
@@ -178,9 +178,9 @@
         ->SetIdentityManagerForTesting(
             identity_test_environment_.identity_manager());
 
-    enterprise_connectors::test::SetAnalysisConnector(profile()->GetPrefs(),
-                                                      PRINT, GetParam());
-    test::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
+    safe_browsing::SetAnalysisConnector(profile()->GetPrefs(), PRINT,
+                                        GetParam());
+    safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
   }
 
   void TearDown() override {
@@ -215,7 +215,7 @@
       &PrintTestContentAnalysisDelegate::Create,
       ContentAnalysisResponse::Result::TriggeredRule::ACTION_UNSPECIFIED));
 
-  test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectNoReport();
 
   auto data = CreateData();
@@ -235,7 +235,7 @@
       &PrintTestContentAnalysisDelegate::Create,
       ContentAnalysisResponse::Result::TriggeredRule::REPORT_ONLY));
 
-  test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       /*url*/ "",
       /*source*/ "",
@@ -271,7 +271,7 @@
       &PrintTestContentAnalysisDelegate::Create,
       ContentAnalysisResponse::Result::TriggeredRule::WARN));
 
-  test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.SetDoneClosure(base::BindLambdaForTesting([this, &validator]() {
     testing::Mock::VerifyAndClearExpectations(client_.get());
     validator.ExpectNoReport();
@@ -314,7 +314,7 @@
       ContentAnalysisResponse::Result::TriggeredRule::WARN));
 
   bool bypassed = false;
-  test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.SetDoneClosure(base::BindLambdaForTesting([this, &validator,
                                                        &bypassed]() {
     // Only do this once to avoid infinite recursion since bypassing triggers
@@ -382,7 +382,7 @@
       &PrintTestContentAnalysisDelegate::Create,
       ContentAnalysisResponse::Result::TriggeredRule::BLOCK));
 
-  test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       /*url*/ "",
       /*source*/ "",
diff --git a/chrome/browser/enterprise/connectors/common_unittest.cc b/chrome/browser/enterprise/connectors/common_unittest.cc
index 660da6f..01f2a66 100644
--- a/chrome/browser/enterprise/connectors/common_unittest.cc
+++ b/chrome/browser/enterprise/connectors/common_unittest.cc
@@ -6,8 +6,8 @@
 
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -82,7 +82,8 @@
       "block_large_files": %s
     })",
                                  bool_setting());
-  test::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED, pref);
+  safe_browsing::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED,
+                                      pref);
   EXPECT_EQ(allowed(),
             ResultShouldAllowDataUse(
                 settings(),
@@ -98,7 +99,8 @@
       "block_password_protected": %s
     })",
                                  bool_setting());
-  test::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED, pref);
+  safe_browsing::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED,
+                                      pref);
   EXPECT_EQ(allowed(),
             ResultShouldAllowDataUse(
                 settings(),
@@ -114,7 +116,8 @@
       "block_unsupported_file_types": %s
     })",
                                  bool_setting());
-  test::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED, pref);
+  safe_browsing::SetAnalysisConnector(profile()->GetPrefs(), FILE_ATTACHED,
+                                      pref);
   EXPECT_EQ(allowed(),
             ResultShouldAllowDataUse(
                 settings(), safe_browsing::BinaryUploadService::Result::
diff --git a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
index 0135a1e..66190a24 100644
--- a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
@@ -14,11 +14,11 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/common.h"
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/profiles/reporting_util.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/enterprise/browser/enterprise_switches.h"
@@ -147,7 +147,7 @@
 enum class ManagementStatus { AFFILIATED, UNAFFILIATED, UNMANAGED };
 
 class ConnectorsServiceProfileBrowserTest
-    : public test::DeepScanningBrowserTestBase {
+    : public safe_browsing::DeepScanningBrowserTestBase {
  public:
   explicit ConnectorsServiceProfileBrowserTest(
       ManagementStatus management_status)
@@ -170,7 +170,7 @@
   }
 
   void SetUpOnMainThread() override {
-    test::DeepScanningBrowserTestBase::SetUpOnMainThread();
+    safe_browsing::DeepScanningBrowserTestBase::SetUpOnMainThread();
 
     SetUpProfileData();
 
@@ -192,7 +192,7 @@
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
     EXPECT_TRUE(browser()->profile()->IsMainProfile());
 #elif !BUILDFLAG(IS_CHROMEOS_ASH)
-    test::SetProfileDMToken(browser()->profile(), kFakeProfileDMToken);
+    safe_browsing::SetProfileDMToken(browser()->profile(), kFakeProfileDMToken);
 #endif
 
     enterprise_management::PolicyData profile_policy_data;
diff --git a/chrome/browser/enterprise/connectors/connectors_service_unittest.cc b/chrome/browser/enterprise/connectors/connectors_service_unittest.cc
index feb9f53f..1dd9aa5 100644
--- a/chrome/browser/enterprise/connectors/connectors_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/connectors_service_unittest.cc
@@ -14,9 +14,9 @@
 #include "chrome/browser/enterprise/connectors/connectors_manager.h"
 #include "chrome/browser/enterprise/connectors/reporting/browser_crash_event_router.h"
 #include "chrome/browser/enterprise/connectors/service_provider_config.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/profiles/profile_testing_helper.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/enterprise/common/proto/connectors.pb.h"
@@ -127,7 +127,8 @@
 };
 
 TEST_P(ConnectorsServiceHasExtraUiTest, AnalysisConnectors) {
-  test::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED, pref());
+  safe_browsing::SetAnalysisConnector(profile_->GetPrefs(), FILE_DOWNLOADED,
+                                      pref());
   auto* service = ConnectorsServiceFactory::GetForBrowserContext(profile_);
   bool show_extra_ui = service->HasExtraUiToDisplay(FILE_DOWNLOADED, kDlpTag);
   ASSERT_EQ(show_extra_ui, has_extra_ui());
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_browsertest.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_browsertest.cc
index df0179c..080b151 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_browsertest.cc
@@ -42,7 +42,6 @@
 #else
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/scoped_key_rotation_command_factory.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "components/enterprise/browser/device_trust/device_trust_key_manager.h"
 #endif
 
diff --git a/chrome/browser/enterprise/connectors/reporting/extension_install_event_router_unittest.cc b/chrome/browser/enterprise/connectors/reporting/extension_install_event_router_unittest.cc
index 5cf3047..2c256d8 100644
--- a/chrome/browser/enterprise/connectors/reporting/extension_install_event_router_unittest.cc
+++ b/chrome/browser/enterprise/connectors/reporting/extension_install_event_router_unittest.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
 #include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
@@ -81,7 +81,7 @@
     mockRealtimeReportingClient_ = static_cast<MockRealtimeReportingClient*>(
         RealtimeReportingClientFactory::GetForProfile(profile_));
 
-    test::SetOnSecurityEventReporting(
+    safe_browsing::SetOnSecurityEventReporting(
         profile_->GetPrefs(), /*enabled=*/true,
         /*enabled_event_names=*/std::set<std::string>(),
         /*enabled_opt_in_events=*/
diff --git a/chrome/browser/enterprise/connectors/test/BUILD.gn b/chrome/browser/enterprise/connectors/test/BUILD.gn
index ccc9239..877e22c8 100644
--- a/chrome/browser/enterprise/connectors/test/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/test/BUILD.gn
@@ -7,46 +7,30 @@
 source_set("test_support") {
   testonly = true
   public = [
-    "deep_scanning_browsertest_base.h",
-    "deep_scanning_test_utils.h",
-    "fake_content_analysis_delegate.h",
-    "fake_files_request_handler.h",
     "management_context_mixin.h",
     "test_constants.h",
   ]
 
   sources = [
-    "deep_scanning_browsertest_base.cc",
-    "deep_scanning_test_utils.cc",
-    "fake_content_analysis_delegate.cc",
-    "fake_files_request_handler.cc",
     "management_context_mixin.cc",
     "test_constants.cc",
   ]
 
   public_deps = [
-    "//base",
-    "//chrome/browser/safe_browsing",
     "//chrome/browser/ui",
     "//chrome/test:test_support_ui",
-    "//components/enterprise/common/proto:connectors_proto",
     "//components/policy/core/common:common_constants",
     "//components/policy/core/common:test_support",
     "//components/policy/proto",
-    "//components/safe_browsing/core/common",
-    "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//testing/gmock",
-    "//third_party/abseil-cpp:absl",
   ]
 
   deps = [
+    "//base",
     "//chrome/browser",
-    "//chrome/browser:browser_process",
     "//chrome/browser/profiles:profile",
-    "//chrome/test:test_support",
     "//components/policy/core/browser",
     "//components/policy/core/common",
-    "//components/prefs",
   ]
 
   if (is_win || is_linux || is_mac) {
diff --git a/chrome/browser/enterprise/connectors/test/browser/management_context_mixin_browser.cc b/chrome/browser/enterprise/connectors/test/browser/management_context_mixin_browser.cc
index 63a8e73..989e1c3 100644
--- a/chrome/browser/enterprise/connectors/test/browser/management_context_mixin_browser.cc
+++ b/chrome/browser/enterprise/connectors/test/browser/management_context_mixin_browser.cc
@@ -6,10 +6,10 @@
 
 #include "build/branding_buildflags.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/enterprise/connectors/test/test_constants.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/enterprise/browser/enterprise_switches.h"
@@ -31,7 +31,7 @@
 
 void ManagementContextMixinBrowser::ManageCloudUser() {
   ManagementContextMixin::ManageCloudUser();
-  SetProfileDMToken(browser()->profile(), kProfileDmToken);
+  safe_browsing::SetProfileDMToken(browser()->profile(), kProfileDmToken);
 
   auto* profile_policy_manager =
       browser()->profile()->GetUserCloudPolicyManager();
diff --git a/chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.cc b/chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.cc
deleted file mode 100644
index 6641ed7..0000000
--- a/chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h"
-
-#include "base/functional/bind.h"
-#include "base/functional/callback_helpers.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h"
-#include "chrome/browser/enterprise/connectors/analysis/files_request_handler.h"
-#include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
-#include "chrome/browser/policy/dm_token_utils.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "components/prefs/pref_service.h"
-#include "components/prefs/scoped_user_pref_update.h"
-#include "components/safe_browsing/core/common/features.h"
-#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
-
-namespace enterprise_connectors::test {
-
-namespace {
-
-constexpr char kDmToken[] = "dm_token";
-
-constexpr base::TimeDelta kMinimumPendingDelay = base::Milliseconds(400);
-constexpr base::TimeDelta kSuccessTimeout = base::Milliseconds(100);
-constexpr base::TimeDelta kShowDialogDelay = base::Milliseconds(0);
-
-class UnresponsiveFilesRequestHandler : public FilesRequestHandler {
- public:
-  using FilesRequestHandler::FilesRequestHandler;
-
-  static std::unique_ptr<FilesRequestHandler> Create(
-      safe_browsing::BinaryUploadService* upload_service,
-      Profile* profile,
-      const AnalysisSettings& analysis_settings,
-      GURL url,
-      const std::string& source,
-      const std::string& destination,
-      const std::string& user_action_id,
-      const std::string& tab_title,
-      safe_browsing::DeepScanAccessPoint access_point,
-      const std::vector<base::FilePath>& paths,
-      FilesRequestHandler::CompletionCallback callback) {
-    return base::WrapUnique(new UnresponsiveFilesRequestHandler(
-        upload_service, profile, analysis_settings, url, source, destination,
-        user_action_id, tab_title, access_point, paths, std::move(callback)));
-  }
-
- private:
-  void UploadFileForDeepScanning(
-      safe_browsing::BinaryUploadService::Result result,
-      const base::FilePath& path,
-      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request)
-      override {
-    // Do nothing.
-  }
-};
-
-class UnresponsiveContentAnalysisDelegate : public FakeContentAnalysisDelegate {
- public:
-  using FakeContentAnalysisDelegate::FakeContentAnalysisDelegate;
-
-  static std::unique_ptr<ContentAnalysisDelegate> Create(
-      base::RepeatingClosure delete_closure,
-      StatusCallback status_callback,
-      std::string dm_token,
-      content::WebContents* web_contents,
-      Data data,
-      CompletionCallback callback) {
-    FilesRequestHandler::SetFactoryForTesting(
-        base::BindRepeating(&UnresponsiveFilesRequestHandler::Create));
-    return std::make_unique<UnresponsiveContentAnalysisDelegate>(
-        delete_closure, status_callback, std::move(dm_token), web_contents,
-        std::move(data), std::move(callback));
-  }
-
- private:
-  void UploadTextForDeepScanning(
-      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request)
-      override {
-    // Do nothing.
-  }
-};
-
-}  // namespace
-
-DeepScanningBrowserTestBase::DeepScanningBrowserTestBase() {
-  // Change the time values of the upload UI to smaller ones to make tests
-  // showing it run faster.
-  ContentAnalysisDialog::SetMinimumPendingDialogTimeForTesting(
-      kMinimumPendingDelay);
-  ContentAnalysisDialog::SetSuccessDialogTimeoutForTesting(kSuccessTimeout);
-  ContentAnalysisDialog::SetShowDialogDelayForTesting(kShowDialogDelay);
-}
-
-DeepScanningBrowserTestBase::~DeepScanningBrowserTestBase() = default;
-
-void DeepScanningBrowserTestBase::TearDownOnMainThread() {
-  ContentAnalysisDelegate::ResetFactoryForTesting();
-  FilesRequestHandler::ResetFactoryForTesting();
-
-  ClearAnalysisConnector(browser()->profile()->GetPrefs(), FILE_ATTACHED);
-  ClearAnalysisConnector(browser()->profile()->GetPrefs(), FILE_DOWNLOADED);
-  ClearAnalysisConnector(browser()->profile()->GetPrefs(), BULK_DATA_ENTRY);
-  ClearAnalysisConnector(browser()->profile()->GetPrefs(), PRINT);
-  SetOnSecurityEventReporting(browser()->profile()->GetPrefs(), false);
-}
-
-void DeepScanningBrowserTestBase::SetUpDelegate() {
-  SetDMTokenForTesting(policy::DMToken::CreateValidToken(kDmToken));
-  ContentAnalysisDelegate::SetFactoryForTesting(base::BindRepeating(
-      &FakeContentAnalysisDelegate::Create, base::DoNothing(),
-      base::BindRepeating(&DeepScanningBrowserTestBase::StatusCallback,
-                          base::Unretained(this)),
-      kDmToken));
-}
-
-void DeepScanningBrowserTestBase::SetUpUnresponsiveDelegate() {
-  SetDMTokenForTesting(policy::DMToken::CreateValidToken(kDmToken));
-  ContentAnalysisDelegate::SetFactoryForTesting(base::BindRepeating(
-      &UnresponsiveContentAnalysisDelegate::Create, base::DoNothing(),
-      base::BindRepeating(&DeepScanningBrowserTestBase::StatusCallback,
-                          base::Unretained(this)),
-      kDmToken));
-}
-
-void DeepScanningBrowserTestBase::SetQuitClosure(
-    base::RepeatingClosure quit_closure) {
-  quit_closure_ = quit_closure;
-}
-
-void DeepScanningBrowserTestBase::CallQuitClosure() {
-  if (!quit_closure_.is_null()) {
-    quit_closure_.Run();
-  }
-}
-
-void DeepScanningBrowserTestBase::SetStatusCallbackResponse(
-    ContentAnalysisResponse response) {
-  connector_status_callback_response_ = response;
-}
-
-ContentAnalysisResponse DeepScanningBrowserTestBase::StatusCallback(
-    const std::string& contents,
-    const base::FilePath& path) {
-  return connector_status_callback_response_;
-}
-
-void DeepScanningBrowserTestBase::CreateFilesForTest(
-    const std::vector<std::string>& paths,
-    const std::vector<std::string>& contents,
-    ContentAnalysisDelegate::Data* data) {
-  ASSERT_EQ(paths.size(), contents.size());
-
-  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
-  for (size_t i = 0; i < paths.size(); ++i) {
-    base::FilePath path = temp_dir_.GetPath().AppendASCII(paths[i]);
-    created_file_paths_.emplace_back(path);
-    base::File file(path, base::File::FLAG_CREATE | base::File::FLAG_WRITE);
-    file.WriteAtCurrentPos(contents[i].data(), contents[i].size());
-    data->paths.emplace_back(path);
-  }
-}
-
-const std::vector<base::FilePath>&
-DeepScanningBrowserTestBase::created_file_paths() const {
-  return created_file_paths_;
-}
-
-}  // namespace enterprise_connectors::test
diff --git a/chrome/browser/enterprise/connectors/test/fake_files_request_handler.h b/chrome/browser/enterprise/connectors/test/fake_files_request_handler.h
deleted file mode 100644
index 57aa3b1..0000000
--- a/chrome/browser/enterprise/connectors/test/fake_files_request_handler.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_FAKE_FILES_REQUEST_HANDLER_H_
-#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_FAKE_FILES_REQUEST_HANDLER_H_
-
-#include "base/functional/callback_forward.h"
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/enterprise/connectors/analysis/files_request_handler.h"
-
-namespace enterprise_connectors::test {
-
-class FakeFilesRequestHandler : public FilesRequestHandler {
- public:
-  using FakeFileRequestCallback =
-      base::OnceCallback<void(base::FilePath path,
-                              safe_browsing::BinaryUploadService::Result result,
-                              ContentAnalysisResponse response)>;
-
-  using FakeFileUploadCallback = base::RepeatingCallback<void(
-      safe_browsing::BinaryUploadService::Result result,
-      const base::FilePath& path,
-      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request,
-      FakeFileRequestCallback callback)>;
-
-  FakeFilesRequestHandler(FakeFileUploadCallback fake_file_upload_callback,
-                          safe_browsing::BinaryUploadService* upload_service,
-                          Profile* profile,
-                          const AnalysisSettings& analysis_settings,
-                          GURL url,
-                          const std::string& source,
-                          const std::string& destination,
-                          const std::string& user_action_id,
-                          const std::string& tab_title,
-                          safe_browsing::DeepScanAccessPoint access_point,
-                          const std::vector<base::FilePath>& paths,
-                          CompletionCallback callback);
-
-  ~FakeFilesRequestHandler() override;
-
-  static std::unique_ptr<FilesRequestHandler> Create(
-      FakeFileUploadCallback fake_file_upload_callback,
-      safe_browsing::BinaryUploadService* upload_service,
-      Profile* profile,
-      const AnalysisSettings& analysis_settings,
-      GURL url,
-      const std::string& source,
-      const std::string& destination,
-      const std::string& user_action_id,
-      const std::string& tab_title,
-      safe_browsing::DeepScanAccessPoint access_point,
-      const std::vector<base::FilePath>& paths,
-      FilesRequestHandler::CompletionCallback callback);
-
-  base::WeakPtr<FakeFilesRequestHandler> GetWeakPtr();
-
- private:
-  void UploadFileForDeepScanning(
-      safe_browsing::BinaryUploadService::Result result,
-      const base::FilePath& path,
-      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request)
-      override;
-
-  FakeFileUploadCallback fake_file_upload_callback_;
-  base::WeakPtrFactory<FakeFilesRequestHandler> weak_ptr_factory_{this};
-};
-
-}  // namespace enterprise_connectors::test
-
-#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_FAKE_FILES_REQUEST_HANDLER_H_
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
index 3cbbdf4c..934f77e 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -50,7 +50,7 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h"
 #include "components/policy/core/common/cloud/cloud_policy_core.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
@@ -154,8 +154,7 @@
       account_info.hosted_domain = "example.com";
       identity_test_env()->UpdateAccountInfoForAccount(account_info);
 
-      enterprise_connectors::test::SetProfileDMToken(profile(),
-                                                     "fake_user_dmtoken");
+      safe_browsing::SetProfileDMToken(profile(), "fake_user_dmtoken");
       auto profile_policy_data =
           std::make_unique<enterprise_management::PolicyData>();
       profile_policy_data->add_user_affiliation_ids(kAffiliationId);
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
index efdf31f..f25982c 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc
@@ -9,13 +9,13 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/enterprise/util/managed_browser_utils.h"
 #include "chrome/browser/net/profile_network_context_service.h"
 #include "chrome/browser/net/profile_network_context_service_factory.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/policy_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/api/enterprise_reporting_private.h"
@@ -198,8 +198,7 @@
       profile_policy_manager->core()->client()->SetupRegistration(
           "dm_token", "client_id", {});
 #else
-      enterprise_connectors::test::SetProfileDMToken(browser()->profile(),
-                                                     "dm_token");
+      safe_browsing::SetProfileDMToken(browser()->profile(), "dm_token");
       auto* profile_policy_manager =
           browser()->profile()->GetUserCloudPolicyManager();
 #endif
@@ -410,9 +409,9 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestFileAttachedProviderName) {
   SetupDMToken();
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::FILE_ATTACHED,
-      kGoogleServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::FILE_ATTACHED,
+                                      kGoogleServiceProvider);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -437,9 +436,9 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestFileDownloadedProviderName) {
   SetupDMToken();
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kGoogleServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::FILE_DOWNLOADED,
+                                      kGoogleServiceProvider);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -464,9 +463,9 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestBulkDataEntryProviderName) {
   SetupDMToken();
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::BULK_DATA_ENTRY,
-      kGoogleServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::BULK_DATA_ENTRY,
+                                      kGoogleServiceProvider);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -491,9 +490,9 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestPrintProviderName) {
   SetupDMToken();
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::PRINT,
-      kGoogleServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::PRINT,
+                                      kGoogleServiceProvider);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -518,18 +517,18 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestAllProviderNamesSet) {
   SetupDMToken();
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::BULK_DATA_ENTRY,
-      kGoogleServiceProvider);
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::FILE_ATTACHED,
-      kOtherServiceProvider);
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kAnotherServiceProvider);
-  enterprise_connectors::test::SetAnalysisConnector(
-      browser()->profile()->GetPrefs(), enterprise_connectors::PRINT,
-      kAndAnotherServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::BULK_DATA_ENTRY,
+                                      kGoogleServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::FILE_ATTACHED,
+                                      kOtherServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::FILE_DOWNLOADED,
+                                      kAnotherServiceProvider);
+  safe_browsing::SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                                      enterprise_connectors::PRINT,
+                                      kAndAnotherServiceProvider);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -578,9 +577,8 @@
 IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateGetContextInfoBaseBrowserTest,
                        TestOnSecurityEventProviderNameSet) {
   SetupDMToken();
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      browser()->profile()->GetPrefs(),
-      /* enabled= */ true);
+  safe_browsing::SetOnSecurityEventReporting(browser()->profile()->GetPrefs(),
+                                             /* enabled= */ true);
 
   auto function =
       base::MakeRefCounted<EnterpriseReportingPrivateGetContextInfoFunction>();
@@ -595,7 +593,7 @@
       context_info_value->GetDict(), info));
 
   EXPECT_EQ(1UL, info.on_security_event_providers.size());
-  // test::SetOnSecurityEventReporting sets the provider name to google
+  // SetOnSecurityEventReporting sets the provider name to google
   EXPECT_EQ("google", info.on_security_event_providers[0]);
 }
 
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index 6ef1f8c6..947bedd1 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -25,9 +25,9 @@
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/safe_browsing/test_extension_event_observer.h"
 #include "chrome/common/chrome_switches.h"
@@ -262,9 +262,9 @@
       const std::map<std::string, std::vector<std::string>>&
           enabled_opt_in_events =
               std::map<std::string, std::vector<std::string>>()) {
-    enterprise_connectors::test::SetOnSecurityEventReporting(
-        profile_->GetPrefs(), enabled, enabled_event_names,
-        enabled_opt_in_events);
+    safe_browsing::SetOnSecurityEventReporting(profile_->GetPrefs(), enabled,
+                                               enabled_event_names,
+                                               enabled_opt_in_events);
 
     // If we are not enabling reporting, or if the client has already been
     // set for testing, just return.
@@ -816,7 +816,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectLoginEvent("https://www.example.com/", false, "",
                              profile_->GetProfileUserName(),
                              GetProfileIdentifier(), u"*****");
@@ -839,7 +839,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectNoReport();
 
   TriggerOnLoginEvent(GURL("https://www.example.com/"), u"login-username");
@@ -860,7 +860,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectLoginEvent("https://www.example.com/", false, "",
                              profile_->GetProfileUserName(),
                              GetProfileIdentifier(), u"*****@example.com");
@@ -883,7 +883,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectLoginEvent(
       "https://www.example.com/", true, "https://www.google.com",
       profile_->GetProfileUserName(), GetProfileIdentifier(), u"*****");
@@ -906,7 +906,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectPasswordBreachEvent(
       "SAFETY_CHECK",
       {
@@ -938,7 +938,7 @@
   identity_test_environment.MakePrimaryAccountAvailable(
       profile_->GetProfileUserName(), signin::ConsentLevel::kSignin);
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectNoReport();
 
   TriggerOnPasswordBreachEvent(
@@ -967,7 +967,7 @@
 
   // The event is only enabled on secondexample.com, so expect only the
   // information related to that origin to be reported.
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  safe_browsing::EventReportValidator validator(client_.get());
   validator.ExpectPasswordBreachEvent(
       "SAFETY_CHECK",
       {
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
index c3c9b55..86f0cedf 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.cc
@@ -18,6 +18,9 @@
 #include "chrome/browser/k_anonymity_service/remote_trust_token_query_answerer.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/common/chrome_features.h"
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/tribool.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
 #include "crypto/sha2.h"
@@ -192,10 +195,6 @@
                     &trust_token_answerer_,
                     storage_.get()),
       profile_(profile) {
-  // We are currently relying on callers of this service to limit which users
-  // are allowed to use this service. No children should use this service
-  // since we are not approved to process their data.
-  DCHECK(!profile->IsChild());
   join_origin_ =
       url::Origin::Create(GURL(features::kKAnonymityServiceJoinServer.Get()));
   DCHECK(!join_origin_.opaque());
@@ -206,8 +205,27 @@
 
 KAnonymityServiceClient::~KAnonymityServiceClient() = default;
 
+bool KAnonymityServiceClient::CanUseKAnonymityService(Profile* profile) {
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  if (!identity_manager) {
+    return false;
+  }
+  const AccountInfo account_info = identity_manager->FindExtendedAccountInfo(
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin));
+  auto capability =
+      account_info.capabilities.can_run_chrome_privacy_sandbox_trials();
+  return capability == signin::Tribool::kTrue;
+}
+
 void KAnonymityServiceClient::JoinSet(std::string id,
                                       base::OnceCallback<void(bool)> callback) {
+  if (!CanUseKAnonymityService(profile_)) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), false));
+    return;
+  }
+
   RecordJoinSetAction(KAnonymityServiceJoinSetAction::kJoinSet);
 
   // Fail immediately if the queue is full.
@@ -428,6 +446,12 @@
 void KAnonymityServiceClient::QuerySets(
     std::vector<std::string> set_ids,
     base::OnceCallback<void(std::vector<bool>)> callback) {
+  if (!CanUseKAnonymityService(profile_)) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), std::vector<bool>()));
+    return;
+  }
+
   RecordQuerySetAction(KAnonymityServiceQuerySetAction::kQuerySet);
   RecordQuerySetSize(set_ids.size());
 
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
index 3d11d0b..4fa9e50 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client.h
@@ -77,6 +77,12 @@
   base::TimeDelta GetJoinInterval() override;
   base::TimeDelta GetQueryInterval() override;
 
+  // Returns true if the profile is allowed to use the k-anonymity service. This
+  // currently checks if the primary profile CanRunChromePrivacySandboxTrials.
+  // This is partially to prevent exposing minors' data to the k-anonymity
+  // service.
+  static bool CanUseKAnonymityService(Profile* profile);
+
  private:
   struct PendingJoinRequest {
     PendingJoinRequest(std::string set_id,
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
index 96772d8..5619826 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_client_unittest.cc
@@ -10,11 +10,14 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/k_anonymity_service/k_anonymity_service_metrics.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "components/signin/public/identity_manager/account_capabilities_test_mutator.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
 #include "content/public/browser/k_anonymity_service_delegate.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/test/browser_task_environment.h"
@@ -51,17 +54,25 @@
   }
 
   void InitializeIdentity(bool signed_on) {
+    const std::string kTestEmail = "user@gmail.com";
     auto identity_test_env_adaptor =
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile_.get());
     auto* identity_test_env = identity_test_env_adaptor->identity_test_env();
     auto* identity_manager = identity_test_env->identity_manager();
     identity_test_env->SetAutomaticIssueOfAccessTokens(true);
+
     if (signed_on) {
       identity_test_env->MakePrimaryAccountAvailable(
-          "user@gmail.com", signin::ConsentLevel::kSignin);
+          kTestEmail, signin::ConsentLevel::kSignin);
       ASSERT_TRUE(
           identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
       EXPECT_EQ(1U, identity_manager->GetAccountsWithRefreshTokens().size());
+
+      auto account_info =
+          identity_manager->FindExtendedAccountInfoByEmailAddress(kTestEmail);
+      AccountCapabilitiesTestMutator mutator(&account_info.capabilities);
+      mutator.set_can_run_chrome_privacy_sandbox_trials(true);
+      signin::UpdateAccountInfoForAccount(identity_manager, account_info);
     }
   }
 
@@ -152,7 +163,9 @@
   data_decoder::test::InProcessDataDecoder decoder_;
 };
 
-TEST_F(KAnonymityServiceClientTest, TryJoinSetFetchTokenFails) {
+// JoinSet fails because the user is not logged in and doesn't have the
+// capability needed to use the K-AnonymityService.
+TEST_F(KAnonymityServiceClientTest, TryJoinSetFails) {
   InitializeIdentity(false);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
@@ -165,10 +178,7 @@
                     }));
   run_loop.Run();
   EXPECT_EQ(0, GetNumPendingURLRequests());
-  CheckJoinSetHistogramActions(
-      hist, {
-                {KAnonymityServiceJoinSetAction::kJoinSet, 1},
-            });
+  CheckJoinSetHistogramActions(hist, {});
 }
 
 TEST_F(KAnonymityServiceClientTest, TryJoinSetSuccess) {
@@ -316,7 +326,29 @@
              {KAnonymityServiceJoinSetAction::kJoinSetQueueFull, 1}});
 }
 
+// Query fails because the user is not logged in and doesn't have the
+// capability needed to use the K-AnonymityService.
+TEST_F(KAnonymityServiceClientTest, TryQuerySetFailed) {
+  KAnonymityServiceClient k_service(profile());
+
+  base::HistogramTester hist;
+  base::RunLoop run_loop;
+  std::vector<std::string> sets;
+  sets.push_back("1");
+  sets.push_back("2");
+  k_service.QuerySets(
+      std::move(sets),
+      base::BindLambdaForTesting([&run_loop](std::vector<bool> result) {
+        run_loop.Quit();
+        EXPECT_EQ(0u, result.size());
+      }));
+  run_loop.Run();
+  EXPECT_EQ(0, GetNumPendingURLRequests());
+  CheckQuerySetHistogramActions(hist, {});
+}
+
 TEST_F(KAnonymityServiceClientTest, TryQuerySetAllNotKAnon) {
+  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
 
   base::HistogramTester hist;
@@ -753,6 +785,7 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetBadResponse) {
+  InitializeIdentity(true);
   base::HistogramTester hist;
   std::vector<std::string> sets;
   sets.push_back("1");
@@ -833,6 +866,7 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySet) {
+  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -863,6 +897,7 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetMultipleSets) {
+  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -913,6 +948,7 @@
 }
 
 TEST_F(KAnonymityServiceClientJoinQueryTest, TryQuerySetCoalescesSplitSets) {
+  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -953,6 +989,7 @@
 
 TEST_F(KAnonymityServiceClientJoinQueryTest,
        TryQuerySetSingleFailureDropsAllRequests) {
+  InitializeIdentity(true);
   KAnonymityServiceClient k_service(profile());
   base::HistogramTester hist;
   std::vector<std::string> sets;
@@ -987,8 +1024,11 @@
        {KAnonymityServiceQuerySetAction::kFetchQuerySetOHTTPKeyFailed, 1}});
 }
 
+// This test is disabled as the current policy blocks running in OTR mode
+// entirely.
+// TODO(behamilton): Re-enable this test when we are allowed to run in OTR mode.
 TEST_F(KAnonymityServiceClientJoinQueryTest,
-       StorageDoesNotPersistWhenOffTheRecord) {
+       DISABLED_StorageDoesNotPersistWhenOffTheRecord) {
   CreateOffTheRecordProfile();
   std::vector<std::string> sets;
   sets.push_back("1");
diff --git a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
index 2098ec3..69f1b37 100644
--- a/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
+++ b/chrome/browser/k_anonymity_service/k_anonymity_service_factory.cc
@@ -16,6 +16,7 @@
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/k_anonymity_service_delegate.h"
+#include "k_anonymity_service_client.h"
 
 namespace {
 ProfileSelections BuildKAnonymityServiceProfileSelections() {
@@ -61,7 +62,7 @@
 KeyedService* KAnonymityServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
-  if (!profile || profile->IsChild()) {
+  if (!KAnonymityServiceClient::CanUseKAnonymityService(profile)) {
     return nullptr;
   }
   return new KAnonymityServiceClient(Profile::FromBrowserContext(context));
diff --git a/chrome/browser/metrics/chrome_feature_list_creator.cc b/chrome/browser/metrics/chrome_feature_list_creator.cc
index 07f7104..19c6908 100644
--- a/chrome/browser/metrics/chrome_feature_list_creator.cc
+++ b/chrome/browser/metrics/chrome_feature_list_creator.cc
@@ -88,8 +88,8 @@
       {switches::kEnablePrivacySandboxAdsApis,
        std::cref(privacy_sandbox::kOverridePrivacySandboxSettingsLocalTesting),
        base::FeatureList::OVERRIDE_ENABLE_FEATURE},
-      // Enabled FedCM when the --block-third-party-cookies switch is used.
-      {network::switches::kBlockThirdPartyCookies,
+      // Enable FedCM to test behavior for third-party cookie phaseout.
+      {network::switches::kTestThirdPartyCookiePhaseout,
        std::cref(features::kFedCmWithoutThirdPartyCookies),
        base::FeatureList::OVERRIDE_ENABLE_FEATURE},
   };
diff --git a/chrome/browser/net/cookie_policy_browsertest.cc b/chrome/browser/net/cookie_policy_browsertest.cc
index b4ef928..ebb98f37 100644
--- a/chrome/browser/net/cookie_policy_browsertest.cc
+++ b/chrome/browser/net/cookie_policy_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/net/storage_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -698,6 +699,37 @@
   ExpectStorage(GetNestedFrame(), true);
 }
 
+class ThirdPartyCookiePhaseoutPolicyStorageBrowserTest
+    : public CookiePolicyBrowserTest {
+ protected:
+  ThirdPartyCookiePhaseoutPolicyStorageBrowserTest() {
+    feature_list_.InitWithFeatures(
+        {
+            net::features::kForceThirdPartyCookieBlocking,
+            net::features::kThirdPartyStoragePartitioning,
+        },
+        {});
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(ThirdPartyCookiePhaseoutPolicyStorageBrowserTest,
+                       ForceThirdPartyCookieBlocking) {
+  NavigateToPageWithFrame(kHostA);
+  NavigateFrameTo(kHostB, "/iframe.html");
+  NavigateNestedFrameTo(kHostA, "/browsing_data/site_data.html");
+
+  // Test that we can access storage. This feature's impact on cookies is tested
+  // separately from this file.
+  storage::test::SetStorageForFrame(GetNestedFrame(),
+                                    /*include_cookies=*/false);
+  storage::test::ExpectStorageForFrame(GetNestedFrame(),
+                                       /*include_cookies=*/false,
+                                       /*expected=*/true);
+}
+
 INSTANTIATE_TEST_SUITE_P(,
                          CookiePolicyStorageBrowserTest,
                          testing::Values(ContextType::kFrame,
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
index c730b13e..689715e 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediator.java
@@ -7,6 +7,7 @@
 import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.CURRENT_SCREEN;
 import static org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.VISIBLE;
 
+import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.MigrationOption;
 import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
@@ -47,7 +48,8 @@
     }
 
     @Override
-    public void onNext() {
+    public void onNext(@MigrationOption int selectedOption) {
+        mModel.set(VISIBLE, false);
         // TODO(crbug.com/1445065): Launch the password Export flow.
     }
 
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java
index 97d409d..7fc51a02 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningMediatorTest.java
@@ -26,6 +26,7 @@
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Batch;
+import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.MigrationOption;
 import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
@@ -90,13 +91,25 @@
 
     @Test
     public void testOnAcknowledgeHidesTheSheet() {
+        mMediator.showWarning(ScreenType.INTRO_SCREEN);
+        assertTrue(mModel.get(VISIBLE));
         mMediator.onAcknowledge(mBottomSheetController);
         assertFalse(mModel.get(VISIBLE));
     }
 
     @Test
     public void testOnCancelHidesTheSheet() {
+        mMediator.showWarning(ScreenType.INTRO_SCREEN);
+        assertTrue(mModel.get(VISIBLE));
         mMediator.onCancel(mBottomSheetController);
         assertFalse(mModel.get(VISIBLE));
     }
+
+    @Test
+    public void testOnNextDismissesTheSheet() {
+        mMediator.showWarning(ScreenType.INTRO_SCREEN);
+        assertTrue(mModel.get(VISIBLE));
+        mMediator.onNext(MigrationOption.SYNC_PASSWORDS);
+        assertFalse(mModel.get(VISIBLE));
+    }
 }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java
index e726d766..e2494d8d 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOnClickHandler.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.pwd_migration;
 
+import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.MigrationOption;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 
 /**
@@ -28,8 +29,10 @@
     /**
      * Starts the sign-in/sync flow or the export flow depending on the user
      * choice in the screen with more options.
+     *
+     * @param selectedOption is the flow that the user wants to proceed with.
      */
-    void onNext();
+    void onNext(@MigrationOption int selectedOption);
 
     /**
      * Closes the sheet when the "Cancel" button is clicked, but doesn't mark
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java
index 6122bf7..cd2b9ef 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningOptionsFragment.java
@@ -11,6 +11,8 @@
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.MigrationOption;
 import org.chromium.components.browser_ui.widget.RadioButtonWithDescription;
 
 /**
@@ -21,12 +23,14 @@
  */
 public class PasswordMigrationWarningOptionsFragment extends Fragment {
     private Context mContext;
-    private Runnable mNextCallback;
+    private Callback<Integer> mNextCallback;
     private Runnable mCancelCallback;
     private String mChannelString;
+    private RadioButtonWithDescription mSignInOrSyncButton;
+    private RadioButtonWithDescription mPasswordExportButton;
 
-    public PasswordMigrationWarningOptionsFragment(
-            Context context, Runnable nextCallback, Runnable cancelCallback, String channelString) {
+    public PasswordMigrationWarningOptionsFragment(Context context, Callback<Integer> nextCallback,
+            Runnable cancelCallback, String channelString) {
         super(R.layout.pwd_migration_warning_options);
         mContext = context;
         mNextCallback = nextCallback;
@@ -36,18 +40,24 @@
 
     @Override
     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
-        RadioButtonWithDescription signInOrSyncButton =
-                view.findViewById(R.id.radio_sign_in_or_sync);
-        RadioButtonWithDescription passwordExportButton =
-                view.findViewById(R.id.radio_password_export);
+        mSignInOrSyncButton = view.findViewById(R.id.radio_sign_in_or_sync);
+        mPasswordExportButton = view.findViewById(R.id.radio_password_export);
         Button nextButton = view.findViewById(R.id.password_migration_next_button);
         Button cancelButton = view.findViewById(R.id.password_migration_cancel_button);
 
-        signInOrSyncButton.setChecked(true);
-        passwordExportButton.setDescriptionText(
+        mSignInOrSyncButton.setChecked(true);
+        mPasswordExportButton.setDescriptionText(
                 mContext.getString(R.string.password_migration_warning_password_export_subtitle)
                         .replace("%1$s", mChannelString));
-        nextButton.setOnClickListener((unusedView) -> mNextCallback.run());
+        nextButton.setOnClickListener((unusedView) -> handleOptionSelected());
         cancelButton.setOnClickListener((unusedView) -> mCancelCallback.run());
     }
+
+    private void handleOptionSelected() {
+        if (mSignInOrSyncButton.isChecked()) {
+            mNextCallback.onResult(MigrationOption.SYNC_PASSWORDS);
+        } else if (mPasswordExportButton.isChecked()) {
+            mNextCallback.onResult(MigrationOption.EXPORT_AND_DELETE);
+        }
+    }
 }
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
index 2f78a20..d95b7ee 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningProperties.java
@@ -19,6 +19,13 @@
  * Properties defined here reflect the visible state of the local passwords migration warning.
  */
 class PasswordMigrationWarningProperties {
+    @IntDef({MigrationOption.SYNC_PASSWORDS, MigrationOption.EXPORT_AND_DELETE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface MigrationOption {
+        int SYNC_PASSWORDS = 0;
+        int EXPORT_AND_DELETE = 1;
+    }
+
     /**
      * The different screens that can be shown on the sheet.
      */
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java
index 1efcb7b8..ace7019 100644
--- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java
+++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PasswordMigrationWarningViewTest.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.pwd_migration;
 
 import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.assertThat;
 import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
@@ -36,6 +37,7 @@
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.MigrationOption;
 import org.chromium.chrome.browser.pwd_migration.PasswordMigrationWarningProperties.ScreenType;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
@@ -147,13 +149,67 @@
                                         R.id.password_migration_cancel_button)
                         != null);
         onView(withId(R.id.radio_button_layout)).check(matches(isDisplayed()));
-        RadioButtonWithDescription signInOrSyncButton =
-                mActivityTestRule.getActivity().findViewById(R.id.radio_sign_in_or_sync);
-        assertTrue(signInOrSyncButton.isChecked());
+        runOnUiThreadBlocking(() -> {
+            RadioButtonWithDescription signInOrSyncButton =
+                    mActivityTestRule.getActivity().findViewById(R.id.radio_sign_in_or_sync);
+            assertTrue(signInOrSyncButton.isChecked());
+        });
         onView(withId(R.id.password_migration_next_button)).check(matches(isDisplayed()));
         onView(withId(R.id.password_migration_cancel_button)).check(matches(isDisplayed()));
     }
 
+    @Test
+    @MediumTest
+    public void testNextButtonPropagatesSyncOption() {
+        // The sheet is shown.
+        runOnUiThreadBlocking(() -> mModel.set(VISIBLE, true));
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        // Setting the options screen.
+        runOnUiThreadBlocking(() -> mModel.set(CURRENT_SCREEN, ScreenType.OPTIONS_SCREEN));
+        // The test waits for the fragment containing the button to be attached.
+        pollUiThread(()
+                             -> mActivityTestRule.getActivity().findViewById(
+                                        R.id.password_migration_cancel_button)
+                        != null);
+        onView(withId(R.id.radio_button_layout)).check(matches(isDisplayed()));
+
+        // Verify that the sync button is checked by default.
+        runOnUiThreadBlocking(() -> {
+            RadioButtonWithDescription signInOrSyncButton =
+                    mActivityTestRule.getActivity().findViewById(R.id.radio_sign_in_or_sync);
+            assertTrue(signInOrSyncButton.isChecked());
+        });
+
+        onView(withId(R.id.password_migration_next_button)).perform(click());
+        verify(mOnClickHandler).onNext(MigrationOption.SYNC_PASSWORDS);
+    }
+
+    @Test
+    @MediumTest
+    public void testNextButtonPropagatesExportOption() {
+        // The sheet is shown.
+        runOnUiThreadBlocking(() -> mModel.set(VISIBLE, true));
+        BottomSheetTestSupport.waitForOpen(mBottomSheetController);
+        // Setting the options screen.
+        runOnUiThreadBlocking(() -> mModel.set(CURRENT_SCREEN, ScreenType.OPTIONS_SCREEN));
+        // The test waits for the fragment containing the button to be attached.
+        pollUiThread(()
+                             -> mActivityTestRule.getActivity().findViewById(
+                                        R.id.password_migration_cancel_button)
+                        != null);
+        onView(withId(R.id.radio_button_layout)).check(matches(isDisplayed()));
+
+        // Select the export button.
+        runOnUiThreadBlocking(() -> {
+            RadioButtonWithDescription exportButton =
+                    mActivityTestRule.getActivity().findViewById(R.id.radio_password_export);
+            exportButton.setChecked(true);
+        });
+
+        onView(withId(R.id.password_migration_next_button)).perform(click());
+        verify(mOnClickHandler).onNext(MigrationOption.EXPORT_AND_DELETE);
+    }
+
     /**
      * Checks that no crash happens and everything works as expected if CURRENT_SCREEN will be set
      * first. It can happen in production, because the order is not guaranteed.
diff --git a/chrome/browser/printing/system_access_process_print_browsertest.cc b/chrome/browser/printing/system_access_process_print_browsertest.cc
index 73c39de..27de39b 100644
--- a/chrome/browser/printing/system_access_process_print_browsertest.cc
+++ b/chrome/browser/printing/system_access_process_print_browsertest.cc
@@ -47,10 +47,10 @@
 #endif
 
 #if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/common.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 
 #if BUILDFLAG(IS_CHROMEOS)
@@ -2162,7 +2162,7 @@
         policy::DMToken::CreateValidToken(kFakeDmToken));
     enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
         base::BindRepeating(
-            &enterprise_connectors::test::FakeContentAnalysisDelegate::Create,
+            &enterprise_connectors::FakeContentAnalysisDelegate::Create,
             base::DoNothing(),
             base::BindRepeating(
                 &ContentAnalysisPrintBrowserTest::ScanningResponse,
@@ -2179,7 +2179,7 @@
   }
 
   void SetUpOnMainThread() override {
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         browser()->profile()->GetPrefs(),
         enterprise_connectors::AnalysisConnector::PRINT,
         R"({
diff --git a/chrome/browser/resources/ash/OWNERS b/chrome/browser/resources/ash/OWNERS
new file mode 100644
index 0000000..44a1559
--- /dev/null
+++ b/chrome/browser/resources/ash/OWNERS
@@ -0,0 +1 @@
+file://ash/webui/PLATFORM_OWNERS
diff --git a/chrome/browser/resources/ash/settings/OWNERS b/chrome/browser/resources/ash/settings/OWNERS
new file mode 100644
index 0000000..dd362a93
--- /dev/null
+++ b/chrome/browser/resources/ash/settings/OWNERS
@@ -0,0 +1,4 @@
+# TODO(b/283986054) Remove reference to old OWNERS file and update this file's
+# contents once the code is moved to this directory.
+
+file://chrome/browser/resources/settings/chromeos/OWNERS
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
index 9e996a4f..55d31a9a 100644
--- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
+++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
@@ -11,7 +11,7 @@
 
 import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -79,7 +79,10 @@
       link.href = 'chrome://theme/colors.css?sets=legacy,sys';
       document.head.appendChild(link);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
 
     const dialogArgs = chrome.getVariableValue('dialogArguments');
diff --git a/chrome/browser/resources/chromeos/cloud_upload/main.ts b/chrome/browser/resources/chromeos/cloud_upload/main.ts
index 5a64f49..4a6ecdf 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/main.ts
+++ b/chrome/browser/resources/chromeos/cloud_upload/main.ts
@@ -8,7 +8,7 @@
 import './strings.m.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 
 import {DialogPage} from './cloud_upload.mojom-webui.js';
@@ -20,7 +20,7 @@
   const jellyEnabled = loadTimeData.getBoolean('isJellyEnabled');
   const theme = jellyEnabled ? 'refresh23' : 'legacy';
   document.documentElement.setAttribute('theme', theme);
-  startColorChangeUpdater();
+  ColorChangeUpdater.forDocument().start();
 });
 
 const dialogArgs =
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
index c2fc69b..58cf71d 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -15,7 +15,7 @@
 import {assert} from 'chrome://resources/ash/common/assert.js';
 import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -108,7 +108,11 @@
       link.href = 'chrome://theme/colors.css?sets=legacy,sys';
       document.head.appendChild(link);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
 
     this.$.networkConfig.init();
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
index b53d009..c6c3386b 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -30,7 +30,7 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {ApnProperties, ConfigProperties, CrosNetworkConfigInterface, GlobalPolicy, IPConfigProperties, ManagedProperties, MAX_NUM_CUSTOM_APNS, NetworkStateProperties, ProxySettings, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType, OncSource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -186,7 +186,10 @@
       link.href = 'chrome://theme/colors.css?sets=legacy,sys';
       document.head.appendChild(link);
       document.body.classList.add('jelly-enabled');
-      startColorChangeUpdater();
+      /** @suppress {checkTypes} */
+      (function() {
+        ColorChangeUpdater.forDocument().start();
+      })();
     }
     let type;
     let name;
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_display_size_selector.html b/chrome/browser/resources/chromeos/login/components/oobe_display_size_selector.html
index 7d3c2b0..1af18f2 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_display_size_selector.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_display_size_selector.html
@@ -29,6 +29,10 @@
   }
 
   #previewTitle {
+    color: var(--cros-text-color-primary);
+    font-size: 14px;
+    font-weight: 500; /* roboto-medium */
+    line-height: 20px;
     margin-bottom: 0;
     margin-top: 16px;
   }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/touchpad_scroll.html b/chrome/browser/resources/chromeos/login/screens/common/touchpad_scroll.html
index 31e22d5..b29d019f 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/touchpad_scroll.html
+++ b/chrome/browser/resources/chromeos/login/screens/common/touchpad_scroll.html
@@ -26,7 +26,10 @@
 
 #areaText {
   color: var(--cros-text-color-primary);
+  font-size: 14px;
+  font-weight: 500; /* roboto-medium */
   left: 20px;
+  line-height: 20px;
   position: sticky;
   top: 20px;
   z-index : 1;
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/set_time.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time.js
index 0500f14..7b524efa 100644
--- a/chrome/browser/resources/chromeos/set_time_dialog/set_time.js
+++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time.js
@@ -11,7 +11,7 @@
 import './set_time_dialog.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
 // TODO(b/257329722) After the Jelly experiment is launched, add the CSS link
 // element directly to the HTML.
@@ -26,6 +26,6 @@
 
 window.onload = () => {
   if (jellyEnabled) {
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 };
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
index e2bd23f5..14b4716d 100644
--- a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
+++ b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
@@ -11,7 +11,7 @@
 import {assert} from 'chrome://resources/ash/common/assert.js';
 import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {SmbBrowserProxy, SmbBrowserProxyImpl} from 'chrome://resources/ash/common/smb_shares/smb_browser_proxy.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -50,7 +50,11 @@
     const jellyEnabled = loadTimeData.getBoolean('isJellyEnabled');
     const theme = jellyEnabled ? 'refresh23' : 'legacy';
     document.documentElement.setAttribute('theme', theme);
-    startColorChangeUpdater();
+
+    /** @suppress {checkTypes} */
+    (function() {
+      ColorChangeUpdater.forDocument().start();
+    })();
   },
 
   /** @override */
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
index c9736525..4aa5d5e 100644
--- a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
+++ b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
@@ -6,7 +6,7 @@
 import './strings.m.js';
 
 import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -22,9 +22,12 @@
 
   behaviors: [I18nBehavior],
 
-  /** @override */
+  /**
+   * @suppress {checkTypes}
+   * @override
+   */
   created() {
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   },
 
   /** @private */
diff --git a/chrome/browser/resources/feedback/js/sys_info.ts b/chrome/browser/resources/feedback/js/sys_info.ts
index 486cd52..d8ed529d 100644
--- a/chrome/browser/resources/feedback/js/sys_info.ts
+++ b/chrome/browser/resources/feedback/js/sys_info.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 {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 
 import {createLogsMapTable} from './logs_map_page.js';
@@ -21,7 +21,7 @@
 function configureJellyColors() {
   if (loadTimeData.getBoolean('isJellyEnabledForOsFeedback')) {
     document.body.classList.add('jelly-enabled');
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 }
 
diff --git a/chrome/browser/resources/internals/user_education/user_education_internals.ts b/chrome/browser/resources/internals/user_education/user_education_internals.ts
index 2f0bd87..ce6e596 100644
--- a/chrome/browser/resources/internals/user_education/user_education_internals.ts
+++ b/chrome/browser/resources/internals/user_education/user_education_internals.ts
@@ -12,7 +12,7 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './user_education_internals_card.js';
 
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
 import {CrContainerShadowMixin, CrContainerShadowMixinInterface} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js';
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
@@ -79,7 +79,7 @@
 
   override ready() {
     super.ready();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
 
     this.handler_.getTutorials().then(({tutorialInfos}) => {
       this.tutorials_ = tutorialInfos;
diff --git a/chrome/browser/resources/nearby_share/app.ts b/chrome/browser/resources/nearby_share/app.ts
index 1241e166..e6c8bb5 100644
--- a/chrome/browser/resources/nearby_share/app.ts
+++ b/chrome/browser/resources/nearby_share/app.ts
@@ -12,7 +12,7 @@
 import {ConfirmationManagerInterface, PayloadPreview, ShareTarget, TransferUpdateListenerPendingReceiver} from '/shared/nearby_share.mojom-webui.js';
 import {NearbyShareSettingsMixin} from '/shared/nearby_share_settings_mixin.js';
 import {CloseReason} from '/shared/types.js';
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -134,7 +134,7 @@
       fontLink.rel = 'stylesheet';
       fontLink.href = 'chrome://theme/typography.css';
       document.head.appendChild(fontLink);
-      startColorChangeUpdater();
+      ColorChangeUpdater.forDocument().start();
     }
   }
 
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index 46ea376..51b1e7c 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
 import {ClickInfo, Command} from 'chrome://resources/js/browser_command.mojom-webui.js';
 import {BrowserCommandProxy} from 'chrome://resources/js/browser_command/browser_command_proxy.js';
@@ -405,7 +405,7 @@
         },
         Math.floor(window.innerWidth));
 
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 
   override connectedCallback() {
diff --git a/chrome/browser/resources/omnibox_popup/app.ts b/chrome/browser/resources/omnibox_popup/app.ts
index 16f8372..53d45d5c 100644
--- a/chrome/browser/resources/omnibox_popup/app.ts
+++ b/chrome/browser/resources/omnibox_popup/app.ts
@@ -5,7 +5,7 @@
 import '//resources/cr_components/omnibox/realbox_dropdown.js';
 import './strings.m.js';
 
-import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {AutocompleteResult, PageCallbackRouter} from '//resources/cr_components/omnibox/omnibox.mojom-webui.js';
 import {RealboxBrowserProxy} from '//resources/cr_components/omnibox/realbox_browser_proxy.js';
 import {RealboxDropdownElement} from '//resources/cr_components/omnibox/realbox_dropdown.js';
@@ -70,7 +70,7 @@
   constructor() {
     super();
     this.callbackRouter_ = RealboxBrowserProxy.getInstance().callbackRouter;
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 
   override connectedCallback() {
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.html b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.html
index add176a..fdb9e6b0 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.html
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.html
@@ -1,6 +1,7 @@
 <style include="settings-shared"></style>
 
-<os-settings-animated-pages id="pages" section="crostini"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <div id="crostini" class="settings-box two-line first"
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.ts b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.ts
index 1ea1b7c..2d5502732 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.ts
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.ts
@@ -34,6 +34,7 @@
 
 import {isCrostiniAllowed, isCrostiniSupported} from '../common/load_time_booleans.js';
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -55,6 +56,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kCrostini,
+        readOnly: true,
+      },
+
       focusConfig_: {
         type: Object,
         value() {
@@ -146,6 +153,7 @@
   private disableCrostiniInstall_: boolean;
   private isCrostiniAllowed_: boolean;
   private isCrostiniSupported_: boolean;
+  private section_: Section;
 
   constructor() {
     super();
diff --git a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html
index f5e58f1..083aa3e 100644
--- a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html
+++ b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html
@@ -4,7 +4,8 @@
     padding-inline-start: var(--cr-section-indent-padding);
   }
 </style>
-<os-settings-animated-pages id="pages" section="dateTime"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div id="main" route-path="default">
     <template is="dom-if"
diff --git a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.ts b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.ts
index 0c2c63d87..e7e12ae 100644
--- a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.ts
+++ b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.ts
@@ -25,6 +25,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -46,6 +47,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kDateAndTime,
+        readOnly: true,
+      },
+
       /**
        * Whether date and time are settable. Normally the date and time are
        * forced by network time, so default to false to initially hide the
@@ -114,6 +121,7 @@
   private canSetDateTime_: boolean;
   private displayManagedByParentIcon_: boolean;
   private focusConfig_: Map<string, string>;
+  private section_: Section;
   private timeZoneSettingSubLabel_: string;
 
   constructor() {
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page.html b/chrome/browser/resources/settings/chromeos/device_page/device_page.html
index f740fe2..dea03888 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/device_page.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/device_page.html
@@ -10,7 +10,8 @@
     margin-inline-end: 8px;
   }
 </style>
-<os-settings-animated-pages id="pages" section="device"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div id="main" route-path="default">
     <template is="dom-if"
diff --git a/chrome/browser/resources/settings/chromeos/device_page/device_page.ts b/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
index 07f3356c..871756869 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/device_page.ts
@@ -36,6 +36,7 @@
 
 import {KeyboardPolicies, MousePolicies} from '../mojom-webui/input_device_settings.mojom-webui.js';
 import {KeyboardSettingsObserverReceiver, MouseSettingsObserverReceiver, PointingStickSettingsObserverReceiver, TouchpadSettingsObserverReceiver} from '../mojom-webui/input_device_settings_provider.mojom-webui.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Router, routes} from '../router.js';
 
@@ -71,6 +72,12 @@
         notify: true,
       },
 
+      section_: {
+        type: Number,
+        value: Section.kDevice,
+        readOnly: true,
+      },
+
       /**
        * |hasMouse_|, |hasPointingStick_|, and |hasTouchpad_| start undefined so
        * observers don't trigger until they have been populated.
@@ -235,6 +242,7 @@
   private touchpadSettingsObserverReceiver: TouchpadSettingsObserverReceiver;
   private inputDeviceSettingsProvider: InputDeviceSettingsProviderInterface;
   private mouseSettingsObserverReceiver: MouseSettingsObserverReceiver;
+  private section_: Section;
 
   constructor() {
     super();
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
index 2d156ac..4c67106 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
@@ -26,7 +26,8 @@
     top: -22px;
   }
 </style>
-<os-settings-animated-pages id="pages" section="internet"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <network-summary default-network="{{defaultNetwork}}"
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.ts b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.ts
index 201c0ead..9a0587df 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.ts
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.ts
@@ -51,6 +51,7 @@
 import {castExists} from '../assert_extras.js';
 import {DeepLinkingMixin, DeepLinkingMixinInterface} from '../deep_linking_mixin.js';
 import {recordSettingChange} from '../metrics_recorder.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin, RouteObserverMixinInterface} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -115,6 +116,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kNetwork,
+        readOnly: true,
+      },
+
       /**
        * The device state for each network device type, keyed by NetworkType.
        * Set by network-summary.
@@ -346,6 +353,7 @@
   private pendingShowCellularSetupDialogAttemptPageName_: CellularSetupPageName|
       null;
   private pendingShowSimLockDialog_: boolean;
+  private section_: Section;
   private showCellularSetupDialog_: boolean;
   private showESimProfileRenameDialog_: boolean;
   private showESimRemoveProfileDialog_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.html b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.html
index bd17089..f1e5fd5 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.html
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.html
@@ -1,5 +1,6 @@
 <style include="settings-shared iron-flex"></style>
-<os-settings-animated-pages id="pages" section="kerberos"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <cr-link-row id="kerberosAccountsSubpageTrigger"
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.ts b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.ts
index 325b6a40..3e88a18 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.ts
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.ts
@@ -19,6 +19,7 @@
 import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Router, routes} from '../router.js';
 
 import {getTemplate} from './kerberos_page.html.js';
@@ -38,6 +39,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kKerberos,
+        readOnly: true,
+      },
+
       focusConfig_: {
         type: Object,
         value() {
@@ -54,6 +61,7 @@
   }
 
   private focusConfig_: Map<string, string>;
+  private section_: Section;
 
   private onKerberosAccountsClick_(): void {
     Router.getInstance().navigateTo(routes.KERBEROS_ACCOUNTS_V2);
diff --git a/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.html b/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.html
index 4ed6594..2429398 100644
--- a/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.html
+++ b/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.html
@@ -139,80 +139,91 @@
       <div class="flex">$i18n{secondaryUserBannerText}</div>
     </div>
     <template is="dom-if"
-       if="[[shouldStampPage_(pageAvailability.internet)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kNetwork)]]"
+        restamp>
       <os-settings-section page-title="$i18n{internetPageTitle}"
-          section="internet">
+          section="[[Section.kNetwork]]">
         <settings-internet-page prefs="{{prefs}}">
         </settings-internet-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-       if="[[shouldStampPage_(pageAvailability.bluetooth)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kBluetooth)]]"
+        restamp>
       <os-settings-section page-title="$i18n{bluetoothPageTitle}"
-          section="bluetooth">
+          section="[[Section.kBluetooth]]">
         <os-settings-bluetooth-page prefs="{{prefs}}">
         </os-settings-bluetooth-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-       if="[[shouldStampPage_(pageAvailability.multidevice)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kMultiDevice)]]"
+        restamp>
       <os-settings-section page-title="$i18n{multidevicePageTitle}"
-          section="multidevice">
+          section="[[Section.kMultiDevice]]">
         <settings-multidevice-page prefs="{{prefs}}">
         </settings-multidevice-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-       if="[[shouldStampPage_(pageAvailability.osPeople)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kPeople)]]"
+        restamp>
       <os-settings-section page-title="$i18n{osPeoplePageTitle}"
-          section="osPeople">
+          section="[[Section.kPeople]]">
         <os-settings-people-page prefs="{{prefs}}"
             page-availability="[[pageAvailability]]">
         </os-settings-people-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.kerberos)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kKerberos)]]"
+        restamp>
       <os-settings-section page-title="$i18n{kerberosPageTitle}"
-          section="kerberos">
+          section="[[Section.kKerberos]]">
         <settings-kerberos-page></settings-kerberos-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.device)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kDevice)]]"
+        restamp>
       <os-settings-section page-title="$i18n{devicePageTitle}"
-          section="device">
+          section="[[Section.kDevice]]">
         <settings-device-page prefs="{{prefs}}">
         </settings-device-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.personalization)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kPersonalization)]]"
+        restamp>
       <os-settings-section page-title="$i18n{personalizationPageTitle}"
-          section="personalization">
+          section="[[Section.kPersonalization]]">
         <settings-personalization-page prefs="{{prefs}}">
         </settings-personalization-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.osSearch)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kSearchAndAssistant)]]"
+        restamp>
       <os-settings-section page-title="$i18n{osSearchPageTitle}"
-          section="osSearch">
+          section="[[Section.kSearchAndAssistant]]">
         <os-settings-search-page prefs="{{prefs}}">
         </os-settings-search-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.osPrivacy)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kPrivacyAndSecurity)]]"
+        restamp>
       <os-settings-section page-title="$i18n{privacyPageTitle}"
-          section="osPrivacy">
+          section="[[Section.kPrivacyAndSecurity]]">
         <os-settings-privacy-page prefs="{{prefs}}">
         </os-settings-privacy-page>
       </os-settings-section>
     </template>
     <template is="dom-if"
-        if="[[shouldStampPage_(pageAvailability.apps)]]" restamp>
-      <os-settings-section page-title="$i18n{appsPageTitle}" section="apps">
+        if="[[shouldStampPage_(pageAvailability, Section.kApps)]]"
+        restamp>
+      <os-settings-section page-title="$i18n{appsPageTitle}"
+          section="[[Section.kApps]]">
         <os-settings-apps-page
             prefs="{{prefs}}"
             android-apps-info="[[androidAppsInfo]]">
@@ -220,9 +231,10 @@
       </os-settings-section>
     </template>
     <template is="dom-if"
-       if="[[shouldStampPage_(pageAvailability.osAccessibility)]]" restamp>
+        if="[[shouldStampPage_(pageAvailability, Section.kAccessibility)]]"
+        restamp>
       <os-settings-section page-title="$i18n{a11yPageTitle}"
-          section="osAccessibility">
+          section="[[Section.kAccessibility]]">
         <os-settings-a11y-page prefs="{{prefs}}">
         </os-settings-a11y-page>
       </os-settings-section>
@@ -250,49 +262,56 @@
         currentRoute_, hasExpandedSection_,
         advancedToggleExpanded)]]">
       <template is="dom-if"
-          if="[[shouldStampPage_(pageAvailability.dateTime)]]" restamp>
+          if="[[shouldStampPage_(pageAvailability, Section.kDateAndTime)]]"
+          restamp>
         <os-settings-section page-title="$i18n{dateTimePageTitle}"
-            section="dateTime">
+            section="[[Section.kDateAndTime]]">
           <settings-date-time-page prefs="{{prefs}}">
           </settings-date-time-page>
         </os-settings-section>
       </template>
       <template is="dom-if"
-          if="[[shouldStampPage_(pageAvailability.osLanguages)]]" restamp>
+          if="[[shouldStampPage_(pageAvailability,
+              Section.kLanguagesAndInput)]]"
+          restamp>
         <os-settings-section page-title="$i18n{osLanguagesPageTitle}"
-            section="osLanguages">
+            section="[[Section.kLanguagesAndInput]]">
           <os-settings-languages-section prefs="{{prefs}}">
           </os-settings-languages-section>
         </os-settings-section>
       </template>
       <template is="dom-if"
-          if="[[shouldStampPage_(pageAvailability.files)]]" restamp>
+          if="[[shouldStampPage_(pageAvailability, Section.kFiles)]]"
+          restamp>
         <os-settings-section page-title="$i18n{filesPageTitle}"
-            section="files">
+            section="[[Section.kFiles]]">
           <os-settings-files-page prefs="{{prefs}}">
           </os-settings-files-page>
         </os-settings-section>
       </template>
       <template is="dom-if"
-          if="[[shouldStampPage_(pageAvailability.osPrinting)]]" restamp>
+          if="[[shouldStampPage_(pageAvailability, Section.kPrinting)]]"
+          restamp>
         <os-settings-section page-title="$i18n{printingPageTitle}"
-            section="osPrinting">
+            section="[[Section.kPrinting]]">
           <os-settings-printing-page prefs="{{prefs}}">
           </os-settings-printing-page>
         </os-settings-section>
       </template>
-      <template is="dom-if" restamp
-          if="[[shouldStampPage_(pageAvailability.crostini)]]">
+      <template is="dom-if"
+          if="[[shouldStampPage_(pageAvailability, Section.kCrostini)]]"
+          restamp>
         <os-settings-section page-title="$i18n{crostiniPageTitle}"
-            section="crostini">
+            section="[[Section.kCrostini]]">
           <settings-crostini-page prefs="{{prefs}}">
           </settings-crostini-page>
         </os-settings-section>
       </template>
       <template is="dom-if"
-          if="[[shouldStampPage_(pageAvailability.osReset)]]" restamp>
+          if="[[shouldStampPage_(pageAvailability, Section.kReset)]]"
+          restamp>
         <os-settings-section page-title="$i18n{resetPageTitle}"
-            section="osReset">
+            section="[[Section.kReset]]">
           <os-settings-reset-page></os-settings-reset-page>
         </os-settings-section>
       </template>
diff --git a/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.ts b/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.ts
index 3a2d38a..5f9dc14 100644
--- a/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.ts
+++ b/chrome/browser/resources/settings/chromeos/main_page_container/main_page_container.ts
@@ -45,6 +45,7 @@
 import {castExists} from '../assert_extras.js';
 import {isRevampWayfindingEnabled} from '../common/load_time_booleans.js';
 import {MainPageMixin} from '../main_page_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {AboutPageBrowserProxyImpl} from '../os_about_page/about_page_browser_proxy.js';
 import {AndroidAppsBrowserProxyImpl, AndroidAppsInfo} from '../os_apps_page/android_apps_browser_proxy.js';
 import {OsPageAvailability} from '../os_page_availability.js';
@@ -72,6 +73,12 @@
         notify: true,
       },
 
+      /** Mirror Section enum to be used in Polymer data bindings. */
+      Section: {
+        type: Object,
+        value: Section,
+      },
+
       androidAppsInfo: Object,
 
       /**
@@ -213,8 +220,9 @@
   }
 
   /** Stamp page in the DOM depending on page availability */
-  private shouldStampPage_(available?: boolean): boolean {
-    return !!available;
+  private shouldStampPage_(
+      pageAvailability: OsPageAvailability, pageName: Section): boolean {
+    return !!pageAvailability[pageName];
   }
 
   private computeShowSecondaryUserBanner_(): boolean {
diff --git a/chrome/browser/resources/settings/chromeos/main_page_mixin.ts b/chrome/browser/resources/settings/chromeos/main_page_mixin.ts
index 2f34bc5..d14ea5b 100644
--- a/chrome/browser/resources/settings/chromeos/main_page_mixin.ts
+++ b/chrome/browser/resources/settings/chromeos/main_page_mixin.ts
@@ -9,6 +9,7 @@
 import {isRevampWayfindingEnabled} from './common/load_time_booleans.js';
 import {Constructor} from './common/types.js';
 import {ensureLazyLoaded} from './ensure_lazy_loaded.js';
+import {Section} from './mojom-webui/routes.mojom-webui.js';
 import {SettingsIdleLoadElement} from './os_settings_page/settings_idle_load.js';
 import {RouteObserverMixin, RouteObserverMixinInterface} from './route_observer_mixin.js';
 import {isAdvancedRoute, Route, Router, routes} from './router.js';
@@ -155,7 +156,7 @@
         private async enterSubpage_(route: Route) {
           if (isRevampWayfindingEnabled()) {
             // Make the parent page visible to ensure the subpage is visible
-            this.showPage(route);
+            await this.showPage(route);
           }
           this.lastScrollTop_ = this.scroller_.scrollTop;
           this.scroller_.scrollTop = 0;
@@ -425,7 +426,10 @@
         /**
          * Helper function to get a section from the local DOM.
          */
-        private querySection(section: string): HTMLElement|null {
+        querySection(section: Section|null): HTMLElement|null {
+          if (section === null) {
+            return null;
+          }
           return this.shadowRoot!.querySelector(
               `os-settings-section[section="${section}"]`);
         }
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
index ba4052c..852eb8c7 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
@@ -3,7 +3,8 @@
     padding: 0 var(--cr-controlled-by-spacing);
   }
 </style>
-<os-settings-animated-pages id="pages" section="multidevice"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <div id="multidevice-item"
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts
index 12a8114..6ae5b926 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.ts
@@ -26,6 +26,7 @@
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {recordSettingChange} from '../metrics_recorder.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -53,6 +54,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kMultiDevice,
+        readOnly: true,
+      },
+
       /**
        * A Map specifying which element should be focused when exiting a
        * subpage. The key of the map holds a Route path, and the value holds a
@@ -176,6 +183,7 @@
   private isPasswordDialogShowing_: boolean;
   private isPhoneScreenLockEnabled_: boolean;
   private isPinNumberDialogShowing_: boolean;
+  private section_: Section;
   private shouldEnableNearbyShareBackgroundScanningRevamp_: boolean;
   private showPasswordPromptDialog_: boolean;
   private showPhonePermissionSetupDialog_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
index 7da3349..d44d74f 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
@@ -1,6 +1,8 @@
 <style include="settings-shared"></style>
-<os-settings-animated-pages id="pages" current-route="{{currentRoute}}"
-    section="osAccessibility" focus-config="[[focusConfig_]]">
+<os-settings-animated-pages id="pages"
+    current-route="{{currentRoute}}"
+    section="[[section_]]"
+    focus-config="[[focusConfig_]]">
   <div route-path="default">
     <settings-toggle-button
         id="a11yImageLabels"
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts
index 439feff8..bf4c7ae 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.ts
@@ -20,6 +20,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteOriginMixin} from '../route_origin_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -55,6 +56,12 @@
         notify: true,
       },
 
+      section_: {
+        type: Number,
+        value: Section.kAccessibility,
+        readOnly: true,
+      },
+
       /**
        * Whether a screen reader is enabled.
        */
@@ -134,6 +141,7 @@
   private isGuest_: boolean;
   private isKioskModeActive_: boolean;
   private route_: Route;
+  private section_: Section;
   private showAccessibilityLabelsSetting_: boolean;
   private isAccessibilityChromeVoxPageMigrationEnabled_: boolean;
   private isAccessibilitySelectToSpeakPageMigrationEnabled_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
index 525d528..4226de84 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.html
@@ -79,8 +79,10 @@
 <iron-media-query query="(prefers-color-scheme: dark)"
     query-matches="{{isDarkModeActive_}}">
 </iron-media-query>
-<os-settings-section page-title="$i18n{aboutOsPageTitle}" section="about">
-  <os-settings-animated-pages id="pages" section="about"
+<os-settings-section page-title="$i18n{aboutOsPageTitle}"
+    section="[[section_]]">
+  <os-settings-animated-pages id="pages"
+      section="[[section_]]"
       focus-config="[[focusConfig_]]">
     <div route-path="default">
       <div class="settings-box two-line first">
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts
index 7953a26..c8b1e25 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts
@@ -38,6 +38,7 @@
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {MainPageMixin} from '../main_page_mixin.js';
 import {recordSettingChange} from '../metrics_recorder.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {isAboutRoute, Route, Router, routes} from '../router.js';
 
@@ -71,6 +72,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kAboutChromeOs,
+        readOnly: true,
+      },
+
       /**
        * Whether the about page is being rendered in dark mode.
        */
@@ -265,12 +272,13 @@
   private eolMessageWithMonthAndYear_: string;
   private hasInternetConnection_: boolean;
   private firmwareUpdateCount_: number;
+  private focusConfig_: Map<string, string>;
   private showCrostiniLicense_: boolean;
   private showUpdateStatus_: boolean;
   private showButtonContainer_: boolean;
   private showRelaunch_: boolean;
   private showCheckUpdates_: boolean;
-  private focusConfig_: Map<string, string>;
+  private section_: Section;
   private showUpdateWarningDialog_: boolean;
   private showTPMFirmwareUpdateLineItem_: boolean;
   private showTPMFirmwareUpdateDialog_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html
index 39c6e85..8098540 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.html
@@ -5,7 +5,8 @@
   }
 </style>
 
-<os-settings-animated-pages id="pages" section="apps"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <cr-link-row id="appManagement"
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts
index ebf9186..17fbef8 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.ts
@@ -38,6 +38,7 @@
 import {androidAppsVisible, isArcVmEnabled, isPlayStoreAvailable, isPluginVmAvailable} from '../common/load_time_booleans.js';
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {App as AppWithNotifications, AppNotificationsHandlerInterface, AppNotificationsObserverReceiver, Readiness} from '../mojom-webui/app_notification_handler.mojom-webui.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -77,6 +78,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kApps,
+        readOnly: true,
+      },
+
       /**
        * This object holds the playStoreEnabled and settingsAppAvailable
        * boolean.
@@ -203,6 +210,7 @@
   private isPluginVmAvailable_: boolean;
   private mojoInterfaceProvider_: AppNotificationsHandlerInterface;
   private onStartupOptions_: DropdownMenuOptionList;
+  private section_: Section;
   private showAndroidApps_: boolean;
   private showAppNotificationsRow_: boolean;
   private showStartup_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
index 0ded1e8..12a17d0 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.html
@@ -1,6 +1,7 @@
 <style include="settings-shared iron-flex">
 </style>
-<os-settings-animated-pages id="pages" section="bluetooth">
+<os-settings-animated-pages id="pages"
+    section="[[section_]]">
   <div route-path="default">
     <os-settings-bluetooth-summary
         on-start-pairing="onStartPairing_"
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.ts b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.ts
index d4f1e51..dae317b 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.ts
@@ -23,6 +23,8 @@
 import {BluetoothSystemProperties, BluetoothSystemState, SystemPropertiesObserverReceiver} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
+
 import {OsBluetoothDevicesSubpageBrowserProxy, OsBluetoothDevicesSubpageBrowserProxyImpl} from './os_bluetooth_devices_subpage_browser_proxy.js';
 import {getTemplate} from './os_bluetooth_page.html.js';
 
@@ -39,6 +41,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kBluetooth,
+        readOnly: true,
+      },
+
       systemProperties_: Object,
 
       shouldShowPairingDialog_: {
@@ -55,6 +63,7 @@
   }
 
   private browserProxy_: OsBluetoothDevicesSubpageBrowserProxy;
+  private section_: Section;
   private showSavedDevicesLoadingIndicators_: boolean;
   private shouldShowPairingDialog_: boolean;
   private systemProperties_: BluetoothSystemProperties;
diff --git a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.html b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.html
index c051b29..dbb576d 100644
--- a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.html
@@ -1,5 +1,6 @@
 <style include="settings-shared"></style>
-<os-settings-animated-pages id="pages" section="files"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <template is="dom-if" if="[[!isBulkPinningEnabled_]]">
diff --git a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.ts b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.ts
index 2cbbf89..6a0f9e7 100644
--- a/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_files_page/os_files_page.ts
@@ -21,6 +21,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -54,6 +55,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kFiles,
+        readOnly: true,
+      },
+
       /**
        * Used by DeepLinkingMixin to focus this page's deep links.
        */
@@ -117,6 +124,7 @@
   private isOneDriveConnected_: boolean;
   private oneDriveEmailAddress_: string|null;
   private oneDriveProxy_: OneDriveBrowserProxy;
+  private section_: Section;
 
   override currentRouteChanged(route: Route, _oldRoute?: Route) {
     // Does not apply to this page.
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html
index 1905446..5a4bac8 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html
@@ -6,7 +6,8 @@
 </settings-languages>
 
 <!-- Top-level settings section. -->
-<os-settings-animated-pages id="pages" section="osLanguages"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <cr-link-row
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.ts b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.ts
index ccac2b5d..f499af0 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.ts
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.ts
@@ -26,6 +26,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FocusConfig} from '../focus_config.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Router, routes} from '../router.js';
 
 import {LanguageHelper, LanguagesModel} from './languages_types.js';
@@ -51,6 +52,12 @@
     return {
       prefs: Object,
 
+      section_: {
+        type: Number,
+        value: Section.kLanguagesAndInput,
+        readOnly: true,
+      },
+
       languages: {
         type: Object,
         notify: true,
@@ -102,6 +109,7 @@
   // Only defined after a render.
   private languageHelper: LanguageHelper;
   private focusConfig_: FocusConfig;
+  private section_: Section;
 
   // loadTimeData flags and strings.
   private inputPageTitle_: string;
diff --git a/chrome/browser/resources/settings/chromeos/os_page_availability.ts b/chrome/browser/resources/settings/chromeos/os_page_availability.ts
index 335859b..e53223b 100644
--- a/chrome/browser/resources/settings/chromeos/os_page_availability.ts
+++ b/chrome/browser/resources/settings/chromeos/os_page_availability.ts
@@ -16,13 +16,16 @@
  */
 
 import {isGuest, isKerberosEnabled, isPowerwashAllowed} from './common/load_time_booleans.js';
-import {OsPageAvailability} from './mojom-webui/routes.mojom-webui.js';
-
-export {OsPageAvailability};
+import {Section} from './mojom-webui/routes.mojom-webui.js';
 
 /**
- * Used to create the pageAvailability object.
- *
+ * Defines which top-level pages/sections are available to the user. Page keys
+ * should must derive from the Section enum in routes.mojom.
+ */
+export type OsPageAvailability = Record<Section, boolean>;
+
+/**
+ * Used to create the pageAvailability object depending on load time data.
  * Can be used to create the pageAvailability object with expected values after
  * overriding load time data within tests.
  */
@@ -30,22 +33,23 @@
   const isGuestMode = isGuest();
 
   return {
-    apps: true,
-    bluetooth: true,
-    crostini: true,
-    dateTime: true,
-    device: true,
-    files: !isGuestMode,
-    internet: true,
-    kerberos: isKerberosEnabled(),
-    multidevice: !isGuestMode,
-    osAccessibility: true,
-    osLanguages: true,
-    osPeople: !isGuestMode,
-    osPrinting: true,
-    osPrivacy: true,
-    osReset: isPowerwashAllowed(),
-    osSearch: true,
-    personalization: !isGuestMode,
+    [Section.kAboutChromeOs]: true,
+    [Section.kAccessibility]: true,
+    [Section.kApps]: true,
+    [Section.kBluetooth]: true,
+    [Section.kCrostini]: true,
+    [Section.kDateAndTime]: true,
+    [Section.kDevice]: true,
+    [Section.kFiles]: !isGuestMode,
+    [Section.kKerberos]: isKerberosEnabled(),
+    [Section.kLanguagesAndInput]: true,
+    [Section.kMultiDevice]: !isGuestMode,
+    [Section.kNetwork]: true,
+    [Section.kPeople]: !isGuestMode,
+    [Section.kPersonalization]: !isGuestMode,
+    [Section.kPrinting]: true,
+    [Section.kPrivacyAndSecurity]: true,
+    [Section.kReset]: isPowerwashAllowed(),
+    [Section.kSearchAndAssistant]: true,
   };
 }
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
index 2b6d2ea..c3059cb 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
@@ -40,7 +40,8 @@
     width: 40px;
   }
 </style>
-<os-settings-animated-pages id="pages" section="osPeople"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <div class="settings-box first two-line">
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.ts b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.ts
index 88b34073..1b01264 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.ts
@@ -29,6 +29,7 @@
 import {isAccountManagerEnabled} from '../common/load_time_booleans.js';
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {LockStateMixin} from '../lock_state_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {OsPageAvailability} from '../os_page_availability.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
@@ -57,6 +58,12 @@
         notify: true,
       },
 
+      section_: {
+        type: Number,
+        value: Section.kPeople,
+        readOnly: true,
+      },
+
       /**
        * The current sync status, supplied by SyncBrowserProxy.
        */
@@ -183,6 +190,7 @@
   private isAccountManagerEnabled_: boolean;
   private showParentalControls_: boolean;
   private focusConfig_: Map<string, string>;
+  private section_: Section;
   private showPasswordPromptDialog_: boolean;
   private showSyncSettingsRevamp_: boolean;
   private setModes_: Object|undefined;
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html
index c51a7a1..7d7bc41 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html
@@ -1,5 +1,6 @@
 <style include="settings-shared"></style>
-<os-settings-animated-pages id="pages" section="osPrinting"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <cr-link-row id="cupsPrinters" label="$i18n{cupsPrintersTitle}"
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.ts b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.ts
index 296e023..707d925e 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.ts
@@ -12,6 +12,7 @@
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {recordSettingChange} from '../metrics_recorder.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -42,6 +43,12 @@
         notify: true,
       },
 
+      section_: {
+        type: Number,
+        value: Section.kPrinting,
+        readOnly: true,
+      },
+
       /**
        * Printer search string.
        * */
@@ -76,6 +83,7 @@
 
   private browserProxy_: CupsPrintersBrowserProxy;
   private focusConfig_: Map<string, string>;
+  private section_: Section;
 
   constructor() {
     super();
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.html b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.html
index 710a038..b11dec5 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.html
@@ -11,7 +11,8 @@
   }
 
 </style>
-<os-settings-animated-pages id="pages" section="osPrivacy"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
 
   <div route-path="default">
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.ts b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.ts
index f453425..2f5d574 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.ts
@@ -27,6 +27,7 @@
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
 import {LockStateMixin} from '../lock_state_mixin.js';
 import {recordSettingChange} from '../metrics_recorder.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -57,6 +58,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kPrivacyAndSecurity,
+        readOnly: true,
+      },
+
       focusConfig_: {
         type: Object,
         value() {
@@ -230,6 +237,7 @@
   private isSmartPrivacyEnabled_: boolean;
   private isThunderboltSupported_: boolean;
   private isUserConfigurable_: boolean;
+  private section_: Section;
   private setModes_: Object|undefined;
   private showDisableProtectionDialog_: boolean;
   private showPasswordPromptDialog_: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html
index f3e8eeeb..55d55c7 100644
--- a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.html
@@ -9,7 +9,8 @@
     padding-inline-end: 8px;
   }
 </style>
-<os-settings-animated-pages id="pages" section="osSearch"
+<os-settings-animated-pages id="pages"
+    section="[[section_]]"
     focus-config="[[focusConfig_]]">
   <div route-path="default">
     <template is="dom-if" if="[[!shouldShowQuickAnswersSettings_]]">
diff --git a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.ts b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.ts
index 09d9810..e6e0c33 100644
--- a/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.ts
+++ b/chrome/browser/resources/settings/chromeos/os_search_page/os_search_page.ts
@@ -25,6 +25,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DeepLinkingMixin} from '../deep_linking_mixin.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {Setting} from '../mojom-webui/setting.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router, routes} from '../router.js';
@@ -46,6 +47,12 @@
 
   static get properties() {
     return {
+      section_: {
+        type: Number,
+        value: Section.kSearchAndAssistant,
+        readOnly: true,
+      },
+
       focusConfig_: Object,
 
       shouldShowQuickAnswersSettings_: {
@@ -75,6 +82,7 @@
 
   private isAssistantAllowed_: boolean;
   private focusConfig_: Map<string, string>;
+  private section_: Section;
   private shouldShowQuickAnswersSettings_: boolean;
 
   override ready() {
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.ts b/chrome/browser/resources/settings/chromeos/os_settings.ts
index 18eb282..cd3081b 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings.ts
@@ -69,7 +69,7 @@
 import './os_bluetooth_page/os_saved_devices_list_item.js';
 import './os_bluetooth_page/settings_fast_pair_constants.js';
 
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 
 /**
@@ -175,7 +175,7 @@
 export {OsSettingsMainElement} from './os_settings_main/os_settings_main.js';
 export {OsSettingsMenuElement} from './os_settings_menu/os_settings_menu.js';
 export {OsSettingsSectionElement} from './os_settings_page/os_settings_section.js';
-export {createRoutes as createRoutesForTesting, OsSettingsRoutes} from './os_settings_routes.js';
+export {createRoutes as createRoutesForTesting, createSection as createSectionForTesting, createSubpage as createSubpageForTesting, OsSettingsRoutes} from './os_settings_routes.js';
 export {OsSettingsSearchBoxElement} from './os_settings_search_box/os_settings_search_box.js';
 export {OsSettingsSearchBoxBrowserProxyImpl} from './os_settings_search_box/os_settings_search_box_browser_proxy.js';
 export {OsSettingsHatsBrowserProxy, OsSettingsHatsBrowserProxyImpl} from './os_settings_ui/os_settings_hats_browser_proxy.js';
@@ -207,6 +207,6 @@
 
 window.addEventListener('load', () => {
   if (jellyEnabled) {
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
index 631678a..72072571 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.html
@@ -159,7 +159,7 @@
     selected="[[selectedUrl_]]">
   <template is="dom-repeat" items="[[basicMenuItems_]]" id="topMenuRepeat">
     <a href="[[item.path]]" class="item"
-        data-page-name$="[[item.pageName]]">
+        data-section$="[[item.pageName]]">
       <iron-icon icon="[[item.icon]]"></iron-icon>
       [[item.label]]
     </a>
@@ -180,7 +180,7 @@
         selected="[[selectedUrl_]]">
       <template is="dom-repeat" items="[[advancedMenuItems_]]">
         <a href="[[item.path]]" class="item"
-            data-page-name$="[[item.pageName]]">
+            data-section$="[[item.pageName]]">
           <iron-icon icon="[[item.icon]]"></iron-icon>
           [[item.label]]
         </a>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.ts b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.ts
index 2349ab2..260d673 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings_menu/os_settings_menu.ts
@@ -27,7 +27,7 @@
 import {getTemplate} from './os_settings_menu.html.js';
 
 interface MenuItemData {
-  pageName: keyof OsPageAvailability;
+  pageName: routesMojom.Section;
   path: string;
   icon: string;
   label: string;
@@ -137,69 +137,70 @@
   }
 
   private computeBasicMenuItems_(): MenuItemData[] {
+    const {Section} = routesMojom;
     const basicMenuItems: MenuItemData[] = [
       {
-        pageName: 'internet',
+        pageName: Section.kNetwork,
         path: routesMojom.NETWORK_SECTION_PATH,
         icon: 'os-settings:network-wifi',
         label: this.i18n('internetPageTitle'),
       },
       {
-        pageName: 'bluetooth',
+        pageName: Section.kBluetooth,
         path: routesMojom.BLUETOOTH_SECTION_PATH,
         icon: 'cr:bluetooth',
         label: this.i18n('bluetoothPageTitle'),
       },
       {
-        pageName: 'multidevice',
+        pageName: Section.kMultiDevice,
         path: routesMojom.MULTI_DEVICE_SECTION_PATH,
         icon: 'os-settings:multidevice-better-together-suite',
         label: this.i18n('multidevicePageTitle'),
       },
       {
-        pageName: 'osPeople',
+        pageName: Section.kPeople,
         path: routesMojom.PEOPLE_SECTION_PATH,
         icon: 'cr:person',
         label: this.i18n('osPeoplePageTitle'),
       },
       {
-        pageName: 'kerberos',
+        pageName: Section.kKerberos,
         path: routesMojom.KERBEROS_SECTION_PATH,
         icon: 'os-settings:auth-key',
         label: this.i18n('kerberosPageTitle'),
       },
       {
-        pageName: 'device',
+        pageName: Section.kDevice,
         path: routesMojom.DEVICE_SECTION_PATH,
         icon: 'os-settings:laptop-chromebook',
         label: this.i18n('devicePageTitle'),
       },
       {
-        pageName: 'personalization',
+        pageName: Section.kPersonalization,
         path: routesMojom.PERSONALIZATION_SECTION_PATH,
         icon: 'os-settings:paint-brush',
         label: this.i18n('personalizationPageTitle'),
       },
       {
-        pageName: 'osSearch',
+        pageName: Section.kSearchAndAssistant,
         path: routesMojom.SEARCH_AND_ASSISTANT_SECTION_PATH,
         icon: 'cr:search',
         label: this.i18n('osSearchPageTitle'),
       },
       {
-        pageName: 'osPrivacy',
+        pageName: Section.kPrivacyAndSecurity,
         path: routesMojom.PRIVACY_AND_SECURITY_SECTION_PATH,
         icon: 'cr:security',
         label: this.i18n('privacyPageTitle'),
       },
       {
-        pageName: 'apps',
+        pageName: Section.kApps,
         path: routesMojom.APPS_SECTION_PATH,
         icon: 'os-settings:apps',
         label: this.i18n('appsPageTitle'),
       },
       {
-        pageName: 'osAccessibility',
+        pageName: Section.kAccessibility,
         path: routesMojom.ACCESSIBILITY_SECTION_PATH,
         icon: 'os-settings:accessibility',
         label: this.i18n('a11yPageTitle'),
@@ -211,39 +212,40 @@
   }
 
   private computeAdvancedMenuItems_(): MenuItemData[] {
+    const {Section} = routesMojom;
     const advancedMenuItems: MenuItemData[] = [
       {
-        pageName: 'dateTime',
+        pageName: Section.kDateAndTime,
         path: routesMojom.DATE_AND_TIME_SECTION_PATH,
         icon: 'os-settings:access-time',
         label: this.i18n('dateTimePageTitle'),
       },
       {
-        pageName: 'osLanguages',
+        pageName: Section.kLanguagesAndInput,
         path: routesMojom.LANGUAGES_AND_INPUT_SECTION_PATH,
         icon: 'os-settings:language',
         label: this.i18n('osLanguagesPageTitle'),
       },
       {
-        pageName: 'files',
+        pageName: Section.kFiles,
         path: routesMojom.FILES_SECTION_PATH,
         icon: 'os-settings:folder-outline',
         label: this.i18n('filesPageTitle'),
       },
       {
-        pageName: 'osPrinting',
+        pageName: Section.kPrinting,
         path: routesMojom.PRINTING_SECTION_PATH,
         icon: 'os-settings:print',
         label: this.i18n('printingPageTitle'),
       },
       {
-        pageName: 'crostini',
+        pageName: Section.kCrostini,
         path: routesMojom.CROSTINI_SECTION_PATH,
         icon: 'os-settings:developer-tags',
         label: this.i18n('crostiniPageTitle'),
       },
       {
-        pageName: 'osReset',
+        pageName: Section.kReset,
         path: routesMojom.RESET_SECTION_PATH,
         icon: 'os-settings:restore',
         label: this.i18n('resetPageTitle'),
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_animated_pages.ts b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_animated_pages.ts
index ab61b11..9dfc98d 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_animated_pages.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_animated_pages.ts
@@ -9,7 +9,7 @@
  *
  * Example:
  *
- *    <os-settings-animated-pages section="privacy">
+ *    <os-settings-animated-pages section="[[Section.kNetwork]]">
  *      <!-- Insert your section controls here -->
  *    </os-settings-animated-pages>
  */
@@ -23,6 +23,7 @@
 
 import {getSettingIdParameter} from '../common/setting_id_param_util.js';
 import {FocusConfig} from '../focus_config.js';
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 import {RouteObserverMixin} from '../route_observer_mixin.js';
 import {Route, Router} from '../router.js';
 
@@ -51,12 +52,16 @@
     return {
       /**
        * Routes with this section activate this element. For instance, if this
-       * property is 'search', and currentRoute.section is also set to 'search',
-       * this element will display the subpage in currentRoute.subpage.
+       * property is Section.kNetwork and currentRoute.section is also set to
+       * Section.kNetwork, this element will display the corresponding page or
+       * subpage.
        *
-       * The section name must match the name specified in route.js.
+       * Must match one of the Section enum entries from routes.mojom.
        */
-      section: String,
+      section: {
+        type: Number,
+        reflectToAttribute: true,
+      },
 
       /**
        * A Map specifying which element should be focused when exiting a
@@ -68,7 +73,7 @@
     };
   }
 
-  section: string;
+  section: Section;
   focusConfig: FocusConfig|null = null;
   private previousRoute_: Route|null;
   private lightDomReady_: boolean = false;
@@ -89,6 +94,12 @@
     this.previousRoute_ = null;
   }
 
+  override ready() {
+    super.ready();
+
+    assert(this.section in Section, `Invalid section: ${this.section}.`);
+  }
+
   private onIronSelect_(e: Event) {
     // Ignore bubbling 'iron-select' events not originating from
     // |animatedPages| itself.
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_section.ts b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_section.ts
index d3fe4c8..9bb4895 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_section.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_section.ts
@@ -4,21 +4,26 @@
 
 /**
  * @fileoverview
- * 'settings-section' shows a paper material themed section with a header
+ * 'os-settings-section' shows a paper material themed section with a header
  * which shows its page title.
  *
  * The section can expand vertically to fill its container's padding edge.
  *
  * Example:
  *
- *    <settings-section page-title="[[pageTitle]]" section="privacy">
+ *    <os-settings-section
+ *        page-title="[[pageTitle]]"
+ *        section="[[Section.kNetwork]]">
  *      <!-- Insert your section controls here -->
- *    </settings-section>
+ *    </os-settings-section>
  */
 
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
 
 import {getTemplate} from './os_settings_section.html.js';
 
@@ -34,11 +39,14 @@
   static get properties() {
     return {
       /**
-       * The section name should match a name specified in route.js. The
-       * MainPageBeMixin will expand this section if this section name matches
-       * currentRoute.section.
+       * If defined, the value must match one of the Section enum entries from
+       * routes.mojom. MainPageBeMixin will expand this section if this section
+       * name matches currentRoute.section.
        */
-      section: String,
+      section: {
+        type: Number,
+        reflectToAttribute: true,
+      },
 
       /**
        * Title for the section header. Initialize so we can use the
@@ -51,9 +59,17 @@
     };
   }
 
-  section: string;
+  section: Section;
   pageTitle: string;
 
+  override ready() {
+    super.ready();
+
+    if (this.section !== undefined) {
+      assert(this.section in Section, `Invalid section: ${this.section}.`);
+    }
+  }
+
   /**
    * Get the value to which to set the aria-hidden attribute of the section
    * heading.
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_routes.ts b/chrome/browser/resources/settings/chromeos/os_settings_routes.ts
index b047cf4..c59b726b 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_routes.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings_routes.ts
@@ -16,42 +16,51 @@
 import {androidAppsVisible, isArcVmEnabled, isCrostiniSupported, isGuest, isKerberosEnabled, isPluginVmAvailable, isPowerwashAllowed} from './common/load_time_booleans.js';
 import * as routesMojom from './mojom-webui/routes.mojom-webui.js';
 
-/** Class for navigable routes. */
+/**
+ * Class for navigable routes. Routes are representing by a tree data structure.
+ */
 export class Route {
   depth: number;
+
+  /**
+   * Whether this route corresponds to a navigable dialog. Navigable dialog
+   * routes must belong to a |section|.
+   */
   isNavigableDialog: boolean;
-  section: string;
+
+  /**
+   * The top-level page/section that this route belongs to. Values are derived
+   * from the Section enum in routes.mojom.
+   */
+  section: routesMojom.Section|null;
+
+  /**
+   * The document title that should be displayed for this route.
+   */
   title: string|undefined;
   parent: Route|null;
   path: string;
 
   constructor(path: string, title?: string) {
+    assert(path.startsWith('/'));
+
     this.path = path;
     this.title = title;
     this.parent = null;
     this.depth = 0;
-
-    /**
-     * Whether this route corresponds to a navigable dialog. Those routes must
-     * belong to a "section".
-     */
     this.isNavigableDialog = false;
-
-    // Below are all legacy properties to provide compatibility with the old
-    // routing system.
-    this.section = '';
+    this.section = null;
   }
 
   /**
-   * Returns a new Route instance that's a child of this route.
+   * @returns A new Route instance that is a child of this route. If |path| does
+   * not have a leading slash, then it extends this route's path. Else, the
+   * given path is set.
    */
   createChild(path: string, title?: string): Route {
     assert(path);
 
-    // |path| extends this route's path if it doesn't have a leading slash.
-    // If it does have a leading slash, it's just set as the child route's path
-    const childPath = path[0] === '/' ? path : `${this.path}/${path}`;
-
+    const childPath = path.startsWith('/') ? path : `${this.path}/${path}`;
     const route = new Route(childPath, title);
     route.parent = this;
     route.section = this.section;
@@ -60,16 +69,6 @@
   }
 
   /**
-   * Returns a new Route instance that's a child section of this route.
-   * TODO(tommycli): Remove once we've obsoleted the concept of sections.
-   */
-  createSection(path: string, section: string, title?: string): Route {
-    const route = this.createChild(path, title);
-    route.section = section;
-    return route;
-  }
-
-  /**
    * Returns the absolute path string for this Route, assuming this function
    * has been called from within chrome://os-settings.
    */
@@ -93,7 +92,7 @@
    * Returns true if this route is a subpage of a section.
    */
   isSubpage(): boolean {
-    return !this.isNavigableDialog && !!this.parent && !!this.section &&
+    return !this.isNavigableDialog && !!this.parent && this.section !== null &&
         this.parent.section === this.section;
   }
 }
@@ -213,13 +212,15 @@
   SYNC_ADVANCED: Route;
 }
 
-function createSection(
-    parent: Route, path: string, _section: routesMojom.Section): Route {
-  // TODO(khorimoto): Add |section| to the the Route object.
-  return parent.createSection(`/${path}`, /*section=*/ path);
+export function createSection(
+    parent: Route, path: string, section: routesMojom.Section,
+    title?: string): Route {
+  const route = parent.createChild(`/${path}`, title);
+  route.section = section;
+  return route;
 }
 
-function createSubpage(
+export function createSubpage(
     parent: Route, path: string, _subpage: routesMojom.Subpage): Route {
   // TODO(khorimoto): Add |subpage| to the Route object.
   return parent.createChild('/' + path);
@@ -247,14 +248,14 @@
   // and kWifiDetails subpages.
   r.INTERNET_NETWORKS =
       createSubpage(r.INTERNET, 'networks', Subpage.kWifiNetworks);
-  r.NETWORK_DETAIL =
-      createSubpage(r.INTERNET, 'networkDetail', Subpage.kWifiDetails);
+  r.NETWORK_DETAIL = createSubpage(
+      r.INTERNET, routesMojom.WIFI_DETAILS_SUBPAGE_PATH, Subpage.kWifiDetails);
   r.KNOWN_NETWORKS = createSubpage(
       r.INTERNET, routesMojom.KNOWN_NETWORKS_SUBPAGE_PATH,
       Subpage.kKnownNetworks);
   if (loadTimeData.getBoolean('isHotspotEnabled')) {
-    r.HOTSPOT_DETAIL =
-        createSubpage(r.INTERNET, 'hotspotDetail', Subpage.kHotspotDetails);
+    r.HOTSPOT_DETAIL = createSubpage(
+        r.INTERNET, routesMojom.HOTSPOT_SUBPAGE_PATH, Subpage.kHotspotDetails);
   }
   if (loadTimeData.getBoolean('isApnRevampEnabled')) {
     r.APN =
@@ -581,8 +582,9 @@
   // implemented using createSection().
   // TODO(khorimoto): Add Section.kAboutChromeOs to Route object.
   r.ABOUT = new Route('/' + routesMojom.ABOUT_CHROME_OS_SECTION_PATH);
-  r.ABOUT_ABOUT = r.ABOUT.createSection(
-      '/' + routesMojom.ABOUT_CHROME_OS_DETAILS_SUBPAGE_PATH, 'about');
+  r.ABOUT_ABOUT = createSection(
+      r.ABOUT, routesMojom.ABOUT_CHROME_OS_DETAILS_SUBPAGE_PATH,
+      Section.kAboutChromeOs);
   r.DETAILED_BUILD_INFO = createSubpage(
       r.ABOUT_ABOUT, routesMojom.DETAILED_BUILD_INFO_SUBPAGE_PATH,
       Subpage.kDetailedBuildInfo);
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
index 6b28433..b5dad19ec 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
@@ -1,5 +1,6 @@
 <style include="settings-shared"></style>
-<os-settings-animated-pages id="pages" section="personalization">
+<os-settings-animated-pages id="pages"
+    section="[[section_]]">
   <div route-path="default">
     <cr-link-row id="personalizationHubButton"
         label="$i18n{personalizationHubTitle}"
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
index 1f7f112..ec52e77 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
@@ -15,6 +15,8 @@
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Section} from '../mojom-webui/routes.mojom-webui.js';
+
 import {PersonalizationHubBrowserProxy, PersonalizationHubBrowserProxyImpl} from './personalization_hub_browser_proxy.js';
 import {getTemplate} from './personalization_page.html.js';
 
@@ -30,7 +32,18 @@
     return getTemplate();
   }
 
+  static get properties() {
+    return {
+      section_: {
+        type: Number,
+        value: Section.kPersonalization,
+        readOnly: true,
+      },
+    };
+  }
+
   private personalizationHubBrowserProxy_: PersonalizationHubBrowserProxy;
+  private section_: Section;
 
   constructor() {
     super();
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
index 3f95c26..3cd9696 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -30,7 +30,7 @@
 import {ShoppingListApiProxy, ShoppingListApiProxyImpl} from '//bookmarks-side-panel.top-chrome/shared/commerce/shopping_list_api_proxy.js';
 import {BookmarkProductInfo} from '//bookmarks-side-panel.top-chrome/shared/shopping_list.mojom-webui.js';
 import {SpEmptyStateElement} from '//bookmarks-side-panel.top-chrome/shared/sp_empty_state.js';
-import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {getInstance as getAnnouncerInstance} from '//resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js';
@@ -233,7 +233,7 @@
 
   constructor() {
     super();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 
   override connectedCallback() {
diff --git a/chrome/browser/resources/side_panel/customize_chrome/app.ts b/chrome/browser/resources/side_panel/customize_chrome/app.ts
index f53e342a..46d16db 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/app.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/app.ts
@@ -12,7 +12,7 @@
 import './shortcuts.js';
 import './themes.js';
 
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
@@ -83,7 +83,7 @@
 
   override ready() {
     super.ready();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
     this.registerHelpBubble(
         CHANGE_CHROME_THEME_BUTTON_ELEMENT_ID,
         ['#appearanceElement', '#editThemeButton']);
diff --git a/chrome/browser/resources/side_panel/reading_list/app.ts b/chrome/browser/resources/side_panel/reading_list/app.ts
index 2158fe2..59cecba 100644
--- a/chrome/browser/resources/side_panel/reading_list/app.ts
+++ b/chrome/browser/resources/side_panel/reading_list/app.ts
@@ -17,7 +17,7 @@
 import './reading_list_item.js';
 import '../strings.m.js';
 
-import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
 import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
@@ -108,7 +108,7 @@
 
   constructor() {
     super();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
 
     this.visibilityChangedListener_ = () => {
       // Refresh Reading List's list data when transitioning into a visible
diff --git a/chrome/browser/resources/tab_search/app.ts b/chrome/browser/resources/tab_search/app.ts
index 3c5fbeb..d5291f0 100644
--- a/chrome/browser/resources/tab_search/app.ts
+++ b/chrome/browser/resources/tab_search/app.ts
@@ -16,7 +16,7 @@
 import './title_item.js';
 import './strings.m.js';
 
-import {startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {MetricsReporter, MetricsReporterImpl} from 'chrome://resources/js/metrics_reporter/metrics_reporter.js';
@@ -145,7 +145,7 @@
 
   constructor() {
     super();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
 
     this.visibilityChangedListener_ = () => {
       // Refresh Tab Search's tab data when transitioning into a visible state.
diff --git a/chrome/browser/resources/tab_strip/tab_list.ts b/chrome/browser/resources/tab_strip/tab_list.ts
index 8fa85901..0456f99 100644
--- a/chrome/browser/resources/tab_strip/tab_list.ts
+++ b/chrome/browser/resources/tab_strip/tab_list.ts
@@ -6,7 +6,7 @@
 import './tab.js';
 import './tab_group.js';
 
-import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {CustomElement} from 'chrome://resources/js/custom_element.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
@@ -262,7 +262,7 @@
     const dragManager = new DragManager(this);
     dragManager.startObserving();
 
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 
   private addAnimationPromise_(promise: Promise<void>) {
diff --git a/chrome/browser/resources/webui_gallery/app.ts b/chrome/browser/resources/webui_gallery/app.ts
index de729a0..d170048 100644
--- a/chrome/browser/resources/webui_gallery/app.ts
+++ b/chrome/browser/resources/webui_gallery/app.ts
@@ -8,7 +8,7 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/polymer/v3_0/iron-location/iron-location.js';
 
-import {COLORS_CSS_SELECTOR, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {ColorChangeUpdater, COLORS_CSS_SELECTOR} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 import {CrMenuSelector} from '//resources/cr_elements/cr_menu_selector/cr_menu_selector.js';
 import {assert} from '//resources/js/assert_ts.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -174,7 +174,7 @@
 
   override ready() {
     super.ready();
-    startColorChangeUpdater();
+    ColorChangeUpdater.forDocument().start();
   }
 
   private async onPathChanged_() {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
new file mode 100644
index 0000000..eeb498b49
--- /dev/null
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
@@ -0,0 +1,186 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+
+#include "base/functional/bind.h"
+#include "base/functional/callback_helpers.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/files_request_handler.h"
+#include "chrome/browser/enterprise/connectors/connectors_service.h"
+#include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
+#include "components/safe_browsing/core/common/features.h"
+#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
+
+namespace safe_browsing {
+
+namespace {
+
+constexpr char kDmToken[] = "dm_token";
+
+constexpr base::TimeDelta kMinimumPendingDelay = base::Milliseconds(400);
+constexpr base::TimeDelta kSuccessTimeout = base::Milliseconds(100);
+constexpr base::TimeDelta kShowDialogDelay = base::Milliseconds(0);
+
+class UnresponsiveFilesRequestHandler
+    : public enterprise_connectors::FilesRequestHandler {
+ public:
+  using enterprise_connectors::FilesRequestHandler::FilesRequestHandler;
+
+  static std::unique_ptr<enterprise_connectors::FilesRequestHandler> Create(
+      safe_browsing::BinaryUploadService* upload_service,
+      Profile* profile,
+      const enterprise_connectors::AnalysisSettings& analysis_settings,
+      GURL url,
+      const std::string& source,
+      const std::string& destination,
+      const std::string& user_action_id,
+      const std::string& tab_title,
+      safe_browsing::DeepScanAccessPoint access_point,
+      const std::vector<base::FilePath>& paths,
+      enterprise_connectors::FilesRequestHandler::CompletionCallback callback) {
+    return base::WrapUnique(new UnresponsiveFilesRequestHandler(
+        upload_service, profile, analysis_settings, url, source, destination,
+        user_action_id, tab_title, access_point, paths, std::move(callback)));
+  }
+
+ private:
+  void UploadFileForDeepScanning(
+      safe_browsing::BinaryUploadService::Result result,
+      const base::FilePath& path,
+      std::unique_ptr<safe_browsing::BinaryUploadService::Request> request)
+      override {
+    // Do nothing.
+  }
+};
+
+class UnresponsiveContentAnalysisDelegate
+    : public enterprise_connectors::FakeContentAnalysisDelegate {
+ public:
+  using enterprise_connectors::FakeContentAnalysisDelegate::
+      FakeContentAnalysisDelegate;
+
+  static std::unique_ptr<enterprise_connectors::ContentAnalysisDelegate> Create(
+      base::RepeatingClosure delete_closure,
+      StatusCallback status_callback,
+      std::string dm_token,
+      content::WebContents* web_contents,
+      Data data,
+      CompletionCallback callback) {
+    enterprise_connectors::FilesRequestHandler::SetFactoryForTesting(
+        base::BindRepeating(&UnresponsiveFilesRequestHandler::Create));
+    return std::make_unique<UnresponsiveContentAnalysisDelegate>(
+        delete_closure, status_callback, std::move(dm_token), web_contents,
+        std::move(data), std::move(callback));
+  }
+
+ private:
+  void UploadTextForDeepScanning(
+      std::unique_ptr<BinaryUploadService::Request> request) override {
+    // Do nothing.
+  }
+};
+
+}  // namespace
+
+DeepScanningBrowserTestBase::DeepScanningBrowserTestBase() {
+  // Change the time values of the upload UI to smaller ones to make tests
+  // showing it run faster.
+  enterprise_connectors::ContentAnalysisDialog::
+      SetMinimumPendingDialogTimeForTesting(kMinimumPendingDelay);
+  enterprise_connectors::ContentAnalysisDialog::
+      SetSuccessDialogTimeoutForTesting(kSuccessTimeout);
+  enterprise_connectors::ContentAnalysisDialog::SetShowDialogDelayForTesting(
+      kShowDialogDelay);
+}
+
+DeepScanningBrowserTestBase::~DeepScanningBrowserTestBase() = default;
+
+void DeepScanningBrowserTestBase::TearDownOnMainThread() {
+  enterprise_connectors::ContentAnalysisDelegate::ResetFactoryForTesting();
+  enterprise_connectors::FilesRequestHandler::ResetFactoryForTesting();
+
+  ClearAnalysisConnector(browser()->profile()->GetPrefs(),
+                         enterprise_connectors::FILE_ATTACHED);
+  ClearAnalysisConnector(browser()->profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED);
+  ClearAnalysisConnector(browser()->profile()->GetPrefs(),
+                         enterprise_connectors::BULK_DATA_ENTRY);
+  ClearAnalysisConnector(browser()->profile()->GetPrefs(),
+                         enterprise_connectors::PRINT);
+  SetOnSecurityEventReporting(browser()->profile()->GetPrefs(), false);
+}
+
+void DeepScanningBrowserTestBase::SetUpDelegate() {
+  SetDMTokenForTesting(policy::DMToken::CreateValidToken(kDmToken));
+  enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
+      base::BindRepeating(
+          &enterprise_connectors::FakeContentAnalysisDelegate::Create,
+          base::DoNothing(),
+          base::BindRepeating(&DeepScanningBrowserTestBase::StatusCallback,
+                              base::Unretained(this)),
+          kDmToken));
+}
+
+void DeepScanningBrowserTestBase::SetUpUnresponsiveDelegate() {
+  SetDMTokenForTesting(policy::DMToken::CreateValidToken(kDmToken));
+  enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
+      base::BindRepeating(
+          &UnresponsiveContentAnalysisDelegate::Create, base::DoNothing(),
+          base::BindRepeating(&DeepScanningBrowserTestBase::StatusCallback,
+                              base::Unretained(this)),
+          kDmToken));
+}
+
+void DeepScanningBrowserTestBase::SetQuitClosure(
+    base::RepeatingClosure quit_closure) {
+  quit_closure_ = quit_closure;
+}
+
+void DeepScanningBrowserTestBase::CallQuitClosure() {
+  if (!quit_closure_.is_null())
+    quit_closure_.Run();
+}
+
+void DeepScanningBrowserTestBase::SetStatusCallbackResponse(
+    enterprise_connectors::ContentAnalysisResponse response) {
+  connector_status_callback_response_ = response;
+}
+
+enterprise_connectors::ContentAnalysisResponse
+DeepScanningBrowserTestBase::StatusCallback(const std::string& contents,
+                                            const base::FilePath& path) {
+  return connector_status_callback_response_;
+}
+
+void DeepScanningBrowserTestBase::CreateFilesForTest(
+    const std::vector<std::string>& paths,
+    const std::vector<std::string>& contents,
+    enterprise_connectors::ContentAnalysisDelegate::Data* data) {
+  ASSERT_EQ(paths.size(), contents.size());
+
+  ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+
+  for (size_t i = 0; i < paths.size(); ++i) {
+    base::FilePath path = temp_dir_.GetPath().AppendASCII(paths[i]);
+    created_file_paths_.emplace_back(path);
+    base::File file(path, base::File::FLAG_CREATE | base::File::FLAG_WRITE);
+    file.WriteAtCurrentPos(contents[i].data(), contents[i].size());
+    data->paths.emplace_back(path);
+  }
+}
+
+const std::vector<base::FilePath>&
+DeepScanningBrowserTestBase::created_file_paths() const {
+  return created_file_paths_;
+}
+
+}  // namespace safe_browsing
diff --git a/chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h
similarity index 65%
rename from chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h
rename to chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h
index ac12f86..1e92a41 100644
--- a/chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_BROWSERTEST_BASE_H_
-#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_BROWSERTEST_BASE_H_
+#ifndef CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_BROWSERTEST_BASE_H_
+#define CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_BROWSERTEST_BASE_H_
 
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 
-namespace enterprise_connectors::test {
+namespace safe_browsing {
 
 // Base test class for deep scanning browser tests. Common utility functions
 // used by browser tests should be added to this class.
@@ -33,16 +33,19 @@
   void CallQuitClosure();
 
   // Set what StatusCallback returns.
-  void SetStatusCallbackResponse(ContentAnalysisResponse response);
+  void SetStatusCallbackResponse(
+      enterprise_connectors::ContentAnalysisResponse response);
 
   // Callbacks used to set up the fake delegate factory.
-  ContentAnalysisResponse StatusCallback(const std::string& contents,
-                                         const base::FilePath& path);
+  enterprise_connectors::ContentAnalysisResponse StatusCallback(
+      const std::string& contents,
+      const base::FilePath& path);
 
   // Creates temporary files for testing in |temp_dir_|, and add them to |data|.
-  void CreateFilesForTest(const std::vector<std::string>& paths,
-                          const std::vector<std::string>& contents,
-                          ContentAnalysisDelegate::Data* data);
+  void CreateFilesForTest(
+      const std::vector<std::string>& paths,
+      const std::vector<std::string>& contents,
+      enterprise_connectors::ContentAnalysisDelegate::Data* data);
 
   const std::vector<base::FilePath>& created_file_paths() const;
 
@@ -51,11 +54,12 @@
 
  private:
   base::RepeatingClosure quit_closure_;
-  ContentAnalysisResponse connector_status_callback_response_;
+  enterprise_connectors::ContentAnalysisResponse
+      connector_status_callback_response_;
   base::ScopedTempDir temp_dir_;
   std::vector<base::FilePath> created_file_paths_;
 };
 
-}  // namespace enterprise_connectors::test
+}  // namespace safe_browsing
 
-#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_BROWSERTEST_BASE_H_
+#endif  // CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_BROWSERTEST_BASE_H_
diff --git a/chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
similarity index 93%
rename from chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.cc
rename to chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
index ddbe456b..5fac298 100644
--- a/chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.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/enterprise/connectors/test/deep_scanning_test_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
@@ -31,7 +31,7 @@
 using extensions::SafeBrowsingPrivateEventRouter;
 using ::testing::_;
 
-namespace enterprise_connectors::test {
+namespace safe_browsing {
 
 EventReportValidator::EventReportValidator(
     policy::MockCloudPolicyClient* client)
@@ -166,7 +166,8 @@
     const std::string& expected_filename,
     const std::string& expected_sha256,
     const std::string& expected_trigger,
-    const ContentAnalysisResponse::Result& expected_dlp_verdict,
+    const enterprise_connectors::ContentAnalysisResponse::Result&
+        expected_dlp_verdict,
     const std::set<std::string>* expected_mimetypes,
     absl::optional<int64_t> expected_content_size,
     const std::string& expected_result,
@@ -206,7 +207,8 @@
     const std::vector<std::string>& expected_filenames,
     const std::vector<std::string>& expected_sha256s,
     const std::string& expected_trigger,
-    const std::vector<ContentAnalysisResponse::Result>& expected_dlp_verdicts,
+    const std::vector<enterprise_connectors::ContentAnalysisResponse::Result>&
+        expected_dlp_verdicts,
     const std::set<std::string>* expected_mimetypes,
     int64_t expected_content_size,
     const std::vector<std::string>& expected_results,
@@ -248,7 +250,8 @@
         const std::string& expected_sha256,
         const std::string& expected_threat_type,
         const std::string& expected_trigger,
-        const ContentAnalysisResponse::Result& expected_dlp_verdict,
+        const enterprise_connectors::ContentAnalysisResponse::Result&
+            expected_dlp_verdict,
         const std::set<std::string>* expected_mimetypes,
         int64_t expected_content_size,
         const std::string& expected_result,
@@ -298,7 +301,8 @@
         const std::string& expected_sha256,
         const std::string& expected_threat_type,
         const std::string& expected_trigger,
-        const ContentAnalysisResponse::Result& expected_dlp_verdict,
+        const enterprise_connectors::ContentAnalysisResponse::Result&
+            expected_dlp_verdict,
         const std::set<std::string>* expected_mimetypes,
         int64_t expected_content_size,
         const std::string& expected_result,
@@ -457,8 +461,10 @@
                 unscanned_reason_);
   ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyProfileUserName,
                 username_);
-  ValidateField(event, RealtimeReportingClient::kKeyProfileIdentifier,
-                profile_identifier_);
+  ValidateField(
+      event,
+      enterprise_connectors::RealtimeReportingClient::kKeyProfileIdentifier,
+      profile_identifier_);
   ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyIsFederated,
                 is_federated_);
   ValidateField(event, SafeBrowsingPrivateEventRouter::kKeyLoginUserName,
@@ -528,7 +534,7 @@
 
 void EventReportValidator::ValidateDlpVerdict(
     const base::Value::Dict* value,
-    const ContentAnalysisResponse::Result& result) {
+    const enterprise_connectors::ContentAnalysisResponse::Result& result) {
   const base::Value::List* triggered_rules =
       value->FindList(SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleInfo);
   ASSERT_NE(nullptr, triggered_rules);
@@ -542,7 +548,8 @@
 
 void EventReportValidator::ValidateDlpRule(
     const base::Value::Dict* value,
-    const ContentAnalysisResponse::Result::TriggeredRule& expected_rule) {
+    const enterprise_connectors::ContentAnalysisResponse::Result::TriggeredRule&
+        expected_rule) {
   ValidateField(value, SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleName,
                 expected_rule.rule_name());
   ValidateField(value, SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleId,
@@ -634,7 +641,7 @@
 }
 
 void SetAnalysisConnector(PrefService* prefs,
-                          AnalysisConnector connector,
+                          enterprise_connectors::AnalysisConnector connector,
                           const std::string& pref_value,
                           bool machine_scope) {
   ScopedListPrefUpdate settings_list(prefs, ConnectorPref(connector));
@@ -654,13 +661,15 @@
   base::Value::List enabled_opt_in_events_list;
   for (const auto& enabled_opt_in_event : enabled_opt_in_events) {
     base::Value::Dict event_value;
-    event_value.Set(kKeyOptInEventName, enabled_opt_in_event.first);
+    event_value.Set(enterprise_connectors::kKeyOptInEventName,
+                    enabled_opt_in_event.first);
 
     base::Value::List url_patterns_list;
     for (const auto& url_pattern : enabled_opt_in_event.second) {
       url_patterns_list.Append(url_pattern);
     }
-    event_value.Set(kKeyOptInEventUrlPatterns, std::move(url_patterns_list));
+    event_value.Set(enterprise_connectors::kKeyOptInEventUrlPatterns,
+                    std::move(url_patterns_list));
 
     enabled_opt_in_events_list.Append(std::move(event_value));
   }
@@ -674,38 +683,43 @@
     const std::map<std::string, std::vector<std::string>>&
         enabled_opt_in_events,
     bool machine_scope) {
-  ScopedListPrefUpdate settings_list(prefs, kOnSecurityEventPref);
+  ScopedListPrefUpdate settings_list(
+      prefs, enterprise_connectors::kOnSecurityEventPref);
   if (!enabled) {
     settings_list->clear();
-    prefs->ClearPref(kOnSecurityEventScopePref);
+    prefs->ClearPref(enterprise_connectors::kOnSecurityEventScopePref);
     return;
   }
 
   if (settings_list->empty()) {
     base::Value::Dict settings;
 
-    settings.Set(kKeyServiceProvider, base::Value("google"));
+    settings.Set(enterprise_connectors::kKeyServiceProvider,
+                 base::Value("google"));
     if (!enabled_event_names.empty()) {
       base::Value::List enabled_event_name_list;
       for (const auto& enabled_event_name : enabled_event_names) {
         enabled_event_name_list.Append(enabled_event_name);
       }
-      settings.Set(kKeyEnabledEventNames, std::move(enabled_event_name_list));
+      settings.Set(enterprise_connectors::kKeyEnabledEventNames,
+                   std::move(enabled_event_name_list));
     }
 
     if (!enabled_opt_in_events.empty()) {
-      settings.Set(kKeyEnabledOptInEvents,
+      settings.Set(enterprise_connectors::kKeyEnabledOptInEvents,
                    CreateOptInEventsList(enabled_opt_in_events));
     }
 
     settings_list->Append(std::move(settings));
   }
   prefs->SetInteger(
-      kOnSecurityEventScopePref,
+      enterprise_connectors::kOnSecurityEventScopePref,
       machine_scope ? policy::POLICY_SCOPE_MACHINE : policy::POLICY_SCOPE_USER);
 }
 
-void ClearAnalysisConnector(PrefService* prefs, AnalysisConnector connector) {
+void ClearAnalysisConnector(
+    PrefService* prefs,
+    enterprise_connectors::AnalysisConnector connector) {
   ScopedListPrefUpdate settings_list(prefs, ConnectorPref(connector));
   settings_list->clear();
   prefs->ClearPref(ConnectorScopePref(connector));
@@ -726,4 +740,4 @@
 }
 #endif
 
-}  // namespace enterprise_connectors::test
+}  // namespace safe_browsing
diff --git a/chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h
similarity index 87%
rename from chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h
rename to chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h
index 92dd5b4..bd0db8a 100644
--- a/chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.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_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_TEST_UTILS_H_
-#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_TEST_UTILS_H_
+#ifndef CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_TEST_UTILS_H_
+#define CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_TEST_UTILS_H_
 
 #include <set>
 #include <string>
@@ -22,7 +22,7 @@
 class MockCloudPolicyClient;
 }
 
-namespace enterprise_connectors::test {
+namespace safe_browsing {
 
 // Helper class that represents a report that's expected from a test. The
 // non-optional fields are expected for every kind of Deep Scanning reports.
@@ -56,7 +56,8 @@
       const std::string& expected_filename,
       const std::string& expected_sha256,
       const std::string& expected_trigger,
-      const ContentAnalysisResponse::Result& expected_dlp_verdict,
+      const enterprise_connectors::ContentAnalysisResponse::Result&
+          expected_dlp_verdict,
       const std::set<std::string>* expected_mimetypes,
       absl::optional<int64_t> expected_content_size,
       const std::string& expected_result,
@@ -71,7 +72,8 @@
       const std::vector<std::string>& expected_filenames,
       const std::vector<std::string>& expected_sha256s,
       const std::string& expected_trigger,
-      const std::vector<ContentAnalysisResponse::Result>& expected_dlp_verdicts,
+      const std::vector<enterprise_connectors::ContentAnalysisResponse::Result>&
+          expected_dlp_verdicts,
       const std::set<std::string>* expected_mimetypes,
       int64_t expected_content_size,
       const std::vector<std::string>& expected_results,
@@ -87,7 +89,8 @@
       const std::string& expected_sha256,
       const std::string& expected_threat_type,
       const std::string& expected_trigger,
-      const ContentAnalysisResponse::Result& expected_dlp_verdict,
+      const enterprise_connectors::ContentAnalysisResponse::Result&
+          expected_dlp_verdict,
       const std::set<std::string>* expected_mimetypes,
       int64_t expected_content_size,
       const std::string& expected_result,
@@ -103,7 +106,8 @@
       const std::string& expected_sha256,
       const std::string& expected_threat_type,
       const std::string& expected_trigger,
-      const ContentAnalysisResponse::Result& expected_dlp_verdict,
+      const enterprise_connectors::ContentAnalysisResponse::Result&
+          expected_dlp_verdict,
       const std::set<std::string>* expected_mimetypes,
       int64_t expected_content_size,
       const std::string& expected_result,
@@ -174,11 +178,12 @@
   void ValidateFederatedOrigin(const base::Value::Dict* value);
   void ValidateIdentities(const base::Value::Dict* value);
   void ValidateMimeType(const base::Value::Dict* value);
-  void ValidateDlpVerdict(const base::Value::Dict* value,
-                          const ContentAnalysisResponse::Result& result);
-  void ValidateDlpRule(
+  void ValidateDlpVerdict(
       const base::Value::Dict* value,
-      const ContentAnalysisResponse::Result::TriggeredRule& expected_rule);
+      const enterprise_connectors::ContentAnalysisResponse::Result& result);
+  void ValidateDlpRule(const base::Value::Dict* value,
+                       const enterprise_connectors::ContentAnalysisResponse::
+                           Result::TriggeredRule& expected_rule);
   void ValidateFilenameMappedAttributes(const base::Value::Dict* value);
   void ValidateField(const base::Value::Dict* value,
                      const std::string& field_key,
@@ -215,7 +220,9 @@
   // When multiple files generate events, we don't necessarily know in which
   // order they will be reported. As such, we use maps to ensure all of them
   // are called as expected.
-  base::flat_map<std::string, ContentAnalysisResponse::Result> dlp_verdicts_;
+  base::flat_map<std::string,
+                 enterprise_connectors::ContentAnalysisResponse::Result>
+      dlp_verdicts_;
   base::flat_map<std::string, std::string> results_;
   base::flat_map<std::string, std::string> filenames_and_hashes_;
   base::flat_map<std::string, std::string> scan_ids_;
@@ -225,7 +232,7 @@
 
 // Helper functions that set Connector policies for testing.
 void SetAnalysisConnector(PrefService* prefs,
-                          AnalysisConnector connector,
+                          enterprise_connectors::AnalysisConnector connector,
                           const std::string& pref_value,
                           bool machine_scope = true);
 void SetOnSecurityEventReporting(
@@ -236,7 +243,8 @@
         enabled_opt_in_events =
             std::map<std::string, std::vector<std::string>>(),
     bool machine_scope = true);
-void ClearAnalysisConnector(PrefService* prefs, AnalysisConnector connector);
+void ClearAnalysisConnector(PrefService* prefs,
+                            enterprise_connectors::AnalysisConnector connector);
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
 // Helper function to set the profile DM token. It installs a
@@ -245,6 +253,6 @@
 void SetProfileDMToken(Profile* profile, const std::string& dm_token);
 #endif
 
-}  // namespace enterprise_connectors::test
+}  // namespace safe_browsing
 
-#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_TEST_DEEP_SCANNING_TEST_UTILS_H_
+#endif  // CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_TEST_UTILS_H_
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
index 4e2b1b9..4a44240 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_browsertest.cc
@@ -24,8 +24,6 @@
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_browsertest_base.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/enterprise/identifiers/profile_id_service_factory.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
@@ -35,6 +33,8 @@
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_factory.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/download_protection/deep_scanning_request.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
 #include "chrome/browser/safe_browsing/download_protection/ppapi_download_request.h"
@@ -127,7 +127,7 @@
 // Integration tests for download deep scanning behavior, only mocking network
 // traffic and FCM dependencies.
 class DownloadDeepScanningBrowserTestBase
-    : public enterprise_connectors::test::DeepScanningBrowserTestBase,
+    : public DeepScanningBrowserTestBase,
       public content::DownloadManager::Observer,
       public download::DownloadItem::Observer {
  public:
@@ -150,10 +150,10 @@
   }
 
   void SetUpReporting() {
-    enterprise_connectors::test::SetOnSecurityEventReporting(
-        browser()->profile()->GetPrefs(),
-        /*enabled*/ true, /*enabled_event_names*/ {},
-        /*enabled_opt_in_events*/ {}, connectors_machine_scope());
+    SetOnSecurityEventReporting(browser()->profile()->GetPrefs(),
+                                /*enabled*/ true, /*enabled_event_names*/ {},
+                                /*enabled_opt_in_events*/ {},
+                                connectors_machine_scope());
     client_ = std::make_unique<policy::MockCloudPolicyClient>();
     client_->SetDMToken("dm_token");
 
@@ -216,14 +216,12 @@
       if (connectors_machine_scope()) {
         SetDMTokenForTesting(policy::DMToken::CreateValidToken("dm_token"));
       } else {
-        enterprise_connectors::test::SetProfileDMToken(browser()->profile(),
-                                                       "dm_token");
+        SetProfileDMToken(browser()->profile(), "dm_token");
       }
 #endif
-      enterprise_connectors::test::SetAnalysisConnector(
-          browser()->profile()->GetPrefs(),
-          enterprise_connectors::FILE_DOWNLOADED,
-          R"({
+      SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                           enterprise_connectors::FILE_DOWNLOADED,
+                           R"({
                               "service_provider": "google",
                               "enable": [
                                 {
@@ -234,7 +232,7 @@
                               "block_until_verdict": 1,
                               "block_password_protected": true
                             })",
-          connectors_machine_scope());
+                           connectors_machine_scope());
     }
   }
 
@@ -779,7 +777,7 @@
   // A single unsafe event should be recorded for this request.
   std::set<std::string> zip_types = {"application/zip",
                                      "application/x-zip-compressed"};
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.ExpectDangerousDeepScanningResult(
       /*url*/ url.spec(),
       /*source*/ "",
@@ -872,7 +870,7 @@
   // Both the DLP and malware violations generate an event.
   std::set<std::string> zip_types = {"application/zip",
                                      "application/x-zip-compressed"};
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.ExpectSensitiveDataEventAndDangerousDeepScanningResult(
       /*url*/ url.spec(),
       /*source*/ "",
@@ -926,10 +924,9 @@
     browser()->profile()->GetPrefs()->SetInteger(
         prefs::kDownloadRestrictions,
         static_cast<int>(DownloadPrefs::DownloadRestriction::DANGEROUS_FILES));
-    enterprise_connectors::test::SetAnalysisConnector(
-        browser()->profile()->GetPrefs(),
-        enterprise_connectors::FILE_DOWNLOADED,
-        R"({
+    SetAnalysisConnector(browser()->profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED,
+                         R"({
                               "service_provider": "google",
                               "enable": [
                                 {
@@ -939,7 +936,7 @@
                               ],
                               "block_until_verdict": 1
                             })",
-        connectors_machine_scope());
+                         connectors_machine_scope());
   }
 };
 
@@ -964,7 +961,7 @@
       browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NO_WAIT);
 
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   std::set<std::string> zip_types = {"application/zip",
                                      "application/x-zip-compressed"};
   validator.ExpectDangerousDownloadEvent(
@@ -1283,7 +1280,7 @@
       enterprise_connectors::ContentAnalysisResponse::Result::SUCCESS);
 
   // That response should not trigger a security event.
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.ExpectNoReport();
 
   SendFcmMessage(response);
@@ -1333,7 +1330,7 @@
   dlp_verdict->set_action(enterprise_connectors::TriggeredRule::BLOCK);
 
   // That blocking response should trigger a security event.
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   std::set<std::string> mimetypes = {"text/plain"};
   validator.ExpectSensitiveDataEvent(
       /*url*/ url.spec(),
@@ -1399,7 +1396,7 @@
 
   // That warning response should trigger a security event.
   base::RunLoop validator_run_loop;
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.SetDoneClosure(validator_run_loop.QuitClosure());
   std::set<std::string> mimetypes = {"text/plain"};
   validator.ExpectSensitiveDataEvent(
@@ -1502,7 +1499,7 @@
 
   // That warning response should trigger a security event.
   base::RunLoop validator_run_loop;
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.SetDoneClosure(validator_run_loop.QuitClosure());
   std::set<std::string> mimetypes = {"text/plain"};
   validator.ExpectSensitiveDataEvent(
@@ -1600,7 +1597,7 @@
   dlp_verdict->set_action(enterprise_connectors::TriggeredRule::BLOCK);
 
   base::RunLoop validator_run_loop;
-  enterprise_connectors::test::EventReportValidator validator(client());
+  EventReportValidator validator(client());
   validator.SetDoneClosure(validator_run_loop.QuitClosure());
   std::set<std::string> mimetypes = {"text/plain"};
   validator.ExpectSensitiveDataEvent(
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
index 96f4d4625..a4d67422 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -26,12 +26,12 @@
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_fcm_service.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_service.h"
 #include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
@@ -360,9 +360,9 @@
 };
 
 TEST_F(DeepScanningRequestFeaturesEnabledTest, ChecksFeatureFlags) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kScanForDlpAndMalware);
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       kScanForDlpAndMalware);
 
   // Try each request with settings indicating both DLP and Malware requests
   // should be sent to show features work correctly.
@@ -416,9 +416,9 @@
 TEST_F(DeepScanningRequestAllFeaturesEnabledTest,
        GeneratesCorrectRequestFromPolicy) {
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-        kScanForDlpAndMalware);
+    SetAnalysisConnector(profile_->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED,
+                         kScanForDlpAndMalware);
     base::RunLoop run_loop;
     DeepScanningRequest request(
         &item_, DeepScanningRequest::DeepScanTrigger::TRIGGER_POLICY,
@@ -462,9 +462,9 @@
 
   {
     base::RunLoop run_loop;
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-        kScanForMalware);
+    SetAnalysisConnector(profile_->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED,
+                         kScanForMalware);
     DeepScanningRequest request(
         &item_, DeepScanningRequest::DeepScanTrigger::TRIGGER_POLICY,
         DownloadCheckResult::SAFE,
@@ -489,9 +489,8 @@
 
   {
     base::RunLoop run_loop;
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-        kScanForDlp);
+    SetAnalysisConnector(profile_->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, kScanForDlp);
     DeepScanningRequest request(
         &item_, DeepScanningRequest::DeepScanTrigger::TRIGGER_POLICY,
         DownloadCheckResult::SAFE,
@@ -515,8 +514,8 @@
 
   {
     base::RunLoop run_loop;
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, kNoScan);
+    SetAnalysisConnector(profile_->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, kNoScan);
     EXPECT_FALSE(settings().has_value());
     enterprise_connectors::AnalysisSettings analysis_settings;
     analysis_settings.block_until_verdict =
@@ -590,17 +589,16 @@
         ->SetIdentityManagerForTesting(
             identity_test_environment_.identity_manager());
 
-    enterprise_connectors::test::SetOnSecurityEventReporting(
-        profile_->GetPrefs(), true);
+    SetOnSecurityEventReporting(profile_->GetPrefs(), true);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     fake_statistics_provider_.SetMachineStatistic(
         ash::system::kSerialNumberKeyForTest, "fake_serial_number");
 #endif
 
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-        kScanForDlpAndMalware);
+    SetAnalysisConnector(profile_->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED,
+                         kScanForDlpAndMalware);
   }
 
   void TearDown() override {
@@ -662,7 +660,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::WARN);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectDangerousDeepScanningResultAndSensitiveDataEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -733,7 +731,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::WARN);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectDangerousDeepScanningResultAndSensitiveDataEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -796,7 +794,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectSensitiveDataEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -857,7 +855,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::WARN);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectSensitiveDataEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -922,7 +920,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectSensitiveDataEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -978,7 +976,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::ALLOW);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1034,7 +1032,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::ALLOW);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1095,7 +1093,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::WARN);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1172,7 +1170,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::ALLOW);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectNoReport();
 
     request.Start();
@@ -1241,7 +1239,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::ALLOW);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1335,7 +1333,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectSensitiveDataEvents(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1401,7 +1399,7 @@
       download_path_, BinaryUploadService::Result::TIMEOUT,
       enterprise_connectors::ContentAnalysisResponse());
 
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectUnscannedFileEvent(
       /*url*/ "https://example.com/download.exe",
       /*source*/ "",
@@ -1490,9 +1488,8 @@
         DownloadPrefs::DownloadRestriction::MALICIOUS_FILES));
 
 TEST_P(DeepScanningDownloadRestrictionsTest, GeneratesCorrectReport) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kScanForMalware);
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED, kScanForMalware);
   {
     base::RunLoop run_loop;
 
@@ -1527,7 +1524,7 @@
     download_protection_service_.GetFakeBinaryUploadService()
         ->SetExpectedFinalAction(expected_final_action());
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectDangerousDeepScanningResult(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1588,7 +1585,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::WARN);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectDangerousDeepScanningResult(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1641,7 +1638,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1699,7 +1696,7 @@
         ->SetExpectedFinalAction(
             enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK);
 
-    enterprise_connectors::test::EventReportValidator validator(client_.get());
+    EventReportValidator validator(client_.get());
     validator.ExpectUnscannedFileEvent(
         /*url*/ "https://example.com/download.exe",
         /*source*/ "",
@@ -1730,9 +1727,8 @@
 
 TEST_F(DeepScanningRequestConnectorsFeatureTest,
        ShouldUploadBinary_MalwareListPolicy) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kScanForMalware);
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED, kScanForMalware);
 
   content::DownloadItemUtils::AttachInfoForTesting(&item_, profile_, nullptr);
   EXPECT_CALL(item_, GetURL()).WillRepeatedly(ReturnRef(download_url_));
@@ -1747,10 +1743,10 @@
 
   // With the new malware policy list set, the item should not be uploaded since
   // DeepScanningRequest honours that policy.
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      base::StringPrintf(
-          R"({
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       base::StringPrintf(
+                           R"({
                             "service_provider": "google",
                             "enable": [
                               {"url_list": ["*"], "tags": ["malware"]}
@@ -1760,14 +1756,14 @@
                             ],
                             "block_until_verdict": 1
                           })",
-          download_url_.host().c_str()));
+                           download_url_.host().c_str()));
   EXPECT_FALSE(settings().has_value());
 }
 
 TEST_F(DeepScanningRequestConnectorsFeatureTest, ShouldUploadBinary_FileURLs) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kScanForDlpAndMalware);
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       kScanForDlpAndMalware);
 
   content::DownloadItemUtils::AttachInfoForTesting(&item_, profile_, nullptr);
 
@@ -1791,9 +1787,9 @@
 }
 
 TEST_F(DeepScanningRequestAllFeaturesEnabledTest, PopulatesRequest) {
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      kScanForDlpAndMalware);
+  SetAnalysisConnector(profile_->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       kScanForDlpAndMalware);
 
   base::RunLoop run_loop;
   DeepScanningRequest request(
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
index cf87835..ed295d1c 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -43,7 +43,6 @@
 #include "chrome/browser/download/download_core_service_factory.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
 #include "chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_factory.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
 #include "chrome/browser/history/history_service_factory.h"
@@ -54,6 +53,7 @@
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_factory.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/test_binary_upload_service.h"
 #include "chrome/browser/safe_browsing/download_protection/check_file_system_access_write_request.h"
 #include "chrome/browser/safe_browsing/download_protection/download_feedback_service.h"
@@ -2950,8 +2950,7 @@
       profile())
       ->SetBrowserCloudPolicyClientForTesting(client_.get());
 
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile()->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
 
   NiceMockDownloadItem item;
   PrepareBasicDownloadItem(&item,
@@ -2963,7 +2962,7 @@
   // This test sets the mimetype to the empty string, so pass a valid set
   // pointer, but only put the empty string in it.
   std::set<std::string> expected_mimetypes{""};
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectDangerousDownloadEvent(
       "",                     // URL, not set in this test
       "a.exe",                // Simple filename without the directory
@@ -2998,8 +2997,7 @@
       profile())
       ->SetBrowserCloudPolicyClientForTesting(client_.get());
 
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile()->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
 
   NiceMockDownloadItem item;
   PrepareBasicDownloadItem(&item,
@@ -3031,7 +3029,7 @@
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING));
 
   std::set<std::string> expected_mimetypes{"fake/mimetype"};
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",          // URL, not set in this test
       "",          // source, not used for file downloads.
@@ -3058,8 +3056,7 @@
       profile())
       ->SetBrowserCloudPolicyClientForTesting(client_.get());
 
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile()->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
 
   NiceMockDownloadItem item;
   PrepareBasicDownloadItem(&item,
@@ -3085,7 +3082,7 @@
   // This test sets the mimetype to the empty string, so pass a valid set
   // pointer, but only put the empty string in it.
   std::set<std::string> expected_mimetypes{""};
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectDangerousDownloadEvent(
       "",                     // URL, not set in this test
       "a.exe",                // Simple filename without the directory
@@ -3111,8 +3108,7 @@
       profile())
       ->SetBrowserCloudPolicyClientForTesting(client_.get());
 
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile()->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
 
   NiceMockDownloadItem item;
   PrepareBasicDownloadItem(&item,
@@ -3147,7 +3143,7 @@
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING));
 
   std::set<std::string> expected_mimetypes{"fake/mimetype"};
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",          // URL, not set in this test
       "",          // source, not used for file downloads.
@@ -3174,8 +3170,7 @@
       profile())
       ->SetBrowserCloudPolicyClientForTesting(client_.get());
 
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile()->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile()->GetPrefs(), true);
 
   NiceMockDownloadItem item;
   PrepareBasicDownloadItem(&item,
@@ -3210,7 +3205,7 @@
           Return(download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_BLOCK));
 
   std::set<std::string> expected_mimetypes{"fake/mimetype"};
-  enterprise_connectors::test::EventReportValidator validator(client_.get());
+  EventReportValidator validator(client_.get());
   validator.ExpectSensitiveDataEvent(
       "",          // URL, not set in this test
       "",          // source, not used for file downloads.
@@ -3523,8 +3518,8 @@
       enterprise_connectors::ContentAnalysisResponse());
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -3553,8 +3548,8 @@
   }
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -3610,8 +3605,8 @@
       enterprise_connectors::ContentAnalysisResponse());
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -3633,8 +3628,8 @@
   }
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -3694,8 +3689,8 @@
       .Times(2);
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -3717,8 +3712,8 @@
   }
 
   {
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -4551,9 +4546,9 @@
               ExtractImageFeatures(
                   tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _));
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      R"({
+  SetAnalysisConnector(profile()->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       R"({
                             "service_provider": "google",
                             "enable": [
                               {
@@ -4605,8 +4600,8 @@
               ExtractImageFeatures(
                   tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _));
 
-  enterprise_connectors::test::ClearAnalysisConnector(
-      profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED);
+  ClearAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED);
 
   TestBinaryUploadService* test_upload_service =
       static_cast<TestBinaryUploadService*>(
@@ -4658,8 +4653,8 @@
                 ExtractImageFeatures(
                     tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _));
 
-    enterprise_connectors::test::SetAnalysisConnector(
-        profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+    SetAnalysisConnector(profile()->GetPrefs(),
+                         enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -4888,8 +4883,8 @@
                            FILE_PATH_LITERAL("a.exe"));           // final_path
   content::DownloadItemUtils::AttachInfoForTesting(&item, profile(), nullptr);
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED, R"(
+  SetAnalysisConnector(profile()->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED, R"(
                          {
                            "service_provider": "google",
                            "enable": [
@@ -4926,9 +4921,9 @@
                            FILE_PATH_LITERAL("a.exe"));           // final_path
   content::DownloadItemUtils::AttachInfoForTesting(&item, profile(), nullptr);
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      R"({
+  SetAnalysisConnector(profile()->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       R"({
                            "service_provider": "google",
                            "enable": [
                              {"url_list": ["*"], "tags": ["malware"]}
@@ -4974,9 +4969,9 @@
               ExtractImageFeatures(
                   tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _));
 
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile()->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      R"({
+  SetAnalysisConnector(profile()->GetPrefs(),
+                       enterprise_connectors::FILE_DOWNLOADED,
+                       R"({
                            "service_provider": "google",
                            "enable": [
                              {"url_list": ["*"], "tags": ["malware"]}
diff --git a/chrome/browser/share/android/java/res/layout/qrcode_camera_error_layout.xml b/chrome/browser/share/android/java/res/layout/qrcode_camera_error_layout.xml
index 424c341..7be20f8 100644
--- a/chrome/browser/share/android/java/res/layout/qrcode_camera_error_layout.xml
+++ b/chrome/browser/share/android/java/res/layout/qrcode_camera_error_layout.xml
@@ -4,22 +4,18 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<ScrollView
+<org.chromium.components.browser_ui.widget.FadingEdgeScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/permission_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    app:topEdgeVisibility="fading">
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">
-      <ImageView
-          android:id="@+id/tab_line"
-          android:layout_width="match_parent"
-          style="@style/TabBarShadow"
-          android:importantForAccessibility="no"/>
-
     <TextView
         android:id="@+id/qrcode_camera_error_text"
         android:layout_width="250dp"
@@ -32,4 +28,4 @@
         android:maxWidth="250dp"
         android:textAppearance="@style/TextAppearance.ErrorCaption" />
   </LinearLayout>
-</ScrollView>
+</org.chromium.components.browser_ui.widget.FadingEdgeScrollView>
diff --git a/chrome/browser/share/android/java/res/layout/qrcode_open_settings_layout.xml b/chrome/browser/share/android/java/res/layout/qrcode_open_settings_layout.xml
index 7ba6d61..7d73872 100644
--- a/chrome/browser/share/android/java/res/layout/qrcode_open_settings_layout.xml
+++ b/chrome/browser/share/android/java/res/layout/qrcode_open_settings_layout.xml
@@ -4,23 +4,18 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<ScrollView
+<org.chromium.components.browser_ui.widget.FadingEdgeScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/permission_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    app:topEdgeVisibility="fading">
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">
-      <ImageView
-          android:id="@+id/tab_line"
-          android:layout_width="match_parent"
-          style="@style/TabBarShadow"
-          android:importantForAccessibility="no"/>
-
       <org.chromium.ui.widget.ChromeImageView
           android:id="@+id/camera_icon"
           android:layout_marginTop="112dp"
@@ -52,4 +47,4 @@
           android:text="@string/qr_code_open_settings_label"
           style="@style/TextButton"/>
   </LinearLayout>
-</ScrollView>
+</org.chromium.components.browser_ui.widget.FadingEdgeScrollView>
diff --git a/chrome/browser/share/android/java/res/layout/qrcode_permission_layout.xml b/chrome/browser/share/android/java/res/layout/qrcode_permission_layout.xml
index 10b73959..7a00c66 100644
--- a/chrome/browser/share/android/java/res/layout/qrcode_permission_layout.xml
+++ b/chrome/browser/share/android/java/res/layout/qrcode_permission_layout.xml
@@ -4,23 +4,18 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<ScrollView
+<org.chromium.components.browser_ui.widget.FadingEdgeScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/permission_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    app:topEdgeVisibility="fading">
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical">
-      <ImageView
-          android:id="@+id/tab_line"
-          android:layout_width="match_parent"
-          style="@style/TabBarShadow"
-          android:importantForAccessibility="no"/>
-
       <org.chromium.ui.widget.ChromeImageView
           android:id="@+id/camera_icon"
           android:layout_marginTop="112dp"
@@ -52,4 +47,4 @@
           android:text="@string/qr_code_permission_continue_label"
           style="@style/TextButton"/>
   </LinearLayout>
-</ScrollView>
+</org.chromium.components.browser_ui.widget.FadingEdgeScrollView>
diff --git a/chrome/browser/share/android/java/res/layout/qrcode_share_layout.xml b/chrome/browser/share/android/java/res/layout/qrcode_share_layout.xml
index a5d38ba..038b55a4 100644
--- a/chrome/browser/share/android/java/res/layout/qrcode_share_layout.xml
+++ b/chrome/browser/share/android/java/res/layout/qrcode_share_layout.xml
@@ -4,21 +4,18 @@
 Use of this source code is governed by a BSD-style license that can be
 found in the LICENSE file.
 -->
-<ScrollView
+<org.chromium.components.browser_ui.widget.FadingEdgeScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/share_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    app:topEdgeVisibility="fading">
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
-    <ImageView
-        android:id="@+id/tab_line"
-        android:layout_width="match_parent"
-        style="@style/TabBarShadow"
-        android:importantForAccessibility="no"/>
 
     <TextView
         android:id="@+id/qrcode_text_image"
@@ -75,4 +72,4 @@
         android:enabled="false"
         style="@style/TextButton"/>
   </LinearLayout>
-</ScrollView>
+</org.chromium.components.browser_ui.widget.FadingEdgeScrollView>
diff --git a/chrome/browser/sharing/sharing_fcm_handler.cc b/chrome/browser/sharing/sharing_fcm_handler.cc
index 4ca7deafe..87c6b9b0 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.cc
+++ b/chrome/browser/sharing/sharing_fcm_handler.cc
@@ -91,7 +91,6 @@
                                   const gcm::IncomingMessage& message) {
   TRACE_EVENT_BEGIN0("sharing", "SharingFCMHandler::OnMessage");
 
-  base::TimeTicks message_received_time = base::TimeTicks::Now();
   chrome_browser_sharing::SharingMessage sharing_message;
   if (!sharing_message.ParseFromString(message.raw_data)) {
     LOG(ERROR) << "Failed to parse incoming message with id : "
@@ -121,8 +120,8 @@
       done_callback = base::BindOnce(
           &SharingFCMHandler::SendAckMessage, weak_ptr_factory_.GetWeakPtr(),
           std::move(message_id), message_type, GetFCMChannel(sharing_message),
-          GetServerChannel(sharing_message), GetSenderPlatform(sharing_message),
-          message_received_time);
+          GetServerChannel(sharing_message),
+          GetSenderPlatform(sharing_message));
     }
 
     handler->OnMessage(std::move(sharing_message), std::move(done_callback));
@@ -182,10 +181,7 @@
     absl::optional<chrome_browser_sharing::ServerChannelConfiguration>
         server_channel,
     SharingDevicePlatform sender_device_type,
-    base::TimeTicks message_received_time,
     std::unique_ptr<chrome_browser_sharing::ResponseMessage> response) {
-  LogSharingMessageHandlerTime(original_message_type,
-                               base::TimeTicks::Now() - message_received_time);
   if (!fcm_channel && !server_channel) {
     LOG(ERROR) << "Unable to find ack channel configuration";
     return;
diff --git a/chrome/browser/sharing/sharing_fcm_handler.h b/chrome/browser/sharing/sharing_fcm_handler.h
index ce502aa..c5c897a 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.h
+++ b/chrome/browser/sharing/sharing_fcm_handler.h
@@ -90,7 +90,6 @@
       absl::optional<chrome_browser_sharing::ServerChannelConfiguration>
           server_channel,
       SharingDevicePlatform sender_device_type,
-      base::TimeTicks message_received_time,
       std::unique_ptr<chrome_browser_sharing::ResponseMessage> response);
 
   void OnAckMessageSent(
diff --git a/chrome/browser/sharing/sharing_metrics.cc b/chrome/browser/sharing/sharing_metrics.cc
index 66455ce1..742339e6 100644
--- a/chrome/browser/sharing/sharing_metrics.cc
+++ b/chrome/browser/sharing/sharing_metrics.cc
@@ -175,14 +175,6 @@
                                 chrome_browser_sharing::MessageType_ARRAYSIZE);
 }
 
-void LogSharingRegistrationResult(SharingDeviceRegistrationResult result) {
-  base::UmaHistogramEnumeration("Sharing.DeviceRegistrationResult", result);
-}
-
-void LogSharingUnregistrationResult(SharingDeviceRegistrationResult result) {
-  base::UmaHistogramEnumeration("Sharing.DeviceUnregistrationResult", result);
-}
-
 void LogSharingDevicesToShow(SharingFeatureName feature,
                              const char* histogram_suffix,
                              int count) {
@@ -236,15 +228,6 @@
                                 /*value_max=*/20);
 }
 
-void LogSharingMessageHandlerTime(
-    chrome_browser_sharing::MessageType message_type,
-    base::TimeDelta time_taken) {
-  base::UmaHistogramMediumTimes(
-      base::StrCat({"Sharing.MessageHandlerTime.",
-                    SharingMessageTypeToString(message_type)}),
-      time_taken);
-}
-
 void LogSharingDialogShown(SharingFeatureName feature, SharingDialogType type) {
   base::UmaHistogramEnumeration(
       base::StrCat({"Sharing.", GetEnumStringValue(feature), "DialogShown"}),
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc
index 940f1d5..b740fd4 100644
--- a/chrome/browser/sharing/sharing_service.cc
+++ b/chrome/browser/sharing/sharing_service.cc
@@ -181,7 +181,6 @@
 
 void SharingService::OnDeviceRegistered(
     SharingDeviceRegistrationResult result) {
-  LogSharingRegistrationResult(result);
   switch (result) {
     case SharingDeviceRegistrationResult::kSuccess:
       backoff_entry_.InformOfRequest(true);
@@ -229,7 +228,6 @@
 
 void SharingService::OnDeviceUnregistered(
     SharingDeviceRegistrationResult result) {
-  LogSharingUnregistrationResult(result);
   if (IsSyncEnabledForSharing(sync_service_)) {
     // In case sync is enabled during un-registration, register it.
     state_ = State::REGISTERING;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index ee8672b..1c613120 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4611,6 +4611,8 @@
       "views/autofill/payments/virtual_card_manual_fallback_icon_view.h",
       "views/autofill/popup/popup_base_view.cc",
       "views/autofill/popup/popup_base_view.h",
+      "views/autofill/popup/popup_cell_utils.cc",
+      "views/autofill/popup/popup_cell_utils.h",
       "views/autofill/popup/popup_cell_view.cc",
       "views/autofill/popup/popup_cell_view.h",
       "views/autofill/popup/popup_row_strategy.cc",
@@ -6302,6 +6304,7 @@
 
   if (is_mac) {
     assert(toolkit_views)
+    configs += [ "//build/config/compiler:enable_arc" ]
     sources += [
       "cocoa/test/cocoa_test_helper.h",
       "cocoa/test/cocoa_test_helper.mm",
diff --git a/chrome/browser/ui/cocoa/test/cocoa_test_helper.mm b/chrome/browser/ui/cocoa/test/cocoa_test_helper.mm
index 32f1b6dd..d94077d 100644
--- a/chrome/browser/ui/cocoa/test/cocoa_test_helper.mm
+++ b/chrome/browser/ui/cocoa/test/cocoa_test_helper.mm
@@ -8,6 +8,10 @@
 #include "base/path_service.h"
 #include "chrome/common/chrome_constants.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 CocoaTestHelper::CocoaTestHelper() {
   CocoaTest::BootstrapCocoa();
 }
diff --git a/chrome/browser/ui/cocoa/test/run_loop_testing.mm b/chrome/browser/ui/cocoa/test/run_loop_testing.mm
index e2985af..e68fa79 100644
--- a/chrome/browser/ui/cocoa/test/run_loop_testing.mm
+++ b/chrome/browser/ui/cocoa/test/run_loop_testing.mm
@@ -3,15 +3,18 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ui/cocoa/test/run_loop_testing.h"
-#include "base/memory/raw_ptr.h"
 
 #import <Foundation/Foundation.h>
 
 #include <memory>
 
-#include "base/mac/scoped_nsobject.h"
+#include "base/memory/raw_ptr.h"
 #include "base/message_loop/message_pump_mac.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 // This class is scheduled with a delayed selector to quit the message pump.
 @interface CocoaQuitTask : NSObject {
  @private
@@ -36,25 +39,22 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
-namespace chrome {
-namespace testing {
+namespace chrome::testing {
 
 void NSRunLoopRunAllPending() {
-  std::unique_ptr<base::MessagePumpNSRunLoop> message_pump(
-      new base::MessagePumpNSRunLoop);
+  auto message_pump = std::make_unique<base::MessagePumpNSRunLoop>();
 
   // Put a delayed selector on the queue. All other pending delayed selectors
   // will run before this, after which the internal loop can end.
-  base::scoped_nsobject<CocoaQuitTask> quit_task(
-      [[CocoaQuitTask alloc] initWithMessagePump:message_pump.get()]);
+  CocoaQuitTask* quit_task =
+      [[CocoaQuitTask alloc] initWithMessagePump:message_pump.get()];
 
   [quit_task performSelector:@selector(doQuit) withObject:nil afterDelay:0];
 
-  // Spin the internal loop, running it until the quit task is pumped. Pass NULL
-  // because there is no delegate MessageLoop; only the Cocoa work queues will
-  // be pumped.
-  message_pump->Run(NULL);
+  // Spin the internal loop, running it until the quit task is pumped. Pass
+  // nullptr because there is no delegate MessageLoop; only the Cocoa work
+  // queues will be pumped.
+  message_pump->Run(nullptr);
 }
 
-}  // namespace testing
-}  // namespace chrome
+}  // namespace chrome::testing
diff --git a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
index e5584919a8..3942a161e 100644
--- a/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
+++ b/chrome/browser/ui/cookie_controls/cookie_controls_controller_unittest.cc
@@ -12,6 +12,7 @@
 #include "components/content_settings/browser/page_specific_content_settings.h"
 #include "components/content_settings/browser/ui/cookie_controls_view.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/content_settings/core/common/cookie_controls_breakage_confidence_level.h"
 #include "components/content_settings/core/common/cookie_controls_enforcement.h"
 #include "components/content_settings/core/common/features.h"
 #include "components/content_settings/core/common/pref_names.h"
@@ -45,6 +46,9 @@
                CookieControlsEnforcement,
                absl::optional<base::Time>));
   MOCK_METHOD(void, OnSitesCountChanged, (int, int));
+  MOCK_METHOD(void,
+              OnBreakageConfidenceLevelChanged,
+              (CookieControlsBreakageConfidenceLevel));
 };
 
 }  // namespace
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
index e21738d..591d5c8 100644
--- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
+++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
@@ -16,10 +16,10 @@
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h"
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/connectors_service.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -63,22 +63,21 @@
               ],
               "block_until_verdict": 1
           })";
-      enterprise_connectors::test::SetAnalysisConnector(
+      safe_browsing::SetAnalysisConnector(
           profile_->GetPrefs(), enterprise_connectors::FILE_ATTACHED, kEnabled);
-      enterprise_connectors::test::SetAnalysisConnector(
+      safe_browsing::SetAnalysisConnector(
           profile_->GetPrefs(), enterprise_connectors::BULK_DATA_ENTRY,
           kEnabled);
     } else {
-      enterprise_connectors::test::ClearAnalysisConnector(
+      safe_browsing::ClearAnalysisConnector(
           profile_->GetPrefs(), enterprise_connectors::FILE_ATTACHED);
-      enterprise_connectors::test::ClearAnalysisConnector(
+      safe_browsing::ClearAnalysisConnector(
           profile_->GetPrefs(), enterprise_connectors::BULK_DATA_ENTRY);
     }
 
     run_loop_ = std::make_unique<base::RunLoop>();
 
-    using FakeDelegate =
-        enterprise_connectors::test::FakeContentAnalysisDelegate;
+    using FakeDelegate = enterprise_connectors::FakeContentAnalysisDelegate;
 
     policy::SetDMTokenForTesting(policy::DMToken::CreateValidToken("dm_token"));
     auto callback = base::BindLambdaForTesting(
@@ -119,7 +118,7 @@
         });
     enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
         base::BindRepeating(
-            &enterprise_connectors::test::FakeContentAnalysisDelegate::Create,
+            &enterprise_connectors::FakeContentAnalysisDelegate::Create,
             run_loop_->QuitClosure(), callback, "dm_token"));
     enterprise_connectors::ContentAnalysisDelegate::DisableUIForTesting();
     enterprise_connectors::ContentAnalysisDelegate::
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc
new file mode 100644
index 0000000..d98253c
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc
@@ -0,0 +1,545 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/autofill/popup/popup_cell_utils.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/feature_list.h"
+#include "build/branding_buildflags.h"
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/autofill/autofill_popup_controller_utils.h"
+#include "chrome/browser/ui/autofill/autofill_popup_controller.h"
+#include "chrome/browser/ui/passwords/ui_utils.h"
+#include "chrome/browser/ui/views/autofill/popup/popup_base_view.h"
+#include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/chrome_typography.h"
+#include "components/autofill/core/browser/data_model/credit_card.h"
+#include "components/autofill/core/browser/ui/suggestion.h"
+#include "components/autofill/core/common/autofill_features.h"
+#include "components/autofill/core/common/autofill_payments_features.h"
+#include "components/omnibox/browser/vector_icons.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/menu/menu_config.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/flex_layout.h"
+#include "ui/views/layout/table_layout_view.h"
+#include "ui/views/view.h"
+
+namespace autofill::popup_cell_utils {
+
+namespace {
+
+// The default icon size used in the suggestion drop down.
+constexpr int kIconSize = 16;
+
+// Max width for the username and masked password.
+constexpr int kAutofillPopupUsernameMaxWidth = 272;
+
+// Max width for address profile suggestion text.
+constexpr int kAutofillPopupAddressProfileMaxWidth = 192;
+// Max width for address credit card suggestion text.
+constexpr int kAutofillPopupCreditCardMaxWidth = 192;
+
+// The additional height of the row in case it has two lines of text.
+constexpr int kAutofillPopupAdditionalDoubleRowHeight = 22;
+
+// The additional padding of the row in case it has three lines of text.
+constexpr int kAutofillPopupAdditionalPadding = 16;
+
+// Vertical spacing between labels in one row.
+constexpr int kAdjacentLabelsVerticalSpacing = 2;
+
+// The icon size used in the suggestion dropdown for displaying the Google
+// Password Manager icon in the Manager Passwords entry.
+constexpr int kGooglePasswordManagerIconSize = 20;
+
+// Returns the name of the network for payment method icons, empty string
+// otherwise.
+std::u16string GetIconAccessibleName(const std::string& icon_text) {
+  // Networks for which icons are currently shown.
+  if (icon_text == autofill::kAmericanExpressCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX);
+  }
+  if (icon_text == autofill::kDinersCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
+  }
+  if (icon_text == autofill::kDiscoverCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
+  }
+  if (icon_text == autofill::kEloCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_ELO);
+  }
+  if (icon_text == autofill::kJCBCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
+  }
+  if (icon_text == autofill::kMasterCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
+  }
+  if (icon_text == autofill::kMirCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MIR);
+  }
+  if (icon_text == autofill::kTroyCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_TROY);
+  }
+  if (icon_text == autofill::kUnionPay) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_UNION_PAY);
+  }
+  if (icon_text == autofill::kVisaCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
+  }
+  // Other networks.
+  if (icon_text == autofill::kGenericCard) {
+    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_GENERIC);
+  }
+  return std::u16string();
+}
+
+std::unique_ptr<views::ImageView> ImageViewFromImageSkia(
+    const gfx::ImageSkia& image_skia) {
+  if (image_skia.isNull()) {
+    return nullptr;
+  }
+  auto image_view = std::make_unique<views::ImageView>();
+  image_view->SetImage(image_skia);
+  return image_view;
+}
+
+std::unique_ptr<views::ImageView> GetIconImageViewByName(
+    const std::string& icon_str) {
+  if (icon_str.empty()) {
+    return nullptr;
+  }
+
+  // For http warning message, get icon images from VectorIcon, which is the
+  // same as security indicator icons in location bar.
+  if (icon_str == "httpWarning") {
+    return ImageViewFromVectorIcon(omnibox::kHttpIcon, kIconSize);
+  }
+
+  if (icon_str == "httpsInvalid") {
+    return std::make_unique<views::ImageView>(
+        ui::ImageModel::FromVectorIcon(vector_icons::kNotSecureWarningIcon,
+                                       ui::kColorAlertHighSeverity, kIconSize));
+  }
+
+  if (icon_str == "keyIcon") {
+    return ImageViewFromVectorIcon(kKeyIcon, kIconSize);
+  }
+
+  if (icon_str == "clearIcon") {
+    return ImageViewFromVectorIcon(kBackspaceIcon, kIconSize);
+  }
+
+  if (icon_str == "globeIcon") {
+    return ImageViewFromVectorIcon(kGlobeIcon, kIconSize);
+  }
+
+  if (icon_str == "accountIcon") {
+    return ImageViewFromVectorIcon(kAccountCircleIcon, kIconSize);
+  }
+
+  if (icon_str == "settingsIcon") {
+    return ImageViewFromVectorIcon(omnibox::kProductIcon, kIconSize);
+  }
+
+  if (icon_str == "empty") {
+    return ImageViewFromVectorIcon(omnibox::kHttpIcon, kIconSize);
+  }
+
+  if (icon_str == "device") {
+    return ImageViewFromVectorIcon(kDevicesIcon, kIconSize);
+  }
+
+  if (icon_str == "google") {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+    return ImageViewFromImageSkia(gfx::CreateVectorIcon(
+        vector_icons::kGoogleGLogoIcon, kIconSize, gfx::kPlaceholderColor));
+#else
+    return nullptr;
+#endif
+  }
+
+  if (icon_str == "googlePasswordManager") {
+    return ImageViewFromVectorIcon(GooglePasswordManagerVectorIcon(),
+                                   kGooglePasswordManagerIconSize);
+  }
+
+#if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  if (icon_str == "googlePay" || icon_str == "googlePayDark") {
+    return nullptr;
+  }
+#endif
+  // For other suggestion entries, get icon from PNG files.
+  int icon_id = GetIconResourceID(icon_str);
+  DCHECK_NE(icon_id, 0);
+  return ImageViewFromImageSkia(
+      *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(icon_id));
+}
+
+}  // namespace
+
+std::unique_ptr<views::ImageView> ImageViewFromVectorIcon(
+    const gfx::VectorIcon& vector_icon,
+    int icon_size = kIconSize) {
+  return std::make_unique<views::ImageView>(
+      ui::ImageModel::FromVectorIcon(vector_icon, ui::kColorIcon, icon_size));
+}
+
+std::u16string GetVoiceOverStringFromSuggestion(const Suggestion& suggestion) {
+  if (suggestion.voice_over) {
+    return *suggestion.voice_over;
+  }
+
+  std::vector<std::u16string> text;
+  auto add_if_not_empty = [&text](std::u16string value) {
+    if (!value.empty()) {
+      text.push_back(std::move(value));
+    }
+  };
+
+  add_if_not_empty(GetIconAccessibleName(suggestion.icon));
+  text.push_back(suggestion.main_text.value);
+  add_if_not_empty(suggestion.minor_text.value);
+
+  for (const std::vector<Suggestion::Text>& row : suggestion.labels) {
+    for (const Suggestion::Text& label : row) {
+      // `label_text` is not populated for footers or autocomplete entries.
+      add_if_not_empty(label.value);
+    }
+  }
+
+  // `additional_label` is only populated in a passwords context.
+  add_if_not_empty(suggestion.additional_label);
+
+  return base::JoinString(text, u" ");
+}
+
+gfx::Insets GetMarginsForContentCell(bool has_control_element) {
+  int left_margin = PopupBaseView::GetHorizontalMargin();
+  int right_margin = left_margin;
+
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillShowAutocompleteDeleteButton)) {
+    // If the feature is enabled, then the row already adds some extra
+    // horizontal margin on the left - deduct that.
+    left_margin = std::max(
+        0, left_margin - ChromeLayoutProvider::Get()->GetDistanceMetric(
+                             DISTANCE_CONTENT_LIST_VERTICAL_SINGLE));
+
+    // If there is no control element, then this is the only cell and the same
+    // correction needs to be made on the right side, too.
+    if (!has_control_element) {
+      right_margin = left_margin;
+    }
+  }
+  return gfx::Insets::TLBR(0, left_margin, 0, right_margin);
+}
+
+std::unique_ptr<views::ImageView> GetIconImageView(
+    const Suggestion& suggestion) {
+  if (!suggestion.custom_icon.IsEmpty()) {
+    return ImageViewFromImageSkia(suggestion.custom_icon.AsImageSkia());
+  }
+
+  return GetIconImageViewByName(suggestion.icon);
+}
+
+std::unique_ptr<views::ImageView> GetTrailingIconImageView(
+    const Suggestion& suggestion) {
+  return GetIconImageViewByName(suggestion.trailing_icon);
+}
+
+// Adds a spacer with `spacer_width` to `view`. `layout` must be the
+// LayoutManager of `view`.
+void AddSpacerWithSize(views::View& view,
+                       views::BoxLayout& layout,
+                       int spacer_width,
+                       bool resize) {
+  auto spacer = views::Builder<views::View>()
+                    .SetPreferredSize(gfx::Size(spacer_width, 1))
+                    .Build();
+  layout.SetFlexForView(view.AddChildView(std::move(spacer)),
+                        /*flex=*/resize ? 1 : 0,
+                        /*use_min_size=*/true);
+}
+
+// Creates the table in which all  the Autofill suggestion content apart from
+// leading and trailing icons is contained and adds it to `content_view`.
+// It registers `main_text_label`, `minor_text_label`, and `description_label`
+// with `content_view` for tracking, but assumes that the labels inside of of
+// `subtext_views` have already been registered for tracking with
+// `content_view`.
+void AddSuggestionContentTableToView(
+    std::unique_ptr<views::Label> main_text_label,
+    std::unique_ptr<views::Label> minor_text_label,
+    std::unique_ptr<views::Label> description_label,
+    std::vector<std::unique_ptr<views::View>> subtext_views,
+    PopupCellView& content_view) {
+  const int kDividerSpacing = ChromeLayoutProvider::Get()->GetDistanceMetric(
+      DISTANCE_RELATED_LABEL_HORIZONTAL_LIST);
+  auto content_table =
+      views::Builder<views::TableLayoutView>()
+          .AddColumn(views::LayoutAlignment::kStart,
+                     views::LayoutAlignment::kStretch,
+                     views::TableLayout::kFixedSize,
+                     views::TableLayout::ColumnSize::kUsePreferred, 0, 0)
+          .AddPaddingColumn(views::TableLayout::kFixedSize, kDividerSpacing)
+          .AddColumn(views::LayoutAlignment::kStart,
+                     views::LayoutAlignment::kStretch,
+                     views::TableLayout::kFixedSize,
+                     views::TableLayout::ColumnSize::kUsePreferred, 0, 0)
+          .Build();
+
+  // Major and minor text go into the first row, first column.
+  content_table->AddRows(1, 0);
+  if (minor_text_label) {
+    auto first_line_container = std::make_unique<views::View>();
+    first_line_container
+        ->SetLayoutManager(std::make_unique<views::FlexLayout>())
+        ->SetOrientation(views::LayoutOrientation::kHorizontal)
+        .SetMainAxisAlignment(views::LayoutAlignment::kStart)
+        .SetCrossAxisAlignment(views::LayoutAlignment::kCenter)
+        .SetIgnoreDefaultMainAxisMargins(true)
+        .SetCollapseMargins(true)
+        .SetDefault(
+            views::kMarginsKey,
+            gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
+                                   DISTANCE_RELATED_LABEL_HORIZONTAL_LIST)));
+
+    content_view.TrackLabel(
+        first_line_container->AddChildView(std::move(main_text_label)));
+    content_view.TrackLabel(
+        first_line_container->AddChildView(std::move(minor_text_label)));
+    content_table->AddChildView(std::move(first_line_container));
+  } else {
+    content_view.TrackLabel(
+        content_table->AddChildView(std::move(main_text_label)));
+  }
+
+  // The description goes into the first row, second column.
+  if (description_label) {
+    content_view.TrackLabel(
+        content_table->AddChildView(std::move(description_label)));
+  } else {
+    content_table->AddChildView(std::make_unique<views::View>());
+  }
+
+  // Every subtext label goes into an additional row.
+  for (std::unique_ptr<views::View>& subtext_view : subtext_views) {
+    content_table->AddPaddingRow(0, kAdjacentLabelsVerticalSpacing)
+        .AddRows(1, 0);
+    content_table->AddChildView(std::move(subtext_view));
+    content_table->AddChildView(std::make_unique<views::View>());
+  }
+  content_view.AddChildView(std::move(content_table));
+}
+
+// Creates the content structure shared by autocomplete, address, credit card,
+// and password suggestions.
+// - `minor_text_label`, `description_label`, and `subtext_labels` may all be
+// null or empty.
+// - `content_view` is the (assumed to be empty) view to which the content
+// structure for the `suggestion` is added.
+void AddSuggestionContentToView(
+    const Suggestion& suggestion,
+    std::unique_ptr<views::Label> main_text_label,
+    std::unique_ptr<views::Label> minor_text_label,
+    std::unique_ptr<views::Label> description_label,
+    std::vector<std::unique_ptr<views::View>> subtext_views,
+    PopupCellView& content_view) {
+  bool has_control_element =
+      suggestion.popup_item_id == PopupItemId::kAutocompleteEntry &&
+      base::FeatureList::IsEnabled(
+          features::kAutofillShowAutocompleteDeleteButton);
+  views::BoxLayout& layout =
+      *content_view.SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kHorizontal,
+          GetMarginsForContentCell(has_control_element)));
+
+  layout.set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::kCenter);
+
+  // Adjust the cell height based on the number of subtexts.
+  const int kStandardRowHeight =
+      views::MenuConfig::instance().touchable_menu_height;
+  const int kActualHeight =
+      kStandardRowHeight +
+      (subtext_views.empty() ? 0 : kAutofillPopupAdditionalDoubleRowHeight);
+  layout.set_minimum_cross_axis_size(kActualHeight);
+
+  // If there are three rows in total, add extra padding to avoid cramming.
+  DCHECK_LE(subtext_views.size(), 2u);
+  if (subtext_views.size() == 2u) {
+    layout.set_inside_border_insets(gfx::Insets::VH(
+        kAutofillPopupAdditionalPadding, PopupBaseView::GetHorizontalMargin()));
+  }
+
+  // The leading icon.
+  if (std::unique_ptr<views::ImageView> icon = GetIconImageView(suggestion)) {
+    content_view.AddChildView(std::move(icon));
+    AddSpacerWithSize(content_view, layout,
+                      PopupBaseView::GetHorizontalPadding(),
+                      /*resize=*/false);
+  }
+
+  // The actual content table.
+  AddSuggestionContentTableToView(
+      std::move(main_text_label), std::move(minor_text_label),
+      std::move(description_label), std::move(subtext_views), content_view);
+
+  // The trailing icon.
+  if (std::unique_ptr<views::ImageView> trailing_icon =
+          GetTrailingIconImageView(suggestion)) {
+    AddSpacerWithSize(content_view, layout,
+                      PopupBaseView::GetHorizontalPadding(),
+                      /*resize=*/true);
+    content_view.AddChildView(std::move(trailing_icon));
+  }
+
+  // Force a refresh to ensure all the labels'styles are correct.
+  content_view.RefreshStyle();
+}
+
+void FormatLabel(views::Label& label,
+                 const Suggestion::Text& text,
+                 base::WeakPtr<const AutofillPopupController> controller) {
+  DCHECK(controller);
+  if (controller->GetPopupType() == PopupType::kAddresses) {
+    label.SetMaximumWidthSingleLine(kAutofillPopupAddressProfileMaxWidth);
+  } else if (controller->GetPopupType() == PopupType::kCreditCards &&
+             text.should_truncate.value()) {
+    // should_truncate should only be set to true iff the experiments are
+    // enabled.
+    DCHECK(base::FeatureList::IsEnabled(
+        autofill::features::kAutofillEnableVirtualCardMetadata));
+    DCHECK(base::FeatureList::IsEnabled(
+        autofill::features::kAutofillEnableCardProductName));
+    label.SetMaximumWidthSingleLine(kAutofillPopupCreditCardMaxWidth);
+  }
+}
+
+// Creates a label for the suggestion's main text.
+std::unique_ptr<views::Label> CreateMainTextLabel(
+    const Suggestion::Text& main_text,
+    int text_style) {
+  return std::make_unique<views::Label>(
+      main_text.value, views::style::CONTEXT_DIALOG_BODY_TEXT,
+      !main_text.is_primary ? views::style::STYLE_PRIMARY : text_style);
+}
+
+// Creates a label for the suggestion's minor text.
+std::unique_ptr<views::Label> CreateMinorTextLabel(
+    const Suggestion::Text& minor_text) {
+  return minor_text.value.empty()
+             ? nullptr
+             : std::make_unique<views::Label>(
+                   minor_text.value, views::style::CONTEXT_DIALOG_BODY_TEXT,
+                   views::style::STYLE_SECONDARY);
+}
+
+std::unique_ptr<views::Label> CreateDescriptionLabel(
+    PopupCellView& content_view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number) {
+  const Suggestion& kSuggestion = controller->GetSuggestionAt(line_number);
+  if (kSuggestion.labels.empty()) {
+    return nullptr;
+  }
+
+  DCHECK_EQ(kSuggestion.labels.size(), 1u);
+  DCHECK_EQ(kSuggestion.labels[0].size(), 1u);
+
+  auto label = std::make_unique<views::Label>(
+      kSuggestion.labels[0][0].value, views::style::CONTEXT_DIALOG_BODY_TEXT,
+      views::style::STYLE_SECONDARY);
+  label->SetElideBehavior(gfx::ELIDE_HEAD);
+  label->SetMaximumWidthSingleLine(kAutofillPopupUsernameMaxWidth);
+  return label;
+}
+
+std::vector<std::unique_ptr<views::View>> CreateAndTrackSubtextViews(
+    PopupCellView& content_view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number) {
+  std::vector<std::unique_ptr<views::View>> result;
+  const int kHorizontalSpacing = ChromeLayoutProvider::Get()->GetDistanceMetric(
+      DISTANCE_RELATED_LABEL_HORIZONTAL_LIST);
+
+  for (const std::vector<Suggestion::Text>& label_row :
+       controller->GetSuggestionAt(line_number).labels) {
+    DCHECK_LE(label_row.size(), 2u);
+    DCHECK(!label_row.empty());
+    if (base::ranges::all_of(label_row, &std::u16string::empty,
+                             &Suggestion::Text::value)) {
+      // If a row is empty, do not include any further rows.
+      return result;
+    }
+
+    auto label_row_container_view =
+        views::Builder<views::BoxLayoutView>()
+            .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
+            .SetBetweenChildSpacing(kHorizontalSpacing)
+            .Build();
+    for (const Suggestion::Text& label_text : label_row) {
+      // If a column is empty, do not include any further columns.
+      if (label_text.value.empty()) {
+        break;
+      }
+      auto* label =
+          label_row_container_view->AddChildView(std::make_unique<views::Label>(
+              label_text.value,
+              ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL,
+              views::style::STYLE_SECONDARY));
+      content_view.TrackLabel(label);
+      FormatLabel(*label, label_text, controller);
+    }
+    result.push_back(std::move(label_row_container_view));
+  }
+
+  return result;
+}
+
+// Adds the callbacks for the content area to `content_view`.
+void AddCallbacksToContentView(
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number,
+    PopupCellView& content_view) {
+  content_view.SetOnSelectedCallback(base::BindRepeating(
+      &AutofillPopupController::SelectSuggestion, controller, line_number));
+  content_view.SetOnUnselectedCallback(base::BindRepeating(
+      &AutofillPopupController::SelectSuggestion, controller, absl::nullopt));
+  content_view.SetOnAcceptedCallback(base::BindRepeating(
+      &AutofillPopupController::AcceptSuggestion, controller, line_number));
+}
+
+void AddSuggestionStrategyContentCellChildren(
+    PopupCellView* view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number) {
+  DCHECK(controller);
+  const Suggestion& kSuggestion = controller->GetSuggestionAt(line_number);
+  // Add the label views.
+  std::unique_ptr<views::Label> main_text_label = CreateMainTextLabel(
+      kSuggestion.main_text, views::style::TextStyle::STYLE_PRIMARY);
+  FormatLabel(*main_text_label, kSuggestion.main_text, controller);
+  AddSuggestionContentToView(
+      kSuggestion, std::move(main_text_label),
+      CreateMinorTextLabel(kSuggestion.minor_text),
+      /*description_label=*/nullptr,
+      CreateAndTrackSubtextViews(*view, controller, line_number), *view);
+
+  // Prepare the callbacks to the controller.
+  AddCallbacksToContentView(controller, line_number, *view);
+}
+
+}  // namespace autofill::popup_cell_utils
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_utils.h b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.h
new file mode 100644
index 0000000..248f11f
--- /dev/null
+++ b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.h
@@ -0,0 +1,150 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_POPUP_CELL_UTILS_H_
+#define CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_POPUP_CELL_UTILS_H_
+
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/ui/suggestion.h"
+#include "ui/gfx/vector_icon_types.h"
+
+namespace views {
+class View;
+class Label;
+class BoxLayout;
+class ImageView;
+}  // namespace views
+
+namespace autofill {
+class AutofillPopupController;
+class PopupCellView;
+}  // namespace autofill
+
+namespace gfx {
+class Insets;
+}
+
+namespace autofill::popup_cell_utils {
+
+// Returns the padding for a content cell.
+//
+// For content cells that make up the entire Autofill popup row (i.e. there is
+// no control element), the following reasoning applies:
+// * If `kAutofillShowAutocompleteDeleteButton` is on, then there is padding
+//   with distance `DISTANCE_CONTENT_LIST_VERTICAL_SINGLE` between the edge of
+//   the Autofill popup row and the start of the content cell.
+// * In addition, there is also padding inside the content cell. Together, these
+//   two paddings need to add up to `PopupBaseView::GetHorizontalMargin`, since
+//   to ensure that the content inside the content cell is aligned with the
+//   popup bubble's arrow.
+// * Similarly, the right padding of the content cell needs to be adjusted.
+//
+//           / \
+//          /   \
+//         /     \
+//        / arrow \
+// ┌─────/         \────────────────────────┐
+// │  ┌──────────────────────────────────┐  │
+// │  │  ┌─────────┐ ┌────────────────┐  │  │
+// ├──┼──┤         │ │                │  │  │
+// ├──┤▲ │  Icon   │ │ Text labels    │  │  │
+// │▲ │| │         │ │                │  │  │
+// ││ ││ └─────────┘ └────────────────┘  │  │
+// ││ └┼─────────────────────────────────┘  │
+// └┼──┼────────────────────────────────────┘
+//  │  │
+//  │  PopupBaseView::GetHorizontalMargin()
+//  │
+//  DISTANCE_CONTENT_LIST_VERTICAL_SINGLE
+//
+// If the popup row has a control element, then the adjustment does not need
+// to be made for the right padding, since the right side of the content cell
+// borders another cell and not the right padding area of the popup row.
+gfx::Insets GetMarginsForContentCell(bool has_control_element);
+
+std::u16string GetVoiceOverStringFromSuggestion(const Suggestion& suggestion);
+
+std::unique_ptr<views::ImageView> GetIconImageView(
+    const Suggestion& suggestion);
+
+std::unique_ptr<views::ImageView> GetTrailingIconImageView(
+    const Suggestion& suggestion);
+
+// Adds a spacer with `spacer_width` to `view`. `layout` must be the
+// LayoutManager of `view`.
+void AddSpacerWithSize(views::View& view,
+                       views::BoxLayout& layout,
+                       int spacer_width,
+                       bool resize);
+
+// Creates the table in which all the Autofill suggestion content apart from
+// leading and trailing icons is contained and adds it to `content_view`.
+// It registers `main_text_label`, `minor_text_label`, and `description_label`
+// with `content_view` for tracking, but assumes that the labels inside of of
+// `subtext_views` have already been registered for tracking with
+// `content_view`.
+void AddSuggestionContentTableToView(
+    std::unique_ptr<views::Label> main_text_label,
+    std::unique_ptr<views::Label> minor_text_label,
+    std::unique_ptr<views::Label> description_label,
+    std::vector<std::unique_ptr<views::View>> subtext_views,
+    PopupCellView& content_view);
+
+// Creates the content structure shared by autocomplete, address, credit card,
+// and password suggestions.
+// - `minor_text_label`, `description_label`, and `subtext_labels` may all be
+// null or empty.
+// - `content_view` is the (assumed to be empty) view to which the content
+// structure for the `suggestion` is added.
+void AddSuggestionContentToView(
+    const Suggestion& suggestion,
+    std::unique_ptr<views::Label> main_text_label,
+    std::unique_ptr<views::Label> minor_text_label,
+    std::unique_ptr<views::Label> description_label,
+    std::vector<std::unique_ptr<views::View>> subtext_views,
+    PopupCellView& content_view);
+
+void FormatLabel(views::Label& label,
+                 const Suggestion::Text& text,
+                 base::WeakPtr<const AutofillPopupController> controller);
+
+// Creates a label for the suggestion's main text.
+std::unique_ptr<views::Label> CreateMainTextLabel(
+    const Suggestion::Text& main_text,
+    int text_style);
+
+// Creates a label for the suggestion's minor text.
+std::unique_ptr<views::Label> CreateMinorTextLabel(
+    const Suggestion::Text& minor_text);
+
+std::vector<std::unique_ptr<views::View>> CreateAndTrackSubtextViews(
+    PopupCellView& content_view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number);
+
+std::unique_ptr<views::Label> CreateDescriptionLabel(
+    PopupCellView& content_view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number);
+
+// Adds the callbacks for the content area to `content_view`.
+void AddCallbacksToContentView(
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number,
+    PopupCellView& content_view);
+
+void AddSuggestionStrategyContentCellChildren(
+    PopupCellView* view,
+    base::WeakPtr<AutofillPopupController> controller,
+    int line_number);
+
+std::unique_ptr<views::ImageView> ImageViewFromVectorIcon(
+    const gfx::VectorIcon& vector_icon,
+    int icon_size);
+
+}  // namespace autofill::popup_cell_utils
+
+#endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_POPUP_POPUP_CELL_UTILS_H_
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc
index f7d9181f..a662ba8 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc
+++ b/chrome/browser/ui/views/autofill/popup/popup_row_strategy.cc
@@ -4,86 +4,31 @@
 
 #include "chrome/browser/ui/views/autofill/popup/popup_row_strategy.h"
 
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/containers/contains.h"
 #include "base/feature_list.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "base/memory/weak_ptr.h"
-#include "base/ranges/algorithm.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "build/branding_buildflags.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/autofill/autofill_popup_controller_utils.h"
 #include "chrome/browser/ui/autofill/autofill_popup_controller.h"
-#include "chrome/browser/ui/passwords/ui_utils.h"
 #include "chrome/browser/ui/views/autofill/popup/popup_base_view.h"
-#include "chrome/browser/ui/views/autofill/popup/popup_cell_view.h"
-#include "chrome/browser/ui/views/chrome_layout_provider.h"
-#include "chrome/browser/ui/views/chrome_typography.h"
-#include "components/autofill/core/browser/data_model/credit_card.h"
+#include "chrome/browser/ui/views/autofill/popup/popup_cell_utils.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
-#include "components/autofill/core/browser/ui/popup_item_ids.h"
-#include "components/autofill/core/browser/ui/popup_types.h"
-#include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/autofill_features.h"
-#include "components/autofill/core/common/autofill_payments_features.h"
-#include "components/omnibox/browser/vector_icons.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/vector_icons/vector_icons.h"
-#include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
-#include "ui/base/models/image_model.h"
-#include "ui/color/color_id.h"
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/gfx/vector_icon_types.h"
-#include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
 #include "ui/views/controls/menu/menu_config.h"
 #include "ui/views/controls/throbber.h"
-#include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/box_layout_view.h"
-#include "ui/views/layout/flex_layout.h"
-#include "ui/views/layout/table_layout_view.h"
 
 namespace autofill {
 
 namespace {
 
+// The default icon size used in the suggestion drop down.
+constexpr int kTrashCanLightIconSize = 12;
+
 // Max width for the username and masked password.
 constexpr int kAutofillPopupUsernameMaxWidth = 272;
 constexpr int kAutofillPopupPasswordMaxWidth = 108;
 
-// Max width for address profile suggestion text.
-constexpr int kAutofillPopupAddressProfileMaxWidth = 192;
-// Max width for address credit card suggestion text.
-constexpr int kAutofillPopupCreditCardMaxWidth = 192;
-
-// The additional height of the row in case it has two lines of text.
-constexpr int kAutofillPopupAdditionalDoubleRowHeight = 22;
-
-// The additional padding of the row in case it has three lines of text.
-constexpr int kAutofillPopupAdditionalPadding = 16;
-
-// Vertical spacing between labels in one row.
-constexpr int kAdjacentLabelsVerticalSpacing = 2;
-
-// The default icon size used in the suggestion drop down.
-constexpr int kIconSize = 16;
-constexpr int kTrashCanLightIconSize = 12;
-
-// The icon size used in the suggestion dropdown for displaying the Google
-// Password Manager icon in the Manager Passwords entry.
-constexpr int kGooglePasswordManagerIconSize = 20;
-
 constexpr int kAutocompleteDeleteIconHorizontalPadding = 8;
 
 // Popup items that use a leading icon instead of a trailing one.
@@ -97,417 +42,6 @@
     PopupItemId::kPasswordAccountStorageReSignin,
     PopupItemId::kPasswordAccountStorageOptInAndGenerate};
 
-std::unique_ptr<views::ImageView> ImageViewFromImageSkia(
-    const gfx::ImageSkia& image_skia) {
-  if (image_skia.isNull()) {
-    return nullptr;
-  }
-  auto image_view = std::make_unique<views::ImageView>();
-  image_view->SetImage(image_skia);
-  return image_view;
-}
-
-std::unique_ptr<views::ImageView> ImageViewFromVectorIcon(
-    const gfx::VectorIcon& vector_icon,
-    int icon_size = kIconSize) {
-  return std::make_unique<views::ImageView>(
-      ui::ImageModel::FromVectorIcon(vector_icon, ui::kColorIcon, icon_size));
-}
-
-std::unique_ptr<views::ImageView> GetIconImageViewByName(
-    const std::string& icon_str) {
-  if (icon_str.empty()) {
-    return nullptr;
-  }
-
-  // For http warning message, get icon images from VectorIcon, which is the
-  // same as security indicator icons in location bar.
-  if (icon_str == "httpWarning") {
-    return ImageViewFromVectorIcon(omnibox::kHttpIcon);
-  }
-
-  if (icon_str == "httpsInvalid") {
-    return std::make_unique<views::ImageView>(
-        ui::ImageModel::FromVectorIcon(vector_icons::kNotSecureWarningIcon,
-                                       ui::kColorAlertHighSeverity, kIconSize));
-  }
-
-  if (icon_str == "keyIcon") {
-    return ImageViewFromVectorIcon(kKeyIcon);
-  }
-
-  if (icon_str == "clearIcon") {
-    return ImageViewFromVectorIcon(kBackspaceIcon);
-  }
-
-  if (icon_str == "globeIcon") {
-    return ImageViewFromVectorIcon(kGlobeIcon);
-  }
-
-  if (icon_str == "accountIcon") {
-    return ImageViewFromVectorIcon(kAccountCircleIcon);
-  }
-
-  if (icon_str == "settingsIcon") {
-    return ImageViewFromVectorIcon(omnibox::kProductIcon);
-  }
-
-  if (icon_str == "empty") {
-    return ImageViewFromVectorIcon(omnibox::kHttpIcon);
-  }
-
-  if (icon_str == "device") {
-    return ImageViewFromVectorIcon(kDevicesIcon);
-  }
-
-  if (icon_str == "google") {
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-    return ImageViewFromImageSkia(gfx::CreateVectorIcon(
-        vector_icons::kGoogleGLogoIcon, kIconSize, gfx::kPlaceholderColor));
-#else
-    return nullptr;
-#endif
-  }
-
-  if (icon_str == "googlePasswordManager") {
-    return ImageViewFromVectorIcon(GooglePasswordManagerVectorIcon(),
-                                   kGooglePasswordManagerIconSize);
-  }
-
-#if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  if (icon_str == "googlePay" || icon_str == "googlePayDark") {
-    return nullptr;
-  }
-#endif
-  // For other suggestion entries, get icon from PNG files.
-  int icon_id = GetIconResourceID(icon_str);
-  DCHECK_NE(icon_id, 0);
-  return ImageViewFromImageSkia(
-      *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(icon_id));
-}
-
-std::unique_ptr<views::ImageView> GetIconImageView(
-    const Suggestion& suggestion) {
-  if (!suggestion.custom_icon.IsEmpty()) {
-    return ImageViewFromImageSkia(suggestion.custom_icon.AsImageSkia());
-  }
-
-  return GetIconImageViewByName(suggestion.icon);
-}
-
-std::unique_ptr<views::ImageView> GetTrailingIconImageView(
-    const Suggestion& suggestion) {
-  return GetIconImageViewByName(suggestion.trailing_icon);
-}
-
-// Creates a label for the suggestion's main text.
-std::unique_ptr<views::Label> CreateMainTextLabel(
-    const Suggestion::Text& main_text,
-    int text_style) {
-  return std::make_unique<views::Label>(
-      main_text.value, views::style::CONTEXT_DIALOG_BODY_TEXT,
-      !main_text.is_primary ? views::style::STYLE_PRIMARY : text_style);
-}
-
-// Creates a label for the suggestion's minor text.
-std::unique_ptr<views::Label> CreateMinorTextLabel(
-    const Suggestion::Text& minor_text) {
-  return minor_text.value.empty()
-             ? nullptr
-             : std::make_unique<views::Label>(
-                   minor_text.value, views::style::CONTEXT_DIALOG_BODY_TEXT,
-                   views::style::STYLE_SECONDARY);
-}
-
-// Adds a spacer with `spacer_width` to `view`. `layout` must be the
-// LayoutManager of `view`.
-void AddSpacerWithSize(views::View& view,
-                       views::BoxLayout& layout,
-                       int spacer_width,
-                       bool resize) {
-  auto spacer = views::Builder<views::View>()
-                    .SetPreferredSize(gfx::Size(spacer_width, 1))
-                    .Build();
-  layout.SetFlexForView(view.AddChildView(std::move(spacer)),
-                        /*flex=*/resize ? 1 : 0,
-                        /*use_min_size=*/true);
-}
-
-// Returns the padding for a content cell.
-//
-// For content cells that make up the entire Autofill popup row (i.e. there is
-// no control element), the following reasoning applies:
-// * If `kAutofillShowAutocompleteDeleteButton` is on, then there is padding
-//   with distance `DISTANCE_CONTENT_LIST_VERTICAL_SINGLE` between the edge of
-//   the Autofill popup row and the start of the content cell.
-// * In addition, there is also padding inside the content cell. Together, these
-//   two paddings need to add up to `PopupBaseView::GetHorizontalMargin`, since
-//   to ensure that the content inside the content cell is aligned with the
-//   popup bubble's arrow.
-// * Similarly, the right padding of the content cell needs to be adjusted.
-//
-//           / \
-//          /   \
-//         /     \
-//        / arrow \
-// ┌─────/         \────────────────────────┐
-// │  ┌──────────────────────────────────┐  │
-// │  │  ┌─────────┐ ┌────────────────┐  │  │
-// ├──┼──┤         │ │                │  │  │
-// ├──┤▲ │  Icon   │ │ Text labels    │  │  │
-// │▲ │| │         │ │                │  │  │
-// ││ ││ └─────────┘ └────────────────┘  │  │
-// ││ └┼─────────────────────────────────┘  │
-// └┼──┼────────────────────────────────────┘
-//  │  │
-//  │  PopupBaseView::GetHorizontalMargin()
-//  │
-//  DISTANCE_CONTENT_LIST_VERTICAL_SINGLE
-//
-// If the popup row has a control element, then the adjustment does not need
-// to be made for the right padding, since the right side of the content cell
-// borders another cell and not the right padding area of the popup row.
-gfx::Insets GetMarginsForContentCell(bool has_control_element) {
-  int left_margin = PopupBaseView::GetHorizontalMargin();
-  int right_margin = left_margin;
-
-  if (base::FeatureList::IsEnabled(
-          features::kAutofillShowAutocompleteDeleteButton)) {
-    // If the feature is enabled, then the row already adds some extra
-    // horizontal margin on the left - deduct that.
-    left_margin = std::max(
-        0, left_margin - ChromeLayoutProvider::Get()->GetDistanceMetric(
-                             DISTANCE_CONTENT_LIST_VERTICAL_SINGLE));
-
-    // If there is no control element, then this is the only cell and the same
-    // correction needs to be made on the right side, too.
-    if (!has_control_element) {
-      right_margin = left_margin;
-    }
-  }
-  return gfx::Insets::TLBR(0, left_margin, 0, right_margin);
-}
-
-// Creates the table in which all the Autofill suggestion content apart from
-// leading and trailing icons is contained and adds it to `content_view`.
-// It registers `main_text_label`, `minor_text_label`, and `description_label`
-// with `content_view` for tracking, but assumes that the labels inside of of
-// `subtext_views` have already been registered for tracking with
-// `content_view`.
-void AddSuggestionContentTableToView(
-    std::unique_ptr<views::Label> main_text_label,
-    std::unique_ptr<views::Label> minor_text_label,
-    std::unique_ptr<views::Label> description_label,
-    std::vector<std::unique_ptr<views::View>> subtext_views,
-    PopupCellView& content_view) {
-  const int kDividerSpacing = ChromeLayoutProvider::Get()->GetDistanceMetric(
-      DISTANCE_RELATED_LABEL_HORIZONTAL_LIST);
-  auto content_table =
-      views::Builder<views::TableLayoutView>()
-          .AddColumn(views::LayoutAlignment::kStart,
-                     views::LayoutAlignment::kStretch,
-                     views::TableLayout::kFixedSize,
-                     views::TableLayout::ColumnSize::kUsePreferred, 0, 0)
-          .AddPaddingColumn(views::TableLayout::kFixedSize, kDividerSpacing)
-          .AddColumn(views::LayoutAlignment::kStart,
-                     views::LayoutAlignment::kStretch,
-                     views::TableLayout::kFixedSize,
-                     views::TableLayout::ColumnSize::kUsePreferred, 0, 0)
-          .Build();
-
-  // Major and minor text go into the first row, first column.
-  content_table->AddRows(1, 0);
-  if (minor_text_label) {
-    auto first_line_container = std::make_unique<views::View>();
-    first_line_container
-        ->SetLayoutManager(std::make_unique<views::FlexLayout>())
-        ->SetOrientation(views::LayoutOrientation::kHorizontal)
-        .SetMainAxisAlignment(views::LayoutAlignment::kStart)
-        .SetCrossAxisAlignment(views::LayoutAlignment::kCenter)
-        .SetIgnoreDefaultMainAxisMargins(true)
-        .SetCollapseMargins(true)
-        .SetDefault(
-            views::kMarginsKey,
-            gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
-                                   DISTANCE_RELATED_LABEL_HORIZONTAL_LIST)));
-
-    content_view.TrackLabel(
-        first_line_container->AddChildView(std::move(main_text_label)));
-    content_view.TrackLabel(
-        first_line_container->AddChildView(std::move(minor_text_label)));
-    content_table->AddChildView(std::move(first_line_container));
-  } else {
-    content_view.TrackLabel(
-        content_table->AddChildView(std::move(main_text_label)));
-  }
-
-  // The description goes into the first row, second column.
-  if (description_label) {
-    content_view.TrackLabel(
-        content_table->AddChildView(std::move(description_label)));
-  } else {
-    content_table->AddChildView(std::make_unique<views::View>());
-  }
-
-  // Every subtext label goes into an additional row.
-  for (std::unique_ptr<views::View>& subtext_view : subtext_views) {
-    content_table->AddPaddingRow(0, kAdjacentLabelsVerticalSpacing)
-        .AddRows(1, 0);
-    content_table->AddChildView(std::move(subtext_view));
-    content_table->AddChildView(std::make_unique<views::View>());
-  }
-  content_view.AddChildView(std::move(content_table));
-}
-
-// Creates the content structure shared by autocomplete, address, credit card,
-// and password suggestions.
-// - `minor_text_label`, `description_label`, and `subtext_labels` may all be
-// null or empty.
-// - `content_view` is the (assumed to be empty) view to which the content
-// structure for the `suggestion` is added.
-void AddSuggestionContentToView(
-    const Suggestion& suggestion,
-    std::unique_ptr<views::Label> main_text_label,
-    std::unique_ptr<views::Label> minor_text_label,
-    std::unique_ptr<views::Label> description_label,
-    std::vector<std::unique_ptr<views::View>> subtext_views,
-    PopupCellView& content_view) {
-  bool has_control_element =
-      suggestion.popup_item_id == PopupItemId::kAutocompleteEntry &&
-      base::FeatureList::IsEnabled(
-          features::kAutofillShowAutocompleteDeleteButton);
-  views::BoxLayout& layout =
-      *content_view.SetLayoutManager(std::make_unique<views::BoxLayout>(
-          views::BoxLayout::Orientation::kHorizontal,
-          GetMarginsForContentCell(has_control_element)));
-
-  layout.set_cross_axis_alignment(
-      views::BoxLayout::CrossAxisAlignment::kCenter);
-
-  // Adjust the cell height based on the number of subtexts.
-  const int kStandardRowHeight =
-      views::MenuConfig::instance().touchable_menu_height;
-  const int kActualHeight =
-      kStandardRowHeight +
-      (subtext_views.empty() ? 0 : kAutofillPopupAdditionalDoubleRowHeight);
-  layout.set_minimum_cross_axis_size(kActualHeight);
-
-  // If there are three rows in total, add extra padding to avoid cramming.
-  DCHECK_LE(subtext_views.size(), 2u);
-  if (subtext_views.size() == 2u) {
-    layout.set_inside_border_insets(gfx::Insets::VH(
-        kAutofillPopupAdditionalPadding, PopupBaseView::GetHorizontalMargin()));
-  }
-
-  // The leading icon.
-  if (std::unique_ptr<views::ImageView> icon = GetIconImageView(suggestion)) {
-    content_view.AddChildView(std::move(icon));
-    AddSpacerWithSize(content_view, layout,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/false);
-  }
-
-  // The actual content table.
-  AddSuggestionContentTableToView(
-      std::move(main_text_label), std::move(minor_text_label),
-      std::move(description_label), std::move(subtext_views), content_view);
-
-  // The trailing icon.
-  if (std::unique_ptr<views::ImageView> trailing_icon =
-          GetTrailingIconImageView(suggestion)) {
-    AddSpacerWithSize(content_view, layout,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/true);
-    content_view.AddChildView(std::move(trailing_icon));
-  }
-
-  // Force a refresh to ensure all the labels'styles are correct.
-  content_view.RefreshStyle();
-}
-
-// Returns the name of the network for payment method icons, empty string
-// otherwise.
-std::u16string GetIconAccessibleName(const std::string& icon_text) {
-  // Networks for which icons are currently shown.
-  if (icon_text == autofill::kAmericanExpressCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_AMEX);
-  }
-  if (icon_text == autofill::kDinersCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DINERS);
-  }
-  if (icon_text == autofill::kDiscoverCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_DISCOVER);
-  }
-  if (icon_text == autofill::kEloCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_ELO);
-  }
-  if (icon_text == autofill::kJCBCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB);
-  }
-  if (icon_text == autofill::kMasterCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD);
-  }
-  if (icon_text == autofill::kMirCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MIR);
-  }
-  if (icon_text == autofill::kTroyCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_TROY);
-  }
-  if (icon_text == autofill::kUnionPay) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_UNION_PAY);
-  }
-  if (icon_text == autofill::kVisaCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA);
-  }
-  // Other networks.
-  if (icon_text == autofill::kGenericCard) {
-    return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_GENERIC);
-  }
-  return std::u16string();
-}
-
-std::u16string GetVoiceOverStringFromSuggestion(const Suggestion& suggestion) {
-  if (suggestion.voice_over) {
-    return *suggestion.voice_over;
-  }
-
-  std::vector<std::u16string> text;
-  auto add_if_not_empty = [&text](std::u16string value) {
-    if (!value.empty()) {
-      text.push_back(std::move(value));
-    }
-  };
-
-  add_if_not_empty(GetIconAccessibleName(suggestion.icon));
-  text.push_back(suggestion.main_text.value);
-  add_if_not_empty(suggestion.minor_text.value);
-
-  for (const std::vector<Suggestion::Text>& row : suggestion.labels) {
-    for (const Suggestion::Text& label : row) {
-      // `label_text` is not populated for footers or autocomplete entries.
-      add_if_not_empty(label.value);
-    }
-  }
-
-  // `additional_label` is only populated in a passwords context.
-  add_if_not_empty(suggestion.additional_label);
-
-  return base::JoinString(text, u" ");
-}
-
-// Adds the callbacks for the content area to `content_view`.
-void AddCallbacksToContentView(
-    base::WeakPtr<AutofillPopupController> controller,
-    int line_number,
-    PopupCellView& content_view) {
-  content_view.SetOnSelectedCallback(base::BindRepeating(
-      &AutofillPopupController::SelectSuggestion, controller, line_number));
-  content_view.SetOnUnselectedCallback(base::BindRepeating(
-      &AutofillPopupController::SelectSuggestion, controller, absl::nullopt));
-  content_view.SetOnAcceptedCallback(base::BindRepeating(
-      &AutofillPopupController::AcceptSuggestion, controller, line_number));
-}
-
 // ********************* AccessibilityDelegate implementations *****************
 
 // ********************* ContentItemAccessibilityDelegate  *********************
@@ -538,7 +72,7 @@
     int line_number) {
   DCHECK(controller);
 
-  voice_over_string_ = GetVoiceOverStringFromSuggestion(
+  voice_over_string_ = popup_cell_utils::GetVoiceOverStringFromSuggestion(
       controller->GetSuggestionAt(line_number));
 
   set_size_ = 0;
@@ -590,7 +124,7 @@
   DCHECK(controller);
   voice_over_string_ = l10n_util::GetStringFUTF16(
       IDS_AUTOFILL_DELETE_AUTOCOMPLETE_SUGGESTION_A11Y_HINT,
-      GetVoiceOverStringFromSuggestion(
+      popup_cell_utils::GetVoiceOverStringFromSuggestion(
           controller->GetSuggestionAt(line_number)));
 }
 
@@ -643,77 +177,26 @@
           .Build();
 
   // Add the actual views.
-  std::unique_ptr<views::Label> main_text_label = CreateMainTextLabel(
-      kSuggestion.main_text, views::style::TextStyle::STYLE_PRIMARY);
-  FormatLabel(*main_text_label, kSuggestion.main_text);
-  AddSuggestionContentToView(kSuggestion, std::move(main_text_label),
-                             CreateMinorTextLabel(kSuggestion.minor_text),
-                             /*description_label=*/nullptr,
-                             CreateAndTrackSubtextViews(*view), *view);
+  std::unique_ptr<views::Label> main_text_label =
+      popup_cell_utils::CreateMainTextLabel(
+          kSuggestion.main_text, views::style::TextStyle::STYLE_PRIMARY);
+  popup_cell_utils::FormatLabel(*main_text_label, kSuggestion.main_text,
+                                GetController());
+  popup_cell_utils::AddSuggestionContentToView(
+      kSuggestion, std::move(main_text_label),
+      popup_cell_utils::CreateMinorTextLabel(kSuggestion.minor_text),
+      /*description_label=*/nullptr,
+      popup_cell_utils::CreateAndTrackSubtextViews(*view, GetController(),
+                                                   GetLineNumber()),
+      *view);
 
   // Prepare the callbacks to the controller.
-  AddCallbacksToContentView(GetController(), GetLineNumber(), *view);
+  popup_cell_utils::AddCallbacksToContentView(GetController(), GetLineNumber(),
+                                              *view);
 
   return view;
 }
 
-std::vector<std::unique_ptr<views::View>>
-PopupSuggestionStrategy::CreateAndTrackSubtextViews(
-    PopupCellView& content_view) const {
-  std::vector<std::unique_ptr<views::View>> result;
-  const int kHorizontalSpacing = ChromeLayoutProvider::Get()->GetDistanceMetric(
-      DISTANCE_RELATED_LABEL_HORIZONTAL_LIST);
-
-  for (const std::vector<Suggestion::Text>& label_row :
-       GetController()->GetSuggestionAt(GetLineNumber()).labels) {
-    DCHECK_LE(label_row.size(), 2u);
-    DCHECK(!label_row.empty());
-    if (base::ranges::all_of(label_row, &std::u16string::empty,
-                             &Suggestion::Text::value)) {
-      // If a row is empty, do not include any further rows.
-      return result;
-    }
-
-    auto label_row_container_view =
-        views::Builder<views::BoxLayoutView>()
-            .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
-            .SetBetweenChildSpacing(kHorizontalSpacing)
-            .Build();
-    for (const Suggestion::Text& label_text : label_row) {
-      // If a column is empty, do not include any further columns.
-      if (label_text.value.empty()) {
-        break;
-      }
-      auto* label =
-          label_row_container_view->AddChildView(std::make_unique<views::Label>(
-              label_text.value,
-              ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL,
-              views::style::STYLE_SECONDARY));
-      content_view.TrackLabel(label);
-      FormatLabel(*label, label_text);
-    }
-    result.push_back(std::move(label_row_container_view));
-  }
-
-  return result;
-}
-
-void PopupSuggestionStrategy::FormatLabel(views::Label& label,
-                                          const Suggestion::Text& text) const {
-  if (GetPopupType() == PopupType::kAddresses) {
-    label.SetMaximumWidthSingleLine(kAutofillPopupAddressProfileMaxWidth);
-  } else if (GetPopupType() == PopupType::kCreditCards &&
-             text.should_truncate.value()) {
-    // should_truncate should only be set to true iff the experiments are
-    // enabled.
-    DCHECK(base::FeatureList::IsEnabled(
-        autofill::features::kAutofillEnableVirtualCardMetadata));
-    DCHECK(base::FeatureList::IsEnabled(
-        autofill::features::kAutofillEnableCardProductName));
-    label.SetMaximumWidthSingleLine(kAutofillPopupCreditCardMaxWidth);
-  }
-}
-
 std::unique_ptr<PopupCellView> PopupSuggestionStrategy::CreateControl() {
   if (!GetController()) {
     return nullptr;
@@ -734,8 +217,9 @@
     view->SetLayoutManager(std::make_unique<views::BoxLayout>(
         views::BoxLayout::Orientation::kHorizontal,
         gfx::Insets::VH(0, kAutocompleteDeleteIconHorizontalPadding)));
-    views::ImageView* delete_icon = view->AddChildView(
-        ImageViewFromVectorIcon(kTrashCanLightIcon, kTrashCanLightIconSize));
+    views::ImageView* delete_icon =
+        view->AddChildView(popup_cell_utils::ImageViewFromVectorIcon(
+            kTrashCanLightIcon, kTrashCanLightIconSize));
     // The tooltip is set for both the cell and the image to ensure that it is
     // also shown over the padding area.
     delete_icon->SetTooltipText(l10n_util::GetStringUTF16(
@@ -783,17 +267,19 @@
           .Build();
 
   // Add the actual views.
-  std::unique_ptr<views::Label> main_text_label = CreateMainTextLabel(
-      kSuggestion.main_text, views::style::TextStyle::STYLE_PRIMARY);
+  std::unique_ptr<views::Label> main_text_label =
+      popup_cell_utils::CreateMainTextLabel(
+          kSuggestion.main_text, views::style::TextStyle::STYLE_PRIMARY);
   main_text_label->SetMaximumWidthSingleLine(kAutofillPopupUsernameMaxWidth);
 
-  AddSuggestionContentToView(kSuggestion, std::move(main_text_label),
-                             CreateMinorTextLabel(kSuggestion.minor_text),
-                             CreateDescriptionLabel(),
-                             CreateAndTrackSubtextViews(*view), *view);
+  popup_cell_utils::AddSuggestionContentToView(
+      kSuggestion, std::move(main_text_label),
+      popup_cell_utils::CreateMinorTextLabel(kSuggestion.minor_text),
+      CreateDescriptionLabel(), CreateAndTrackSubtextViews(*view), *view);
 
   // Prepare the callbacks to the controller.
-  AddCallbacksToContentView(GetController(), GetLineNumber(), *view);
+  popup_cell_utils::AddCallbacksToContentView(GetController(), GetLineNumber(),
+                                              *view);
 
   return view;
 }
@@ -862,58 +348,63 @@
   views::BoxLayout* layout_manager =
       view->SetLayoutManager(std::make_unique<views::BoxLayout>(
           views::BoxLayout::Orientation::kHorizontal,
-          GetMarginsForContentCell(/*has_control_element=*/false)));
+          popup_cell_utils::GetMarginsForContentCell(
+              /*has_control_element=*/false)));
 
   layout_manager->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
-  std::unique_ptr<views::ImageView> icon = GetIconImageView(kSuggestion);
+  std::unique_ptr<views::ImageView> icon =
+      popup_cell_utils::GetIconImageView(kSuggestion);
 
   const bool kUseLeadingIcon =
       base::Contains(kItemTypesUsingLeadingIcons, kSuggestion.popup_item_id);
 
   if (kSuggestion.is_loading) {
     view->AddChildView(std::make_unique<views::Throbber>())->Start();
-    AddSpacerWithSize(*view, *layout_manager,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/false);
+    popup_cell_utils::AddSpacerWithSize(*view, *layout_manager,
+                                        PopupBaseView::GetHorizontalPadding(),
+                                        /*resize=*/false);
   } else if (icon && kUseLeadingIcon) {
     view->AddChildView(std::move(icon));
-    AddSpacerWithSize(*view, *layout_manager,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/false);
+    popup_cell_utils::AddSpacerWithSize(*view, *layout_manager,
+                                        PopupBaseView::GetHorizontalPadding(),
+                                        /*resize=*/false);
   }
 
   layout_manager->set_minimum_cross_axis_size(
       views::MenuConfig::instance().touchable_menu_height);
 
   std::unique_ptr<views::Label> main_text_label =
-      CreateMainTextLabel(kSuggestion.main_text, views::style::STYLE_SECONDARY);
+      popup_cell_utils::CreateMainTextLabel(kSuggestion.main_text,
+                                            views::style::STYLE_SECONDARY);
   main_text_label->SetEnabled(!kSuggestion.is_loading);
   view->TrackLabel(view->AddChildView(std::move(main_text_label)));
 
-  AddSpacerWithSize(*view, *layout_manager, 0, /*resize=*/true);
+  popup_cell_utils::AddSpacerWithSize(*view, *layout_manager, 0,
+                                      /*resize=*/true);
 
   if (icon && !kUseLeadingIcon) {
-    AddSpacerWithSize(*view, *layout_manager,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/false);
+    popup_cell_utils::AddSpacerWithSize(*view, *layout_manager,
+                                        PopupBaseView::GetHorizontalPadding(),
+                                        /*resize=*/false);
     view->AddChildView(std::move(icon));
   }
 
   std::unique_ptr<views::ImageView> trailing_icon =
-      GetTrailingIconImageView(kSuggestion);
+      popup_cell_utils::GetTrailingIconImageView(kSuggestion);
   if (trailing_icon) {
-    AddSpacerWithSize(*view, *layout_manager,
-                      PopupBaseView::GetHorizontalPadding(),
-                      /*resize=*/true);
+    popup_cell_utils::AddSpacerWithSize(*view, *layout_manager,
+                                        PopupBaseView::GetHorizontalPadding(),
+                                        /*resize=*/true);
     view->AddChildView(std::move(trailing_icon));
   }
 
   // Force a refresh to ensure all the labels'styles are correct.
   view->RefreshStyle();
 
-  AddCallbacksToContentView(GetController(), GetLineNumber(), *view);
+  popup_cell_utils::AddCallbacksToContentView(GetController(), GetLineNumber(),
+                                              *view);
 
   return view;
 }
diff --git a/chrome/browser/ui/views/chrome_typography.cc b/chrome/browser/ui/views/chrome_typography.cc
index 37e06c6..8a49741 100644
--- a/chrome/browser/ui/views/chrome_typography.cc
+++ b/chrome/browser/ui/views/chrome_typography.cc
@@ -17,8 +17,8 @@
 
 int GetFontSizeDeltaBoundedByAvailableHeight(int available_height,
                                              int desired_font_size) {
-  int size_delta =
-      GetFontSizeDeltaIgnoringUserOrLocaleSettings(desired_font_size);
+  int size_delta = views::style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(
+      desired_font_size);
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
   gfx::FontList base_font = bundle.GetFontListWithDelta(size_delta);
 
@@ -33,28 +33,6 @@
          user_or_locale_delta;
 }
 
-int GetFontSizeDeltaIgnoringUserOrLocaleSettings(int desired_font_size) {
-  int size_delta = desired_font_size - gfx::PlatformFont::kDefaultBaseFontSize;
-  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  gfx::FontList base_font = bundle.GetFontListWithDelta(size_delta);
-
-  // The ResourceBundle's default font may not actually be kDefaultBaseFontSize
-  // if, for example, the user has changed their system font sizes or the
-  // current locale has been overridden to use a different default font size.
-  // Adjust for the difference in default font sizes.
-  int user_or_locale_delta = 0;
-  if (base_font.GetFontSize() != desired_font_size) {
-    user_or_locale_delta = desired_font_size - base_font.GetFontSize();
-    base_font = bundle.GetFontListWithDelta(size_delta + user_or_locale_delta);
-  }
-  DCHECK_EQ(desired_font_size, base_font.GetFontSize());
-
-  // To ensure a subsequent request from the ResourceBundle ignores the delta
-  // due to user or locale settings, include it here.
-  return base_font.GetFontSize() - gfx::PlatformFont::kDefaultBaseFontSize +
-         user_or_locale_delta;
-}
-
 void ApplyCommonFontStyles(int context,
                            int style,
                            ui::ResourceBundle::FontDetails& details) {
@@ -70,7 +48,8 @@
       break;
     }
     case CONTEXT_TAB_COUNTER: {
-      details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
+      details.size_delta =
+          views::style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
       details.weight = gfx::Font::Weight::BOLD;
       break;
     }
@@ -119,16 +98,19 @@
       break;
 #endif
     case CONTEXT_IPH_BUBBLE_TITLE:
-      details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(18);
+      details.size_delta =
+          views::style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(18);
       if (base::FeatureList::IsEnabled(features::kChromeRefresh2023)) {
         details.weight = gfx::Font::Weight::MEDIUM;
       }
       break;
     case CONTEXT_IPH_BUBBLE_BODY:
-      details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
+      details.size_delta =
+          views::style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
       break;
     case CONTEXT_SIDE_PANEL_TITLE:
-      details.size_delta = GetFontSizeDeltaIgnoringUserOrLocaleSettings(13);
+      details.size_delta =
+          views::style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(13);
       break;
   }
 }
diff --git a/chrome/browser/ui/views/chrome_typography_provider.cc b/chrome/browser/ui/views/chrome_typography_provider.cc
index 4f1c63fe..3b2b36b 100644
--- a/chrome/browser/ui/views/chrome_typography_provider.cc
+++ b/chrome/browser/ui/views/chrome_typography_provider.cc
@@ -44,6 +44,13 @@
       << "context: " << context << " style: " << style;
 
   ui::ResourceBundle::FontDetails details;
+
+  if (style > views::style::STYLE_OVERRIDE_TYPOGRAPHY_START &&
+      style < views::style::STYLE_OVERRIDE_TYPOGRAPHY_END) {
+    details = TypographyProvider::GetFontDetails(context, style);
+    return details;
+  }
+
   details.size_delta = kDefaultSize - gfx::PlatformFont::kDefaultBaseFontSize;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/views/extensions/extension_action_test_helper_mac.mm b/chrome/browser/ui/views/extensions/extension_action_test_helper_mac.mm
index 9861b22..96ed42e 100644
--- a/chrome/browser/ui/views/extensions/extension_action_test_helper_mac.mm
+++ b/chrome/browser/ui/views/extensions/extension_action_test_helper_mac.mm
@@ -6,22 +6,26 @@
 
 #include <AppKit/AppKit.h>
 
-#import "base/mac/scoped_nsobject.h"
 #import "ui/base/test/windowed_nsnotification_observer.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 bool ExtensionActionTestHelper::WaitForPopup() {
-  NSWindow* window = [GetPopupNativeView().GetNativeNSView() window];
+  NSWindow* window = GetPopupNativeView().GetNativeNSView().window;
   if (!window)
     return false;
 
-  if ([window isKeyWindow])
+  if (window.keyWindow) {
     return true;
+  }
 
-  base::scoped_nsobject<WindowedNSNotificationObserver> waiter(
+  WindowedNSNotificationObserver* waiter =
       [[WindowedNSNotificationObserver alloc]
           initForNotification:NSWindowDidBecomeKeyNotification
-                       object:window]);
+                       object:window];
 
   BOOL notification_observed = [waiter wait];
-  return notification_observed && [window isKeyWindow];
+  return notification_observed && window.keyWindow;
 }
diff --git a/chrome/browser/ui/views/side_panel/search_companion/companion_side_panel_controller_utils.cc b/chrome/browser/ui/views/side_panel/search_companion/companion_side_panel_controller_utils.cc
index a20fb78..4e5482c 100644
--- a/chrome/browser/ui/views/side_panel/search_companion/companion_side_panel_controller_utils.cc
+++ b/chrome/browser/ui/views/side_panel/search_companion/companion_side_panel_controller_utils.cc
@@ -20,8 +20,7 @@
   auto* browser_window =
       BrowserWindow::FindBrowserWindowWithWebContents(web_contents);
   auto* browser_view = static_cast<BrowserView*>(browser_window);
-  CHECK(browser_view);
-  return browser_view->browser();
+  return browser_view ? browser_view->browser() : nullptr;
 }
 
 }  // namespace companion
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index 4202a44..2618ff5 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -19,9 +19,8 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/values.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/policy/dm_token_utils.h"
-#include "chrome/browser/ui/webui/management/management_ui_handler.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/ash/components/settings/cros_settings_names.h"
@@ -1496,25 +1495,25 @@
   // When policies are set to values that enable the feature without a usable DM
   // token, nothing to report.
   policy::SetDMTokenForTesting(policy::DMToken::CreateInvalidToken());
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_no_domain->GetPrefs(), enterprise_connectors::FILE_ATTACHED,
-      "[{\"service_provider\":\"google\"}]");
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_no_domain->GetPrefs(), enterprise_connectors::FILE_DOWNLOADED,
-      "[{\"service_provider\":\"google\"}]");
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_no_domain->GetPrefs(), enterprise_connectors::BULK_DATA_ENTRY,
-      "[{\"service_provider\":\"google\"}]");
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_no_domain->GetPrefs(), enterprise_connectors::PRINT,
-      "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::FILE_ATTACHED,
+                                      "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::FILE_DOWNLOADED,
+                                      "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::BULK_DATA_ENTRY,
+                                      "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::PRINT,
+                                      "[{\"service_provider\":\"google\"}]");
 #if BUILDFLAG(IS_CHROMEOS)
-  enterprise_connectors::test::SetAnalysisConnector(
-      profile_no_domain->GetPrefs(), enterprise_connectors::FILE_TRANSFER,
-      "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::FILE_TRANSFER,
+                                      "[{\"service_provider\":\"google\"}]");
 #endif
-  enterprise_connectors::test::SetOnSecurityEventReporting(
-      profile_no_domain->GetPrefs(), true);
+  safe_browsing::SetOnSecurityEventReporting(profile_no_domain->GetPrefs(),
+                                             true);
   profile_no_domain->GetPrefs()->SetInteger(
       prefs::kSafeBrowsingEnterpriseRealTimeUrlCheckMode, 1);
   profile_no_domain->GetPrefs()->SetInteger(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 58ea319..3c6bebc 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -50,10 +50,10 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
+#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h"
 #include "chrome/browser/enterprise/connectors/common.h"
-#include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
-#include "chrome/browser/enterprise/connectors/test/fake_content_analysis_delegate.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_manager.h"  //nogncheck
@@ -1557,7 +1557,7 @@
   void SetUp() override {
     enterprise_connectors::ContentAnalysisDelegate::SetFactoryForTesting(
         base::BindRepeating(
-            &enterprise_connectors::test::FakeContentAnalysisDelegate::Create,
+            &enterprise_connectors::FakeContentAnalysisDelegate::Create,
             run_loop_.QuitClosure(),
             base::BindRepeating(
                 &ContentAnalysisPrintPreviewHandlerTest::ScanningResponse,
@@ -1568,7 +1568,7 @@
     PrintPreviewHandlerTest::SetUp();
 
     // Set the policy that enables local content analysis for print.
-    enterprise_connectors::test::SetAnalysisConnector(
+    safe_browsing::SetAnalysisConnector(
         profile()->GetPrefs(), enterprise_connectors::AnalysisConnector::PRINT,
         R"({
           "service_provider": "local_system_agent",
diff --git a/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom b/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
index 6cc3ff7..bd6ad44 100644
--- a/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
+++ b/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
@@ -4,9 +4,10 @@
 
 module chromeos.settings.mojom;
 
-// Chrome OS Settings sections (i.e., top-level navigation items). Each section
-// has a corresponding path string listed below. Numerical values are used for
-// metrics; do not change or reuse values.
+// ChromeOS Settings sections (i.e., top-level pages & their navigation items).
+// Each section has a corresponding path string listed below. Numerical values
+// are used for metrics.
+// DO NOT change or reuse values.
 enum Section {
   kNetwork = 0,
   kBluetooth = 1,
@@ -321,25 +322,3 @@
 // Kerberos section.
 const string kKerberosSectionPath = "kerberos";
 const string kKerberosAccountsV2SubpagePath = "kerberos/kerberosAccounts";
-
-// The properties should match the top-level section paths defined above
-// Keep alphabetized
-struct OsPageAvailability {
-  bool apps;
-  bool bluetooth;
-  bool crostini;
-  bool dateTime;
-  bool device;
-  bool files;
-  bool internet;
-  bool kerberos;
-  bool multidevice;
-  bool osAccessibility;
-  bool osLanguages;
-  bool osPeople;
-  bool osPrinting;
-  bool osPrivacy;
-  bool osReset;
-  bool osSearch;
-  bool personalization;
-};
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
index c4e0ac7..068502d26 100644
--- a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
@@ -160,6 +160,11 @@
     // Calls to the browser need to happen after the ShowUI() call above since
     // it is only added to browser hierarchy after the side panel has loaded the
     // page.
+    auto* browser = GetBrowser();
+    if (!browser) {
+      return;
+    }
+
     auto* active_web_contents =
         GetBrowser()->tab_strip_model()->GetActiveWebContents();
     Observe(active_web_contents);
diff --git a/chrome/browser/ui/webui/side_panel/companion/signin_delegate_impl.cc b/chrome/browser/ui/webui/side_panel/companion/signin_delegate_impl.cc
index 40b493c..0ff3dbe3 100644
--- a/chrome/browser/ui/webui/side_panel/companion/signin_delegate_impl.cc
+++ b/chrome/browser/ui/webui/side_panel/companion/signin_delegate_impl.cc
@@ -77,13 +77,17 @@
 }
 
 void SigninDelegateImpl::OpenUrlInBrowser(const GURL& url, bool use_new_tab) {
+  auto* browser = companion::GetBrowserForWebContents(webui_contents_);
+  if (!browser) {
+    return;
+  }
+
   content::OpenURLParams params(url, content::Referrer(),
                                 use_new_tab
                                     ? WindowOpenDisposition::NEW_FOREGROUND_TAB
                                     : WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
                                 /*is_renderer_initiated*/ false);
-  auto* browser = companion::GetBrowserForWebContents(webui_contents_);
   browser->OpenURL(params);
 }
 
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 9453079..432bf3c 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1686751181-b090ec8fcf0029d366528dd7a1aca48ad0cc3ce7.profdata
+chrome-mac-arm-main-1686758346-f228fc14950ae53b74df10aa18d8075891994471.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index e8e8c9d..8161f11 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1686743662-1cdc8d15119eba6f66cff7bf15709d8d1f07439a.profdata
+chrome-win64-main-1686754776-64fec57127d4e24f1e31fe0b507d059b06d1ce09.profdata
diff --git a/chrome/renderer/accessibility/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything_app_model.cc
index ea9a3ce..02a674f6 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.cc
+++ b/chrome/renderer/accessibility/read_anything_app_model.cc
@@ -8,14 +8,26 @@
 
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
+#include "content/public/renderer/render_thread.h"
+#include "services/metrics/public/cpp/mojo_ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_role_properties.h"
 #include "ui/accessibility/ax_serializable_tree.h"
 #include "ui/accessibility/ax_tree_update_util.h"
 
-ReadAnythingAppModel::ReadAnythingAppModel() = default;
-ReadAnythingAppModel::~ReadAnythingAppModel() = default;
+ReadAnythingAppModel::ReadAnythingAppModel() {
+  // TODO(crbug.com/1450930): Use a global ukm recorder instance instead.
+  mojo::Remote<ukm::mojom::UkmRecorderFactory> factory;
+  content::RenderThread::Get()->BindHostReceiver(
+      factory.BindNewPipeAndPassReceiver());
+  ukm_recorder_ = ukm::MojoUkmRecorder::Create(*factory);
+}
+
+ReadAnythingAppModel::~ReadAnythingAppModel() {
+  SetActiveUkmSourceId(ukm::kInvalidSourceId);
+}
 
 void ReadAnythingAppModel::OnThemeChanged(
     read_anything::mojom::ReadAnythingThemePtr new_theme) {
@@ -81,6 +93,7 @@
     base::UmaHistogramEnumeration(
         string_constants::kEmptyStateHistogramName,
         ReadAnythingEmptyState::kSelectionAfterEmptyStateShown);
+    num_selections_++;
   }
 
   // If the main panel selection contains content outside of the distilled
@@ -408,6 +421,19 @@
   EraseTree(tree_id);
 }
 
+void ReadAnythingAppModel::SetActiveUkmSourceId(ukm::SourceId source_id) {
+  // Record the number of selections made on the current page if it was not
+  // distillable.
+  if (active_ukm_source_id_ != ukm::kInvalidSourceId &&
+      content_node_ids_.empty()) {
+    ukm::builders::Accessibility_ReadAnything_EmptyState(active_ukm_source_id_)
+        .SetTotalNumSelections(num_selections_)
+        .Record(ukm_recorder_.get());
+  }
+  num_selections_ = 0;
+  active_ukm_source_id_ = source_id;
+}
+
 ui::AXNode* ReadAnythingAppModel::GetAXNode(ui::AXNodeID ax_node_id) const {
   ui::AXSerializableTree* tree = GetTreeFromId(active_tree_id_).get();
   return tree->GetFromId(ax_node_id);
diff --git a/chrome/renderer/accessibility/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything_app_model.h
index ae8212e..a21d775b 100644
--- a/chrome/renderer/accessibility/read_anything_app_model.h
+++ b/chrome/renderer/accessibility/read_anything_app_model.h
@@ -18,6 +18,10 @@
 class AXSerializableTree;
 }  // namespace ui
 
+namespace ukm {
+class MojoUkmRecorder;
+}
+
 // A class that holds state for the ReadAnythingAppController for the Read
 // Anything WebUI app.
 class ReadAnythingAppModel {
@@ -81,9 +85,7 @@
   void SetActiveTreeSelectable(bool active_tree_selectable) {
     active_tree_selectable_ = active_tree_selectable;
   }
-  void SetActiveUkmSourceId(ukm::SourceId source_id) {
-    active_ukm_source_id_ = source_id;
-  }
+  void SetActiveUkmSourceId(ukm::SourceId source_id);
 
   void SetActiveTreeId(ui::AXTreeID tree_id) { active_tree_id_ = tree_id; }
 
@@ -218,6 +220,13 @@
   bool requires_distillation_ = false;
   bool requires_post_process_selection_ = false;
   bool selection_from_action_ = false;
+
+  std::unique_ptr<ukm::MojoUkmRecorder> ukm_recorder_;
+
+  // Used to keep track of how many selections were made for the
+  // active_ukm_source_id_. Only recorded during the select-to-distill flow
+  // (when the empty state page is shown).
+  int32_t num_selections_ = 0;
 };
 
 #endif  // CHROME_RENDERER_ACCESSIBILITY_READ_ANYTHING_APP_MODEL_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index a45aa0a..061c2128 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -518,6 +518,8 @@
       "../browser/renderer_context_menu/mock_render_view_context_menu.h",
       "../browser/renderer_context_menu/render_view_context_menu_test_util.cc",
       "../browser/renderer_context_menu/render_view_context_menu_test_util.h",
+      "../browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc",
+      "../browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h",
       "../browser/signin/signin_browser_test_base.h",
       "../browser/themes/test/theme_service_changed_waiter.cc",
       "../browser/themes/test/theme_service_changed_waiter.h",
@@ -1526,6 +1528,7 @@
       "//components/privacy_sandbox",
       "//components/privacy_sandbox:privacy_sandbox_prefs",
       "//components/privacy_sandbox:test_support",
+      "//components/privacy_sandbox/privacy_sandbox_attestations",
       "//components/proxy_config",
       "//components/reading_list/core",
       "//components/reading_list/features:flags",
@@ -1901,6 +1904,8 @@
       "../browser/download/save_page_browsertest.cc",
       "../browser/engagement/site_engagement_helper_browsertest.cc",
       "../browser/enterprise/browser_management/management_service_browsertest.cc",
+      "../browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc",
+      "../browser/enterprise/connectors/connectors_service_browsertest.cc",
       "../browser/enterprise/connectors/reporting/crash_reporting_context_browsertest.cc",
       "../browser/enterprise/reporting/report_scheduler_browsertest.cc",
       "../browser/enterprise/util/managed_browser_utils_browsertest.cc",
@@ -2166,6 +2171,8 @@
       "../browser/resource_coordinator/tab_helper_browsertest.cc",
       "../browser/resource_coordinator/tab_manager_browsertest.cc",
       "../browser/safe_browsing/client_side_detection_service_browsertest.cc",
+      "../browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc",
+      "../browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h",
       "../browser/safe_browsing/download_protection/download_protection_service_browsertest.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.cc",
       "../browser/safe_browsing/test_safe_browsing_database_helper.h",
@@ -2533,6 +2540,10 @@
 
     if (!is_chromeos_lacros) {
       sources += [
+        # crbug.com/1230268 These tests need to be fixed for Lacros.
+        "../browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc",
+        "../browser/safe_browsing/download_protection/deep_scanning_browsertest.cc",
+
         # Lacros does not seem to have any actual WebView-based UI to test.
         "../browser/accessibility/live_translate_controller_browsertest.cc",
         "../browser/ui/webui/webui_webview_browsertest.cc",
@@ -2559,16 +2570,6 @@
           "../browser/accessibility/live_caption/live_caption_speech_recognition_host_browsertest.cc",
         ]
       }
-
-      # TODO(b/283093731): Replace the platforms below with a condition for
-      # cloud content analysis.
-      if (is_win || is_linux || is_mac || is_chromeos) {
-        sources += [
-          # crbug.com/1230268 These tests need to be fixed for Lacros.
-          "../browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc",
-          "../browser/safe_browsing/download_protection/deep_scanning_browsertest.cc",
-        ]
-      }
     }
 
     if (is_win) {
@@ -3095,6 +3096,8 @@
         "../browser/extensions/api/desktop_capture/desktop_capture_apitest.cc",
         "../browser/extensions/api/developer_private/developer_private_apitest.cc",
         "../browser/extensions/api/downloads/downloads_api_browsertest.cc",
+        "../browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc",
+        "../browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc",
         "../browser/extensions/api/extension_action/browser_action_apitest.cc",
         "../browser/extensions/api/extension_action/browser_action_browsertest.cc",
         "../browser/extensions/api/extension_action/extension_action_apitest.cc",
@@ -3344,17 +3347,6 @@
         ]
       }
 
-      # TODO(b/283093731): Replace the platforms below with a condition for
-      # cloud content analysis.
-      if (is_win || is_linux || is_mac || is_chromeos) {
-        sources += [
-          "../browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc",
-          "../browser/enterprise/connectors/connectors_service_browsertest.cc",
-          "../browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc",
-          "../browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_browsertest.cc",
-        ]
-        deps += [ "//chrome/browser/enterprise/connectors/test:test_support" ]
-      }
       if (is_win || is_linux || is_mac || is_chromeos_ash) {
         sources += [ "../browser/enterprise/connectors/device_trust/device_trust_browsertest.cc" ]
 
@@ -3363,6 +3355,7 @@
           "//chrome/browser/enterprise/connectors/device_trust:prefs",
           "//chrome/browser/enterprise/connectors/device_trust/common",
           "//chrome/browser/enterprise/connectors/device_trust/test:test_support",
+          "//chrome/browser/enterprise/connectors/test:test_support",
           "//components/device_signals/core/common",
           "//components/device_signals/core/common:features",
           "//components/device_signals/test:test_support",
@@ -8799,12 +8792,7 @@
       "../common/safe_browsing/ipc_protobuf_message_test_messages.h",
       "../common/safe_browsing/ipc_protobuf_message_unittest.cc",
     ]
-    deps += [
-      # TODO(b/283093731): Replace the dependency below to a more specific
-      # condition for cloud content analysis.
-      "../browser/enterprise/connectors/test:test_support",
-      "../common/safe_browsing:archive_analyzer_results",
-    ]
+    deps += [ "../common/safe_browsing:archive_analyzer_results" ]
     if (is_mac) {
       sources += [
         "../browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac_unittest.cc",
diff --git a/chrome/test/data/autofill/form_hidden_selectmenu.html b/chrome/test/data/autofill/form_hidden_selectmenu.html
new file mode 100644
index 0000000..bc48242
--- /dev/null
+++ b/chrome/test/data/autofill/form_hidden_selectmenu.html
@@ -0,0 +1,13 @@
+<!-- A page that is used to test that filling <select> works properly if the <select> is hidden. -->
+<body>
+  <form name="addr1.1" id="form1" action="https://example.com/" method="post">
+    Name: <input type="text" name="firstname" id="firstname" autocomplete="given-name"><br>
+    Address: <input type="text" name="address1" id="address1"><br>
+    City: <input type="text" name="city" id="city"><br>
+    State: <selectmenu name="state" id="state" style="display:none">
+      <option value="MI">MI</option>
+      <option value="NY">NY</option>
+      <option value="TX">TX</option>
+    </selectmenu>
+  </form>
+</body>
diff --git a/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_accounts_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_accounts_subpage_test.ts
index 4d3d145..5b29d11 100644
--- a/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_accounts_subpage_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_accounts_subpage_test.ts
@@ -5,7 +5,7 @@
 import 'chrome://os-settings/lazy_load.js';
 
 import {KerberosAccountsBrowserProxyImpl, SettingsKerberosAccountsSubpageElement} from 'chrome://os-settings/lazy_load.js';
-import {Route, Router, routes} from 'chrome://os-settings/os_settings.js';
+import {createSectionForTesting, createSubpageForTesting, Router, routes, routesMojom} from 'chrome://os-settings/os_settings.js';
 import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import {CrToastElement} from 'chrome://resources/cr_elements/cr_toast/cr_toast.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
@@ -30,20 +30,21 @@
     REMOVE_ACCOUNT: 2,
   };
 
-  setup(() => {
-    routes.BASIC = new Route('/'),
-    routes.KERBEROS = routes.BASIC.createSection('/kerberos', 'kerberos');
-    routes.KERBEROS_ACCOUNTS_V2 =
-        routes.KERBEROS.createChild('/kerberos/kerberosAccounts');
+  suiteSetup(() => {
+    routes.KERBEROS = createSectionForTesting(
+        routes.BASIC, routesMojom.KERBEROS_SECTION_PATH,
+        routesMojom.Section.kKerberos);
+    routes.KERBEROS_ACCOUNTS_V2 = createSubpageForTesting(
+        routes.KERBEROS, routesMojom.KERBEROS_ACCOUNTS_V2_SUBPAGE_PATH,
+        routesMojom.Subpage.kKerberosAccountsV2);
 
     Router.resetInstanceForTesting(new Router(routes));
+  });
 
+  setup(() => {
     browserProxy = new TestKerberosAccountsBrowserProxy();
     KerberosAccountsBrowserProxyImpl.setInstanceForTesting(browserProxy);
 
-    // Setting the default value of the relevant load time data.
-    loadTimeData.overrideValues({kerberosAddAccountsAllowed: true});
-
     createDialog();
   });
 
diff --git a/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_page_test.ts b/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_page_test.ts
index 5cd43be..a509e47 100644
--- a/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/kerberos_page/kerberos_page_test.ts
@@ -5,7 +5,7 @@
 import 'chrome://os-settings/os_settings.js';
 
 import {KerberosAccountsBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js';
-import {Route, Router, routes, SettingsKerberosPageElement} from 'chrome://os-settings/os_settings.js';
+import {createSectionForTesting, createSubpageForTesting, Router, routes, routesMojom, SettingsKerberosPageElement} from 'chrome://os-settings/os_settings.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse} from 'chrome://webui-test/chai_assert.js';
@@ -16,14 +16,18 @@
   let kerberosPage: SettingsKerberosPageElement;
   let browserProxy: TestKerberosAccountsBrowserProxy;
 
-  setup(() => {
-    routes.BASIC = new Route('/'),
-    routes.KERBEROS = routes.BASIC.createSection('/kerberos', 'kerberos');
-    routes.KERBEROS_ACCOUNTS_V2 =
-        routes.KERBEROS.createChild('/kerberos/kerberosAccounts');
+  suiteSetup(() => {
+    routes.KERBEROS = createSectionForTesting(
+        routes.BASIC, routesMojom.KERBEROS_SECTION_PATH,
+        routesMojom.Section.kKerberos);
+    routes.KERBEROS_ACCOUNTS_V2 = createSubpageForTesting(
+        routes.KERBEROS, routesMojom.KERBEROS_ACCOUNTS_V2_SUBPAGE_PATH,
+        routesMojom.Subpage.kKerberosAccountsV2);
 
     Router.resetInstanceForTesting(new Router(routes));
+  });
 
+  setup(() => {
     browserProxy = new TestKerberosAccountsBrowserProxy();
     KerberosAccountsBrowserProxyImpl.setInstanceForTesting(browserProxy);
   });
diff --git a/chrome/test/data/webui/settings/chromeos/main_page_container_test.js b/chrome/test/data/webui/settings/chromeos/main_page_container_test.js
index 97cb719..5f94da7 100644
--- a/chrome/test/data/webui/settings/chromeos/main_page_container_test.js
+++ b/chrome/test/data/webui/settings/chromeos/main_page_container_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://os-settings/lazy_load.js';
 
-import {createPageAvailabilityForTesting, CrSettingsPrefs, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting} from 'chrome://os-settings/os_settings.js';
+import {createPageAvailabilityForTesting, CrSettingsPrefs, Router, routes, routesMojom, setContactManagerForTesting, setNearbyShareSettingsForTesting} from 'chrome://os-settings/os_settings.js';
 import {setBluetoothConfigForTesting} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -14,6 +14,8 @@
 import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
+const {Section} = routesMojom;
+
 suite('<main-page-container>', function() {
   /** @type {?MainPageContainerElement} */
   let mainPageContainer = null;
@@ -72,73 +74,73 @@
     [
         // Basic pages
         {
-          pageName: 'internet',
+          pageName: 'kNetwork',
           elementName: 'settings-internet-page',
         },
         {
-          pageName: 'bluetooth',
+          pageName: 'kBluetooth',
           elementName: 'os-settings-bluetooth-page',
         },
         {
-          pageName: 'multidevice',
+          pageName: 'kMultiDevice',
           elementName: 'settings-multidevice-page',
         },
         {
-          pageName: 'kerberos',
+          pageName: 'kKerberos',
           elementName: 'settings-kerberos-page',
         },
         {
-          pageName: 'osPeople',
+          pageName: 'kPeople',
           elementName: 'os-settings-people-page',
         },
         {
-          pageName: 'device',
+          pageName: 'kDevice',
           elementName: 'settings-device-page',
         },
         {
-          pageName: 'personalization',
+          pageName: 'kPersonalization',
           elementName: 'settings-personalization-page',
         },
         {
-          pageName: 'osSearch',
+          pageName: 'kSearchAndAssistant',
           elementName: 'os-settings-search-page',
         },
         {
-          pageName: 'osPrivacy',
+          pageName: 'kPrivacyAndSecurity',
           elementName: 'os-settings-privacy-page',
         },
         {
-          pageName: 'apps',
+          pageName: 'kApps',
           elementName: 'os-settings-apps-page',
         },
         {
-          pageName: 'osAccessibility',
+          pageName: 'kAccessibility',
           elementName: 'os-settings-a11y-page',
         },
 
         // Advanced section pages
         {
-          pageName: 'dateTime',
+          pageName: 'kDateAndTime',
           elementName: 'settings-date-time-page',
         },
         {
-          pageName: 'osLanguages',
+          pageName: 'kLanguagesAndInput',
           elementName: 'os-settings-languages-section',
         },
         {
-          pageName: 'files',
+          pageName: 'kFiles',
           elementName: 'os-settings-files-page',
         },
         {
-          pageName: 'osPrinting',
+          pageName: 'kPrinting',
           elementName: 'os-settings-printing-page',
         },
         {
-          pageName: 'crostini',
+          pageName: 'kCrostini',
           elementName: 'settings-crostini-page',
         },
         {
-          pageName: 'osReset',
+          pageName: 'kReset',
           elementName: 'os-settings-reset-page',
         },
     ].forEach(({pageName, elementName}) => {
@@ -146,7 +148,7 @@
         // Make page available
         mainPageContainer.pageAvailability = {
           ...mainPageContainer.pageAvailability,
-          [pageName]: true,
+          [Section[pageName]]: true,
         };
         flush();
 
@@ -157,7 +159,7 @@
         // Make page unavailable
         mainPageContainer.pageAvailability = {
           ...mainPageContainer.pageAvailability,
-          [pageName]: false,
+          [Section[pageName]]: false,
         };
         flush();
 
@@ -194,13 +196,15 @@
       });
 
       suite('Route navigations', () => {
+        const {Section} = routesMojom;
+
         /**
          * Asserts the following:
          * - Only one page is marked active
          * - Active page does not have style "display: none"
          * - Inactive pages have style "display: none"
          */
-        function assertOnlyActivePageIsVisible(pageName) {
+        function assertOnlyActivePageIsVisible(section) {
           const pages = mainPageContainer.shadowRoot.querySelectorAll(
               'os-settings-section');
           let numActive = 0;
@@ -210,7 +214,7 @@
             if (page.hasAttribute('active')) {
               numActive++;
               assertNotEquals('none', displayStyle);
-              assertEquals(pageName, page.section);
+              assertEquals(section, page.section);
             } else {
               assertEquals('none', displayStyle);
             }
@@ -221,7 +225,7 @@
 
         suite('From Initial', () => {
           test('to Root should only show Network page', () => {
-            assertOnlyActivePageIsVisible('internet');
+            assertOnlyActivePageIsVisible(Section.kNetwork);
           });
         });
 
@@ -233,7 +237,7 @@
             Router.getInstance().navigateTo(routes.INTERNET);
             await navigationCompletePromise;
 
-            assertOnlyActivePageIsVisible('internet');
+            assertOnlyActivePageIsVisible(Section.kNetwork);
           });
 
           test('to Subpage should result in only one active page', async () => {
@@ -243,7 +247,7 @@
             Router.getInstance().navigateTo(routes.BLUETOOTH_DEVICES);
             await navigationCompletePromise;
 
-            assertOnlyActivePageIsVisible('bluetooth');
+            assertOnlyActivePageIsVisible(Section.kBluetooth);
           });
 
           test(
@@ -259,7 +263,7 @@
                     /*removeSearch=*/ true);
                 await navigationCompletePromise;
 
-                assertOnlyActivePageIsVisible('internet');
+                assertOnlyActivePageIsVisible(Section.kNetwork);
               });
         });
 
@@ -274,7 +278,7 @@
                 Router.getInstance().navigateTo(routes.BLUETOOTH);
                 await navigationCompletePromise;
 
-                assertOnlyActivePageIsVisible('bluetooth');
+                assertOnlyActivePageIsVisible(Section.kBluetooth);
               });
 
           test('to Subpage should result in only one active page', async () => {
@@ -286,7 +290,7 @@
                 routes.A11Y_DISPLAY_AND_MAGNIFICATION);
             await navigationCompletePromise;
 
-            assertOnlyActivePageIsVisible('osAccessibility');
+            assertOnlyActivePageIsVisible(Section.kAccessibility);
           });
 
           test('to Root should result in only one active page', async () => {
@@ -297,7 +301,7 @@
             Router.getInstance().navigateTo(routes.BASIC);
             await navigationCompletePromise;
 
-            assertOnlyActivePageIsVisible('internet');
+            assertOnlyActivePageIsVisible(Section.kNetwork);
           });
         });
       });
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_page/multidevice_feature_item_test.ts b/chrome/test/data/webui/settings/chromeos/multidevice_page/multidevice_feature_item_test.ts
index 2075877..19e53677 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_page/multidevice_feature_item_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_page/multidevice_feature_item_test.ts
@@ -89,8 +89,8 @@
     crToggle = featureToggle.$.toggle;
 
     initialRoute = routes.MULTIDEVICE_FEATURES;
-    const FREE_CANDY = routes.BASIC.createSection('/freeCandy', 'freeCandy');
-    featureItem.subpageRoute = FREE_CANDY;
+    const dummyRoute = new Route('/freeCandy');
+    featureItem.subpageRoute = dummyRoute;
 
     resetFeatureData();
     Router.getInstance().navigateTo(initialRoute);
diff --git a/chrome/test/data/webui/settings/chromeos/os_page_availability_test.ts b/chrome/test/data/webui/settings/chromeos/os_page_availability_test.ts
index 087ac811..d992ad09 100644
--- a/chrome/test/data/webui/settings/chromeos/os_page_availability_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_page_availability_test.ts
@@ -4,10 +4,13 @@
 
 import 'chrome://os-settings/os_settings.js';
 
-import {createPageAvailabilityForTesting, OsPageAvailability} from 'chrome://os-settings/os_settings.js';
+import {createPageAvailabilityForTesting, routesMojom} from 'chrome://os-settings/os_settings.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
+const {Section} = routesMojom;
+type PageName = keyof typeof Section;
+
 suite('Page availability', () => {
   setup(() => {
     // Setup consistent load time data for each test so overrides do not carry
@@ -24,51 +27,51 @@
    */
   function runLoadTimeControlledTests() {
     interface LoadTimeControlledPage {
-      pageName: keyof OsPageAvailability;
+      pageName: PageName;
       loadTimeId: string;
     }
 
     const loadTimeControlled: LoadTimeControlledPage[] = [
-      {pageName: 'kerberos', loadTimeId: 'isKerberosEnabled'},
-      {pageName: 'osReset', loadTimeId: 'allowPowerwash'},
+      {pageName: 'kKerberos', loadTimeId: 'isKerberosEnabled'},
+      {pageName: 'kReset', loadTimeId: 'allowPowerwash'},
     ];
     loadTimeControlled.forEach(({pageName, loadTimeId}) => {
       test(`${pageName} page is available when ${loadTimeId}=true`, () => {
         loadTimeData.overrideValues({[loadTimeId]: true});
         const pageAvailability = createPageAvailabilityForTesting();
-        assertTrue(!!pageAvailability[pageName]);
+        assertTrue(!!pageAvailability[Section[pageName]]);
       });
 
       test(`${pageName} page is unavailable when ${loadTimeId}=false`, () => {
         loadTimeData.overrideValues({[loadTimeId]: false});
         const pageAvailability = createPageAvailabilityForTesting();
-        assertFalse(!!pageAvailability[pageName]);
+        assertFalse(!!pageAvailability[Section[pageName]]);
       });
     });
   }
 
   suite('When signed in as user', () => {
-    const alwaysAvailable: Array<keyof OsPageAvailability> = [
-      'apps',
-      'bluetooth',
-      'crostini',
-      'dateTime',
-      'device',
-      'files',
-      'internet',
-      'multidevice',
-      'osAccessibility',
-      'osLanguages',
-      'osPeople',
-      'osPrinting',
-      'osPrivacy',
-      'osSearch',
-      'personalization',
+    const alwaysAvailable: PageName[] = [
+      'kAccessibility',
+      'kApps',
+      'kBluetooth',
+      'kCrostini',
+      'kDateAndTime',
+      'kDevice',
+      'kFiles',
+      'kLanguagesAndInput',
+      'kMultiDevice',
+      'kNetwork',
+      'kPeople',
+      'kPersonalization',
+      'kPrinting',
+      'kPrivacyAndSecurity',
+      'kSearchAndAssistant',
     ];
     alwaysAvailable.forEach((pageName) => {
       test(`${pageName} page should always be available`, () => {
         const pageAvailability = createPageAvailabilityForTesting();
-        assertTrue(!!pageAvailability[pageName]);
+        assertTrue(!!pageAvailability[Section[pageName]]);
       });
     });
 
@@ -80,36 +83,36 @@
       loadTimeData.overrideValues({isGuest: true});
     });
 
-    const alwaysAvailable: Array<keyof OsPageAvailability> = [
-      'apps',
-      'bluetooth',
-      'crostini',
-      'dateTime',
-      'device',
-      'internet',
-      'osAccessibility',
-      'osLanguages',
-      'osPrinting',
-      'osPrivacy',
-      'osSearch',
+    const alwaysAvailable: PageName[] = [
+      'kAccessibility',
+      'kApps',
+      'kBluetooth',
+      'kCrostini',
+      'kDateAndTime',
+      'kDevice',
+      'kLanguagesAndInput',
+      'kNetwork',
+      'kPrinting',
+      'kPrivacyAndSecurity',
+      'kSearchAndAssistant',
     ];
     alwaysAvailable.forEach((pageName) => {
       test(`${pageName} page should always be available`, () => {
         const pageAvailability = createPageAvailabilityForTesting();
-        assertTrue(!!pageAvailability[pageName]);
+        assertTrue(!!pageAvailability[Section[pageName]]);
       });
     });
 
-    const neverAvailable: Array<keyof OsPageAvailability> = [
-      'files',
-      'multidevice',
-      'osPeople',
-      'personalization',
+    const neverAvailable: PageName[] = [
+      'kFiles',
+      'kMultiDevice',
+      'kPeople',
+      'kPersonalization',
     ];
     neverAvailable.forEach((pageName) => {
       test(`${pageName} page should never be available`, () => {
         const pageAvailability = createPageAvailabilityForTesting();
-        assertFalse(!!pageAvailability[pageName]);
+        assertFalse(!!pageAvailability[Section[pageName]]);
       });
     });
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_menu/os_settings_menu_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_menu/os_settings_menu_test.ts
index 84316af..f509283 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_menu/os_settings_menu_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_menu/os_settings_menu_test.ts
@@ -4,40 +4,16 @@
 
 import 'chrome://os-settings/os_settings.js';
 
-import {createPageAvailabilityForTesting, OsSettingsMenuElement, OsSettingsRoutes, Route, Router, routes} from 'chrome://os-settings/os_settings.js';
+import {createPageAvailabilityForTesting, OsSettingsMenuElement, Router, routes, routesMojom} from 'chrome://os-settings/os_settings.js';
 import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertNotEquals, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 /** @fileoverview Runs tests for the OS settings menu. */
-
-function setupRouter() {
-  const basicRoute = new Route('/');
-  const bluetoothRoute = basicRoute.createSection('/bluetooth', 'bluetooth');
-  const advancedRoute = new Route('/advanced');
-  const resetRoute = advancedRoute.createSection('/osReset', 'osReset');
-
-  const testRoutes = {
-    BASIC: basicRoute,
-    ABOUT: new Route('/about'),
-    ADVANCED: advancedRoute,
-    BLUETOOTH: bluetoothRoute,
-    OS_RESET: resetRoute,
-  };
-
-  Router.resetInstanceForTesting(new Router(testRoutes as OsSettingsRoutes));
-
-  routes.OS_RESET = testRoutes.OS_RESET;
-  routes.BLUETOOTH = testRoutes.BLUETOOTH;
-  routes.ADVANCED = testRoutes.ADVANCED;
-  routes.BASIC = testRoutes.BASIC;
-}
-
 suite('<os-settings-menu>', () => {
   let settingsMenu: OsSettingsMenuElement;
 
   setup(() => {
-    setupRouter();
     settingsMenu = document.createElement('os-settings-menu');
     settingsMenu.pageAvailability = createPageAvailabilityForTesting();
     document.body.appendChild(settingsMenu);
@@ -112,7 +88,6 @@
   let settingsMenu: OsSettingsMenuElement;
 
   setup(() => {
-    setupRouter();
     Router.getInstance().navigateTo(routes.OS_RESET);
     settingsMenu = document.createElement('os-settings-menu');
     settingsMenu.pageAvailability = createPageAvailabilityForTesting();
@@ -159,6 +134,9 @@
 suite('<os-settings-menu> page availability', () => {
   let settingsMenu: OsSettingsMenuElement;
 
+  const {Section} = routesMojom;
+  type PageName = keyof typeof Section;
+
   setup(() => {
     settingsMenu = document.createElement('os-settings-menu');
     settingsMenu.pageAvailability = createPageAvailabilityForTesting();
@@ -170,52 +148,52 @@
     settingsMenu.remove();
   });
 
-  function queryMenuItemByPageName(pageName: string): HTMLElement|null {
+  function queryMenuItem(pageName: PageName): HTMLElement|null {
     return settingsMenu.shadowRoot!.querySelector<HTMLElement>(
-        `a.item[data-page-name='${pageName}']`);
+        `a.item[data-section="${Section[pageName]}"]`);
   }
 
-  const pages = [
+  const pageNames: PageName[] = [
     // Basic pages
-    'internet',
-    'bluetooth',
-    'multidevice',
-    'kerberos',
-    'osPeople',
-    'device',
-    'personalization',
-    'osSearch',
-    'osPrivacy',
-    'apps',
-    'osAccessibility',
+    'kNetwork',
+    'kBluetooth',
+    'kMultiDevice',
+    'kKerberos',
+    'kPeople',
+    'kDevice',
+    'kPersonalization',
+    'kSearchAndAssistant',
+    'kPrivacyAndSecurity',
+    'kApps',
+    'kAccessibility',
     // Advanced section pages
-    'dateTime',
-    'osLanguages',
-    'files',
-    'osPrinting',
-    'crostini',
-    'osReset',
+    'kDateAndTime',
+    'kLanguagesAndInput',
+    'kFiles',
+    'kPrinting',
+    'kCrostini',
+    'kReset',
   ];
-  for (const pageName of pages) {
+  for (const pageName of pageNames) {
     test(`${pageName} menu item is controlled by pageAvailability`, () => {
       // Make page available
       settingsMenu.pageAvailability = {
         ...settingsMenu.pageAvailability,
-        [pageName]: true,
+        [Section[pageName]]: true,
       };
       flush();
 
-      let menuItem = queryMenuItemByPageName(pageName);
+      let menuItem = queryMenuItem(pageName);
       assertTrue(!!menuItem, `Menu item for ${pageName} should be stamped.`);
 
       // Make page unavailable
       settingsMenu.pageAvailability = {
         ...settingsMenu.pageAvailability,
-        [pageName]: false,
+        [Section[pageName]]: false,
       };
       flush();
 
-      menuItem = queryMenuItemByPageName(pageName);
+      menuItem = queryMenuItem(pageName);
       assertNull(menuItem, `Menu item for ${pageName} should not be stamped.`);
     });
   }
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js
index 12f47a660..9827054 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_about_page_test.js
@@ -2,12 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CrSettingsPrefs, Router, routes, setNearbyShareSettingsForTesting} from 'chrome://os-settings/os_settings.js';
+import {CrSettingsPrefs, Router, routes, routesMojom, setNearbyShareSettingsForTesting} from 'chrome://os-settings/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
 import {waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js';
 
+const {Section} = routesMojom;
+
 suite('<os-settings-ui> about page', () => {
   let ui;
   let fakeNearbySettings;
@@ -55,8 +57,9 @@
         const aboutPage =
             settingsMain.shadowRoot.querySelector('os-settings-about-page');
         await waitBeforeNextRender(aboutPage);
+
         const aboutSection = aboutPage.shadowRoot.querySelector(
-            'os-settings-section[section="about"]');
+            `os-settings-section[section="${Section.kAboutChromeOs}"]`);
         assertEquals(aboutSection, aboutPage.shadowRoot.activeElement);
       });
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts
index 14f18fc..217f08d 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts
@@ -8,11 +8,14 @@
  * Separated into a separate file to mitigate test timeouts.
  */
 
-import {CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsSectionElement, OsSettingsUiElement} from 'chrome://os-settings/os_settings.js';
+import {CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsSectionElement, OsSettingsUiElement, routesMojom} from 'chrome://os-settings/os_settings.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assertEquals, assertGT, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {assertEquals, assertGT, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js';
+
+const {Section} = routesMojom;
+type PageName = keyof typeof Section;
 
 suite('<os-settings-ui> page availability', () => {
   let ui: OsSettingsUiElement;
@@ -97,31 +100,32 @@
       ui.remove();
     });
 
-    const availablePages = [
-      'apps',
-      'bluetooth',
-      'crostini',
-      'dateTime',
-      'device',
-      'files',
-      'internet',
-      'kerberos',
-      'multidevice',
-      'osAccessibility',
-      'osLanguages',
-      'osPeople',
-      'osPrinting',
-      'osPrivacy',
-      'osReset',
-      'osSearch',
-      'personalization',
+    const availablePages: PageName[] = [
+      'kAccessibility',
+      'kApps',
+      'kBluetooth',
+      'kCrostini',
+      'kDateAndTime',
+      'kDevice',
+      'kFiles',
+      'kKerberos',
+      'kMultiDevice',
+      'kLanguagesAndInput',
+      'kNetwork',
+      'kPeople',
+      'kPersonalization',
+      'kPrinting',
+      'kPrivacyAndSecurity',
+      'kReset',
+      'kSearchAndAssistant',
     ];
-    for (const name of availablePages) {
-      test(`${name} page should be stamped and subpages hidden`, () => {
-        const section = mainPageContainer.shadowRoot!
-                            .querySelector<OsSettingsSectionElement>(
-                                `os-settings-section[section=${name}]`);
-        assertTrue(!!section, `Expected to find ${name} page stamped`);
+    for (const pageName of availablePages) {
+      test(`${pageName} page should be stamped and subpages hidden`, () => {
+        const section =
+            mainPageContainer.shadowRoot!
+                .querySelector<OsSettingsSectionElement>(
+                    `os-settings-section[section="${Section[pageName]}"]`);
+        assertTrue(!!section, `Expected to find ${pageName} page stamped.`);
         verifySubpagesHidden(section);
       });
     }
@@ -141,40 +145,42 @@
       ui.remove();
     });
 
-    const unavailablePages = [
-      'files',
-      'multidevice',
-      'osPeople',
-      'personalization',
+    const unavailablePages: PageName[] = [
+      'kFiles',
+      'kMultiDevice',
+      'kPeople',
+      'kPersonalization',
     ];
-    for (const name of unavailablePages) {
-      test(`${name} page should not be stamped`, () => {
-        const section = mainPageContainer.shadowRoot!
-                            .querySelector<OsSettingsSectionElement>(
-                                `os-settings-section[section=${name}]`);
-        assertEquals(null, section, `Found unexpected page ${name}`);
+    for (const pageName of unavailablePages) {
+      test(`${pageName} page should not be stamped`, () => {
+        const section =
+            mainPageContainer.shadowRoot!
+                .querySelector<OsSettingsSectionElement>(
+                    `os-settings-section[section="${Section[pageName]}"]`);
+        assertNull(section, `Found unexpected page ${pageName}.`);
       });
     }
 
-    const availablePages = [
-      'apps',
-      'bluetooth',
-      'dateTime',
-      'device',
-      'internet',
-      'kerberos',
-      'osAccessibility',
-      'osLanguages',
-      'osPrivacy',
-      'osReset',
-      'osSearch',
+    const availablePages: PageName[] = [
+      'kAccessibility',
+      'kApps',
+      'kBluetooth',
+      'kDateAndTime',
+      'kDevice',
+      'kKerberos',
+      'kLanguagesAndInput',
+      'kNetwork',
+      'kPrivacyAndSecurity',
+      'kReset',
+      'kSearchAndAssistant',
     ];
-    for (const name of availablePages) {
-      test(`${name} page should be stamped and subpages hidden`, () => {
-        const section = mainPageContainer.shadowRoot!
-                            .querySelector<OsSettingsSectionElement>(
-                                `os-settings-section[section=${name}]`);
-        assertTrue(!!section, `Expected to find ${name} page stamped`);
+    for (const pageName of availablePages) {
+      test(`${pageName} page should be stamped and subpages hidden`, () => {
+        const section =
+            mainPageContainer.shadowRoot!
+                .querySelector<OsSettingsSectionElement>(
+                    `os-settings-section[section="${Section[pageName]}"]`);
+        assertTrue(!!section, `Expected to find ${pageName} page stamped.`);
         verifySubpagesHidden(section);
       });
     }
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_test.ts
index 52f5ddf..3f2f894 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_test.ts
@@ -11,13 +11,16 @@
 
 import 'chrome://os-settings/os_settings.js';
 
-import {createRoutesForTesting, CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsMenuElement, OsSettingsRoutes, OsSettingsUiElement, Router} from 'chrome://os-settings/os_settings.js';
+import {createRoutesForTesting, CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsMenuElement, OsSettingsRoutes, OsSettingsUiElement, Router, routesMojom} from 'chrome://os-settings/os_settings.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
+const {Section} = routesMojom;
+type PageName = keyof typeof Section;
+
 suite('<os-settings-ui> page visibility', () => {
   let ui: OsSettingsUiElement;
   let settingsMain: OsSettingsMainElement;
@@ -52,9 +55,9 @@
     flush();
   }
 
-  function queryMenuItem(pageName: string): HTMLElement|null {
+  function queryMenuItem(pageName: PageName): HTMLElement|null {
     return menu.shadowRoot!.querySelector<HTMLElement>(
-        `a.item[data-page-name='${pageName}']`);
+        `a.item[data-section="${Section[pageName]}"]`);
   }
 
   /**
@@ -63,7 +66,7 @@
    * - Active page does not have style "display: none"
    * - Inactive pages have style "display: none"
    */
-  function assertOnlyActivePageIsVisible(pageName: string): void {
+  function assertOnlyActivePageIsVisible(pageName: PageName): void {
     const pages =
         mainPageContainer.shadowRoot!.querySelectorAll('os-settings-section');
     let numActive = 0;
@@ -73,7 +76,7 @@
       if (page.hasAttribute('active')) {
         numActive++;
         assertNotEquals('none', displayStyle);
-        assertEquals(pageName, page.section);
+        assertEquals(Section[pageName], page.section);
       } else {
         assertEquals('none', displayStyle);
       }
@@ -106,27 +109,27 @@
 
   test('Network page should be the default visible page', () => {
     Router.getInstance().navigateTo(testRoutes.BASIC);
-    assertOnlyActivePageIsVisible('internet');
+    assertOnlyActivePageIsVisible('kNetwork');
   });
 
-  const pageNames = [
-    'apps',
-    'bluetooth',
-    'crostini',
-    'dateTime',
-    'device',
-    'files',
-    'internet',
-    'kerberos',
-    'multidevice',
-    'osAccessibility',
-    'osLanguages',
-    'osPeople',
-    'osPrinting',
-    'osPrivacy',
-    'osReset',
-    'osSearch',
-    'personalization',
+  const pageNames: PageName[] = [
+    'kAccessibility',
+    'kApps',
+    'kBluetooth',
+    'kCrostini',
+    'kDateAndTime',
+    'kDevice',
+    'kFiles',
+    'kKerberos',
+    'kMultiDevice',
+    'kLanguagesAndInput',
+    'kNetwork',
+    'kPeople',
+    'kPersonalization',
+    'kPrinting',
+    'kPrivacyAndSecurity',
+    'kReset',
+    'kSearchAndAssistant',
   ];
   for (const pageName of pageNames) {
     test(
diff --git a/chrome/test/enterprise/e2e/connector/device_trust_connector/device_trust_connector_windows_enrollment_test.py b/chrome/test/enterprise/e2e/connector/device_trust_connector/device_trust_connector_windows_enrollment_test.py
index 1f7db8f..5c4d4cf 100644
--- a/chrome/test/enterprise/e2e/connector/device_trust_connector/device_trust_connector_windows_enrollment_test.py
+++ b/chrome/test/enterprise/e2e/connector/device_trust_connector/device_trust_connector_windows_enrollment_test.py
@@ -82,13 +82,13 @@
       logging.info('key_trust_level: %s' % result['KeyTrustLevel'])
       self.assertIsNotNone(result['SpkiHash'])
       logging.info('device_hash: %s' % result['SpkiHash'])
-      # self.assertTrue(result['HistogramSuccess'])
       self.assertIsNotNone(result['FakeIdP'])
       self.assertIsNotNone(result['Histograms'])
       client = result['ClientSignals']
       server = result['ServerSignals']
       self.assertEqual(client['deviceEnrollmentDomain'], 'beyondcorp.bigr.name')
       self.assertEqual(client['safeBrowsingProtectionLevel'], 1)
+      self.assertEqual(client['trigger'], 1)
       self.assertEqual(server['keyTrustLevel'], 'CHROME_BROWSER_HW_KEY')
       self.assertIsNotNone(server['devicePermanentId'])
 
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index 921c9528..96bc449 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1135,7 +1135,7 @@
         // See description for FILTER_NON_FOCUSABLE_ELEMENTS.
         ((filters & FILTER_NON_FOCUSABLE_ELEMENTS) &&
          !IsWebElementFocusableForAutofill(element) &&
-         !IsSelectElement(element))) {
+         !IsSelectOrSelectMenuElement(element))) {
       continue;
     }
 
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc
index a8e6a80f8..68c0e89 100644
--- a/components/autofill/core/browser/autofill_field.cc
+++ b/components/autofill/core/browser/autofill_field.cc
@@ -320,9 +320,16 @@
     return AutofillType(server_type());
   }
 
-  // If the explicit type is cc-exp and either the server or heuristics agree
-  // on a 2 vs 4 digit specialization of cc-exp, use that specialization.
-  if (html_type_ == HtmlFieldType::kCreditCardExp) {
+  // TODO(crbug/1441057) Delete this if-statement when
+  // features::kAutofillEnableExpirationDateImprovements has launched. This
+  // should be covered by
+  // FormStructureRationalizer::RationalizeAutocompleteAttributes.
+  //
+  // If the explicit type is cc-exp and either the server or heuristics agree on
+  // a 2 vs 4 digit specialization of cc-exp, use that specialization.
+  if (html_type_ == HtmlFieldType::kCreditCardExp &&
+      !base::FeatureList::IsEnabled(
+          features::kAutofillEnableExpirationDateImprovements)) {
     if (server_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
         server_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR) {
       return AutofillType(server_type());
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index e03b1a6c..f5271913 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -2316,10 +2316,10 @@
 
     FieldTypeGroup field_group_type = autofill_field->Type().group();
 
-    // Don't fill unfocusable fields, with the exception of <select> fields, for
-    // the sake of filling the synthetic fields.
+    // Don't fill unfocusable fields, with the exception of <select> and
+    // <selectmenu> fields, for the sake of filling the synthetic fields.
     if (!autofill_field->IsFocusable()) {
-      bool skip = result.fields[i].form_control_type != "select-one";
+      bool skip = !result.fields[i].IsSelectOrSelectMenuElement();
       form_interactions_ukm_logger()
           ->LogHiddenRepresentationalFieldSkipDecision(*form_structure,
                                                        *autofill_field, skip);
diff --git a/components/autofill/core/browser/field_filler.cc b/components/autofill/core/browser/field_filler.cc
index 6888095d..739b790 100644
--- a/components/autofill/core/browser/field_filler.cc
+++ b/components/autofill/core/browser/field_filler.cc
@@ -770,36 +770,27 @@
   std::u16string yyyy = credit_card.Expiration4DigitYearAsString();
 
   ServerFieldType field_type = field.Type().GetStorableType();
-  CreditCardField::ExpirationDateFormat format =
-      CreditCardField::DetermineExpirationDateFormat(field, field_type);
-
-  // In case of a server override, try whether the server's format fits and use
-  // it if possible.
-  // TODO(crbug.com/1441057): Experiment with choosing the server type (when
-  // it's not an override) over the format string found on the website.
-  std::u16string server_year;
-  if (field.server_type() == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR) {
-    server_year = yy;
-  } else if (field.server_type() == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR) {
-    server_year = yyyy;
-  }
-  if (field.server_type_prediction_is_override() && !server_year.empty()) {
-    // Try several separators (longest to shortest), hoping that one fits.
-    std::array<std::u16string, 4> separator_candidates = {
-        format.separator,
-        std::u16string(base::TrimWhitespace(format.separator, base::TRIM_ALL)),
-        std::u16string(u"/"), std::u16string()};
-    for (const std::u16string& separator : separator_candidates) {
-      std::u16string expiration_candidate =
-          base::StrCat({mm, separator, server_year});
-      if (field.max_length == 0 ||
-          expiration_candidate.length() <= field.max_length) {
-        return expiration_candidate;
-      }
-    }
+  // At this point the field type is determined, so we pass it even as
+  // `forced_field_type`.
+  CreditCardField::ExpirationDateFormat format;
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillEnableExpirationDateImprovements)) {
+    format = CreditCardField::DetermineExpirationDateFormat(
+        field, /*fallback_type=*/field_type,
+        /*server_hint=*/field_type, /*forced_field_type=*/field_type);
+  } else {
+    // Before the experiment, the type was not fully determined yet. That
+    // happened at field filling time like in this else-branch.
+    ServerFieldType server_hint = field.server_type();
+    ServerFieldType forced_field_type =
+        field.server_type_prediction_is_override() ? server_hint
+                                                   : NO_SERVER_DATA;
+    ServerFieldType fallback_type = field.Type().GetStorableType();
+    format = CreditCardField::DetermineExpirationDateFormat(
+        field, /*fallback_type=*/fallback_type,
+        /*server_hint=*/server_hint, /*forced_field_type=*/forced_field_type);
   }
 
-  // Now try the format data derived locally from the website.
   std::u16string expiration_candidate =
       base::StrCat({mm, format.separator,
                     format.digits_in_expiration_year == 4 ? yyyy : yy});
diff --git a/components/autofill/core/browser/field_filler_unittest.cc b/components/autofill/core/browser/field_filler_unittest.cc
index 61237d2c..0c9a04f 100644
--- a/components/autofill/core/browser/field_filler_unittest.cc
+++ b/components/autofill/core/browser/field_filler_unittest.cc
@@ -645,20 +645,63 @@
                                     u"3"}));
 
 struct FillUtilExpirationDateTestCase {
+  const char* name;
   HtmlFieldType field_type;
   size_t field_max_length;
   std::u16string expected_value;
   bool expected_response;
   const char* opt_label = nullptr;
   ServerFieldType server_override = UNKNOWN_TYPE;
+  // If this is absl::nullopt, a test is valid regardless whether the
+  // features::kAutofillEnableExpirationDateImprovements is enabled or not.
+  // If it is true, it should only execute if
+  // features::kAutofillEnableExpirationDateImprovements is enabled. The inverse
+  // applies for false.
+  // TODO(crbug.com/1441057): Remove once launched. Delete all tests with a
+  // value of false, and remove the attribute from tests with a value of true.
+  absl::optional<bool> for_expiration_date_improvements_experiment =
+      absl::nullopt;
 };
 
 class ExpirationDateTest
     : public AutofillFieldFillerTest,
-      public testing::WithParamInterface<FillUtilExpirationDateTestCase> {};
+      public testing::WithParamInterface<
+          std::tuple<FillUtilExpirationDateTestCase,
+                     // Whether kAutofillEnableExpirationDateImprovements should
+                     // be enabled.
+                     bool>> {};
 
 TEST_P(ExpirationDateTest, FillExpirationDateInput) {
-  auto test_case = GetParam();
+  auto test_case = std::get<0>(GetParam());
+  auto enable_expiration_date_improvements = std::get<1>(GetParam());
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatureState(
+      features::kAutofillEnableExpirationDateImprovements,
+      enable_expiration_date_improvements);
+  SCOPED_TRACE(
+      ::testing::Message()
+      << "name=" << test_case.name << ", field_type=" << test_case.field_type
+      << ", field_max_length=" << test_case.field_max_length
+      << ", expected_value=" << test_case.expected_value
+      << ", expected_response=" << test_case.expected_response
+      << ", opt_label=" << test_case.opt_label
+      << ", server_override=" << test_case.server_override
+      << ", for_expiration_date_improvements_experiment="
+      << (test_case.for_expiration_date_improvements_experiment.has_value()
+              ? (test_case.for_expiration_date_improvements_experiment.value()
+                     ? "1"
+                     : "0")
+              : "not set"));
+
+  if (test_case.for_expiration_date_improvements_experiment.has_value() &&
+      test_case.for_expiration_date_improvements_experiment.value() !=
+          base::FeatureList::IsEnabled(
+              features::kAutofillEnableExpirationDateImprovements)) {
+    // The test case does not apply to the current experiment configuration and
+    // gets skipped.
+    return;
+  }
+
   AutofillField field;
   field.form_control_type = "text";
   field.SetHtmlType(test_case.field_type, HtmlFieldMode());
@@ -666,7 +709,8 @@
 
   CreditCardField::ExpirationDateFormat format =
       CreditCardField::DetermineExpirationDateFormat(
-          field, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
+          field, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, NO_SERVER_DATA,
+          NO_SERVER_DATA);
   field.set_heuristic_type(PatternSource::kLegacy,
                            format.digits_in_expiration_year == 2
                                ? CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
@@ -694,135 +738,201 @@
 INSTANTIATE_TEST_SUITE_P(
     AutofillFieldFillerTest,
     ExpirationDateTest,
-    testing::Values(
-        // A field predicted as a expiration date w/ 2 digit year should fill
-        // with a format of MM/YY unless it has max-length of:
-        // 4: Use format MMYY
-        // 6: Use format MMYYYY
-        // 7: Use format MM/YYYY
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear,
-            /* default value */ 0, u"03/22", true},
-        // Unsupported max lengths of 1-3, fail
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 1, u"", false},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 2, u"", false},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 3, u"", false},
-        // A max length of 4 indicates a format of MMYY.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 4, u"0322", true},
-        // A max length of 6 indicates a format of MMYYYY, the 21st century is
-        // assumed.
-        // Desired case of proper max length >= 5
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 5, u"03/22", true},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 6, u"032022", true},
-        // A max length of 7 indicates a format of MM/YYYY, the 21st century is
-        // assumed.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 7, u"03/2022", true},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 12, u"03/22", true},
+    testing::Combine(
+        testing::Values(
+            // A field predicted as a expiration date w/ 2 digit year should
+            // fill with a format of MM/YY
+            FillUtilExpirationDateTestCase{
+                "Test 1", HtmlFieldType::kCreditCardExpDate2DigitYear,
+                /* default value */ 0, u"03/22", true},
+            // Unsupported max lengths of 1-3, fail
+            FillUtilExpirationDateTestCase{
+                "Test 2", HtmlFieldType::kCreditCardExpDate2DigitYear, 1, u"",
+                false},
+            FillUtilExpirationDateTestCase{
+                "Test 3", HtmlFieldType::kCreditCardExpDate2DigitYear, 2, u"",
+                false},
+            FillUtilExpirationDateTestCase{
+                "Test 4", HtmlFieldType::kCreditCardExpDate2DigitYear, 3, u"",
+                false},
+            // A max length of 4 indicates a format of MMYY.
+            FillUtilExpirationDateTestCase{
+                "Test 5", HtmlFieldType::kCreditCardExpDate2DigitYear, 4,
+                u"0322", true},
+            // Desired case of proper max length >= 5
+            FillUtilExpirationDateTestCase{
+                "Test 6", HtmlFieldType::kCreditCardExpDate2DigitYear, 5,
+                u"03/22", true},
+            // If kAutofillEnableExpirationDateImprovements is enabled, the
+            // overall type comes from
+            // HtmlFieldType::kCreditCardExpDate2DigitYear and therefore, we
+            // fill 03/22.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 7",
+                .field_type = HtmlFieldType::kCreditCardExpDate2DigitYear,
+                .field_max_length = 6,
+                .expected_value = u"03/22",
+                .expected_response = true,
+                .for_expiration_date_improvements_experiment = true},
+            // If kAutofillEnableExpirationDateImprovements is disabled, the max
+            // length drives the length of the filling.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 8",
+                .field_type = HtmlFieldType::kCreditCardExpDate2DigitYear,
+                .field_max_length = 6,
+                .expected_value = u"032022",
+                .expected_response = true,
+                .for_expiration_date_improvements_experiment = false},
+            // If kAutofillEnableExpirationDateImprovements is enabled, the
+            // overall type comes from
+            // HtmlFieldType::kCreditCardExpDate2DigitYear and therefore, we
+            // fill 03/22.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 9",
+                .field_type = HtmlFieldType::kCreditCardExpDate2DigitYear,
+                .field_max_length = 7,
+                .expected_value = u"03/22",
+                .expected_response = true,
+                .for_expiration_date_improvements_experiment = true},
+            // If kAutofillEnableExpirationDateImprovements is disabled, the max
+            // length drives the length of the filling.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 10",
+                .field_type = HtmlFieldType::kCreditCardExpDate2DigitYear,
+                .field_max_length = 7,
+                .expected_value = u"03/2022",
+                .expected_response = true,
+                .for_expiration_date_improvements_experiment = false},
+            FillUtilExpirationDateTestCase{
+                "Test 11", HtmlFieldType::kCreditCardExpDate2DigitYear, 12,
+                u"03/22", true},
 
-        // A field predicted as a expiration date w/ 4 digit year should fill
-        // with a format of MM/YYYY unless it has max-length of:
-        // 4: Use format MMYY
-        // 5: Use format MM/YY
-        // 6: Use format MMYYYY
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear,
-            /* default value */ 0, u"03/2022", true},
-        // Unsupported max lengths of 1-3, fail
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 1, u"", false},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 2, u"", false},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 3, u"", false},
-        // A max length of 4 indicates a format of MMYY.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 4, u"0322", true},
-        // A max length of 5 indicates a format of MM/YY.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 5, u"03/22", true},
-        // A max length of 6 indicates a format of MMYYYY.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 6, u"032022", true},
-        // Desired case of proper max length >= 7
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 7, u"03/2022", true},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 12, u"03/2022", true},
+            // A field predicted as a expiration date w/ 4 digit year should
+            // fill with a format of MM/YYYY unless it has max-length of: 4: Use
+            // format MMYY 5: Use format MM/YY 6: Use format MMYYYY
+            FillUtilExpirationDateTestCase{
+                "Test 12", HtmlFieldType::kCreditCardExpDate4DigitYear,
+                /* default value */ 0, u"03/2022", true},
+            // Unsupported max lengths of 1-3, fail
+            FillUtilExpirationDateTestCase{
+                "Test 13", HtmlFieldType::kCreditCardExpDate4DigitYear, 1, u"",
+                false},
+            FillUtilExpirationDateTestCase{
+                "Test 14", HtmlFieldType::kCreditCardExpDate4DigitYear, 2, u"",
+                false},
+            FillUtilExpirationDateTestCase{
+                "Test 15", HtmlFieldType::kCreditCardExpDate4DigitYear, 3, u"",
+                false},
+            // A max length of 4 indicates a format of MMYY.
+            FillUtilExpirationDateTestCase{
+                "Test 16", HtmlFieldType::kCreditCardExpDate4DigitYear, 4,
+                u"0322", true},
+            // A max length of 5 indicates a format of MM/YY.
+            FillUtilExpirationDateTestCase{
+                "Test 17", HtmlFieldType::kCreditCardExpDate4DigitYear, 5,
+                u"03/22", true},
+            // A max length of 6 indicates a format of MMYYYY.
+            FillUtilExpirationDateTestCase{
+                "Test 18", HtmlFieldType::kCreditCardExpDate4DigitYear, 6,
+                u"032022", true},
+            // Desired case of proper max length >= 7
+            FillUtilExpirationDateTestCase{
+                "Test 19", HtmlFieldType::kCreditCardExpDate4DigitYear, 7,
+                u"03/2022", true},
+            FillUtilExpirationDateTestCase{
+                "Test 20", HtmlFieldType::kCreditCardExpDate4DigitYear, 12,
+                u"03/2022", true},
 
-        // Tests for features::kAutofillFillCreditCardAsPerFormatString:
+            // Tests for features::kAutofillFillCreditCardAsPerFormatString:
 
-        // Base case works regardless of capitalization.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03/22", true,
-            "mm/yy"},
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03/22", true,
-            "MM/YY"},
-        // Even if we expect a 4 digit expiration date, we follow the
-        // placeholder.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 0, u"03/22", true,
-            "MM/YY"},
-        // Whitespaces are respected.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03 / 22", true,
-            "MM / YY"},
-        // Whitespaces are stripped if that makes the string fit.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 5, u"03/22", true,
-            "MM / YY"},
-        // Different separators work.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03-22", true,
-            "MM-YY"},
-        // Four year expiration years work.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03-2022", true,
-            "MM-YYYY"},
-        // Some extra text around the pattern does not matter.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03/22", true,
-            "Credit card in format MM/YY."},
-        // Fallback to the length based filling in case the maxlength is too
-        // low.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 5, u"03/22", true,
-            "MM/YYYY"},
-        // Empty strings are handled gracefully.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 5, u"03/22", true, ""},
+            // Base case works regardless of capitalization.
+            FillUtilExpirationDateTestCase{
+                "Test 21", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03/22", true, "mm/yy"},
+            FillUtilExpirationDateTestCase{
+                "Test 22", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03/22", true, "MM/YY"},
+            // If we expect a 4 digit expiration date, we consider only the
+            // separator of the the placeholder once
+            // kAutofillEnableExpirationDateImprovements is launched.
+            //
+            // If kAutofillEnableExpirationDateImprovements is enabled, the
+            // overall type comes from
+            // HtmlFieldType::kCreditCardExpDate4DigitYear and therefore, we
+            // fill 03/2022.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 23",
+                .field_type = HtmlFieldType::kCreditCardExpDate4DigitYear,
+                .field_max_length = 0,
+                .expected_value = u"03/2022",
+                .expected_response = true,
+                .opt_label = "MM/YY",
+                .for_expiration_date_improvements_experiment = true},
+            // If kAutofillEnableExpirationDateImprovements is disabled, the
+            // pattern defines the length of the filling.
+            FillUtilExpirationDateTestCase{
+                .name = "Test 24",
+                .field_type = HtmlFieldType::kCreditCardExpDate4DigitYear,
+                .field_max_length = 0,
+                .expected_value = u"03/22",
+                .expected_response = true,
+                .opt_label = "MM/YY",
+                .for_expiration_date_improvements_experiment = false},
+            // Whitespaces are respected.
+            FillUtilExpirationDateTestCase{
+                "Test 25", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03 / 22", true, "MM / YY"},
+            // Whitespaces are stripped if that makes the string fit.
+            FillUtilExpirationDateTestCase{
+                "Test 26", HtmlFieldType::kCreditCardExpDate2DigitYear, 5,
+                u"03/22", true, "MM / YY"},
+            // Different separators work.
+            FillUtilExpirationDateTestCase{
+                "Test 27", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03-22", true, "MM-YY"},
+            // Four year expiration years work.
+            FillUtilExpirationDateTestCase{
+                "Test 28", HtmlFieldType::kCreditCardExpDate4DigitYear, 0,
+                u"03-2022", true, "MM-YYYY"},
+            // Some extra text around the pattern does not matter.
+            FillUtilExpirationDateTestCase{
+                "Test 29", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03/22", true, "Credit card in format MM/YY."},
+            // Fallback to the length based filling in case the maxlength is too
+            // low.
+            FillUtilExpirationDateTestCase{
+                "Test 30", HtmlFieldType::kCreditCardExpDate4DigitYear, 5,
+                u"03/22", true, "MM/YYYY"},
+            // Empty strings are handled gracefully.
+            FillUtilExpirationDateTestCase{
+                "Test 31", HtmlFieldType::kCreditCardExpDate4DigitYear, 5,
+                u"03/22", true, ""},
 
-        // Test manual server overrides:
-        // Even if the label indicates a mm/yy, a server override for a 4 digit
-        // year should be honored if it fits.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate2DigitYear, 0, u"03/2022", true,
-            "mm/yy", CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
-        // Follow the server if it overrides a shorter date format.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 0, u"03/22", true,
-            "mm/yyyy", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-        // Follow the server but preserve the separator if possible.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 0, u"03 - 22", true,
-            "mm - yyyy", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-        // Follow the server but preserve the separator if possible, even if
-        // that means that whitespaces need to be pruned.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 5, u"03-22", true,
-            "mm - yy", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-        // If the server format just does not fit, fall back to heuristics.
-        FillUtilExpirationDateTestCase{
-            HtmlFieldType::kCreditCardExpDate4DigitYear, 4, u"0322", true,
-            "mm/yy", CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR}));
+            // Test manual server overrides:
+            // Even if the label indicates a mm/yy, a server override for a 4
+            // digit year should be honored if it fits.
+            FillUtilExpirationDateTestCase{
+                "Test 32", HtmlFieldType::kCreditCardExpDate2DigitYear, 0,
+                u"03/2022", true, "mm/yy", CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+            // Follow the server if it overrides a shorter date format.
+            FillUtilExpirationDateTestCase{
+                "Test 33", HtmlFieldType::kCreditCardExpDate4DigitYear, 0,
+                u"03/22", true, "mm/yyyy", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
+            // Follow the server but preserve the separator if possible.
+            FillUtilExpirationDateTestCase{
+                "Test 34", HtmlFieldType::kCreditCardExpDate4DigitYear, 0,
+                u"03 - 22", true, "mm - yyyy",
+                CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
+            // Follow the server but preserve the separator if possible, even if
+            // that means that whitespaces need to be pruned.
+            FillUtilExpirationDateTestCase{
+                "Test 35", HtmlFieldType::kCreditCardExpDate4DigitYear, 5,
+                u"03-22", true, "mm - yy", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
+            // If the server format just does not fit, fall back to heuristics.
+            FillUtilExpirationDateTestCase{
+                "Test 36", HtmlFieldType::kCreditCardExpDate4DigitYear, 4,
+                u"0322", true, "mm/yy", CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR}),
+        testing::Bool()));
 
 TEST_F(AutofillFieldFillerTest, FillSelectControlByValue) {
   std::vector<const char*> kOptions = {
diff --git a/components/autofill/core/browser/form_parsing/credit_card_field.cc b/components/autofill/core/browser/form_parsing/credit_card_field.cc
index e9ea2ac..14f9cf4 100644
--- a/components/autofill/core/browser/form_parsing/credit_card_field.cc
+++ b/components/autofill/core/browser/form_parsing/credit_card_field.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -504,8 +505,10 @@
               ? CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
               : CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
       ExpirationDateFormat format =
-          CreditCardField::DetermineExpirationDateFormat(*expiration_date_,
-                                                         fallback_type);
+          CreditCardField::DetermineExpirationDateFormat(
+              *expiration_date_, /*fallback_type=*/fallback_type,
+              /*server_hint=*/NO_SERVER_DATA,
+              /*forced_field_type=*/NO_SERVER_DATA);
       AddClassification(expiration_date_,
                         format.digits_in_expiration_year == 2
                             ? CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
@@ -671,9 +674,11 @@
 CreditCardField::ExpirationDateFormat
 CreditCardField::DetermineExpirationDateFormat(
     const AutofillField& field,
-    ServerFieldType assumed_field_type) {
-  CHECK(assumed_field_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
-        assumed_field_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
+    ServerFieldType fallback_type,
+    ServerFieldType server_hint,
+    ServerFieldType forced_field_type) {
+  CHECK(fallback_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
+        fallback_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR);
   static constexpr size_t kMonthLength = 2;  // 2 characters for a MM format.
   // Check whether we find one of the standard format descriptors like
   // "mm/yy", "mm/yyyy", "mm / yy", "mm-yyyy", ... in one of the human
@@ -682,6 +687,7 @@
   bool matches = false;
   if (base::FeatureList::IsEnabled(
           features::kAutofillEnableExpirationDateImprovements)) {
+    // TODO(crbug/1326244): We should use a language specific regex.
     static constexpr char16_t kFormatRegex[] =
         u"mm(\\s?[/-]?\\s?)?(y{2,4}|a{2,4})";
     //       ^^^^ opt white space
@@ -699,25 +705,70 @@
     matches = MatchesRegex<kFormatRegEx>(field.placeholder, &groups) ||
               MatchesRegex<kFormatRegEx>(field.label, &groups);
   }
-  // TODO(crbug/1326244): We should use language specific regex.
+
+  // Build a list of separator candidates from the regular expression sorted
+  // by what we want to fill most.
+  std::vector<std::u16string> separator_candidates;
   if (matches) {
+    // First choice: The matching separator with padding whitespace.
     const std::u16string& separator = groups[1];
-    const std::u16string& year_format = groups[2];
-    uint8_t year_length = year_format.length();
-    uint8_t candidate_size = kMonthLength + separator.length() + year_length;
-    if (field.max_length == 0 || candidate_size <= field.max_length) {
-      return {separator, year_length};
-    }
-    // Try once more with a stripped version of the separator if the previous
-    // version did not fit.
+    separator_candidates.emplace_back(separator);
+
+    // Fallback: The matching separator with padding whitespace trimmed.
     base::StringPiece16 trimmed_separator =
-        base::TrimWhitespace(groups[1], base::TRIM_ALL);
-    candidate_size = kMonthLength + trimmed_separator.length() + year_length;
-    if (field.max_length == 0 || candidate_size <= field.max_length) {
-      return {std::u16string(trimmed_separator), year_length};
+        base::TrimWhitespace(separator, base::TRIM_ALL);
+    if (trimmed_separator != separator) {
+      separator_candidates.emplace_back(trimmed_separator);
+    }
+  }
+  // Add generic fallbacks.
+  for (const char16_t* fallback : {u"/", u""}) {
+    if (!base::Contains(separator_candidates, fallback)) {
+      separator_candidates.emplace_back(fallback);
     }
   }
 
+  // Build a list of lengths of the expiration year (this can only contain
+  // entries for a length of 2 or 4 digits; or remain empty). The order of the
+  // elements matters.
+  // We may temporarily add 0 entries in case a specific parameter does not
+  // have an indication for the format to use. This simplifies the code.
+  constexpr uint8_t kInvalid = 0;
+  auto type_length = [](ServerFieldType type) -> uint8_t {
+    return type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR   ? 2
+           : type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR ? 4
+                                                       : kInvalid;
+  };
+  std::vector<uint8_t> year_length_candidates = {
+      // First choice: Look at the forced field type (this is a server override
+      // or the result of the entire classification chain).
+      type_length(forced_field_type),
+      // Fall back to a pattern found with the regex if the server does not have
+      // an override. If the regex matched, groups[2] refers to the the the year
+      // part (i.e. YY or YYYY in English strings).
+      matches ? static_cast<uint8_t>(groups[2].length()) : kInvalid,
+      // Finally, fall back to server hints if they are available.
+      type_length(server_hint)};
+  // Now erase all zeros that indicate that some of the three cases above did
+  // not lead to a hint.
+  base::Erase(year_length_candidates, kInvalid);
+
+  // If we don't have any concrete hints from the server or the matched date
+  // pattern, we leave `year_length_candidates` empty (instead of always adding
+  // a 4 and/or 2) as we have further heuristics based on `field.max_length`
+  // that will be processed later.
+
+  for (uint8_t year_length : year_length_candidates) {
+    for (const std::u16string& separator : separator_candidates) {
+      uint8_t candidate_size = kMonthLength + separator.length() + year_length;
+      if (field.max_length == 0 || candidate_size <= field.max_length) {
+        return {separator, year_length};
+      }
+    }
+  }
+
+  // Now use to the `field.max_length` attribute to guess an appropriate
+  // format.
   switch (field.max_length) {
     case 1:
     case 2:
@@ -739,7 +790,7 @@
       return {.separator = u"/", .digits_in_expiration_year = 4};
     default:
       // Includes the case where max_length is not specified (0).
-      return assumed_field_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
+      return fallback_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR
                  ? ExpirationDateFormat{u"/", /*digits_in_expiration_year*/ 2}
                  : ExpirationDateFormat{u"/", /*digits_in_expiration_year*/ 4};
   }
diff --git a/components/autofill/core/browser/form_parsing/credit_card_field.h b/components/autofill/core/browser/form_parsing/credit_card_field.h
index ffcfab24..d449dde 100644
--- a/components/autofill/core/browser/form_parsing/credit_card_field.h
+++ b/components/autofill/core/browser/form_parsing/credit_card_field.h
@@ -46,12 +46,27 @@
   };
   // Returns formatting instructions for an CC expiration date <input> field
   // based on properties of the field (maximum length, label, placeholder, ...).
-  // The `assumed_field_type` specifies the number of digits to use for a field
+  //
+  // The `forced_field_type` is always used over detected patterns (like "MM /
+  // YY" or "MM/YYYY") in a label or placeholder if possible. There are two main
+  // usecases for this: 1) server overrides should be given precedence over
+  // local heuristics. 2) During the final filling moment, we try to stick to
+  // the overall type for filling and only diverge if the type does not fit into
+  // the field. If the `forced_field_type` is `NO_SERVER_DATA`, it gets ignored.
+  //
+  // The `server_hint` is used if `DetermineExpirationDateFormat` does not
+  // detect any pattern on the website. This is for classical crowdsourcing,
+  // which sometimes makes errors. If the `server_hint` is `NO_SERVER_DATA`, it
+  // gets ignored.
+  //
+  // The `fallback_type` specifies the number of digits to use for a field
   // if there are no hints on what's best. It must be either
   // CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR or CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR.
   static ExpirationDateFormat DetermineExpirationDateFormat(
       const AutofillField& field,
-      ServerFieldType assumed_field_type);
+      ServerFieldType fallback_type,
+      ServerFieldType server_hint,
+      ServerFieldType forced_field_type);
 
  protected:
   void AddClassifications(FieldCandidatesMap& field_candidates) const override;
diff --git a/components/autofill/core/browser/form_parsing/credit_card_field_unittest.cc b/components/autofill/core/browser/form_parsing/credit_card_field_unittest.cc
index 31f3e07..3fe3dca 100644
--- a/components/autofill/core/browser/form_parsing/credit_card_field_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/credit_card_field_unittest.cc
@@ -589,6 +589,8 @@
   const uint8_t expected_year_length;
   const std::string label;
   const int max_length;
+  ServerFieldType server_type_hint = NO_SERVER_DATA;
+  bool is_server_override = false;
 };
 
 class DetermineExpirationDateFormat
@@ -668,7 +670,41 @@
         DetermineExpirationDateFormatTestCase{" - ", 2, "MM - YY", 0},
 
         // Date fits after stripping whitespaces from separator.
-        DetermineExpirationDateFormatTestCase{"-", 2, "MM - YY", 5}));
+        DetermineExpirationDateFormatTestCase{"-", 2, "MM - YY", 5},
+
+        // Verify that server hints are getting priority over max_length
+        // but not over the pattern.
+        //
+        // Due to the MM / YY pattern, the 2 digit expiration date is chosen.
+        DetermineExpirationDateFormatTestCase{
+            " / ", 2, "MM / YY", 0, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+        DetermineExpirationDateFormatTestCase{
+            " / ", 2, "MM / YY", 7, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+        // If no pattern and max length are given, the server hint wins.
+        DetermineExpirationDateFormatTestCase{
+            "/", 4, "", 0, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+        DetermineExpirationDateFormatTestCase{
+            "/", 2, "", 0, CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
+        // The max-length may require a pruning of the separator.
+        DetermineExpirationDateFormatTestCase{
+            "/", 4, "", 7, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+        DetermineExpirationDateFormatTestCase{
+            "", 4, "", 6, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+        // But at some point we ignore the server if the type does not fit:
+        DetermineExpirationDateFormatTestCase{
+            "/", 2, "", 5, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR},
+
+        // Verify that server overrides are prioritized over everything else.
+        DetermineExpirationDateFormatTestCase{
+            " / ", 4, "MM / YY", 0, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, true},
+        // The max-length may require a pruning of the separator.
+        DetermineExpirationDateFormatTestCase{
+            "/", 4, "MM / YY", 7, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, true},
+        DetermineExpirationDateFormatTestCase{
+            "", 4, "MM / YY", 6, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, true},
+        // But at some point we ignore the server if the type does not fit:
+        DetermineExpirationDateFormatTestCase{
+            "/", 2, "MM / YY", 5, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, true}));
 
 TEST_P(DetermineExpirationDateFormat, TestDetermineFormat) {
   // Assists in identifying which case has failed.
@@ -676,15 +712,20 @@
   SCOPED_TRACE(test_case().expected_year_length);
   SCOPED_TRACE(test_case().label);
   SCOPED_TRACE(test_case().max_length);
+  SCOPED_TRACE(test_case().server_type_hint);
+  SCOPED_TRACE(test_case().is_server_override);
 
   AutofillField field;
   field.max_length = test_case().max_length;
   field.label = base::UTF8ToUTF16(test_case().label);
 
-  ServerFieldType assumed_field_type = CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
+  ServerFieldType fallback_type = CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR;
 
   CreditCardField::ExpirationDateFormat result =
-      CreditCardField::DetermineExpirationDateFormat(field, assumed_field_type);
+      CreditCardField::DetermineExpirationDateFormat(
+          field, fallback_type, test_case().server_type_hint,
+          test_case().is_server_override ? test_case().server_type_hint
+                                         : NO_SERVER_DATA);
   EXPECT_EQ(base::UTF8ToUTF16(test_case().expected_separator),
             result.separator);
   EXPECT_EQ(test_case().expected_year_length, result.digits_in_expiration_year);
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc
index 1c046901..666fe8d 100644
--- a/components/autofill/core/browser/form_parsing/form_field.cc
+++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -378,11 +378,11 @@
     // Ignore checkable fields as they interfere with parsers assuming context.
     // Eg., while parsing address, "Is PO box" checkbox after ADDRESS_LINE1
     // interferes with correctly understanding ADDRESS_LINE2.
-    // Ignore fields marked as presentational, unless for 'select' fields (for
-    // synthetic fields.)
+    // Ignore fields marked as presentational, unless for 'select' and
+    // 'selectmenu' fields (for synthetic fields.)
     if (IsCheckable(field->check_status) ||
         (field->role == FormFieldData::RoleAttribute::kPresentation &&
-         field->form_control_type != "select-one")) {
+         !field->IsSelectOrSelectMenuElement())) {
       continue;
     }
     processed_fields.push_back(field.get());
diff --git a/components/autofill/core/browser/form_structure_rationalizer.cc b/components/autofill/core/browser/form_structure_rationalizer.cc
index 774bbaf..bc0bd61 100644
--- a/components/autofill/core/browser/form_structure_rationalizer.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer.cc
@@ -116,12 +116,26 @@
           set_html_type(HtmlFieldType::kAdditionalNameInitial);
         }
         break;
+      // We look at kCreditCardExpDate2DigitYear and
+      // kCreditCardExpDate4DigitYear as well (not just kCreditCardExp which
+      // is generated by the autocomplete attribute parser) because the server
+      // hints can have changed (they may not have been available during the
+      // first rationalization). In that case we want to rationalize again.
       case HtmlFieldType::kCreditCardExp:
+      case HtmlFieldType::kCreditCardExpDate2DigitYear:
+      case HtmlFieldType::kCreditCardExpDate4DigitYear:
         if (base::FeatureList::IsEnabled(
                 features::kAutofillEnableExpirationDateImprovements)) {
-          set_html_type(CreditCardField::DetermineExpirationDateFormat(
-                            *field, CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR)
-                                    .digits_in_expiration_year == 4
+          ServerFieldType server_hint = field->server_type();
+          ServerFieldType forced_field_type =
+              field->server_type_prediction_is_override() ? field->server_type()
+                                                          : NO_SERVER_DATA;
+          CreditCardField::ExpirationDateFormat format =
+              CreditCardField::DetermineExpirationDateFormat(
+                  *field, /*fallback_type=*/CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
+                  /*server_hint=*/server_hint,
+                  /*forced_field_type=*/forced_field_type);
+          set_html_type(format.digits_in_expiration_year == 4
                             ? HtmlFieldType::kCreditCardExpDate4DigitYear
                             : HtmlFieldType::kCreditCardExpDate2DigitYear);
         } else {
@@ -330,6 +344,40 @@
         break;
     }
   }
+
+  // If after rationalization we have an expiration date field, we consider
+  // once more whether we should make this a field with a 2 or 4 digit
+  // expiration year based on server information.
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillEnableExpirationDateImprovements)) {
+    for (const auto& field : *fields_) {
+      // Here we look at the type after rationalization.
+      ServerFieldType current_field_type = field->Type().GetStorableType();
+      if (current_field_type == CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR ||
+          current_field_type == CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR) {
+        ServerFieldType server_hint = field->server_type();
+        ServerFieldType forced_field_type =
+            field->server_type_prediction_is_override() ? server_hint
+                                                        : NO_SERVER_DATA;
+        CreditCardField::ExpirationDateFormat format =
+            CreditCardField::DetermineExpirationDateFormat(
+                *field, /*fallback_type=*/CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
+                /*server_hint=*/server_hint,
+                /*forced_field_type=*/forced_field_type);
+        ServerFieldType new_field_type =
+            format.digits_in_expiration_year == 4
+                ? CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR
+                : CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR;
+        if (new_field_type != current_field_type) {
+          LOG_AF(log_manager)
+              << LoggingScope::kRationalization << LogMessage::kRationalization
+              << "Credit card rationalization: Updated expiration date format "
+                 "with server hints or via patterns found in the labels.";
+          field->SetTypeTo(AutofillType(new_field_type));
+        }
+      }
+    }
+  }
 }
 
 void FormStructureRationalizer::RationalizeMultiOriginCreditCardFields(
@@ -624,9 +672,10 @@
   for (auto current_index = field_index + 1; current_index < fields_->size();
        current_index++) {
     if ((*fields_)[current_index]->IsFocusable() ||
-        (*fields_)[current_index]->form_control_type != "select-one" ||
-        (*fields_)[current_index]->Type().GetStorableType() != old_type)
+        !(*fields_)[current_index]->IsSelectOrSelectMenuElement() ||
+        (*fields_)[current_index]->Type().GetStorableType() != old_type) {
       break;
+    }
     ApplyRationalizationsToFieldAndLog(current_index, new_type, form_signature,
                                        form_interactions_ukm_logger);
   }
@@ -637,9 +686,10 @@
     return;
   for (auto current_index = field_index - 1;; current_index--) {
     if ((*fields_)[current_index]->IsFocusable() ||
-        (*fields_)[current_index]->form_control_type != "select-one" ||
-        (*fields_)[current_index]->Type().GetStorableType() != old_type)
+        !(*fields_)[current_index]->IsSelectOrSelectMenuElement() ||
+        (*fields_)[current_index]->Type().GetStorableType() != old_type) {
       break;
+    }
     ApplyRationalizationsToFieldAndLog(current_index, new_type, form_signature,
                                        form_interactions_ukm_logger);
     if (current_index == 0)
diff --git a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
index 46998273..d3ea30c 100644
--- a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/autofill/core/browser/form_structure_rationalizer.h"
 
+#include <tuple>
 #include <utility>
 
 #include "base/base64.h"
@@ -44,6 +45,8 @@
   base::StringPiece name;
   // This is a field type we assume the autofill server would provide for
   // the given field.
+  // TODO(crbug.com/1441057) Rename field_type to server_type to clarify what
+  // it represents. Also change to server_type_is_override below.
   ServerFieldType field_type = UNKNOWN_TYPE;
   // Section name of a field.
   base::StringPiece section = "";
@@ -54,6 +57,9 @@
   FormFieldData::RoleAttribute role = FormFieldData::RoleAttribute::kOther;
   absl::optional<url::Origin> subframe_origin;
   absl::optional<FormGlobalId> host_form;
+  bool field_type_is_override = false;
+  // Only appled if BuildFormStructure is called with run_heuristics=false.
+  ServerFieldType heuristic_type = UNKNOWN_TYPE;
 };
 
 // These are helper functions that set a special flag in a field_template.
@@ -115,20 +121,29 @@
     field_suggestion->set_field_signature(
         CalculateFieldSignatureForField(form.fields[i]).value());
     *field_suggestion->add_predictions() =
-        ::autofill::test::CreateFieldPrediction(fields[i].field_type);
+        ::autofill::test::CreateFieldPrediction(
+            fields[i].field_type, fields[i].field_type_is_override);
   }
   std::string response_string = SerializeAndEncode(response);
 
   return std::make_pair(form, response_string);
 }
 
-std::unique_ptr<FormStructure> BuildFormStructure(FormData form,
-                                                  std::string response_string,
-                                                  bool run_heuristics) {
+std::unique_ptr<FormStructure> BuildFormStructure(
+    const std::vector<FieldTemplate>& fields,
+    bool run_heuristics) {
+  FormData form;
+  std::string response_string;
+  std::tie(form, response_string) = CreateFormAndServerClassification(fields);
   auto form_structure = std::make_unique<FormStructure>(form);
   // Identifies the sections based on the heuristics types.
   if (run_heuristics) {
     form_structure->DetermineHeuristicTypes(nullptr, nullptr);
+  } else {
+    for (size_t i = 0; i < fields.size(); ++i) {
+      form_structure->field(i)->set_heuristic_type(PatternSource::kLegacy,
+                                                   fields[i].heuristic_type);
+    }
   }
   // Calls RationalizeFieldTypePredictions.
   FormStructure::ParseApiQueryResponse(
@@ -137,14 +152,6 @@
   return form_structure;
 }
 
-std::unique_ptr<FormStructure> BuildFormStructure(
-    std::pair<FormData, std::string> form_and_server_classifications,
-    bool run_heuristics) {
-  return BuildFormStructure(std::move(form_and_server_classifications.first),
-                            std::move(form_and_server_classifications.second),
-                            run_heuristics);
-}
-
 std::vector<ServerFieldType> GetTypes(const FormStructure& form_structure) {
   std::vector<ServerFieldType> server_types;
   server_types.reserve(form_structure.field_count());
@@ -207,11 +214,10 @@
 
 TEST_F(FormStructureRationalizerTest, ParseQueryResponse_RationalizeLoneField) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification(
-          {{"fullname", "fullname", NAME_FULL},
-           {"address", "address", ADDRESS_HOME_LINE1},
-           {"height", "height", CREDIT_CARD_EXP_MONTH},  // Uh-oh!
-           {"email", "email", EMAIL_ADDRESS}}),
+      {{"fullname", "fullname", NAME_FULL},
+       {"address", "address", ADDRESS_HOME_LINE1},
+       {"height", "height", CREDIT_CARD_EXP_MONTH},  // Uh-oh!
+       {"email", "email", EMAIL_ADDRESS}},
       /*run_heuristics=*/false);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -220,10 +226,9 @@
 
 TEST_F(FormStructureRationalizerTest, ParseQueryResponse_RationalizeCCName) {
   std::unique_ptr<FormStructure> form_structure =
-      BuildFormStructure(CreateFormAndServerClassification(
-                             {{"First Name", "fname", CREDIT_CARD_NAME_FIRST},
-                              {"Last Name", "lname", CREDIT_CARD_NAME_LAST},
-                              {"email", "email", EMAIL_ADDRESS}}),
+      BuildFormStructure({{"First Name", "fname", CREDIT_CARD_NAME_FIRST},
+                          {"Last Name", "lname", CREDIT_CARD_NAME_LAST},
+                          {"email", "email", EMAIL_ADDRESS}},
                          /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(NAME_FIRST, NAME_LAST, EMAIL_ADDRESS));
@@ -231,13 +236,13 @@
 TEST_F(FormStructureRationalizerTest,
        ParseQueryResponse_RationalizeMultiMonth_1) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Cardholder", "fullname", CREDIT_CARD_NAME_FULL},
           {"Card Number", "address", CREDIT_CARD_NUMBER},
           {"Month", "expiry_month", CREDIT_CARD_EXP_MONTH},
           {"Year", "expiry_year", CREDIT_CARD_EXP_2_DIGIT_YEAR},
           {"Quantity", "quantity", CREDIT_CARD_EXP_MONTH}  // Uh-oh!
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(CREDIT_CARD_NAME_FULL, CREDIT_CARD_NUMBER,
@@ -248,12 +253,12 @@
 TEST_F(FormStructureRationalizerTest,
        ParseQueryResponse_RationalizeMultiMonth_2) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Cardholder", "fullname", CREDIT_CARD_NAME_FULL},
           {"Card Number", "address", CREDIT_CARD_NUMBER},
           {"Expiry Date (MMYY)", "expiry", CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
           {"Quantity", "quantity", CREDIT_CARD_EXP_MONTH},  // Uh-oh!
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(CREDIT_CARD_NAME_FULL, CREDIT_CARD_NUMBER,
@@ -263,12 +268,12 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizePhoneNumber_RunsOncePerSection) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Home Phone", "homePhoneNumber", PHONE_HOME_WHOLE_NUMBER},
           {"Cell Phone", "cellPhoneNumber", PHONE_HOME_WHOLE_NUMBER},
-      }),
+      },
       /*run_heuristics=*/false);
   Section s = form_structure->field(0)->section;
   EXPECT_FALSE(test_api(*form_structure).phone_rationalized(s));
@@ -284,11 +289,11 @@
 
 TEST_F(FormStructureRationalizerTest, RationalizeStreetAddressAndAddressLine) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address1", "address1", ADDRESS_HOME_STREET_ADDRESS},
           {"Address2", "address2", ADDRESS_HOME_LINE2},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(NAME_FULL, ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2));
@@ -334,8 +339,8 @@
   for (ServerFieldType type : kCorrectTypes) {
     fields.push_back({"", "", type});
   }
-  std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification(fields), /*run_heuristics=*/false);
+  std::unique_ptr<FormStructure> form_structure =
+      BuildFormStructure(fields, /*run_heuristics=*/false);
 
   // Expect `kCorrectTypes` twice.
   std::vector<ServerFieldType> expected_types = kCorrectTypes;
@@ -348,11 +353,11 @@
 // ADDRESS_HOME_STREET_ADDRESS is not modified by the address rationalization.
 TEST_F(FormStructureRationalizerTest, RationalizeRepeatedFields_OneAddress) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -364,12 +369,12 @@
 // ADDRESS_HOME_LINE1 and ADDRESS_HOME_LINE2 instead.
 TEST_F(FormStructureRationalizerTest, RationalizeRepreatedFields_TwoAddresses) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(NAME_FULL, ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2,
@@ -382,13 +387,13 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_ThreeAddresses) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(NAME_FULL, ADDRESS_HOME_LINE1, ADDRESS_HOME_LINE2,
@@ -402,14 +407,14 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_FourAddresses) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -423,7 +428,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_OneAddressEachSection) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // Billing
           {"Full Name", "fullName", NAME_FULL, "Billing"},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS, "Billing"},
@@ -432,7 +437,7 @@
           {"Full Name", "fullName", NAME_FULL, "Shipping"},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS, "Shipping"},
           {"City", "city", ADDRESS_HOME_CITY, "Shipping"},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(
@@ -450,7 +455,7 @@
     FormStructureRationalizerTest,
     RationalizeRepreatedFields_SectionTwoAddress_SectionThreeAddress_SectionFourAddresses) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // Shipping.
           {"Full Name", "fullName", NAME_FULL, "Shipping"},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS, "Shipping"},
@@ -469,7 +474,7 @@
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS, "Work"},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS, "Work"},
           {"City", "city", ADDRESS_HOME_CITY, "Work"},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -491,7 +496,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_MultipleSectionsByHeuristics_OneAddressEach) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // Billing.
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
@@ -500,7 +505,7 @@
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/true);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(
@@ -517,7 +522,7 @@
     FormStructureRationalizerTest,
     RationalizeRepreatedFields_MultipleSectionsByHeuristics_TwoAddress_ThreeAddress) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // Shipping
           {"Full Name", "fullName", NAME_FULL},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
@@ -529,7 +534,7 @@
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"Address", "address", ADDRESS_HOME_STREET_ADDRESS},
           {"City", "city", ADDRESS_HOME_CITY},
-      }),
+      },
       /*run_heuristics=*/true);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -543,24 +548,24 @@
 
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_StateCountry_NoRationalization) {
-  std::unique_ptr<FormStructure> form_structure =
-      BuildFormStructure(CreateFormAndServerClassification({
-                             // First Section
-                             {"Full Name", "fullName", NAME_FULL},
-                             {"State", "state", ADDRESS_HOME_STATE},
-                             {"Country", "country", ADDRESS_HOME_COUNTRY},
-                             // Second Section
-                             {"Country", "country", ADDRESS_HOME_COUNTRY},
-                             {"Full Name", "fullName", NAME_FULL},
-                             {"State", "state", ADDRESS_HOME_STATE},
-                             // Third Section
-                             {"Full Name", "fullName", NAME_FULL},
-                             {"State", "state", ADDRESS_HOME_STATE},
-                             // Fourth Section
-                             {"Full Name", "fullName", NAME_FULL},
-                             {"Country", "country", ADDRESS_HOME_COUNTRY},
-                         }),
-                         /*run_heuristics=*/true);
+  std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
+      {
+          // First Section
+          {"Full Name", "fullName", NAME_FULL},
+          {"State", "state", ADDRESS_HOME_STATE},
+          {"Country", "country", ADDRESS_HOME_COUNTRY},
+          // Second Section
+          {"Country", "country", ADDRESS_HOME_COUNTRY},
+          {"Full Name", "fullName", NAME_FULL},
+          {"State", "state", ADDRESS_HOME_STATE},
+          // Third Section
+          {"Full Name", "fullName", NAME_FULL},
+          {"State", "state", ADDRESS_HOME_STATE},
+          // Fourth Section
+          {"Full Name", "fullName", NAME_FULL},
+          {"Country", "country", ADDRESS_HOME_COUNTRY},
+      },
+      /*run_heuristics=*/true);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(
                   // First section.
@@ -576,7 +581,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_CountryStateNoHeuristics) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // Shipping.
           {"Full Name", "fullName", NAME_FULL, "shipping"},
           {"City", "city", ADDRESS_HOME_CITY, "shipping"},
@@ -600,7 +605,7 @@
           {"Country", "country", ADDRESS_HOME_STATE, "billing-2"},
           {"Full Name", "fullName", NAME_FULL, "billing-2"},
           {"State", "state", ADDRESS_HOME_STATE, "billing-2"},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(
@@ -618,7 +623,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_StateCountryWithHeuristics) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           // First section.
           {"Full Name", "fullName", NAME_FULL},
           ToSelectOne(
@@ -642,7 +647,7 @@
           {"Country", "country", ADDRESS_HOME_COUNTRY},
           ToSelectOne(
               ToNotFocusable({"Country", "country2", ADDRESS_HOME_COUNTRY})),
-      }),
+      },
       /*run_heuristics=*/true);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(
@@ -659,7 +664,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_FirstFieldRationalized) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Country", "country", ADDRESS_HOME_STATE, "billing"},
           ToSelectOne(ToNotFocusable(
               {"Country", "country2", ADDRESS_HOME_STATE, "billing"})),
@@ -667,7 +672,7 @@
               {"Country", "country3", ADDRESS_HOME_STATE, "billing"})),
           {"Full Name", "fullName", NAME_FULL, "billing"},
           {"State", "state", ADDRESS_HOME_STATE, "billing"},
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(ADDRESS_HOME_COUNTRY, ADDRESS_HOME_COUNTRY,
@@ -677,7 +682,7 @@
 TEST_F(FormStructureRationalizerTest,
        RationalizeRepreatedFields_LastFieldRationalized) {
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification({
+      {
           {"Country", "country", ADDRESS_HOME_COUNTRY, "billing"},
           ToSelectOne(ToNotFocusable(
               {"Country", "country2", ADDRESS_HOME_COUNTRY, "billing"})),
@@ -687,7 +692,7 @@
           ToSelectOne(ToNotFocusable(
               {"State", "state", ADDRESS_HOME_COUNTRY, "billing"})),
           ToSelectOne({"State", "state2", ADDRESS_HOME_COUNTRY, "billing"}),
-      }),
+      },
       /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure),
               ElementsAre(ADDRESS_HOME_COUNTRY, ADDRESS_HOME_COUNTRY,
@@ -717,13 +722,13 @@
        RationalizeIfSensitiveFieldsOnMainAndCrossOrigin) {
   EXPECT_THAT(
       *BuildFormStructure(
-          CreateFormAndServerClassification({
+          {
               {.field_type = CREDIT_CARD_NAME_FULL},
               {.field_type = sensitive_type()},
               {.field_type = sensitive_type(),
                .subframe_origin = url::Origin::Create(GURL("https://psp.com"))},
               {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-          }),
+          },
           /*run_heuristics=*/false),
       AreFields(HasType(CREDIT_CARD_NAME_FULL),
                 HasType(UNKNOWN_TYPE),  // Because there are sub-frames.
@@ -737,12 +742,13 @@
 TEST_P(FormStructureRationalizerTestMultiOriginCreditCardFields,
        DoNotRationalizeIfSensitiveFieldsOnlyOnMainOrigin) {
   EXPECT_THAT(
-      *BuildFormStructure(CreateFormAndServerClassification({
-                              {.field_type = CREDIT_CARD_NAME_FULL},
-                              {.field_type = sensitive_type()},
-                              {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-                          }),
-                          /*run_heuristics=*/false),
+      *BuildFormStructure(
+          {
+              {.field_type = CREDIT_CARD_NAME_FULL},
+              {.field_type = sensitive_type()},
+              {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
+          },
+          /*run_heuristics=*/false),
       AreFields(HasType(CREDIT_CARD_NAME_FULL), HasType(sensitive_type()),
                 HasType(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR)));
 }
@@ -752,7 +758,7 @@
 TEST_P(FormStructureRationalizerTestMultiOriginCreditCardFields,
        DoNotRationalizeIfSensitiveFieldsOnlyOnCrossOrigins) {
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = sensitive_type(),
                        .subframe_origin =
@@ -761,7 +767,7 @@
                        .subframe_origin =
                            url::Origin::Create(GURL("https://psp2.com"))},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasType(CREDIT_CARD_NAME_FULL),
                         HasType(sensitive_type()), HasType(sensitive_type()),
@@ -777,12 +783,12 @@
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(
       *BuildFormStructure(
-          CreateFormAndServerClassification({
+          {
               {.field_type = CREDIT_CARD_NUMBER, .max_length = 1},
               {.field_type = CREDIT_CARD_NAME_FULL},
               {.field_type = CREDIT_CARD_NUMBER},
               {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
-          }),
+          },
           /*run_heuristics=*/false),
       AreFields(HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
                 HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
@@ -798,13 +804,13 @@
   base::test::ScopedFeatureList feature_list(
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 1},
                       {.field_type = CREDIT_CARD_NUMBER},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
                         HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
@@ -820,7 +826,7 @@
   base::test::ScopedFeatureList feature_list(
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
@@ -828,7 +834,7 @@
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
                         HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
@@ -845,7 +851,7 @@
   base::test::ScopedFeatureList feature_list(
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER,
                        .is_focusable = false,
@@ -857,7 +863,7 @@
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
                         HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
@@ -875,7 +881,7 @@
       features::kAutofillSplitCreditCardNumbersCautiously);
   FormGlobalId other_host_form = test::MakeFormGlobalId();
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER,
                        .max_length = 4,
@@ -887,7 +893,7 @@
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
                         HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
@@ -905,7 +911,7 @@
   base::test::ScopedFeatureList feature_list(
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 4},
@@ -913,7 +919,7 @@
                       {.field_type = CREDIT_CARD_NUMBER},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
                         HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
@@ -933,7 +939,7 @@
   base::test::ScopedFeatureList feature_list(
       features::kAutofillSplitCreditCardNumbersCautiously);
   EXPECT_THAT(*BuildFormStructure(
-                  CreateFormAndServerClassification({
+                  {
                       {.field_type = CREDIT_CARD_NUMBER},
                       {.field_type = CREDIT_CARD_NAME_FULL},
                       {.field_type = CREDIT_CARD_NUMBER, .max_length = 1},
@@ -949,7 +955,7 @@
                       {.field_type = CREDIT_CARD_NUMBER},
                       {.field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR},
                       {.field_type = CREDIT_CARD_NUMBER},
-                  }),
+                  },
                   /*run_heuristics=*/false),
               AreFields(HasTypeAndOffset(CREDIT_CARD_NUMBER, 0),
                         HasTypeAndOffset(CREDIT_CARD_NAME_FULL, 0),
@@ -1013,6 +1019,37 @@
                                 .field_type = HtmlFieldType::kCreditCardExp},
                         .max_length = 7}},
             .final_types = {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
+        // <input autocomplete="cc-exp" max-length=20> becomes a MM/YYYY field
+        // by default (see test above), but if later a server classification is
+        // available, the type is re-rationalized to a 2 digit expiration field.
+        RationalizeAutocompleteTestParam{
+            .fields =
+                {{.label = "MM / YY",
+                  // Server verdict, which contradicts max_length=7.
+                  .field_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR,
+                  // Rationalization verdict without server type, which should
+                  // get corrected.
+                  .parsed_autocomplete =
+                      AutocompleteParsingResult{
+                          .field_type =
+                              HtmlFieldType::kCreditCardExpDate4DigitYear},
+                  .max_length = 7}},
+            .final_types = {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
+        // The pattern "MM / YY" trumps a server verdict.
+        RationalizeAutocompleteTestParam{
+            .fields = {{.label = "MM / YY",
+                        .field_type = CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
+                        .max_length = 7,
+                        .heuristic_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
+            .final_types = {CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
+        // The pattern "MM / YY" does NOT trump a server override.
+        RationalizeAutocompleteTestParam{
+            .fields = {{.label = "MM / YY",
+                        .field_type = CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR,
+                        .max_length = 7,
+                        .field_type_is_override = true,
+                        .heuristic_type = CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR}},
+            .final_types = {CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR}},
         // <input autocomplete="cc-exp-year" max-length=4> becomes a YYYY field.
         RationalizeAutocompleteTestParam{
             .fields =
@@ -1040,7 +1077,7 @@
 
 TEST_P(RationalizeAutocompleteTest, RationalizeAutocompleteAttribute) {
   std::unique_ptr<FormStructure> form_structure =
-      BuildFormStructure(CreateFormAndServerClassification(GetParam().fields),
+      BuildFormStructure(GetParam().fields,
                          /*run_heuristics=*/false);
   EXPECT_THAT(GetTypes(*form_structure), GetParam().final_types);
 }
@@ -1081,11 +1118,10 @@
 
   // Just adding >=3 random fields to trigger rationalization.
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification(
-          {{"First Name", "firstName", NAME_FIRST},
-           {"Last Name", "lastName", NAME_LAST},
-           {"Address", "address", ADDRESS_HOME_LINE1},
-           {"Something under test", "tested-thing", filtered_off_field}}),
+      {{"First Name", "firstName", NAME_FIRST},
+       {"Last Name", "lastName", NAME_LAST},
+       {"Address", "address", ADDRESS_HOME_LINE1},
+       {"Something under test", "tested-thing", filtered_off_field}},
       /*run_heuristics=*/true);
   EXPECT_THAT(
       GetTypes(*form_structure),
@@ -1102,12 +1138,11 @@
 
   // Just adding >=3 random fields to trigger rationalization.
   std::unique_ptr<FormStructure> form_structure = BuildFormStructure(
-      CreateFormAndServerClassification(
-          {{"First Name", "firstName", NAME_FIRST},
-           {"Last Name", "lastName", NAME_LAST},
-           {"Some field with required type", "some-name",
-            test_params.required_type},
-           {"Something under test", "tested-thing", test_params.server_type}}),
+      {{"First Name", "firstName", NAME_FIRST},
+       {"Last Name", "lastName", NAME_LAST},
+       {"Some field with required type", "some-name",
+        test_params.required_type},
+       {"Something under test", "tested-thing", test_params.server_type}},
       /*run_heuristics=*/true);
   EXPECT_THAT(
       GetTypes(*form_structure),
diff --git a/components/autofill/core/browser/form_structure_sectioning_util.cc b/components/autofill/core/browser/form_structure_sectioning_util.cc
index c8a4d7d..3ed23ac 100644
--- a/components/autofill/core/browser/form_structure_sectioning_util.cc
+++ b/components/autofill/core/browser/form_structure_sectioning_util.cc
@@ -55,9 +55,10 @@
 // Sectionable fields are all the fields that are in a non-default section.
 // Generally, only focusable fields are assigned a section. As an exception,
 // unfocusable <select> elements get a section, as hidden <select> elements are
-// common in custom select elements.
+// common in custom select elements. <selectmenu> elements behave the same as
+// <select> elements for the sake of simplicity.
 bool IsSectionable(const AutofillField& field) {
-  return field.IsFocusable() || field.form_control_type == "select-one";
+  return field.IsFocusable() || field.IsSelectOrSelectMenuElement();
 }
 
 // Assign all credit card fields without a valid autocomplete attribute section
diff --git a/components/browser_ui/widget/android/java/res/values/attrs.xml b/components/browser_ui/widget/android/java/res/values/attrs.xml
index c544dc3..0e4a3fa 100644
--- a/components/browser_ui/widget/android/java/res/values/attrs.xml
+++ b/components/browser_ui/widget/android/java/res/values/attrs.xml
@@ -123,6 +123,19 @@
         <attr name="cardElevation" format="reference|dimension"/>
     </declare-styleable>
 
+    <declare-styleable name="FadingEdgeScrollView">
+        <attr name="topEdgeVisibility" format="enum">
+            <enum name="none" value="0" />
+            <enum name="fading" value="1" />
+            <enum name="hard" value="2" />
+        </attr>
+        <attr name="bottomEdgeVisibility" format="enum">
+            <enum name="none" value="0" />
+            <enum name="fading" value="1" />
+            <enum name="hard" value="2" />
+        </attr>
+    </declare-styleable>
+
     <!-- Surface color resources. See https://crbug.com/1410537. -->
     <attr name="tileViewIconBackgroundModern" format="reference"/>
     <attr name="cardElevation" format="reference|dimension"/>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingEdgeScrollView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingEdgeScrollView.java
index 6c6fcb3..4c51f9d 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingEdgeScrollView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingEdgeScrollView.java
@@ -5,6 +5,7 @@
 package org.chromium.components.browser_ui.widget;
 
 import android.content.Context;
+import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
@@ -50,6 +51,8 @@
 
         mSeparatorColor = getContext().getColor(R.color.toolbar_shadow_color);
         mSeparatorHeight = getResources().getDimensionPixelSize(R.dimen.divider_height);
+
+        if (attrs != null) parseAttributes(attrs);
     }
 
     @Override
@@ -113,4 +116,18 @@
             canvas.drawRect(left, top, right, top + mSeparatorHeight, mSeparatorPaint);
         }
     }
+
+    private void parseAttributes(AttributeSet attrs) {
+        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.FadingEdgeScrollView);
+
+        if (a.hasValue(R.styleable.FadingEdgeScrollView_topEdgeVisibility)) {
+            mDrawTopEdge =
+                    a.getInt(R.styleable.FadingEdgeScrollView_topEdgeVisibility, EdgeType.FADING);
+        }
+        if (a.hasValue(R.styleable.FadingEdgeScrollView_bottomEdgeVisibility)) {
+            mDrawBottomEdge = a.getInt(
+                    R.styleable.FadingEdgeScrollView_bottomEdgeVisibility, EdgeType.FADING);
+        }
+        a.recycle();
+    }
 }
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc
index f33f917..5ef17699 100644
--- a/components/commerce/core/shopping_service.cc
+++ b/components/commerce/core/shopping_service.cc
@@ -51,6 +51,7 @@
 #include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "url/url_constants.h"
 
 namespace commerce {
 
@@ -381,7 +382,7 @@
   }
 
   const std::string* currency = on_page_meta_map.FindString(kOgPriceCurrency);
-  const std::string* amount = on_page_meta_map.FindString(kOgPriceCurrency);
+  const std::string* amount = on_page_meta_map.FindString(kOgPriceAmount);
   const std::string* image = on_page_meta_map.FindString(kOgImage);
 
   if (currency && amount && image) {
@@ -635,7 +636,8 @@
     std::move(callback).Run(url, absl::nullopt);
 
     // If doing local PDP detection, we might still want to run this.
-    if (base::FeatureList::IsEnabled(kCommerceLocalPDPDetection)) {
+    if (base::FeatureList::IsEnabled(kCommerceLocalPDPDetection) &&
+        url.SchemeIsHTTPOrHTTPS()) {
       UpdateProductInfoCache(url, true, nullptr);
       if (web) {
         ScheduleProductInfoJavascript(web);
diff --git a/components/commerce/core/shopping_service_metrics_unittest.cc b/components/commerce/core/shopping_service_metrics_unittest.cc
index 592d821a..0015d47 100644
--- a/components/commerce/core/shopping_service_metrics_unittest.cc
+++ b/components/commerce/core/shopping_service_metrics_unittest.cc
@@ -277,6 +277,25 @@
   histogram_tester_->ExpectTotalCount(metrics::kPDPStateWithLocalMetaName, 1);
 }
 
+TEST_F(ShoppingServiceMetricsTest, TestLocalPDPDetection_IllegalScheme) {
+  test_features_.InitWithFeatures({kShoppingList, kCommerceLocalPDPDetection},
+                                  {});
+
+  base::Value js_result("{\"" + std::string(kOgType) + "\": \"" +
+                        kOgTypeOgProduct + "\"}");
+  MockWebWrapper web(GURL("chrome://internal-page"), false, &js_result);
+
+  opt_guide_->SetResponse(GURL(kProductUrl), OptimizationType::PRICE_TRACKING,
+                          OptimizationGuideDecision::kFalse,
+                          OptimizationMetadata());
+
+  DidNavigatePrimaryMainFrame(&web);
+  DidFinishLoad(&web);
+  SimulateProductInfoJsTaskFinished();
+
+  histogram_tester_->ExpectTotalCount(metrics::kPDPStateWithLocalMetaName, 0);
+}
+
 TEST_F(ShoppingServiceMetricsTest,
        TestLocalPDPDetection_NoServer_NoExperimentFlag) {
   test_features_.InitWithFeatures({kShoppingList},
diff --git a/components/content_settings/browser/content_settings_manager_impl.cc b/components/content_settings/browser/content_settings_manager_impl.cc
index 86869a3..baddb40a 100644
--- a/components/content_settings/browser/content_settings_manager_impl.cc
+++ b/components/content_settings/browser/content_settings_manager_impl.cc
@@ -16,6 +16,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_features.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "net/cookies/cookie_util.h"
 #include "net/cookies/site_for_cookies.h"
 
 using content_settings::PageSpecificContentSettings;
@@ -154,6 +155,13 @@
   bool allowed = cookie_settings_->IsFullCookieAccessAllowed(
       url, site_for_cookies, top_frame_origin,
       cookie_settings_->SettingOverridesForStorage());
+  // Allow storage when --test-third-party-cookie-phaseout is used, but ensure
+  // that only partitioned storage is available. This developer flag is meant to
+  // simulate Chrome's behavior when 3P cookies are turned down to help
+  // developers test their site.
+  if (!allowed && net::cookie_util::IsForceThirdPartyCookieBlockingEnabled()) {
+    allowed = true;
+  }
   if (delegate_->AllowStorageAccess(render_process_id_, render_frame_id,
                                     storage_type, url, allowed, &callback)) {
     DCHECK(!callback);
diff --git a/components/content_settings/browser/ui/cookie_controls_controller.cc b/components/content_settings/browser/ui/cookie_controls_controller.cc
index f3f8fae8..5558bdb 100644
--- a/components/content_settings/browser/ui/cookie_controls_controller.cc
+++ b/components/content_settings/browser/ui/cookie_controls_controller.cc
@@ -65,6 +65,9 @@
       observer.OnStatusChanged(status.status, status.enforcement,
                                status.expiration);
       observer.OnSitesCountChanged(allowed_sites, blocked_sites);
+      // TODO(crbug.com/1446230): Return the actual confidence level.
+      observer.OnBreakageConfidenceLevelChanged(
+          CookieControlsBreakageConfidenceLevel::kMedium);
     }
   } else {
     int allowed_cookies = GetAllowedCookieCount();
diff --git a/components/content_settings/browser/ui/cookie_controls_view.h b/components/content_settings/browser/ui/cookie_controls_view.h
index 0604c66..fe3fbc4 100644
--- a/components/content_settings/browser/ui/cookie_controls_view.h
+++ b/components/content_settings/browser/ui/cookie_controls_view.h
@@ -7,6 +7,7 @@
 
 #include "base/observer_list_types.h"
 #include "base/time/time.h"
+#include "components/content_settings/core/common/cookie_controls_breakage_confidence_level.h"
 #include "components/content_settings/core/common/cookie_controls_enforcement.h"
 #include "components/content_settings/core/common/cookie_controls_status.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -46,6 +47,12 @@
   // are blocked from accessing site data. There might be reasons other than
   // 3PCB to why a site is blocked or allowed (ex. site data exceptions).
   virtual void OnSitesCountChanged(int allowed_sites, int blocked_sites) = 0;
+
+  // Called wherever the site breakage confidence level changes. It takes into
+  // account blocked third-party cookie access, exceptions lifecycle, site
+  // engagement index and recent user activity (like frequent page reloads).
+  virtual void OnBreakageConfidenceLevelChanged(
+      CookieControlsBreakageConfidenceLevel level) = 0;
 };
 
 }  // namespace content_settings
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc
index 9442ffd9..97ed28c 100644
--- a/components/content_settings/core/browser/cookie_settings_unittest.cc
+++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -421,10 +421,15 @@
                 /*top_frame_origin=*/absl::nullopt, cookie_setting_overrides));
 }
 
-TEST_P(CookieSettingsTest, ForceThirdPartyCookieBlocking) {
+TEST_P(CookieSettingsTest, TestThirdPartyCookiePhaseout) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      net::features::kForceThirdPartyCookieBlocking);
+  feature_list.InitWithFeatures(
+      {
+          net::features::kForceThirdPartyCookieBlocking,
+          net::features::kThirdPartyStoragePartitioning,
+      },
+      {});
+  ASSERT_TRUE(net::cookie_util::IsForceThirdPartyCookieBlockingEnabled());
 
   auto cookie_setting_overrides = GetCookieSettingOverrides();
 
diff --git a/components/content_settings/core/common/BUILD.gn b/components/content_settings/core/common/BUILD.gn
index 64694c8b..61a11e0 100644
--- a/components/content_settings/core/common/BUILD.gn
+++ b/components/content_settings/core/common/BUILD.gn
@@ -22,6 +22,7 @@
     "content_settings_types.h",
     "content_settings_utils.cc",
     "content_settings_utils.h",
+    "cookie_controls_breakage_confidence_level.h",
     "cookie_controls_enforcement.h",
     "cookie_controls_status.h",
     "cookie_settings_base.cc",
diff --git a/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h b/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h
new file mode 100644
index 0000000..61de61a
--- /dev/null
+++ b/components/content_settings/core/common/cookie_controls_breakage_confidence_level.h
@@ -0,0 +1,19 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_COOKIE_CONTROLS_BREAKAGE_CONFIDENCE_LEVEL_H_
+#define COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_COOKIE_CONTROLS_BREAKAGE_CONFIDENCE_LEVEL_H_
+
+// The confidence level that a site is broken and the user needs to use cookie
+// controls. It takes into account blocked third-party cookie access, exceptions
+// lifecycle, site engagement index and recent user activity (like frequent page
+// reloads).
+enum class CookieControlsBreakageConfidenceLevel {
+  kUninitialized,
+  kLow,
+  kMedium,
+  kHigh,
+};
+
+#endif  // COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_COOKIE_CONTROLS_BREAKAGE_CONFIDENCE_LEVEL_H_
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java
index 86f30c4d..669219a 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/ExperimentalOptionsTranslationTest.java
@@ -5,11 +5,9 @@
 package org.chromium.net;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import androidx.annotation.OptIn;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -50,7 +48,7 @@
                 ConnectionMigrationOptions.builder().enableDefaultNetworkMigration(true));
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals(EXPECTED_CONNECTION_MIGRATION_ENABLED_STRING,
                 mockBuilderImpl.mEffectiveExperimentalOptions);
     }
@@ -65,8 +63,9 @@
                 ConnectionMigrationOptions.builder().enableDefaultNetworkMigration(true));
         builder.build();
 
-        assertTrue(mockBuilderImpl.mConnectionMigrationOptions.getEnableDefaultNetworkMigration());
-        assertNull(mockBuilderImpl.mEffectiveExperimentalOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions.getEnableDefaultNetworkMigration())
+                .isTrue();
+        assertThat(mockBuilderImpl.mEffectiveExperimentalOptions).isNull();
     }
 
     @Test
@@ -86,7 +85,7 @@
                         "{\"QUIC\": {\"migrate_sessions_on_network_change_v2\": false}}");
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals(EXPECTED_CONNECTION_MIGRATION_ENABLED_STRING,
                 mockBuilderImpl.mEffectiveExperimentalOptions);
     }
@@ -101,7 +100,7 @@
                 ConnectionMigrationOptions.builder().allowNonDefaultNetworkUsage(true));
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals("{\"QUIC\":{}}", mockBuilderImpl.mEffectiveExperimentalOptions);
     }
 
@@ -115,7 +114,7 @@
                 ConnectionMigrationOptions.builder().enablePathDegradationMigration(true));
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals("{\"QUIC\":{\"allow_port_migration\":true}}",
                 mockBuilderImpl.mEffectiveExperimentalOptions);
     }
@@ -131,7 +130,7 @@
                                                       .allowNonDefaultNetworkUsage(true));
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals("{\"QUIC\":{\"migrate_sessions_early_v2\":true}}",
                 mockBuilderImpl.mEffectiveExperimentalOptions);
     }
@@ -147,7 +146,7 @@
                                                       .allowNonDefaultNetworkUsage(false));
         builder.build();
 
-        assertNull(mockBuilderImpl.mConnectionMigrationOptions);
+        assertThat(mockBuilderImpl.mConnectionMigrationOptions).isNull();
         assertJsonEquals(
                 "{\"QUIC\":{\"migrate_sessions_early_v2\":false,\"allow_port_migration\":true}}",
                 mockBuilderImpl.mEffectiveExperimentalOptions);
@@ -164,9 +163,8 @@
                                                       .allowNonDefaultNetworkUsage(true));
 
         IllegalArgumentException e = assertThrows(IllegalArgumentException.class, builder::build);
-        assertTrue(e.getMessage().contains(
-                "Unable to turn on non-default network usage without path degradation"
-                + " migration"));
+        assertThat(e).hasMessageThat().contains(
+                "Unable to turn on non-default network usage without path degradation migration");
     }
 
     @Test
@@ -366,13 +364,13 @@
             JSONObject expectedJson = new JSONObject(expected);
             JSONObject actualJson = new JSONObject(actual);
 
-            assertJsonEquals(expectedJson, actualJson);
+            assertJsonEquals(expectedJson, actualJson, "");
         } catch (JSONException e) {
             throw new AssertionError(e);
         }
     }
 
-    private static void assertJsonEquals(JSONObject expected, JSONObject actual)
+    private static void assertJsonEquals(JSONObject expected, JSONObject actual, String currentPath)
             throws JSONException {
         assertThat(jsonKeys(actual)).isEqualTo(jsonKeys(expected));
 
@@ -382,15 +380,16 @@
             if (expectedValue == actualValue) {
                 continue;
             }
+            String fullKey = currentPath.isEmpty() ? key : currentPath + "." + key;
             if (expectedValue instanceof JSONObject) {
-                if (actualValue instanceof JSONObject) {
-                    assertJsonEquals((JSONObject) expectedValue, (JSONObject) actualValue);
-                } else {
-                    fail("key [" + key + "]: expected [" + expectedValue + "] but got ["
-                            + actualValue + "]");
-                }
+                assertWithMessage("key is '" + fullKey + "'")
+                        .that(actualValue)
+                        .isInstanceOf(JSONObject.class);
+                assertJsonEquals((JSONObject) expectedValue, (JSONObject) actualValue, fullKey);
             } else {
-                assertThat(actualValue).isEqualTo(expectedValue);
+                assertWithMessage("key is '" + fullKey + "'")
+                        .that(actualValue)
+                        .isEqualTo(expectedValue);
             }
         }
     }
diff --git a/components/embedder_support/content_settings_utils.cc b/components/embedder_support/content_settings_utils.cc
index 6c9276b..33d1e1fa 100644
--- a/components/embedder_support/content_settings_utils.cc
+++ b/components/embedder_support/content_settings_utils.cc
@@ -10,6 +10,7 @@
 #include "components/content_settings/core/common/content_settings_utils.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/cookies/cookie_setting_override.h"
+#include "net/cookies/cookie_util.h"
 #include "net/cookies/site_for_cookies.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -30,6 +31,13 @@
   bool allow = cookie_settings->IsFullCookieAccessAllowed(
       url, net::SiteForCookies::FromUrl(url), url::Origin::Create(url),
       net::CookieSettingOverrides());
+  // Allow storage when --test-third-party-cookie-phaseout is used, but ensure
+  // that only partitioned storage is available. This developer flag is meant to
+  // simulate Chrome's behavior when 3P cookies are turned down to help
+  // developers test their site.
+  if (!allow && net::cookie_util::IsForceThirdPartyCookieBlockingEnabled()) {
+    allow = true;
+  }
 
   for (const auto& it : render_frames) {
     content_settings::PageSpecificContentSettings::StorageAccessed(
@@ -67,6 +75,14 @@
   bool allow_cookies = cookie_settings->IsFullCookieAccessAllowed(
       scope, site_for_cookies, top_frame_origin,
       cookie_settings->SettingOverridesForStorage());
+  // Allow storage when --test-third-party-cookie-phaseout is used, but ensure
+  // that only partitioned storage is available. This developer flag is meant to
+  // simulate Chrome's behavior when 3P cookies are turned down to help
+  // developers test their site.
+  if (!allow_cookies &&
+      net::cookie_util::IsForceThirdPartyCookieBlockingEnabled()) {
+    allow_cookies = true;
+  }
 
   return content::AllowServiceWorkerResult::FromPolicy(!allow_javascript,
                                                        !allow_cookies);
@@ -85,6 +101,14 @@
       worker_url, site_for_cookies, top_frame_origin,
       cookie_settings->SettingOverridesForStorage());
 
+  // Allow storage when --test-third-party-cookie-phaseout is used, but ensure
+  // that only partitioned storage is available. This developer flag is meant to
+  // simulate Chrome's behavior when 3P cookies are turned down to help
+  // developers test their site.
+  if (!allow && net::cookie_util::IsForceThirdPartyCookieBlockingEnabled()) {
+    allow = true;
+  }
+
   content_settings::PageSpecificContentSettings::SharedWorkerAccessed(
       render_process_id, render_frame_id, worker_url, name, storage_key,
       !allow);
diff --git a/components/payments/content/payment_response_helper.cc b/components/payments/content/payment_response_helper.cc
index 298d91b..3391177 100644
--- a/components/payments/content/payment_response_helper.cc
+++ b/components/payments/content/payment_response_helper.cc
@@ -26,14 +26,14 @@
 namespace payments {
 
 PaymentResponseHelper::PaymentResponseHelper(
-    const std::string& app_locale,
+    std::string app_locale,
     base::WeakPtr<PaymentRequestSpec> spec,
     base::WeakPtr<PaymentApp> selected_app,
     base::WeakPtr<PaymentRequestDelegate> payment_request_delegate,
     autofill::AutofillProfile* selected_shipping_profile,
     autofill::AutofillProfile* selected_contact_profile,
     base::WeakPtr<Delegate> delegate)
-    : app_locale_(app_locale),
+    : app_locale_(std::move(app_locale)),
       is_waiting_for_shipping_address_normalization_(false),
       is_waiting_for_instrument_details_(false),
       spec_(spec),
@@ -126,7 +126,7 @@
     } else {
       DCHECK(selected_contact_profile);
       payer->name = base::UTF16ToUTF8(
-          selected_contact_profile->GetInfo(autofill::NAME_FULL, *app_locale_));
+          selected_contact_profile->GetInfo(autofill::NAME_FULL, app_locale_));
     }
   }
   if (spec_->request_payer_email()) {
@@ -150,10 +150,10 @@
       // https://w3c.github.io/payment-request/#paymentrequest-updated-algorithm
       const std::string original_number =
           base::UTF16ToUTF8(selected_contact_profile->GetInfo(
-              autofill::PHONE_HOME_WHOLE_NUMBER, *app_locale_));
+              autofill::PHONE_HOME_WHOLE_NUMBER, app_locale_));
 
       const std::string default_region_code =
-          autofill::AutofillCountry::CountryCodeForLocale(*app_locale_);
+          autofill::AutofillCountry::CountryCodeForLocale(app_locale_);
       payer->phone = autofill::i18n::FormatPhoneForResponse(
           original_number, default_region_code);
     }
@@ -184,7 +184,7 @@
     } else {
       payment_response->shipping_address =
           data_util::GetPaymentAddressFromAutofillProfile(shipping_address_,
-                                                          *app_locale_);
+                                                          app_locale_);
       payment_response->shipping_option = spec_->selected_shipping_option()->id;
     }
   }
diff --git a/components/payments/content/payment_response_helper.h b/components/payments/content/payment_response_helper.h
index 67889723..e71b24a4 100644
--- a/components/payments/content/payment_response_helper.h
+++ b/components/payments/content/payment_response_helper.h
@@ -36,7 +36,7 @@
 
   // The spec, selected_app and delegate cannot be null.
   PaymentResponseHelper(
-      const std::string& app_locale,
+      std::string app_locale,
       base::WeakPtr<PaymentRequestSpec> spec,
       base::WeakPtr<PaymentApp> selected_app,
       base::WeakPtr<PaymentRequestDelegate> payment_request_delegate,
@@ -66,7 +66,7 @@
   void OnAddressNormalized(bool success,
                            const autofill::AutofillProfile& normalized_profile);
 
-  const raw_ref<const std::string> app_locale_;
+  const std::string app_locale_;
   bool is_waiting_for_shipping_address_normalization_;
   bool is_waiting_for_instrument_details_;
 
diff --git a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h
index 0c8e0e4..5ecbcf5 100644
--- a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h
+++ b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h
@@ -22,11 +22,13 @@
   kMaxValue = kSharedStorage,
 };
 
-using PrivacySandboxAttestationsMap = base::flat_map<
-    net::SchemefulSite,
+using PrivacySandboxAttestationsGatedAPISet =
     base::EnumSet<PrivacySandboxAttestationsGatedAPI,
                   PrivacySandboxAttestationsGatedAPI::kTopics,
-                  PrivacySandboxAttestationsGatedAPI::kMaxValue>>;
+                  PrivacySandboxAttestationsGatedAPI::kMaxValue>;
+
+using PrivacySandboxAttestationsMap =
+    base::flat_map<net::SchemefulSite, PrivacySandboxAttestationsGatedAPISet>;
 
 class PrivacySandboxAttestations {
  public:
@@ -36,7 +38,7 @@
   PrivacySandboxAttestations(PrivacySandboxAttestations&) = delete;
 
   // Returns whether `site` is enrolled and attested for `invoking_api`.
-  // (If the `kEnforcePrivacySandboxAttestations` flag is enabled, returns
+  // (If the `kEnforcePrivacySandboxAttestations` flag is disabled, returns
   // true unconditionally.)
   bool IsSiteAttested(net::SchemefulSite site,
                       PrivacySandboxAttestationsGatedAPI invoking_api) const;
diff --git a/components/safe_browsing/core/browser/db/hash_prefix_map.cc b/components/safe_browsing/core/browser/db/hash_prefix_map.cc
index da6bbfb..1c35f53 100644
--- a/components/safe_browsing/core/browser/db/hash_prefix_map.cc
+++ b/components/safe_browsing/core/browser/db/hash_prefix_map.cc
@@ -370,8 +370,19 @@
     const V4StoreFileFormat& file_format) {
   DCHECK(file_format.list_update_response().additions().empty());
   for (const auto& hash_file : file_format.hash_files()) {
-    if (!GetFileInfo(hash_file.prefix_size()).Initialize(hash_file))
+    auto& file_info = GetFileInfo(hash_file.prefix_size());
+    // Make sure file size is correct before attempting to mmap.
+    int64_t file_size;
+    if (!GetFileSize(GetPath(store_path_, hash_file.extension()), &file_size)) {
       return MMAP_FAILURE;
+    }
+    if (static_cast<uint64_t>(file_size) != hash_file.file_size()) {
+      return MMAP_FAILURE;
+    }
+
+    if (!file_info.Initialize(hash_file)) {
+      return MMAP_FAILURE;
+    }
   }
   return APPLY_UPDATE_SUCCESS;
 }
diff --git a/components/safe_browsing/core/browser/db/hash_prefix_map_unittest.cc b/components/safe_browsing/core/browser/db/hash_prefix_map_unittest.cc
index 00d8745..c5b1635 100644
--- a/components/safe_browsing/core/browser/db/hash_prefix_map_unittest.cc
+++ b/components/safe_browsing/core/browser/db/hash_prefix_map_unittest.cc
@@ -133,6 +133,7 @@
   auto* hash_file = file_format.add_hash_files();
   hash_file->set_prefix_size(4);
   hash_file->set_extension("foo");
+  hash_file->set_file_size(3);
 
   MmapHashPrefixMap map(GetBasePath());
   EXPECT_EQ(map.ReadFromDisk(file_format), APPLY_UPDATE_SUCCESS);
@@ -151,10 +152,12 @@
   auto* hash_file = file_format.add_hash_files();
   hash_file->set_prefix_size(4);
   hash_file->set_extension("foo");
+  hash_file->set_file_size(3);
 
   hash_file = file_format.add_hash_files();
   hash_file->set_prefix_size(2);
   hash_file->set_extension("bar");
+  hash_file->set_file_size(3);
 
   MmapHashPrefixMap map(GetBasePath());
   EXPECT_EQ(map.ReadFromDisk(file_format), APPLY_UPDATE_SUCCESS);
@@ -172,15 +175,29 @@
   auto* hash_file = file_format.add_hash_files();
   hash_file->set_prefix_size(4);
   hash_file->set_extension("foo");
+  hash_file->set_file_size(3);
 
   MmapHashPrefixMap map(GetBasePath());
   EXPECT_EQ(map.ReadFromDisk(file_format), MMAP_FAILURE);
   EXPECT_EQ(map.IsValid(), MMAP_FAILURE);
 }
 
+TEST_F(HashPrefixMapTest, ReadFileWrongSize) {
+  base::WriteFile(GetPath("foo"), "");
+
+  V4StoreFileFormat file_format;
+  auto* hash_file = file_format.add_hash_files();
+  hash_file->set_prefix_size(4);
+  hash_file->set_extension("foo");
+  hash_file->set_file_size(4);
+
+  MmapHashPrefixMap map(GetBasePath());
+  EXPECT_EQ(map.ReadFromDisk(file_format), MMAP_FAILURE);
+}
+
 TEST_F(HashPrefixMapTest, WriteAndReadFile) {
   MmapHashPrefixMap map(GetBasePath());
-  map.Append(4, "foo");
+  map.Append(4, "fooo");
 
   V4StoreFileFormat file_format;
   EXPECT_TRUE(map.WriteToDisk(&file_format));
@@ -192,7 +209,7 @@
 
   HashPrefixMapView view = map_read.view();
   EXPECT_EQ(view.size(), 1u);
-  EXPECT_EQ(view[4], "foo");
+  EXPECT_EQ(view[4], "fooo");
 }
 
 TEST_F(HashPrefixMapTest, ClearingMapBeforeWriteDeletesFile) {
diff --git a/components/safe_browsing/core/browser/db/v4_store_unittest.cc b/components/safe_browsing/core/browser/db/v4_store_unittest.cc
index bdf3b762..5d7f8dc 100644
--- a/components/safe_browsing/core/browser/db/v4_store_unittest.cc
+++ b/components/safe_browsing/core/browser/db/v4_store_unittest.cc
@@ -936,6 +936,7 @@
   auto* hash_file = file_format.add_hash_files();
   hash_file->set_prefix_size(5);
   hash_file->set_extension("foo");
+  hash_file->set_file_size(5);
 
   WriteFileFormatProtoToFile(&file_format, 0x600D71FE, 9,
                              &list_update_response);
@@ -946,7 +947,7 @@
   EXPECT_EQ(READ_SUCCESS, store.ReadFromDisk());
   EXPECT_FALSE(store.expected_checksum_.empty());
   EXPECT_EQ("test_client_state", store.state());
-  EXPECT_EQ(78, store.file_size_);
+  EXPECT_EQ(85, store.file_size_);
 
   EXPECT_TRUE(store.VerifyChecksum());
 
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index f5de5807..e9c8048 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -947,11 +947,11 @@
       if (current_frame()->root_render_pass->content_color_usage ==
           gfx::ContentColorUsage::kHDR) {
         surface_candidate.hdr_metadata.emplace();
-        surface_candidate.hdr_metadata->extended_range_brightness.emplace();
+        surface_candidate.hdr_metadata->extended_range.emplace();
         // TODO(https://crbug.com/1430768): Track the actual brightness of the
         // content. For now, assume that all HDR content is 1,000 nits.
-        surface_candidate.hdr_metadata->extended_range_brightness
-            ->desired_ratio = 1000.f / gfx::ColorSpace::kDefaultSDRWhiteLevel;
+        surface_candidate.hdr_metadata->extended_range->desired_headroom =
+            1000.f / gfx::ColorSpace::kDefaultSDRWhiteLevel;
       }
       surface_candidate.is_opaque = !surface_plane.enable_blending;
       surface_candidate.opacity = surface_plane.opacity;
diff --git a/content/browser/media/capture/mouse_cursor_overlay_controller_mac.mm b/content/browser/media/capture/mouse_cursor_overlay_controller_mac.mm
index f398f1b6..87e64d87 100644
--- a/content/browser/media/capture/mouse_cursor_overlay_controller_mac.mm
+++ b/content/browser/media/capture/mouse_cursor_overlay_controller_mac.mm
@@ -157,11 +157,11 @@
     const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
 
-  NSCursor* cursor = [NSCursor currentCursor];
+  NSCursor* cursor = NSCursor.currentCursor;
   if (!cursor) {
-    cursor = [NSCursor arrowCursor];
+    cursor = NSCursor.arrowCursor;
   }
-  return cursor;
+  return base::apple::OwnedNSCursor(cursor);
 }
 
 gfx::RectF MouseCursorOverlayController::ComputeRelativeBoundsForOverlay(
@@ -180,11 +180,12 @@
   }
 
   if (target_size.GetArea()) {
+    NSCursor* ns_cursor = cursor.Get();
     // The documentation on NSCursor reference states that the hot spot is in
     // flipped coordinates which, from the perspective of the Aura coordinate
     // system, means it's not flipped.
-    const NSPoint hotspot = [cursor hotSpot];
-    const NSSize size = [[cursor image] size];
+    const NSPoint hotspot = ns_cursor.hotSpot;
+    const NSSize size = ns_cursor.image.size;
     return gfx::ScaleRect(
         gfx::RectF(location_aura.x() - hotspot.x, location_aura.y() - hotspot.y,
                    size.width, size.height),
@@ -208,7 +209,8 @@
 SkBitmap MouseCursorOverlayController::GetCursorImage(
     const gfx::NativeCursor& cursor) {
   return skia::NSImageToSkBitmapWithColorSpace(
-      [cursor image], /*is_opaque=*/false, base::mac::GetSystemColorSpace());
+      cursor.Get().image, /*is_opaque=*/false,
+      base::mac::GetSystemColorSpace());
 }
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/web_input_event_builders_ios.h b/content/browser/renderer_host/input/web_input_event_builders_ios.h
index 1eb6d4d9..b2b70e32 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_ios.h
+++ b/content/browser/renderer_host/input/web_input_event_builders_ios.h
@@ -30,10 +30,12 @@
 
 class CONTENT_EXPORT WebTouchEventBuilder {
  public:
-  static blink::WebTouchEvent Build(blink::WebInputEvent::Type type,
-                                    UITouch* touch,
-                                    UIEvent* event,
-                                    UIView* view);
+  static blink::WebTouchEvent Build(
+      blink::WebInputEvent::Type type,
+      UITouch* touch,
+      UIEvent* event,
+      UIView* view,
+      const absl::optional<gfx::Vector2dF>& view_offset);
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/input/web_input_event_builders_ios.mm b/content/browser/renderer_host/input/web_input_event_builders_ios.mm
index 7dddb0c..c250f1e 100644
--- a/content/browser/renderer_host/input/web_input_event_builders_ios.mm
+++ b/content/browser/renderer_host/input/web_input_event_builders_ios.mm
@@ -112,9 +112,11 @@
   // TODO(dtapuska): Support stylus.
 }
 
-blink::WebTouchPoint CreateWebTouchPoint(UIView* view,
-                                         UITouch* event,
-                                         bool was_changed) {
+blink::WebTouchPoint CreateWebTouchPoint(
+    UIView* view,
+    UITouch* event,
+    bool was_changed,
+    const absl::optional<gfx::Vector2dF>& view_offset) {
   blink::WebTouchPoint touch;
 
   size_t pointer_index = GetTouchPointerId(event);
@@ -124,10 +126,17 @@
                                              [event force]);
 
   touch.state = ToWebTouchPointState(event, was_changed);
-  CGPoint view_location = [event locationInView:view];
-  touch.SetPositionInWidget(view_location.x, view_location.y);
-  CGPoint window_location = [event locationInView:nil];
-  touch.SetPositionInScreen(window_location.x, window_location.y);
+  gfx::PointF window_location = gfx::PointF([event locationInView:nil]);
+  touch.SetPositionInScreen(window_location);
+
+  gfx::PointF view_location;
+  if (view_offset) {
+    view_location = gfx::PointF(window_location);
+    view_location += view_offset.value();
+  } else {
+    view_location = gfx::PointF([event locationInView:view]);
+  }
+  touch.SetPositionInWidget(view_location);
 
   float major_radius = event.majorRadius;
   float minor_radius = event.majorRadius;
@@ -181,7 +190,8 @@
     blink::WebInputEvent::Type type,
     UITouch* touch,
     UIEvent* event,
-    UIView* view) {
+    UIView* view,
+    const absl::optional<gfx::Vector2dF>& view_offset) {
   blink::WebTouchEvent result(type, ModifiersFromEvent(event),
                               ui::EventTimeStampFromSeconds([event timestamp]));
   // TODO(dtapuska): Enable
@@ -198,7 +208,7 @@
     AddUITouch(touch);
   }
   result.touches[touch_index] =
-      CreateWebTouchPoint(view, touch, /*was_changed=*/true);
+      CreateWebTouchPoint(view, touch, /*was_changed=*/true, view_offset);
   ++touch_index;
   if (type == blink::WebInputEvent::Type::kTouchCancel ||
       type == blink::WebInputEvent::Type::kTouchEnd) {
@@ -213,7 +223,7 @@
       continue;
     }
     result.touches[touch_index] = CreateWebTouchPoint(
-        view, g_active_touches_map[i], /*was_changed=*/false);
+        view, g_active_touches_map[i], /*was_changed=*/false, view_offset);
     ++touch_index;
   }
   result.touches_length = touch_index;
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.h b/content/browser/renderer_host/render_widget_host_view_ios.h
index 8db1b23..1e57d27 100644
--- a/content/browser/renderer_host/render_widget_host_view_ios.h
+++ b/content/browser/renderer_host/render_widget_host_view_ios.h
@@ -52,7 +52,8 @@
       public BrowserCompositorIOSClient,
       public TextInputManager::Observer,
       public ui::GestureProviderClient,
-      public ui::CALayerFrameSink {
+      public ui::CALayerFrameSink,
+      public RenderFrameMetadataProvider::Observer {
  public:
   // The view will associate itself with the given widget. The native view must
   // be hooked up immediately to the view hierarchy, or else when it is
@@ -119,6 +120,15 @@
       const gfx::Size& dst_size,
       base::OnceCallback<void(const SkBitmap&)> callback) override;
   ui::Compositor* GetCompositor() override;
+  void GestureEventAck(
+      const blink::WebGestureEvent& event,
+      blink::mojom::InputEventResultState ack_result,
+      blink::mojom::ScrollResultDataPtr scroll_result_data) override;
+  void ChildDidAckGestureEvent(
+      const blink::WebGestureEvent& event,
+      blink::mojom::InputEventResultState ack_result,
+      blink::mojom::ScrollResultDataPtr scroll_result_data) override;
+  void OnSynchronizedDisplayPropertiesChanged(bool rotation) override;
 
   BrowserCompositorIOS* BrowserCompositor() const {
     return browser_compositor_.get();
@@ -155,6 +165,15 @@
                                     RenderWidgetHostViewBase* updated_view,
                                     bool did_update_state) override;
 
+  // RenderFrameMetadataProvider::Observer implementation.
+  void OnRenderFrameMetadataChangedBeforeActivation(
+      const cc::RenderFrameMetadata& metadata) override;
+  void OnRenderFrameMetadataChangedAfterActivation(
+      base::TimeTicks activation_time) override {}
+  void OnRenderFrameSubmission() override {}
+  void OnLocalSurfaceIdChanged(
+      const cc::RenderFrameMetadata& metadata) override {}
+
   void SetActive(bool active);
   void OnTouchEvent(blink::WebTouchEvent event);
   void UpdateNativeViewTree(gfx::NativeView view);
@@ -181,6 +200,7 @@
 
   bool CanBecomeFirstResponderForTesting() const;
   bool CanResignFirstResponderForTesting() const;
+  void ContentInsetChanged();
 
  private:
   friend class MockPointerLockRenderWidgetHostView;
@@ -195,6 +215,8 @@
 
   bool ComputeIsViewOrSubviewFirstResponder() const;
 
+  void ApplyRootScrollOffsetChanged(const gfx::PointF& root_scroll_offset);
+
   // Provides gesture synthesis given a stream of touch events and touch event
   // acks. This is for generating gesture events from injected touch events.
   ui::FilteredGestureProvider gesture_provider_;
@@ -218,6 +240,9 @@
   // EnsureSurfaceSynchronizedForWebTest().
   uint32_t latest_capture_sequence_number_ = 0u;
 
+  absl::optional<gfx::PointF> last_root_scroll_offset_;
+  bool is_scrolling_ = false;
+
   std::unique_ptr<BrowserCompositorIOS> browser_compositor_;
   std::unique_ptr<UIViewHolder> ui_view_;
   std::unique_ptr<ui::DisplayCALayerTree> display_tree_;
diff --git a/content/browser/renderer_host/render_widget_host_view_ios.mm b/content/browser/renderer_host/render_widget_host_view_ios.mm
index 9e989b0..958cc0d8 100644
--- a/content/browser/renderer_host/render_widget_host_view_ios.mm
+++ b/content/browser/renderer_host/render_widget_host_view_ios.mm
@@ -13,6 +13,7 @@
 #include "content/browser/renderer_host/input/motion_event_web.h"
 #include "content/browser/renderer_host/input/synthetic_gesture_target_ios.h"
 #include "content/browser/renderer_host/input/web_input_event_builders_ios.h"
+#include "content/browser/renderer_host/render_view_host_delegate_view.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_input_event_router.h"
 #include "content/browser/renderer_host/text_input_manager.h"
@@ -25,11 +26,14 @@
 #include "ui/base/ime/text_input_type.h"
 #include "ui/display/screen.h"
 #include "ui/events/gesture_detection/gesture_provider_config_helper.h"
+#include "ui/gfx/geometry/size_conversions.h"
 
 // Used for settng the requested renderer size when testing.
 constexpr int kDefaultWidthForTesting = 800;
 constexpr int kDefaultHeightForTesting = 600;
 
+static void* kObservingContext = &kObservingContext;
+
 @interface UIApplication (Testing)
 - (BOOL)isRunningTests;
 @end
@@ -60,11 +64,28 @@
 
 @interface RenderWidgetUIView : CALayerFrameSinkProvider {
   raw_ptr<content::RenderWidgetHostViewIOS> _view;
+  absl::optional<gfx::Vector2dF> _view_offset_during_touch_sequence;
 }
 
 // TextInput state.
 @property(nonatomic, strong) RenderWidgetUIViewTextInput* textInput;
 
+/** The constraint between the top edge of @c contentView and its superview. */
+@property(nonatomic, strong, nonnull)
+    NSLayoutConstraint* contentViewTopConstraint;
+
+/** The constraint between the bottom edge of @c contentView and its superview.
+ */
+@property(nonatomic, strong, nonnull)
+    NSLayoutConstraint* contentViewBottomConstraint;
+
+/** The constraint between the trailing edge of @c contentView and its
+ * superview. */
+@property(nonatomic, strong, nonnull)
+    NSLayoutConstraint* contentViewTrailingConstraint;
+
+- (void)updateView:(UIScrollView*)view;
+- (void)removeView;
 @end
 
 @implementation CALayerFrameSinkProvider
@@ -216,30 +237,82 @@
     }
   }
   for (UITouch* touch in touches) {
-    _view->OnTouchEvent(content::WebTouchEventBuilder::Build(
-        blink::WebInputEvent::Type::kTouchStart, touch, event, self));
+    blink::WebTouchEvent webTouchEvent = content::WebTouchEventBuilder::Build(
+        blink::WebInputEvent::Type::kTouchStart, touch, event, self,
+        _view_offset_during_touch_sequence);
+    if (!_view_offset_during_touch_sequence) {
+      _view_offset_during_touch_sequence =
+          webTouchEvent.touches[0].PositionInWidget() -
+          webTouchEvent.touches[0].PositionInScreen();
+    }
+    _view->OnTouchEvent(std::move(webTouchEvent));
   }
 }
 
 - (void)touchesEnded:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event {
   for (UITouch* touch in touches) {
     _view->OnTouchEvent(content::WebTouchEventBuilder::Build(
-        blink::WebInputEvent::Type::kTouchEnd, touch, event, self));
+        blink::WebInputEvent::Type::kTouchEnd, touch, event, self,
+        _view_offset_during_touch_sequence));
+  }
+  if (event.allTouches.count == 1) {
+    _view_offset_during_touch_sequence.reset();
   }
 }
 
 - (void)touchesMoved:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event {
   for (UITouch* touch in touches) {
     _view->OnTouchEvent(content::WebTouchEventBuilder::Build(
-        blink::WebInputEvent::Type::kTouchMove, touch, event, self));
+        blink::WebInputEvent::Type::kTouchMove, touch, event, self,
+        _view_offset_during_touch_sequence));
   }
 }
 
 - (void)touchesCancelled:(NSSet<UITouch*>*)touches withEvent:(UIEvent*)event {
   for (UITouch* touch in touches) {
     _view->OnTouchEvent(content::WebTouchEventBuilder::Build(
-        blink::WebInputEvent::Type::kTouchCancel, touch, event, self));
+        blink::WebInputEvent::Type::kTouchCancel, touch, event, self,
+        _view_offset_during_touch_sequence));
   }
+  _view_offset_during_touch_sequence.reset();
+}
+
+- (void)observeValueForKeyPath:(NSString*)keyPath
+                      ofObject:(id)object
+                        change:(NSDictionary*)change
+                       context:(void*)context {
+  if (context == kObservingContext) {
+    _view->ContentInsetChanged();
+  } else {
+    [super observeValueForKeyPath:keyPath
+                         ofObject:object
+                           change:change
+                          context:context];
+  }
+}
+
+- (void)removeView {
+  UIScrollView* view = (UIScrollView*)[self superview];
+  [view removeObserver:self
+            forKeyPath:NSStringFromSelector(@selector(contentInset))];
+  [self removeFromSuperview];
+}
+
+- (void)updateView:(UIScrollView*)view {
+  [view addSubview:self];
+  view.scrollEnabled = NO;
+  CGRect parentBounds = [view bounds];
+  CGRect frameBounds = CGRectZero;
+  frameBounds.size = parentBounds.size;
+  self.frame = frameBounds;
+  // Remove all existing gestureRecognizers since the header might be reused.
+  for (UIGestureRecognizer* recognizer in view.gestureRecognizers) {
+    [view removeGestureRecognizer:recognizer];
+  }
+  [view addObserver:self
+         forKeyPath:NSStringFromSelector(@selector(contentInset))
+            options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
+            context:kObservingContext];
 }
 
 @end
@@ -296,12 +369,14 @@
     text_input_manager_->AddObserver(this);
   }
 
+  host()->render_frame_metadata_provider()->AddObserver(this);
   host()->SetView(this);
 }
 
 RenderWidgetHostViewIOS::~RenderWidgetHostViewIOS() = default;
 
 void RenderWidgetHostViewIOS::Destroy() {
+  host()->render_frame_metadata_provider()->RemoveObserver(this);
   if (text_input_manager_) {
     text_input_manager_->RemoveObserver(this);
   }
@@ -530,6 +605,11 @@
   RenderWidgetHostViewBase::UpdateScreenInfo();
 }
 
+void RenderWidgetHostViewIOS::OnSynchronizedDisplayPropertiesChanged(
+    bool rotation) {
+  host()->SynchronizeVisualProperties();
+}
+
 void RenderWidgetHostViewIOS::UpdateCALayerTree(
     const gfx::CALayerParams& ca_layer_params) {
   DCHECK(display_tree_);
@@ -738,10 +818,9 @@
 
 void RenderWidgetHostViewIOS::UpdateNativeViewTree(gfx::NativeView view) {
   if (view) {
-    [view addSubview:ui_view_->view_];
-    ui_view_->view_.get().frame = [view bounds];
+    [ui_view_->view_ updateView:(UIScrollView*)view];
   } else {
-    [ui_view_->view_ removeFromSuperview];
+    [ui_view_->view_ removeView];
   }
 }
 
@@ -814,4 +893,93 @@
   return browser_compositor_->GetCompositor();
 }
 
+void RenderWidgetHostViewIOS::GestureEventAck(
+    const blink::WebGestureEvent& event,
+    blink::mojom::InputEventResultState ack_result,
+    blink::mojom::ScrollResultDataPtr scroll_result_data) {
+  UIScrollView* scrollView = (UIScrollView*)[ui_view_->view_ superview];
+  switch (event.GetType()) {
+    case blink::WebInputEvent::Type::kGestureScrollBegin:
+      is_scrolling_ = true;
+      [[scrollView delegate] scrollViewWillBeginDragging:scrollView];
+      break;
+    case blink::WebInputEvent::Type::kGestureScrollUpdate:
+      if (scroll_result_data && scroll_result_data->root_scroll_offset) {
+        ApplyRootScrollOffsetChanged(*scroll_result_data->root_scroll_offset);
+      }
+      break;
+    case blink::WebInputEvent::Type::kGestureScrollEnd: {
+      is_scrolling_ = false;
+      CGPoint targetOffset = [scrollView contentOffset];
+      [[scrollView delegate] scrollViewWillEndDragging:scrollView
+                                          withVelocity:CGPoint()
+                                   targetContentOffset:&targetOffset];
+      [[scrollView delegate] scrollViewDidEndDragging:scrollView
+                                       willDecelerate:NO];
+      host()->SynchronizeVisualProperties();
+      break;
+    }
+    default:
+      break;
+  }
+}
+
+void RenderWidgetHostViewIOS::ChildDidAckGestureEvent(
+    const blink::WebGestureEvent& event,
+    blink::mojom::InputEventResultState ack_result,
+    blink::mojom::ScrollResultDataPtr scroll_result_data) {
+  if (scroll_result_data && scroll_result_data->root_scroll_offset) {
+    ApplyRootScrollOffsetChanged(*scroll_result_data->root_scroll_offset);
+  }
+}
+
+void RenderWidgetHostViewIOS::ApplyRootScrollOffsetChanged(
+    const gfx::PointF& root_scroll_offset) {
+  UIScrollView* scrollView = (UIScrollView*)[ui_view_->view_ superview];
+  gfx::PointF scrollOffset = root_scroll_offset;
+  UIEdgeInsets insets = [scrollView contentInset];
+  scrollOffset.Offset(insets.left, insets.top);
+  CGRect parentBounds = [[ui_view_->view_ superview] bounds];
+  gfx::SizeF viewportSize(parentBounds.size);
+
+  // Adjust the viewport so that it doesn't overhang the screen when the
+  // min controls are shown, otherwise we won't be able to scroll to all
+  // the content.
+  RenderViewHostDelegateView* rvh_delegate_view =
+      host()->delegate()->GetDelegateView();
+  viewportSize.Enlarge(0, -(rvh_delegate_view->GetTopControlsMinHeight() +
+                            rvh_delegate_view->GetBottomControlsMinHeight()));
+  CGRect frameBounds;
+  frameBounds.origin = scrollOffset.ToCGPoint();
+  frameBounds.size = viewportSize.ToCGSize();
+
+  [ui_view_->view_ setFrame:frameBounds];
+  if (last_root_scroll_offset_ != root_scroll_offset) {
+    [scrollView setContentOffset:root_scroll_offset.ToCGPoint()];
+    last_root_scroll_offset_ = root_scroll_offset;
+    [[scrollView delegate] scrollViewDidScroll:scrollView];
+  }
+}
+
+void RenderWidgetHostViewIOS::OnRenderFrameMetadataChangedBeforeActivation(
+    const cc::RenderFrameMetadata& metadata) {
+  UIScrollView* scrollView = (UIScrollView*)[ui_view_->view_ superview];
+  CGSize newContentSize = metadata.root_layer_size.ToCGSize();
+  if (!CGSizeEqualToSize([scrollView contentSize], newContentSize)) {
+    [scrollView setContentSize:newContentSize];
+  }
+  if (metadata.root_scroll_offset) {
+    ApplyRootScrollOffsetChanged(*metadata.root_scroll_offset);
+  }
+}
+
+void RenderWidgetHostViewIOS::ContentInsetChanged() {
+  if (last_root_scroll_offset_) {
+    ApplyRootScrollOffsetChanged(*last_root_scroll_offset_);
+  }
+  if (!is_scrolling_) {
+    host()->SynchronizeVisualProperties();
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index cf3c0c18..4a5df7b 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -307,13 +307,13 @@
     // Browser command-line switches to propagate to the utility process.
     static const char* const kSwitchNames[] = {
       network::switches::kAdditionalTrustTokenKeyCommitments,
-      network::switches::kBlockThirdPartyCookies,
       network::switches::kForceEffectiveConnectionType,
       network::switches::kHostResolverRules,
       network::switches::kIgnoreCertificateErrorsSPKIList,
       network::switches::kIgnoreUrlFetcherCertRequests,
       network::switches::kLogNetLog,
       network::switches::kNetLogCaptureMode,
+      network::switches::kTestThirdPartyCookiePhaseout,
       sandbox::policy::switches::kNoSandbox,
 #if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
       switches::kDisableDevShmUsage,
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index dc348722b..18ad2b55 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -1302,7 +1302,7 @@
 }
 
 gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) {
-  return gfx::kNullCursor;
+  return gfx::NativeCursor{};
 }
 
 int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const {
diff --git a/content/browser/web_contents/web_contents_view_ios.mm b/content/browser/web_contents/web_contents_view_ios.mm
index cb7209d..0049200 100644
--- a/content/browser/web_contents/web_contents_view_ios.mm
+++ b/content/browser/web_contents/web_contents_view_ios.mm
@@ -38,7 +38,7 @@
 // of the WebContentsViewIOS.
 class WebContentsUIViewHolder {
  public:
-  base::scoped_nsobject<UIView> view_;
+  base::scoped_nsobject<UIScrollView> view_;
 };
 
 std::unique_ptr<WebContentsView> CreateWebContentsView(
@@ -56,7 +56,9 @@
     std::unique_ptr<WebContentsViewDelegate> delegate)
     : web_contents_(web_contents), delegate_(std::move(delegate)) {
   ui_view_ = std::make_unique<WebContentsUIViewHolder>();
-  ui_view_->view_ = base::scoped_nsobject<UIView>([[UIView alloc] init]);
+  ui_view_->view_ =
+      base::scoped_nsobject<UIScrollView>([[UIScrollView alloc] init]);
+  [ui_view_->view_ setScrollEnabled:NO];
   [ui_view_->view_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
                                        UIViewAutoresizingFlexibleHeight];
 }
diff --git a/content/common/cursors/webcursor_android.cc b/content/common/cursors/webcursor_android.cc
index a574b3e..9c5cdc77 100644
--- a/content/common/cursors/webcursor_android.cc
+++ b/content/common/cursors/webcursor_android.cc
@@ -8,7 +8,7 @@
 namespace content {
 
 gfx::NativeCursor WebCursor::GetNativeCursor() {
-  return gfx::kNullCursor;
+  return gfx::NativeCursor{};
 }
 
 #if defined(USE_AURA)
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
index fd7dd484..8b90d35 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
@@ -247,6 +247,11 @@
                     || action.equals(ACTION_SCROLL_RIGHT) || action.equals(ACTION_SCROLL_LEFT)) {
                 continue;
             }
+            // Page actions are dependent on screen size, so ignore them to reduce flakiness.
+            if (action.equals(ACTION_PAGE_UP) || action.equals(ACTION_PAGE_DOWN)
+                    || action.equals(ACTION_PAGE_LEFT) || action.equals(ACTION_PAGE_RIGHT)) {
+                continue;
+            }
 
             actionStrings.add(toString(action.getId()));
         }
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc
index 34ebf6c..9e902dc 100644
--- a/content/public/common/content_switch_dependent_feature_overrides.cc
+++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -119,10 +119,13 @@
      std::cref(net::features::kPartitionedCookies),
      base::FeatureList::OVERRIDE_ENABLE_FEATURE},
 
-    // Override third-party cookie blocking.
-    {network::switches::kBlockThirdPartyCookies,
+    // Test behavior for third-party cookie phaseout.
+    {network::switches::kTestThirdPartyCookiePhaseout,
      std::cref(net::features::kForceThirdPartyCookieBlocking),
      base::FeatureList::OVERRIDE_ENABLE_FEATURE},
+    {network::switches::kTestThirdPartyCookiePhaseout,
+     std::cref(net::features::kThirdPartyStoragePartitioning),
+     base::FeatureList::OVERRIDE_ENABLE_FEATURE},
 
     // Overrides for --isolation-by-default.
     {switches::kIsolationByDefault,
diff --git a/content/test/data/accessibility/css/font-size-expected-android-external.txt b/content/test/data/accessibility/css/font-size-expected-android-external.txt
index b049d86..0376f18 100644
--- a/content/test/data/accessibility/css/font-size-expected-android-external.txt
+++ b/content/test/data/accessibility/css/font-size-expected-android-external.txt
@@ -1,4 +1,4 @@
-WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS, PAGE_DOWN] bundle:[chromeRole="rootWebArea"]
+WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++TextView text:"10.2340920823px" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++TextView text:"10px" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++TextView text:"11px" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
diff --git a/content/test/data/accessibility/html/iframe-focus-expected-android-external.txt b/content/test/data/accessibility/html/iframe-focus-expected-android-external.txt
index dcacb84..279ab5530 100644
--- a/content/test/data/accessibility/html/iframe-focus-expected-android-external.txt
+++ b/content/test/data/accessibility/html/iframe-focus-expected-android-external.txt
@@ -1,10 +1,10 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="iframe"]
-++++++View scrollable actions:[AX_FOCUS, PAGE_RIGHT] bundle:[chromeRole="rootWebArea"]
+++++++View scrollable actions:[AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++++++++Button text:"Button with focus handler" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
 ++++++++TextView viewIdResName:"focused_log" actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="iframe"]
-++++++View scrollable actions:[AX_FOCUS, PAGE_RIGHT] bundle:[chromeRole="rootWebArea"]
+++++++View scrollable actions:[AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++++++++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++++++++Button text:"Ordinary Button" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/offscreen-iframe-expected-android-external.txt b/content/test/data/accessibility/html/offscreen-iframe-expected-android-external.txt
index 00983cf..56adbf13 100644
--- a/content/test/data/accessibility/html/offscreen-iframe-expected-android-external.txt
+++ b/content/test/data/accessibility/html/offscreen-iframe-expected-android-external.txt
@@ -1,6 +1,6 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="iframe"]
-++++++View scrollable actions:[AX_FOCUS, PAGE_DOWN] bundle:[chromeRole="rootWebArea"]
+++++++View scrollable actions:[AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++++++++View text:"iframe_onscreen" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"]
 ++++++++View text:"iframe_offscreen" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/overflow-actions-expected-android-external.txt b/content/test/data/accessibility/html/overflow-actions-expected-android-external.txt
index ebc25bb..353540eb 100644
--- a/content/test/data/accessibility/html/overflow-actions-expected-android-external.txt
+++ b/content/test/data/accessibility/html/overflow-actions-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++View text:"Example Paragraph 1 Example Paragraph 2" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_DOWN] bundle:[chromeRole="genericContainer"]
+++View text:"Example Paragraph 1 Example Paragraph 2" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++TextView text:"Example Paragraph 1" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++++TextView text:"Example Paragraph 2" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
diff --git a/content/test/data/accessibility/html/scrollable-expected-android-external.txt b/content/test/data/accessibility/html/scrollable-expected-android-external.txt
index 738e93fa..1887df11 100644
--- a/content/test/data/accessibility/html/scrollable-expected-android-external.txt
+++ b/content/test/data/accessibility/html/scrollable-expected-android-external.txt
@@ -1,4 +1,4 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++TextView text:"not scrollable" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
-++TextView scrollable actions:[AX_FOCUS, PAGE_RIGHT] bundle:[chromeRole="genericContainer"]
-++TextView scrollable actions:[AX_FOCUS, PAGE_DOWN] bundle:[chromeRole="genericContainer"]
\ No newline at end of file
+++TextView scrollable actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
+++TextView scrollable actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-overflow-expected-android-external.txt b/content/test/data/accessibility/html/scrollable-overflow-expected-android-external.txt
index 4502258..0e0945e 100644
--- a/content/test/data/accessibility/html/scrollable-overflow-expected-android-external.txt
+++ b/content/test/data/accessibility/html/scrollable-overflow-expected-android-external.txt
@@ -1,26 +1,26 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++TextView text:"no overflow" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++TextView text:"clipped large lots of text more text" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++EditText text:"ab cd" clickable editable focusable multiLine scrollable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, PAGE_DOWN, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
+++EditText text:"ab cd" clickable editable focusable multiLine scrollable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++TextView text:"tiny" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="group"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"x=hidden" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"x=hidden" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_DOWN, PAGE_RIGHT] bundle:[chromeRole="genericContainer"]
+++++View text:"x=hidden" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"x=hidden" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"x=auto" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_RIGHT] bundle:[chromeRole="genericContainer"]
+++++View text:"x=auto" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"x=auto" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"x=scroll" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_RIGHT] bundle:[chromeRole="genericContainer"]
+++++View text:"x=scroll" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"x=scroll" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++++TextView text:"x=visible" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="group"]
 ++++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"y=hidden" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"y=hidden" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_DOWN, PAGE_RIGHT] bundle:[chromeRole="genericContainer"]
+++++View text:"y=hidden" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"y=hidden" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"y=auto" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_DOWN] bundle:[chromeRole="genericContainer"]
+++++View text:"y=auto" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"y=auto" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
-++++View text:"y=scroll" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS, PAGE_DOWN] bundle:[chromeRole="genericContainer"]
+++++View text:"y=scroll" scrollable actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="genericContainer"]
 ++++++TextView text:"y=scroll" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
 ++++TextView text:"y=visible" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/scrollable-textarea-expected-android-external.txt b/content/test/data/accessibility/html/scrollable-textarea-expected-android-external.txt
index fa92bc719..63d31a6 100644
--- a/content/test/data/accessibility/html/scrollable-textarea-expected-android-external.txt
+++ b/content/test/data/accessibility/html/scrollable-textarea-expected-android-external.txt
@@ -1,4 +1,4 @@
 WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="genericContainer"]
 ++++EditText text:"little" clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
-++++EditText text:"lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text" clickable editable focusable multiLine scrollable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, PAGE_DOWN, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
\ No newline at end of file
+++++EditText text:"lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text+ lots+of+text" clickable editable focusable multiLine scrollable textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS, COPY, PASTE, CUT, SET_SELECTION, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
\ No newline at end of file
diff --git a/device/vr/android/arcore/arcore_gl.cc b/device/vr/android/arcore/arcore_gl.cc
index 78a72e6c..6242648 100644
--- a/device/vr/android/arcore/arcore_gl.cc
+++ b/device/vr/android/arcore/arcore_gl.cc
@@ -1423,13 +1423,6 @@
       &ArCoreGl::OnBindingDisconnect, weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ArCoreGl::SetInputSourceButtonListener(
-    mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>) {
-  // Input eventing is not supported. This call should not
-  // be made on this device.
-  frame_data_receiver_.ReportBadMessage("Input eventing is not supported.");
-}
-
 void ArCoreGl::SubscribeToHitTest(
     mojom::XRNativeOriginInformationPtr native_origin_information,
     const std::vector<mojom::EntityTypeForHitTest>& entity_types,
diff --git a/device/vr/android/arcore/arcore_gl.h b/device/vr/android/arcore/arcore_gl.h
index 8cd5291f..decb4cd 100644
--- a/device/vr/android/arcore/arcore_gl.h
+++ b/device/vr/android/arcore/arcore_gl.h
@@ -145,9 +145,6 @@
   void GetEnvironmentIntegrationProvider(
       mojo::PendingAssociatedReceiver<mojom::XREnvironmentIntegrationProvider>
           environment_provider) override;
-  void SetInputSourceButtonListener(
-      mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>)
-      override;
 
   // XRPresentationProvider
   void SubmitFrameMissing(int16_t frame_index, const gpu::SyncToken&) override;
diff --git a/device/vr/android/cardboard/cardboard_render_loop.cc b/device/vr/android/cardboard/cardboard_render_loop.cc
index 2a8f8b8..9ff84d1b 100644
--- a/device/vr/android/cardboard/cardboard_render_loop.cc
+++ b/device/vr/android/cardboard/cardboard_render_loop.cc
@@ -72,13 +72,6 @@
       "Environment integration is not supported.");
 }
 
-void CardboardRenderLoop::SetInputSourceButtonListener(
-    mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>) {
-  // Input eventing is not supported. This call should not
-  // be made on this device.
-  frame_data_receiver_.ReportBadMessage("Input eventing is not supported.");
-}
-
 void CardboardRenderLoop::CreateSession(
     CardboardRequestSessionCallback session_request_callback,
     base::OnceClosure session_shutdown_callback,
diff --git a/device/vr/android/cardboard/cardboard_render_loop.h b/device/vr/android/cardboard/cardboard_render_loop.h
index 4f128fd..029cd80a 100644
--- a/device/vr/android/cardboard/cardboard_render_loop.h
+++ b/device/vr/android/cardboard/cardboard_render_loop.h
@@ -61,9 +61,6 @@
   // mojom::XRFrameDataProvider
   void GetFrameData(mojom::XRFrameDataRequestOptionsPtr options,
                     GetFrameDataCallback callback) override;
-  void SetInputSourceButtonListener(
-      mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>
-          input_listener_remote) override;
 
   void GetEnvironmentIntegrationProvider(
       mojo::PendingAssociatedReceiver<
diff --git a/device/vr/orientation/orientation_session.cc b/device/vr/orientation/orientation_session.cc
index 588c58c..d8ef2f7 100644
--- a/device/vr/orientation/orientation_session.cc
+++ b/device/vr/orientation/orientation_session.cc
@@ -52,13 +52,6 @@
       "Environment integration is not supported.");
 }
 
-void VROrientationSession::SetInputSourceButtonListener(
-    mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>) {
-  // Input eventing is not supported. This call should not
-  // be made on this device.
-  magic_window_receiver_.ReportBadMessage("Input eventing is not supported.");
-}
-
 // XRSessionController
 void VROrientationSession::SetFrameDataRestricted(bool frame_data_restricted) {
   restrict_frame_data_ = frame_data_restricted;
diff --git a/device/vr/orientation/orientation_session.h b/device/vr/orientation/orientation_session.h
index dcba850..270724b 100644
--- a/device/vr/orientation/orientation_session.h
+++ b/device/vr/orientation/orientation_session.h
@@ -35,10 +35,6 @@
   void GetEnvironmentIntegrationProvider(
       mojo::PendingAssociatedReceiver<mojom::XREnvironmentIntegrationProvider>
           environment_provider) override;
-  void SetInputSourceButtonListener(
-      mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>)
-      override;
-
   // Accessible to tests.
  protected:
   // mojom::XRFrameDataProvider
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom
index 905ed51a..35033948 100644
--- a/device/vr/public/mojom/vr_service.mojom
+++ b/device/vr/public/mojom/vr_service.mojom
@@ -148,10 +148,6 @@
 // This structure contains a description of the device's active configuration
 // for the session being established.
 struct XRSessionDeviceConfig {
-  // Indicates whether the device backing this session sends input events solely
-  // via eventing (as opposed to polling).
-  bool uses_input_eventing;
-
   // The default scale that should be applied to the native framebuffer size
   // unless overridden by the developer.
   float default_framebuffer_scale = 1.0;
@@ -821,10 +817,7 @@
   array<XRView> views;
 
   // For immersive sessions only, reports the state of all active input devices
-  // at the time of this frame. If a session has indicated that it
-  // |uses_input_eventing|, then these input states should not fire select,
-  // squeeze, or similar events, but all controller state, including current
-  // button states, should still be updated.
+  // at the time of this frame. all controller state, including current
   array<XRInputSourceState>? input_state;
 
   // Stage parameters may be provided per-frame, or only re-computed
@@ -1082,13 +1075,6 @@
   DetachAnchor(uint64 anchor_id);
 };
 
-// Provides a mechanism for a channel to plumb up any button click events
-// separately from polling, to provide better latency/position tracking for
-// those events.
-interface XRInputSourceButtonListener {
-  OnButtonEvent(XRInputSourceState input_source);
-};
-
 struct XRFrameDataRequestOptions {
   // Controls whether |XRFrameData.light_estimation_data| should be populated
   // by the request to |XRFrameDataProvider.GetFrameData()|.
@@ -1113,8 +1099,6 @@
   GetEnvironmentIntegrationProvider(
       pending_associated_receiver<XREnvironmentIntegrationProvider>
           environment_provider);
-  SetInputSourceButtonListener(
-      pending_associated_remote<XRInputSourceButtonListener>? event_listener);
 };
 
 // Provides the necessary functionality for sending frames to a headset.
diff --git a/device/vr/windows/compositor_base.cc b/device/vr/windows/compositor_base.cc
index 90e0d54e..4d24623 100644
--- a/device/vr/windows/compositor_base.cc
+++ b/device/vr/windows/compositor_base.cc
@@ -179,7 +179,6 @@
   presentation_receiver_.reset();
   frame_data_receiver_.reset();
   overlay_receiver_.reset();
-  input_event_listener_.reset();
   StopRuntime();
 }
 
@@ -193,12 +192,6 @@
   SetOverlayAndWebXRVisibility(false, true);
 }
 
-bool XRCompositorCommon::UsesInputEventing() {
-  // By default we don't use input eventing.  Any subclass that does will need
-  // to override this.
-  return false;
-}
-
 void XRCompositorCommon::UpdateLayerBounds(int16_t frame_id,
                                            const gfx::RectF& left_bounds,
                                            const gfx::RectF& right_bounds,
@@ -306,7 +299,6 @@
                                    enabled_features_.end());
 
   session->device_config = device::mojom::XRSessionDeviceConfig::New();
-  session->device_config->uses_input_eventing = UsesInputEventing();
   session->device_config->enable_anti_aliasing = CanEnableAntiAliasing();
   session->device_config->views = GetDefaultViews();
   session->enviroment_blend_mode = GetEnvironmentBlendMode(options->mode);
@@ -479,14 +471,6 @@
   }
 }
 
-void XRCompositorCommon::SetInputSourceButtonListener(
-    mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>
-        input_listener_remote) {
-  DCHECK(UsesInputEventing());
-  input_event_listener_.reset();
-  input_event_listener_.Bind(std::move(input_listener_remote));
-}
-
 void XRCompositorCommon::SendFrameData(
     XRFrameDataProvider::GetFrameDataCallback callback,
     mojom::XRFrameDataPtr frame_data) {
diff --git a/device/vr/windows/compositor_base.h b/device/vr/windows/compositor_base.h
index caa1995..3e1a942 100644
--- a/device/vr/windows/compositor_base.h
+++ b/device/vr/windows/compositor_base.h
@@ -96,9 +96,6 @@
 
   void GetFrameData(mojom::XRFrameDataRequestOptionsPtr options,
                     XRFrameDataProvider::GetFrameDataCallback callback) final;
-  void SetInputSourceButtonListener(
-      mojo::PendingAssociatedRemote<device::mojom::XRInputSourceButtonListener>
-          input_listener_remote) override;
 
   void GetEnvironmentIntegrationProvider(
       mojo::PendingAssociatedReceiver<
@@ -110,7 +107,6 @@
   virtual gpu::gles2::GLES2Interface* GetContextGL() = 0;
 
  protected:
-  virtual bool UsesInputEventing();
   void SetVisibilityState(mojom::XRVisibilityState visibility_state);
   const mojom::VRStageParametersPtr& GetCurrentStageParameters() const;
   void SetStageParameters(mojom::VRStageParametersPtr stage_parameters);
@@ -121,8 +117,6 @@
 
   // Allow derived classes to call methods on the main thread.
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
-  mojo::AssociatedRemote<mojom::XRInputSourceButtonListener>
-      input_event_listener_;
 
   // Derived classes override this to be notified to clear its pending frame.
   virtual void ClearPendingFrameInternal() {}
diff --git a/docs/linux/build_instructions.md b/docs/linux/build_instructions.md
index ff04be2..b51299e 100644
--- a/docs/linux/build_instructions.md
+++ b/docs/linux/build_instructions.md
@@ -412,8 +412,8 @@
 
 ```shell
 $ sudo pacman -S --needed python perl gcc gcc-libs bison flex gperf pkgconfig \
-nss alsa-lib glib2 gtk3 nspr freetype2 cairo dbus libgnome-keyring \
-xorg-server-xvfb xorg-xdpyinfo
+nss alsa-lib glib2 gtk3 nspr freetype2 cairo dbus xorg-server-xvfb \
+xorg-xdpyinfo
 ```
 
 For the optional packages on Arch Linux:
@@ -447,11 +447,10 @@
 cups-devel dbus-devel dbus-glib-devel expat-devel fontconfig-devel \
 freetype-devel gcc-c++ glib2-devel glibc.i686 gperf glib2-devel \
 gtk3-devel java-1.*.0-openjdk-devel libatomic libcap-devel libffi-devel \
-libgcc.i686 libgnome-keyring-devel libjpeg-devel libstdc++.i686 libX11-devel \
-libXScrnSaver-devel libXtst-devel libxkbcommon-x11-devel ncurses-compat-libs \
-nspr-devel nss-devel pam-devel pango-devel pciutils-devel \
-pulseaudio-libs-devel zlib.i686 httpd mod_ssl php php-cli python-psutil wdiff \
-xorg-x11-server-Xvfb'
+libgcc.i686 libjpeg-devel libstdc++.i686 libX11-devel libXScrnSaver-devel \
+libXtst-devel libxkbcommon-x11-devel ncurses-compat-libs nspr-devel nss-devel \
+pam-devel pango-devel pciutils-devel pulseaudio-libs-devel zlib.i686 httpd \
+mod_ssl php php-cli python-psutil wdiff xorg-x11-server-Xvfb'
 ```
 
 The fonts needed by Blink's web tests can be obtained by following [these
diff --git a/docs/linux/password_storage.md b/docs/linux/password_storage.md
index 0418e64..e32edc6f 100644
--- a/docs/linux/password_storage.md
+++ b/docs/linux/password_storage.md
@@ -1,21 +1,22 @@
 # Linux Password Storage
 
-On Linux, Chromium can store passwords in three ways:
+On Linux, Chromium can store passwords in four ways:
 
-*   GNOME Keyring
+*   GNOME Libsecret
 *   KWallet 4
+*   KWallet 5
 *   plain text
 
 Chromium chooses which store to use automatically, based on your desktop
 environment.
 
-Passwords stored in GNOME Keyring or KWallet are encrypted on disk, and access
+Passwords stored in KWallet are encrypted on disk, and access
 to them is controlled by dedicated daemon software. Passwords stored in plain
-text are not encrypted. Because of this, when either GNOME Keyring or KWallet is
+text are not encrypted. Because of this, when KWallet is
 in use, any unencrypted passwords that have been stored previously are
 automatically moved into the encrypted store.
 
-Support for using GNOME Keyring and KWallet was added in version 6, but using
+Support for using KWallet was added in version 6, but using
 these (when available) was not made the default mode until version 12.
 
 ## Details
@@ -23,8 +24,9 @@
 Although Chromium chooses which store to use automatically, the store to use can
 also be specified with a command line argument:
 
-*   `--password-store=gnome` (to use GNOME Keyring)
-*   `--password-store=kwallet` (to use KWallet)
+*   `--password-store=gnome-libsecret` (to use GNOME Libsecret)
+*   `--password-store=kwallet` (to use KWallet 4)
+*   `--password-store=kwallet5` (to use KWallet 5)
 *   `--password-store=basic` (to use the plain text store)
 
 Note that Chromium will fall back to `basic` if a requested or autodetected
diff --git a/docs/security/faq.md b/docs/security/faq.md
index ab55f6bf..1ce9576 100644
--- a/docs/security/faq.md
+++ b/docs/security/faq.md
@@ -851,11 +851,11 @@
      encrypted on disk with a key that is then stored in the user's Keychain.
      See [Issue 466638](https://crbug.com/466638) for further explanation.
 *    On Linux, Chrome previously stored credentials directly in the user's
-     Gnome Keyring or KWallet, but for technical reasons, it has switched to
+     Gnome Secret Service or KWallet, but for technical reasons, it has switched to
      storing the credentials in "Login Data" in the Chrome user's profile directory,
      but encrypted on disk with a key that is then stored in the user's Gnome
-     Keyring or KWallet. If there is no available Keyring or KWallet, the data is
-     not encrypted when stored.
+     Secret Service or KWallet. If there is no available Secret Service or KWallet,
+     the data is not encrypted when stored.
 *    On iOS, passwords are currently stored directly in the iOS Keychain and
      referenced from the rest of the metadata stored in a separate DB. The plan
      there is to just store them in plain text in the DB, because iOS gives
diff --git a/fuchsia_web/runners/cast/test/cast_runner_launcher.cc b/fuchsia_web/runners/cast/test/cast_runner_launcher.cc
index d2aca2e..92f5640 100644
--- a/fuchsia_web/runners/cast/test/cast_runner_launcher.cc
+++ b/fuchsia_web/runners/cast/test/cast_runner_launcher.cc
@@ -22,6 +22,7 @@
 #include <fuchsia/ui/composition/cpp/fidl.h>
 #include <fuchsia/ui/scenic/cpp/fidl.h>
 #include <fuchsia/web/cpp/fidl.h>
+#include <lib/vfs/cpp/pseudo_dir.h>
 #include <lib/vfs/cpp/remote_dir.h>
 
 #include <memory>
diff --git a/fuchsia_web/runners/cast/test/fake_cast_agent.cc b/fuchsia_web/runners/cast/test/fake_cast_agent.cc
index 1ab2eca9..331389b 100644
--- a/fuchsia_web/runners/cast/test/fake_cast_agent.cc
+++ b/fuchsia_web/runners/cast/test/fake_cast_agent.cc
@@ -4,6 +4,8 @@
 
 #include "fuchsia_web/runners/cast/test/fake_cast_agent.h"
 
+#include <lib/vfs/cpp/service.h>
+
 #include <memory>
 #include <utility>
 
diff --git a/fuchsia_web/webengine/test/web_engine_browser_test.cc b/fuchsia_web/webengine/test/web_engine_browser_test.cc
index 8e1a338..c3e487f 100644
--- a/fuchsia_web/webengine/test/web_engine_browser_test.cc
+++ b/fuchsia_web/webengine/test/web_engine_browser_test.cc
@@ -7,6 +7,8 @@
 #include <fuchsia/web/cpp/fidl.h>
 #include <lib/sys/cpp/component_context.h>
 #include <lib/sys/cpp/service_directory.h>
+#include <lib/vfs/cpp/pseudo_dir.h>
+
 #include <vector>
 
 #include "base/command_line.h"
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
index 6408e4b..3bb031a5 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
@@ -57,6 +57,8 @@
     case DXGI_FORMAT_NV12:
     case DXGI_FORMAT_P010:
       return 2;
+    case DXGI_FORMAT_R8_UNORM:
+    case DXGI_FORMAT_R8G8_UNORM:
     case DXGI_FORMAT_R8G8B8A8_UNORM:
     case DXGI_FORMAT_B8G8R8A8_UNORM:
     case DXGI_FORMAT_R10G10B10A2_UNORM:
diff --git a/infra/config/generated/builders/ci/chromeos-js-code-coverage/properties.json b/infra/config/generated/builders/ci/chromeos-js-code-coverage/properties.json
index b8e87de..726c165 100644
--- a/infra/config/generated/builders/ci/chromeos-js-code-coverage/properties.json
+++ b/infra/config/generated/builders/ci/chromeos-js-code-coverage/properties.json
@@ -43,6 +43,10 @@
         {
           "builder": "chromeos-js-code-coverage",
           "group": "tryserver.chromium.linux"
+        },
+        {
+          "builder": "chromeos-js-coverage-rel",
+          "group": "tryserver.chromium.linux"
         }
       ]
     }
diff --git a/infra/config/generated/builders/try/chromeos-js-coverage-rel/properties.json b/infra/config/generated/builders/try/chromeos-js-coverage-rel/properties.json
new file mode 100644
index 0000000..7a3d8ee
--- /dev/null
+++ b/infra/config/generated/builders/try/chromeos-js-coverage-rel/properties.json
@@ -0,0 +1,65 @@
+{
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "chromeos-js-code-coverage",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.coverage",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "chromeos"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "chromeos"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "chromeos-js-code-coverage",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
+  "$build/code_coverage": {
+    "coverage_test_types": [
+      "unit",
+      "overall"
+    ],
+    "use_javascript_coverage": true
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-untrusted",
+    "metrics_project": "chromium-reclient-metrics"
+  },
+  "$recipe_engine/resultdb/test_presentation": {
+    "column_keys": [],
+    "grouping_keys": [
+      "status",
+      "v.test_suite"
+    ]
+  },
+  "builder_group": "tryserver.chromium.linux",
+  "cq": "path-based",
+  "recipe": "chromium_trybot"
+}
\ No newline at end of file
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index 5881f8d..720d8a2e 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -543,6 +543,12 @@
 as required builders.
 
 ### chromium
+* [chromeos-js-coverage-rel](https://ci.chromium.org/p/chromium/builders/try/chromeos-js-coverage-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""chromeos-js-coverage-rel""))
+  * Experiment percentage: 10.0
+
+  Location filters:
+  * [`//.*\.(js|ts)`](https://cs.chromium.org/search?q=+file:.*\.(js|ts))
+
 * [dawn-android-arm64-deps-rel](https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm64-deps-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""dawn-android-arm64-deps-rel""))
   * Experiment percentage: 100.0
 
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 9222d913a..353b2a5 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -1303,6 +1303,32 @@
         includable_only: true
       }
       builders {
+        name: "chromium/try/chromeos-js-coverage-rel"
+        experiment_percentage: 10
+        location_filters {
+          gerrit_host_regexp: ".*"
+          gerrit_project_regexp: ".*"
+          path_regexp: ".*\\.(js|ts)"
+        }
+        location_filters {
+          gerrit_host_regexp: ".*"
+          gerrit_project_regexp: ".*"
+          path_regexp: "docs/.+"
+          exclude: true
+        }
+        location_filters {
+          gerrit_host_regexp: ".*"
+          gerrit_project_regexp: ".*"
+          path_regexp: "infra/config/.+"
+          exclude: true
+        }
+        location_filters {
+          gerrit_host_regexp: ".*"
+          gerrit_project_regexp: ".*"
+          path_regexp: "infra/config/generated/builders/try/chromeos-js-coverage-rel/.+"
+        }
+      }
+      builders {
         name: "chromium/try/chromeos-octopus-rel"
         includable_only: true
       }
diff --git a/infra/config/generated/luci/cr-buildbucket-dev.cfg b/infra/config/generated/luci/cr-buildbucket-dev.cfg
index 6e0d953..8ea1171 100644
--- a/infra/config/generated/luci/cr-buildbucket-dev.cfg
+++ b/infra/config/generated/luci/cr-buildbucket-dev.cfg
@@ -468,7 +468,7 @@
       name: "mac-arm-rel-dev"
       swarming_host: "chromium-swarm-dev.appspot.com"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/main"
@@ -558,7 +558,7 @@
       name: "mac-rel-dev"
       swarming_host: "chromium-swarm-dev.appspot.com"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/main"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 32733be..3f5ff42 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -99,7 +99,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -3948,7 +3948,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -4031,7 +4031,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -4116,7 +4116,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -4199,7 +4199,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:arm64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -4699,7 +4699,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -4786,7 +4786,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -11507,7 +11507,7 @@
       dimensions: "builder:Libfuzzer Upload Mac ASan"
       dimensions: "cores:24"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -11662,7 +11662,7 @@
       dimensions: "builder:Libfuzzer Upload iOS Catalyst Debug"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -14617,7 +14617,7 @@
       dimensions: "builder:Mac ASAN Release"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -14702,7 +14702,7 @@
       dimensions: "builder:Mac ASAN Release Media"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -14786,7 +14786,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac ASan 64 Builder"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -14871,7 +14871,7 @@
       dimensions: "builder:Mac ASan 64 Tests (1)"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -14955,7 +14955,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac Builder"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -15124,7 +15124,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -16852,7 +16852,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac deterministic"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -16927,7 +16927,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac deterministic (dbg)"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -19937,7 +19937,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -20024,7 +20024,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -20111,7 +20111,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -20198,7 +20198,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -21039,7 +21039,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ToTiOS"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -21128,7 +21128,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ToTiOSDevice"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -32762,7 +32762,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-asan"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -32935,7 +32935,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-catalyst"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33024,7 +33024,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-device"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33198,7 +33198,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33284,7 +33284,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator-cronet"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33370,7 +33370,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33459,7 +33459,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-code-coverage"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:1"
       exe {
@@ -33631,7 +33631,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-full-configs"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33805,7 +33805,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-noncq"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -33979,7 +33979,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-wpt-fyi-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42725,7 +42725,7 @@
       dimensions: "builder:mac-archive-dbg"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42810,7 +42810,7 @@
       dimensions: "builder:mac-archive-rel"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42895,7 +42895,7 @@
       dimensions: "builder:mac-arm64-archive-dbg"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -42980,7 +42980,7 @@
       dimensions: "builder:mac-arm64-archive-rel"
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43064,7 +43064,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43148,7 +43148,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43318,7 +43318,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43485,7 +43485,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-intel-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43818,7 +43818,7 @@
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43901,7 +43901,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -43987,7 +43987,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -44564,7 +44564,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -51984,7 +51984,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Chromium Mac Goma RBE Staging"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -52032,7 +52032,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Chromium Mac Goma RBE Staging (dbg)"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -52229,7 +52229,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac Builder (dbg) Goma RBE Canary (clobber)"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -52277,7 +52277,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:Mac M1 Builder (dbg) Goma RBE Canary (clobber)"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -52723,7 +52723,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-device-goma-rbe-canary-clobber"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -52877,7 +52877,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-archive-rel-goma-rbe-canary"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -53662,7 +53662,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -53747,7 +53747,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -53831,7 +53831,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -53915,7 +53915,7 @@
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -54844,7 +54844,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -54933,7 +54933,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55022,7 +55022,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55111,7 +55111,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55200,7 +55200,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55285,7 +55285,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55370,7 +55370,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55455,7 +55455,7 @@
       dimensions: "cores:12"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:standard"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -55997,7 +55997,7 @@
         '        "builderless": "1",'
         '        "cpu": "x86-64",'
         '        "free_space": "standard",'
-        '        "os": "Mac-12|Mac-13",'
+        '        "os": "Mac-13",'
         '        "ssd": "1"'
         '      },'
         '      "tester_filter": {'
@@ -56234,7 +56234,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -63082,6 +63082,97 @@
       }
     }
     builders {
+      name: "chromeos-js-coverage-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-18.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/chromium/bootstrapper/${platform}"
+        cipd_version: "latest"
+        cmd: "bootstrapper"
+      }
+      properties:
+        '{'
+        '  "$bootstrap/exe": {'
+        '    "exe": {'
+        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
+        '      "cipd_version": "refs/heads/main",'
+        '      "cmd": ['
+        '        "luciexe"'
+        '      ]'
+        '    }'
+        '  },'
+        '  "$bootstrap/properties": {'
+        '    "properties_file": "infra/config/generated/builders/try/chromeos-js-coverage-rel/properties.json",'
+        '    "top_level_project": {'
+        '      "ref": "refs/heads/main",'
+        '      "repo": {'
+        '        "host": "chromium.googlesource.com",'
+        '        "project": "chromium/src"'
+        '      }'
+        '    }'
+        '  },'
+        '  "builder_group": "tryserver.chromium.linux",'
+        '  "cq": "path-based",'
+        '  "led_builder_is_bootstrapped": true,'
+        '  "recipe": "chromium_trybot"'
+        '}'
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      grace_period {
+        seconds: 120
+      }
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage {
+        value: 5
+      }
+      experiments {
+        key: "chromium_swarming.expose_merge_script_failures"
+        value: 100
+      }
+      experiments {
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "try_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "gpu_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
+            }
+          }
+        }
+        bq_exports {
+          project: "chrome-luci-data"
+          dataset: "chromium"
+          table: "blink_web_tests_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+    }
+    builders {
       name: "chromeos-octopus-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -70025,7 +70116,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-asan"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70117,7 +70208,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-blink-dbg-fyi"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70209,7 +70300,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-catalyst"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70301,7 +70392,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-device"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70393,7 +70484,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70485,7 +70576,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70577,7 +70668,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-m1-simulator-cronet"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70764,7 +70855,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-code-coverage"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70856,7 +70947,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-compilator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -70949,7 +71040,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-cronet"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -71042,7 +71133,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-full-configs"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -71135,7 +71226,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-inverse-fieldtrials-fyi"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -71227,7 +71318,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-multi-window"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -71319,7 +71410,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-noncq"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -71412,7 +71503,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-wpt-fyi-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -81113,7 +81204,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-arm64-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -81291,7 +81382,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -81467,7 +81558,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -81644,7 +81735,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -81733,7 +81824,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-intel-on-arm64-rel"
       dimensions: "cpu:arm64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -81822,7 +81913,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -82276,7 +82367,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -82364,7 +82455,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac-rel-compilator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -84142,7 +84233,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:mac13-arm64-rel-compilator"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
@@ -85211,7 +85302,7 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12|Mac-13"
+      dimensions: "os:Mac-13"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index bc6d9def..ad84c58 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -3048,6 +3048,9 @@
     name: "buildbucket/luci.chromium.try/chromeos-jacuzzi-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/chromeos-js-coverage-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/chromeos-octopus-rel"
   }
   builders {
@@ -17379,6 +17382,9 @@
     name: "buildbucket/luci.chromium.try/chromeos-js-code-coverage"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/chromeos-js-coverage-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/chromeos-octopus-rel"
   }
   builders {
@@ -18894,6 +18900,9 @@
     name: "buildbucket/luci.chromium.try/chromeos-js-code-coverage"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/chromeos-js-coverage-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-lacros-amd-rel"
   }
   builders {
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index 41fc784..f79cad8d 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -78,8 +78,7 @@
     MAC_10_15 = os_enum(os_category.MAC, "Mac-10.15"),
     MAC_12 = os_enum(os_category.MAC, "Mac-12"),
     MAC_13 = os_enum(os_category.MAC, "Mac-13"),
-    # TODO(crbug.com/1448262) Remove Mac 12 once builders migrate to Mac 13
-    MAC_DEFAULT = os_enum(os_category.MAC, "Mac-12|Mac-13"),
+    MAC_DEFAULT = os_enum(os_category.MAC, "Mac-13"),
     MAC_ANY = os_enum(os_category.MAC, "Mac"),
     WINDOWS_10 = os_enum(os_category.WINDOWS, "Windows-10"),
     WINDOWS_11 = os_enum(os_category.WINDOWS, "Windows-11"),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 9070daf..c54f919 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -745,6 +745,25 @@
     use_javascript_coverage = True,
 )
 
+# This builder is different from try/chromeos-js-code-coverage builder below as
+# this is a try builder meant to provide javascript coverage for webui related
+# CLs, where as try/chromeos-js-code-coverage builder is there to test changes
+# in ci/chromeos-js-code-coverage builder and would mostly be used by coverage
+# devs only.
+try_.builder(
+    name = "chromeos-js-coverage-rel",
+    mirrors = ["ci/chromeos-js-code-coverage"],
+    coverage_test_types = ["unit", "overall"],
+    main_list_view = "try",
+    tryjob = try_.job(
+        experiment_percentage = 10,
+        location_filters = [
+            cq.location_filter(path_regexp = r".*\.(js|ts)"),
+        ],
+    ),
+    use_javascript_coverage = True,
+)
+
 # Coverage builders set up mainly to test changes in CI builders
 try_.builder(
     name = "linux-code-coverage",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 4c15b3b..0baa00d 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -517,10 +517,10 @@
     {"(will not show again after user interacts with keyboard accessories)",
      kAutofillBrandingIOSDismissWhenInteractedNoAnimation,
      std::size(kAutofillBrandingIOSDismissWhenInteractedNoAnimation), nullptr},
-    {"(shows and fades to the left every time)",
+    {"(shows and fades to leading edge every time)",
      kAutofillBrandingIOSAlwaysShowAndDismiss,
      std::size(kAutofillBrandingIOSAlwaysShowAndDismiss), nullptr},
-    {"(fades to the left after user interacts with keyboard accessories)",
+    {"(fades to leading edge after user interacts with keyboard accessories)",
      kAutofillBrandingIOSDismissWhenInteractedWithAnimation,
      std::size(kAutofillBrandingIOSDismissWhenInteractedWithAnimation),
      nullptr}};
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
index a55b151..f0114441 100644
--- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -392,7 +392,12 @@
   registry->RegisterDictionaryPref(kPrefPromoObject);
 
   // Register pref storing whether Web Inspector support is enabled.
+#if BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG)
+  // Enable it by default on debug builds
+  registry->RegisterBooleanPref(prefs::kWebInspectorEnabled, true);
+#else
   registry->RegisterBooleanPref(prefs::kWebInspectorEnabled, false);
+#endif
 
   // Register prerender network prediction preferences.
   registry->RegisterIntegerPref(
diff --git a/ios/chrome/browser/ui/autofill/branding/branding_view_controller.mm b/ios/chrome/browser/ui/autofill/branding/branding_view_controller.mm
index b7e3d68..035dcb7 100644
--- a/ios/chrome/browser/ui/autofill/branding/branding_view_controller.mm
+++ b/ios/chrome/browser/ui/autofill/branding/branding_view_controller.mm
@@ -21,9 +21,12 @@
 // The left margin of the branding logo, if visible.
 constexpr CGFloat kLeadingInset = 10;
 // The scale used by the "pop" animation.
-constexpr CGFloat kAnimationScale = ((CGFloat)4) / 3;
+constexpr CGFloat kPopAnimationScale = ((CGFloat)4) / 3;
 // Wait time after the keyboard settles into place to perform pop animation.
-constexpr base::TimeDelta kAnimationWaitTime = base::Milliseconds(200);
+constexpr base::TimeDelta kPopAnimationWaitTime = base::Milliseconds(200);
+// Wait time after the keyboard settles into place to perform the
+// slide-away-from-leading-edge animation.
+constexpr base::TimeDelta kSlideAnimationWaitTime = base::Milliseconds(400);
 // Time it takes the "pop" animation to perform.
 constexpr base::TimeDelta kTimeToAnimate = base::Milliseconds(400);
 // Minimum time interval between two animations.
@@ -36,10 +39,10 @@
   // Button that shows the branding.
   UIButton* _brandingIcon;
   // The start time of the last or ongoing animation.
-  base::TimeTicks _lastAnimationStartTime;
-  // A constraint of the view that should be activated when the branding is
-  // invisible.
-  NSLayoutConstraint* _constraintToHideView;
+  base::TimeTicks _lastPopAnimationStartTime;
+  // Horizontal constraints that are used for animation purpose.
+  NSLayoutConstraint* _leadingConstraint;
+  NSLayoutConstraint* _widthConstraintWhenHidingBranding;
   // A boolean representing visibility of the keyboard.
   BOOL _keyboardVisible;
 }
@@ -92,7 +95,26 @@
 #pragma mark - BrandingConsumer
 
 - (void)slideAwayFromLeadingEdge {
-  // TODO(crbug.com/1447909): Implement "exit to the leading edge" animation.
+  __weak BrandingViewController* weakSelf = self;
+  __weak UIButton* weakBranding = _brandingIcon;
+  base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE, base::BindOnce(^{
+        [UIView animateWithDuration:kTimeToAnimate.InSecondsF()
+            animations:^{
+              [weakSelf slideAwayAnimation];
+            }
+            completion:^(BOOL finished) {
+              if (weakBranding.superview == nil || !finished) {
+                return;
+              }
+              [NSLayoutConstraint
+                  deactivateConstraints:weakSelf.view.constraints];
+              [weakSelf hideBranding];
+              // Restore original size.
+              weakBranding.transform = CGAffineTransformIdentity;
+            }];
+      }),
+      kSlideAnimationWaitTime);
 }
 
 #pragma mark - Keyboard Event Handlers
@@ -109,19 +131,23 @@
   }
 
   // Add or remove the branding icon to keyboard accessories accordingly.
-  if (!_constraintToHideView) {
-    _constraintToHideView = [self.view.widthAnchor constraintEqualToConstant:0];
+  if (!_widthConstraintWhenHidingBranding) {
+    _widthConstraintWhenHidingBranding =
+        [self.view.widthAnchor constraintEqualToConstant:0];
   }
   BOOL shouldShow = self.visible && self.keyboardAccessoryVisible;
   if (shouldShow && _brandingIcon.superview == nil) {
     [self.view addSubview:_brandingIcon];
-    _constraintToHideView.active = NO;
-    AddSameConstraintsWithInsets(
+    _widthConstraintWhenHidingBranding.active = NO;
+    AddSameConstraintsToSides(
         _brandingIcon, self.view,
-        NSDirectionalEdgeInsetsMake(0, kLeadingInset, 0, 0));
+        LayoutSides::kTop | LayoutSides::kBottom | LayoutSides::kTrailing);
+    _leadingConstraint = [_brandingIcon.leadingAnchor
+        constraintEqualToAnchor:self.view.leadingAnchor
+                       constant:kLeadingInset];
+    _leadingConstraint.active = YES;
   } else if (!shouldShow) {
-    [_brandingIcon removeFromSuperview];
-    _constraintToHideView.active = YES;
+    [self hideBranding];
   }
 }
 
@@ -141,7 +167,7 @@
     return;
   }
   [self.delegate brandingIconDidShow];
-  const base::TimeTicks lastAnimationStartTime = _lastAnimationStartTime;
+  const base::TimeTicks lastAnimationStartTime = _lastPopAnimationStartTime;
   BOOL shouldPerformPopAnimation =
       self.shouldPerformPopAnimation &&
       (lastAnimationStartTime.is_null() ||
@@ -155,7 +181,7 @@
         FROM_HERE, base::BindOnce(^{
           [weakSelf performPopAnimation];
         }),
-        kAnimationWaitTime);
+        kPopAnimationWaitTime);
   }
 }
 
@@ -166,23 +192,50 @@
 
 #pragma mark - Private
 
+// Hides the branding icon from the view. This does NOT mean that the branding
+// would not show again when the keyboard pops up next time.
+- (void)hideBranding {
+  [_brandingIcon removeFromSuperview];
+  _leadingConstraint.active = NO;
+  _leadingConstraint = nil;
+  _widthConstraintWhenHidingBranding.constant = 0;
+  _widthConstraintWhenHidingBranding.active = YES;
+}
+
 // Method that is invoked when the user taps the branding icon.
 - (void)onBrandingTapped {
   [_delegate brandingIconDidPress];
 }
 
+// Animation to slide the branding away from the leading edge,
+- (void)slideAwayAnimation {
+  if (_brandingIcon.superview == nil) {
+    return;
+  }
+  _leadingConstraint.constant = 0;
+  [self.view layoutIfNeeded];
+  _brandingIcon.transform =
+      CGAffineTransformScale(CGAffineTransformIdentity, 0.1, 0.1);
+  CGFloat newWidth = CGSizeApplyAffineTransform(_brandingIcon.bounds.size,
+                                                _brandingIcon.transform)
+                         .width;
+  _widthConstraintWhenHidingBranding.constant = newWidth;
+  _widthConstraintWhenHidingBranding.active = YES;
+  [self.view.superview layoutIfNeeded];
+}
+
 // Performs the "pop" animation. This includes a quick enlarging of the icon
 // and shrinking it back to the original size, and if finishes successfully,
 // also notifies the delegate on completion.
 - (void)performPopAnimation {
-  _lastAnimationStartTime = base::TimeTicks::Now();
+  _lastPopAnimationStartTime = base::TimeTicks::Now();
   __weak UIButton* weakBranding = _brandingIcon;
   __weak id<BrandingViewControllerDelegate> weakDelegate = self.delegate;
   [UIView animateWithDuration:kTimeToAnimate.InSecondsF() / 2
       // Scale up the icon.
       animations:^{
         weakBranding.transform = CGAffineTransformScale(
-            CGAffineTransformIdentity, kAnimationScale, kAnimationScale);
+            CGAffineTransformIdentity, kPopAnimationScale, kPopAnimationScale);
       }
       completion:^(BOOL finished) {
         if (!finished) {
diff --git a/ios/chrome/browser/ui/autofill/branding/branding_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/branding/branding_view_controller_egtest.mm
index 0179322..0990aec 100644
--- a/ios/chrome/browser/ui/autofill/branding/branding_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/branding/branding_view_controller_egtest.mm
@@ -315,33 +315,6 @@
   CheckBrandingHasVisiblity(NO);
 }
 
-// Tests that when the "always show and dismiss" variation is turned on, the
-// autofill branding icon shows until the user interacts with it.
-- (void)testBrandingAlwaysSlideToLeadingEdgeOnPhone {
-  AppLaunchConfiguration config = ConfigWithBrandingEnabledWithFrequencyType(
-      /*phone=*/autofill::features::
-          kAutofillBrandingIOSParamFrequencyTypeAlwaysShowAndDismiss,
-      /*tablet=*/autofill::features::
-          kAutofillBrandingIOSParamFrequencyTypeAlways);
-  [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config];
-  EnableManualFillButtonForPassword();
-  // First time.
-  BringUpKeyboard();
-  CheckBrandingHasVisiblity(YES);
-  // TODO(crbug.com/1447909): Icon should have slid away from the leading edge.
-  // CheckBrandingHasVisiblity([ChromeEarlGrey isIPadIdiom]);
-  [[EarlGrey selectElementWithMatcher:ManualFallbackPasswordIconMatcher()]
-      performAction:grey_tap()];
-  DismissKeyboard();
-  // Second time: branding is still visible after user interacts with a keyboard
-  // accessory element.
-  BringUpKeyboard();
-  CheckBrandingHasVisiblity(YES);
-  base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(0.5));
-  // TODO(crbug.com/1447909): Icon should have slid away from the leading edge.
-  // CheckBrandingHasVisiblity([ChromeEarlGrey isIPadIdiom]);
-}
-
 // Tests that when the "dismiss when interacted" variation is turned on, the
 // autofill branding icon shows until the user interacts with it.
 - (void)testBrandingSlideToLeadingEdgeWhenInteractedOnPhone {
@@ -361,9 +334,11 @@
   CheckBrandingHasVisiblity(YES);
   [[EarlGrey selectElementWithMatcher:ManualFallbackPasswordIconMatcher()]
       performAction:grey_tap()];
+  // On iPhone, the branding should be sliding away from the leading edge after
+  // a slight wait time.
   base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(0.5));
-  // TODO(crbug.com/1447909): Icon should have slid away from the leading edge.
-  // CheckBrandingHasVisiblity([ChromeEarlGrey isIPadIdiom]);
+  [ChromeEarlGreyUI waitForAppToIdle];
+  CheckBrandingHasVisiblity([ChromeEarlGrey isIPadIdiom]);
   DismissKeyboard();
   // Third time: branding should not be visible on iPhone, but visible on iPad.
   BringUpKeyboard();
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index cdcf661..239d8a44 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -26,7 +26,6 @@
   deps = [
     "//base",
     "//base:i18n",
-    "//build:blink_buildflags",
     "//components/bookmarks/browser",
     "//components/feature_engagement/public",
     "//components/image_fetcher/ios",
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 5378c19f..b3e219d2 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -10,7 +10,6 @@
 #import "base/mac/foundation_util.h"
 #import "base/strings/sys_string_conversions.h"
 #import "base/task/sequenced_task_runner.h"
-#import "build/blink_buildflags.h"
 #import "components/password_manager/core/browser/ui/credential_ui_entry.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
 #import "components/strings/grit/components_strings.h"
@@ -1710,13 +1709,6 @@
           self.fullscreenController->GetCurrentViewportInsets();
       viewFrame = UIEdgeInsetsInsetRect(viewFrame, viewportInsets);
     }
-
-#if BUILDFLAG(USE_BLINK)
-    // Temporary workaround to keep web view under toolbar.
-    CGFloat toolbarHeight = [self expandedTopToolbarHeight];
-    viewFrame = UIEdgeInsetsInsetRect(viewFrame,
-                                      UIEdgeInsetsMake(toolbarHeight, 0, 0, 0));
-#endif
     view.frame = viewFrame;
 
     [self updateToolbarState];
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
index 28fbf7ed..6de144eb 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -407,7 +407,7 @@
                 action:^{
                   [weakMediator disableSetUpList];
                 }
-                 style:UIAlertActionStyleDefault];
+                 style:UIAlertActionStyleDestructive];
   [_actionSheetCoordinator
       addItemWithTitle:l10n_util::GetNSString(
                            IDS_IOS_SET_UP_LIST_SETTINGS_CANCEL)
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index 4c21dd3..4373447 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -455,6 +455,7 @@
     }
     for (SetUpListItemViewData* data in items) {
       data.compactLayout = shouldShowCompactedSetUpListModule;
+      data.heroCellMagicStackLayout = !shouldShowCompactedSetUpListModule;
       SetUpListItemView* view = [[SetUpListItemView alloc] initWithData:data];
       view.tapDelegate = self;
       ContentSuggestionsModuleType type =
@@ -587,6 +588,8 @@
     SetUpListItemViewData* allSetData =
         [[SetUpListItemViewData alloc] initWithType:SetUpListItemType::kAllSet
                                            complete:NO];
+    allSetData.heroCellMagicStackLayout =
+        !set_up_list_utils::ShouldShowCompactedSetUpListModule();
     SetUpListItemView* view =
         [[SetUpListItemView alloc] initWithData:allSetData];
     MagicStackModuleContainer* allSetModule = [[MagicStackModuleContainer alloc]
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn
index 9905664..3418f89 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/BUILD.gn
@@ -23,6 +23,7 @@
     "//ios/chrome/browser/ntp:set_up_list_item_type",
     "//ios/chrome/browser/shared/ui/elements",
     "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/browser/ui/content_suggestions/set_up_list/resources",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.h b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.h
index b130f4e..20ad1d3 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.h
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.h
@@ -16,10 +16,12 @@
 @interface SetUpListItemIcon : UIView
 
 // Instantiates a `SetUpListItemItemIcon` for the given `type` with the
-// given `complete` state and whether to configure with a `compactLayout`.
+// given `complete` state, whether to configure with a `compactLayout`, and
+// whether it should be placed `inSquare` container.
 - (instancetype)initWithType:(SetUpListItemType)type
                     complete:(BOOL)complete
-               compactLayout:(BOOL)compactLayout;
+               compactLayout:(BOOL)compactLayout
+                    inSquare:(BOOL)inSquare;
 
 // Plays the "sparkle" animation with the given `duration`, after the given
 // `delay`.
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.mm
index a5421214..458c2ad19 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.mm
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.mm
@@ -23,6 +23,7 @@
 constexpr CGFloat kSymbolPointSize = 18;
 constexpr CGFloat kSparkleSize = 72;
 constexpr CGFloat kSparkleOffset = (kSparkleSize - kIconSize) / 2;
+constexpr CGFloat kIconSquareContainerRadius = 7.0f;
 
 // The amount of rotation for the icons, during the animation.
 constexpr CGFloat kAnimationRotation = 90 * M_PI / 180;
@@ -35,16 +36,12 @@
 // `colorName`.
 UIImageView* IconForSymbol(NSString* symbol,
                            BOOL compact_layout,
-                           NSString* color_name = nil) {
+                           NSArray<UIColor*>* color_palette = nil) {
   UIImageSymbolConfiguration* config = [UIImageSymbolConfiguration
       configurationWithWeight:UIImageSymbolWeightLight];
-  if (color_name) {
-    // Create a palette which uses whiteColor as the stroke color. whiteColor
-    // is the same in Dark and Light modes.
-    NSArray<UIColor*>* palette =
-        @[ [UIColor whiteColor], [UIColor colorNamed:color_name] ];
-    UIImageSymbolConfiguration* colorConfig =
-        [UIImageSymbolConfiguration configurationWithPaletteColors:palette];
+  if (color_palette) {
+    UIImageSymbolConfiguration* colorConfig = [UIImageSymbolConfiguration
+        configurationWithPaletteColors:color_palette];
     config = [config configurationByApplyingConfiguration:colorConfig];
   }
   UIImage* image = DefaultSymbolWithConfiguration(symbol, config);
@@ -58,6 +55,21 @@
   return icon;
 }
 
+UIView* IconInSquareContainer(UIImageView* icon, NSString* color) {
+  UIView* square_view = [[UIView alloc] init];
+  square_view.translatesAutoresizingMaskIntoConstraints = NO;
+  square_view.layer.cornerRadius = kIconSquareContainerRadius;
+  square_view.backgroundColor = [UIColor colorNamed:color];
+
+  [square_view addSubview:icon];
+  AddSameCenterConstraints(icon, square_view);
+  [NSLayoutConstraint activateConstraints:@[
+    [square_view.widthAnchor constraintEqualToConstant:kIconSize],
+    [square_view.heightAnchor constraintEqualToAnchor:square_view.widthAnchor],
+  ]];
+  return square_view;
+}
+
 UIImageView* DefaultBrowserIcon(BOOL compact_layout) {
 #if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS)
   UIImageView* container = [[UIImageView alloc] init];
@@ -122,26 +134,59 @@
   return circle_view;
 }
 
+UIView* IconInSquare(NSString* symbol,
+                     BOOL compact_layout,
+                     NSString* color_name) {
+  UIImageConfiguration* compactImageConfiguration = [UIImageSymbolConfiguration
+      configurationWithPointSize:kSymbolPointSize
+                          weight:UIImageSymbolWeightLight
+                           scale:UIImageSymbolScaleSmall];
+  UIView* square_view = [[UIView alloc] init];
+  square_view.translatesAutoresizingMaskIntoConstraints = NO;
+  square_view.layer.cornerRadius = kIconSquareContainerRadius;
+  square_view.backgroundColor = [UIColor colorNamed:color_name];
+  UIImage* symbol_image =
+      compact_layout
+          ? DefaultSymbolWithConfiguration(symbol, compactImageConfiguration)
+          : DefaultSymbolWithPointSize(symbol, kSymbolPointSize);
+  CHECK(symbol_image);
+
+  UIImageView* symbol_view = [[UIImageView alloc] initWithImage:symbol_image];
+  symbol_view.tintColor = [UIColor whiteColor];
+  symbol_view.translatesAutoresizingMaskIntoConstraints = NO;
+  [square_view addSubview:symbol_view];
+  AddSameCenterConstraints(symbol_view, square_view);
+  [NSLayoutConstraint activateConstraints:@[
+    [square_view.widthAnchor constraintEqualToConstant:kIconSize],
+    [square_view.heightAnchor constraintEqualToAnchor:square_view.widthAnchor],
+  ]];
+  return square_view;
+}
+
 }  // namespace
 
 @implementation SetUpListItemIcon {
   SetUpListItemType _type;
   BOOL _complete;
-  UIImageView* _typeIcon;
+  UIView* _typeIcon;
   UIImageView* _checkmark;
   UIImageView* _sparkle;
   // YES if this view should configure itself with a compacted layout.
   BOOL _compactLayout;
+  // YES if this view should place the icon in a square shape.
+  BOOL _inSquare;
 }
 
 - (instancetype)initWithType:(SetUpListItemType)type
                     complete:(BOOL)complete
-               compactLayout:(BOOL)compactLayout {
+               compactLayout:(BOOL)compactLayout
+                    inSquare:(BOOL)inSquare {
   self = [super init];
   if (self) {
     _type = type;
     _complete = complete;
     _compactLayout = compactLayout;
+    _inSquare = inSquare;
   }
   return self;
 }
@@ -199,8 +244,9 @@
   }
 
   _typeIcon = [self createTypeIcon];
-  _checkmark =
-      IconForSymbol(kCheckmarkCircleFillSymbol, _compactLayout, kBlue500Color);
+  _checkmark = IconForSymbol(
+      kCheckmarkCircleFillSymbol, _compactLayout,
+      @[ [UIColor whiteColor], [UIColor colorNamed:kBlue500Color] ]);
   _sparkle = [self createSparkle];
   [self addSubview:_typeIcon];
   [self addSubview:_checkmark];
@@ -216,18 +262,35 @@
 }
 
 // Creates the type-specific icon for this item.
-- (UIImageView*)createTypeIcon {
+- (UIView*)createTypeIcon {
   switch (_type) {
-    case SetUpListItemType::kSignInSync:
-      return IconForSymbol(kSyncCircleSymbol, _compactLayout, kGreen500Color);
-    case SetUpListItemType::kDefaultBrowser:
-      return DefaultBrowserIcon(_compactLayout);
-    case SetUpListItemType::kAutofill:
-      return IconInCircle(kEllipsisRectangleSymbol, _compactLayout,
-                          kBlue500Color);
-    case SetUpListItemType::kAllSet:
-      return IconForSymbol(kCheckmarkSealFillSymbol, _compactLayout,
-                           kBlue500Color);
+    case SetUpListItemType::kSignInSync: {
+      UIImageView* icon_image = IconForSymbol(
+          kSyncCircleSymbol, _compactLayout || _inSquare,
+          @[ [UIColor whiteColor], [UIColor colorNamed:kGreen500Color] ]);
+      if (_inSquare) {
+        return IconInSquareContainer(icon_image, kGreen500Color);
+      }
+      return icon_image;
+    }
+    case SetUpListItemType::kDefaultBrowser: {
+      UIImageView* icon_image = DefaultBrowserIcon(_compactLayout || _inSquare);
+      if (_inSquare) {
+        return IconInSquareContainer(icon_image, kBackgroundColor);
+      }
+      return icon_image;
+    }
+    case SetUpListItemType::kAutofill: {
+      return _inSquare
+                 ? IconInSquare(kEllipsisRectangleSymbol, NO, kBlue500Color)
+                 : IconInCircle(kEllipsisRectangleSymbol, _compactLayout,
+                                kBlue500Color);
+    }
+    case SetUpListItemType::kAllSet: {
+      return IconForSymbol(
+          kCheckmarkSealFillSymbol, _compactLayout,
+          @[ [UIColor whiteColor], [UIColor colorNamed:kBlue500Color] ]);
+    }
     case SetUpListItemType::kFollow:
       // TODO(crbug.com/1428070): Add a Follow item to the Set Up List.
       NOTREACHED();
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm
index 3a4c187f..a546b5e 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view.mm
@@ -12,6 +12,7 @@
 #import "ios/chrome/browser/ntp/set_up_list_item_type.h"
 #import "ios/chrome/browser/shared/ui/elements/crossfade_label.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/content_suggestions/set_up_list/constants.h"
 #import "ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_icon.h"
 #import "ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view+private.h"
@@ -54,6 +55,7 @@
 // Holds all the configurable attributes of this view.
 struct ViewConfig {
   BOOL compact_layout;
+  BOOL hero_layout;
   int signin_sync_description;
   int default_browser_description;
   int autofill_description;
@@ -66,6 +68,7 @@
 
 @implementation SetUpListItemView {
   SetUpListItemIcon* _icon;
+  UIView* _iconContainerView;
   CrossfadeLabel* _title;
   CrossfadeLabel* _description;
   UIStackView* _contentStack;
@@ -78,23 +81,7 @@
   if (self) {
     _type = data.type;
     _complete = data.complete;
-    if (!data.compactLayout) {
-      // Normal ViewConfig.
-      const int syncString =
-          base::FeatureList::IsEnabled(
-              password_manager::features::kEnablePasswordsAccountStorage)
-              ? IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION_NO_PASSWORDS
-              : IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION;
-      _config = {
-          NO,
-          syncString,
-          IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_DESCRIPTION,
-          IDS_IOS_SET_UP_LIST_AUTOFILL_DESCRIPTION,
-          UIFontTextStyleSubheadline,
-          UIFontTextStyleFootnote,
-          kTextSpacing,
-      };
-    } else {
+    if (data.compactLayout) {
       // ViewConfig for a compact layout.
       const int syncString =
           base::FeatureList::IsEnabled(
@@ -103,6 +90,7 @@
               : IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_SHORT_DESCRIPTION;
       _config = {
           YES,
+          NO,
           syncString,
           IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_SHORT_DESCRIPTION,
           IDS_IOS_SET_UP_LIST_AUTOFILL_SHORT_DESCRIPTION,
@@ -110,6 +98,35 @@
           UIFontTextStyleCaption2,
           kCompactTextSpacing,
       };
+
+    } else if (data.heroCellMagicStackLayout) {
+      _config = {
+          NO,
+          YES,
+          IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_MAGIC_STACK_DESCRIPTION,
+          IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_MAGIC_STACK_DESCRIPTION,
+          IDS_IOS_SET_UP_LIST_AUTOFILL_MAGIC_STACK_DESCRIPTION,
+          UIFontTextStyleSubheadline,
+          UIFontTextStyleFootnote,
+          kTextSpacing,
+      };
+    } else {
+      // Normal ViewConfig.
+      const int syncString =
+          base::FeatureList::IsEnabled(
+              password_manager::features::kEnablePasswordsAccountStorage)
+              ? IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION_NO_PASSWORDS
+              : IDS_IOS_SET_UP_LIST_SIGN_IN_SYNC_DESCRIPTION;
+      _config = {
+          NO,
+          NO,
+          syncString,
+          IDS_IOS_SET_UP_LIST_DEFAULT_BROWSER_DESCRIPTION,
+          IDS_IOS_SET_UP_LIST_AUTOFILL_DESCRIPTION,
+          UIFontTextStyleSubheadline,
+          UIFontTextStyleFootnote,
+          kTextSpacing,
+      };
     }
   }
   return self;
@@ -193,9 +210,28 @@
     self.accessibilityTraits += UIAccessibilityTraitNotEnabled;
   }
 
+  BOOL putIconInSquareBackground =
+      _config.hero_layout && _type != SetUpListItemType::kAllSet;
   _icon = [[SetUpListItemIcon alloc] initWithType:_type
                                          complete:_complete
-                                    compactLayout:_config.compact_layout];
+                                    compactLayout:_config.compact_layout
+                                         inSquare:putIconInSquareBackground];
+  if (putIconInSquareBackground) {
+    _icon.translatesAutoresizingMaskIntoConstraints = NO;
+    _iconContainerView = [[UIView alloc] init];
+    _iconContainerView.backgroundColor = [UIColor colorNamed:kGrey100Color];
+    _iconContainerView.layer.cornerRadius = 12;
+    _iconContainerView.layer.masksToBounds = NO;
+    _iconContainerView.clipsToBounds = YES;
+    [_iconContainerView addSubview:_icon];
+    AddSameCenterConstraints(_icon, _iconContainerView);
+    [NSLayoutConstraint activateConstraints:@[
+      [_iconContainerView.widthAnchor constraintEqualToConstant:56],
+      [_iconContainerView.widthAnchor
+          constraintEqualToAnchor:_iconContainerView.heightAnchor],
+    ]];
+  }
+
   _title = [self createTitle];
   _description = [self createDescription];
 
@@ -207,8 +243,11 @@
   textStack.spacing = _config.text_spacing;
 
   // Add a horizontal stack to contain the icon(s) and the text stack.
+  NSArray* arrangedSubviews = putIconInSquareBackground
+                                  ? @[ _iconContainerView, textStack ]
+                                  : @[ _icon, textStack ];
   _contentStack =
-      [[UIStackView alloc] initWithArrangedSubviews:@[ _icon, textStack ]];
+      [[UIStackView alloc] initWithArrangedSubviews:arrangedSubviews];
   _contentStack.translatesAutoresizingMaskIntoConstraints = NO;
   _contentStack.alignment = UIStackViewAlignmentCenter;
   _contentStack.spacing = kPadding;
@@ -229,7 +268,11 @@
   CrossfadeLabel* label = [[CrossfadeLabel alloc] init];
   label.text = [self titleText];
   label.translatesAutoresizingMaskIntoConstraints = NO;
-  label.font = [UIFont preferredFontForTextStyle:_config.title_font];
+  label.font =
+      _config.hero_layout
+          ? CreateDynamicFont(UIFontTextStyleFootnote, UIFontWeightSemibold)
+          : [UIFont preferredFontForTextStyle:_config.title_font];
+  label.adjustsFontForContentSizeCategory = YES;
   if (_complete) {
     label.textColor = [UIColor colorNamed:kTextQuaternaryColor];
     label.attributedText = Strikethrough(label.text);
@@ -311,6 +354,9 @@
 // Sets the various subview properties that should be animated.
 - (void)setAnimations {
   [_icon markComplete];
+  if (_iconContainerView) {
+    _iconContainerView.backgroundColor = [UIColor clearColor];
+  }
   [_title crossfade];
   [_description crossfade];
 }
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view_data.h b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view_data.h
index da0b528..cb610a03 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view_data.h
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_item_view_data.h
@@ -24,6 +24,10 @@
 // YES if this view should configure itself with a compacted layout.
 @property(nonatomic, assign) BOOL compactLayout;
 
+// YES if this view should configure itself for a hero cell layout in the Magic
+// Stack.
+@property(nonatomic, assign) BOOL heroCellMagicStackLayout;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_SET_UP_LIST_SET_UP_LIST_ITEM_VIEW_DATA_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm
index 655807d..b7c786d 100644
--- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm
@@ -38,6 +38,9 @@
 // The padding used inside the list.
 constexpr CGFloat kPadding = 15;
 
+// The spacing between items in the list.
+constexpr CGFloat kItemSpacing = 18;
+
 // The spacing used between title and description in the "All Set" View.
 constexpr CGFloat kAllSetSpacing = 10;
 
@@ -280,7 +283,7 @@
       [[UIStackView alloc] initWithArrangedSubviews:initialItems];
   stack.axis = UILayoutConstraintAxisVertical;
   stack.translatesAutoresizingMaskIntoConstraints = NO;
-  stack.spacing = kPadding;
+  stack.spacing = kItemSpacing;
   stack.layer.masksToBounds = YES;
   stack.layer.cornerRadius = kBorderRadius;
   stack.layer.borderWidth = kBorderWidth;
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm
index 57bddb09..00c5f8f 100644
--- a/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm
+++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_coordinator.mm
@@ -139,6 +139,11 @@
   self.mediator = nil;
   self.accountManagerService = nil;
   self.authenticationService = nil;
+  [super stop];
+}
+
+- (void)dealloc {
+  CHECK(!self.authenticationService);
 }
 
 #pragma mark - Private
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
index fc78bd87..748ae661 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -792,7 +792,7 @@
 #pragma mark - NewTabPageHeaderCommands
 
 - (void)updateForHeaderSizeChange {
-  [self.NTPViewController updateHeightAboveFeedAndScrollToTopIfNeeded];
+  [self.NTPViewController updateHeightAboveFeed];
 }
 
 - (void)fakeboxTapped {
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h
index a18a0d6..e2061761 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.h
@@ -100,12 +100,6 @@
 // Lays out content above feed and adjusts content suggestions.
 - (void)updateNTPLayout;
 
-// Signal to the ViewController that the height above the feed needs to be
-// recalculated and thus also likely needs to be scrolled up to accommodate for
-// the new height. Nothing may happen if the ViewController determines that the
-// current scroll state should not change.
-- (void)updateHeightAboveFeedAndScrollToTopIfNeeded;
-
 // Signals to the ViewController that the height above the feed needs to be
 // recalculated. Usually called in response to an event that happens after
 // all the content has been loaded (example: a UI element expanding). Keeps
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
index 73f4081b..ba3804d 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -525,18 +525,6 @@
   [self updateFakeOmniboxForScrollPosition];
 }
 
-- (void)updateHeightAboveFeedAndScrollToTopIfNeeded {
-  if (self.viewDidFinishLoading &&
-      !self.hasSavedOffsetFromPreviousScrollState) {
-    // Do not scroll to the top if there is a saved scroll state. Also,
-    // `-setContentOffsetToTop` potentially updates constaints, and if
-    // viewDidLoad has not finished, some views may not in the view hierarchy
-    // yet.
-    [self updateFeedInsetsForContentAbove];
-    [self setContentOffsetToTop];
-  }
-}
-
 - (void)updateHeightAboveFeed {
   if (self.viewDidFinishLoading) {
     CGFloat oldHeightAboveFeed = self.collectionView.contentInset.top;
@@ -1412,6 +1400,22 @@
   _backgroundGradientView.hidden = style == UIUserInterfaceStyleLight;
 }
 
+// Signal to the ViewController that the height above the feed needs to be
+// recalculated and thus also likely needs to be scrolled up to accommodate for
+// the new height. Nothing may happen if the ViewController determines that the
+// current scroll state should not change.
+- (void)updateHeightAboveFeedAndScrollToTopIfNeeded {
+  if (self.viewDidFinishLoading &&
+      !self.hasSavedOffsetFromPreviousScrollState) {
+    // Do not scroll to the top if there is a saved scroll state. Also,
+    // `-setContentOffsetToTop` potentially updates constaints, and if
+    // viewDidLoad has not finished, some views may not in the view hierarchy
+    // yet.
+    [self updateFeedInsetsForContentAbove];
+    [self setContentOffsetToTop];
+  }
+}
+
 #pragma mark - Helpers
 
 - (UIViewController*)contentSuggestionsViewController {
diff --git a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
index c4ec70c..65f8911 100644
--- a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
+++ b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
@@ -14,6 +14,7 @@
   ]
   deps = [
     "//base",
+    "//build:blink_buildflags",
     "//ios/chrome/app/strings",
     "//ios/chrome/app/theme",
     "//ios/chrome/browser/shared/public/features",
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index e0eb7b6..f536673 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -15,6 +15,7 @@
 #import "base/metrics/user_metrics_action.h"
 #import "base/notreached.h"
 #import "base/time/time.h"
+#import "build/blink_buildflags.h"
 #import "ios/chrome/browser/shared/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
@@ -460,11 +461,16 @@
   // If Overscroll actions are triggered and dismissed quickly, it is
   // possible to be in a state where drag is enough to be in STARTED_PULLING
   // or ACTION_READY state, but with no selectedAction.
+  // TODO: This is not quite correct for blink, the contentOffset is always
+  // positive while scrolling the main content, resetting the insets causes
+  // after scrolling is done seems wrong.
+#if !BUILDFLAG(USE_BLINK)
   if (contentOffset.y >= 0 ||
       self.overscrollState == OverscrollState::NO_PULL_STARTED ||
       self.overscrollActionView.selectedAction == OverscrollAction::NONE) {
     [self resetScrollViewTopContentInset];
   }
+#endif
 
   [self triggerActionIfNeeded];
   _allowPullingActions = NO;
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_carousel_egtest.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_carousel_egtest.mm
index 5195978..4ddaf54 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_carousel_egtest.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_carousel_egtest.mm
@@ -76,6 +76,7 @@
 
   // Clean up What's New destination promo data.
   [ChromeEarlGrey removeUserDefaultObjectForKey:kWhatsNewUsageEntryKey];
+  [ChromeEarlGrey removeUserDefaultObjectForKey:kWhatsNewM116UsageEntryKey];
 }
 
 // Resolves the passphrase error from the Overflow Menu.
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
index e133d00..4df9c4fb 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator_unittest.mm
@@ -107,6 +107,8 @@
 void CleanupNSUserDefaults() {
   [[NSUserDefaults standardUserDefaults]
       removeObjectForKey:kWhatsNewUsageEntryKey];
+  [[NSUserDefaults standardUserDefaults]
+      removeObjectForKey:kWhatsNewM116UsageEntryKey];
 }
 
 }  // namespace
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
index e8021e1..cdb905d 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
+#import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/signin/system_identity_manager.h"
 #import "ios/chrome/browser/sync/sync_observer_bridge.h"
 #import "ios/chrome/browser/sync/sync_service_factory.h"
@@ -98,9 +99,9 @@
 
 - (void)start {
   DCHECK(self.baseNavigationController);
+  ChromeBrowserState* browserState = self.browser->GetBrowserState();
   SyncSetupService* syncSetupService =
-      SyncSetupServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
+      SyncSetupServiceFactory::GetForBrowserState(browserState);
   switch (_accountState) {
     case SyncSettingsAccountState::kAdvancedInitialSyncSetup:
     case SyncSettingsAccountState::kSyncing:
@@ -117,10 +118,12 @@
 
   self.mediator = [[ManageSyncSettingsMediator alloc]
       initWithSyncService:self.syncService
-          userPrefService:self.browser->GetBrowserState()->GetPrefs()
+          userPrefService:browserState->GetPrefs()
+          identityManager:IdentityManagerFactory::GetForBrowserState(
+                              browserState)
       initialAccountState:_accountState];
-  self.mediator.syncSetupService = SyncSetupServiceFactory::GetForBrowserState(
-      self.browser->GetBrowserState());
+  self.mediator.syncSetupService =
+      SyncSetupServiceFactory::GetForBrowserState(browserState);
   self.mediator.commandHandler = self;
   self.mediator.syncErrorHandler = self;
   self.mediator.forcedSigninEnabled =
@@ -144,7 +147,7 @@
   self.mediator.consumer = self.viewController;
   [self.baseNavigationController pushViewController:self.viewController
                                            animated:YES];
-  _syncObserver.reset(new SyncObserverBridge(self, self.syncService));
+  _syncObserver = std::make_unique<SyncObserverBridge>(self, self.syncService);
 }
 
 - (void)stop {
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
index 17eac27..e437611 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.h
@@ -20,6 +20,9 @@
 namespace syncer {
 class SyncService;
 }  // syncer
+namespace signin {
+class IdentityManager;
+}  // namespace signin
 
 // Mediator for the manager sync settings.
 @interface ManageSyncSettingsMediator
@@ -51,6 +54,7 @@
 // `syncService`: Sync service. Should not be null.
 - (instancetype)initWithSyncService:(syncer::SyncService*)syncService
                     userPrefService:(PrefService*)userPrefService
+                    identityManager:(signin::IdentityManager*)identityManager
                 initialAccountState:
                     (SyncSettingsAccountState)initialAccountState
     NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
index 24199df..1d6947d 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -110,21 +110,28 @@
   PrefBackedBoolean* _autocompleteWalletPreference;
   // Sync service.
   syncer::SyncService* _syncService;
+  // Observer for `IdentityManager`.
+  std::unique_ptr<signin::IdentityManagerObserverBridge>
+      _identityManagerObserver;
 }
 
 - (instancetype)initWithSyncService:(syncer::SyncService*)syncService
                     userPrefService:(PrefService*)userPrefService
+                    identityManager:(signin::IdentityManager*)identityManager
                 initialAccountState:
                     (SyncSettingsAccountState)initialAccountState {
   self = [super init];
   if (self) {
     DCHECK(syncService);
     _syncService = syncService;
-    _syncObserver.reset(new SyncObserverBridge(self, syncService));
+    _syncObserver = std::make_unique<SyncObserverBridge>(self, syncService);
     _autocompleteWalletPreference = [[PrefBackedBoolean alloc]
         initWithPrefService:userPrefService
                    prefName:autofill::prefs::kAutofillWalletImportEnabled];
     _autocompleteWalletPreference.observer = self;
+    _identityManagerObserver =
+        std::make_unique<signin::IdentityManagerObserverBridge>(identityManager,
+                                                                self);
     _initialAccountState = initialAccountState;
   }
   return self;
@@ -136,6 +143,7 @@
   _autocompleteWalletPreference.observer = nil;
   [_autocompleteWalletPreference stop];
   _autocompleteWalletPreference = nil;
+  _identityManagerObserver.reset();
 }
 
 #pragma mark - Loads sync data type section
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm
index 257e8db..a2f7989b 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator_unittest.mm
@@ -23,6 +23,7 @@
 #import "ios/chrome/browser/shared/ui/table_view/table_view_model.h"
 #import "ios/chrome/browser/signin/fake_system_identity.h"
 #import "ios/chrome/browser/signin/fake_system_identity_manager.h"
+#import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/sync/mock_sync_service_utils.h"
 #import "ios/chrome/browser/sync/sync_service_factory.h"
 #import "ios/chrome/browser/sync/sync_setup_service_factory.h"
@@ -99,6 +100,8 @@
     mediator_ = [[ManageSyncSettingsMediator alloc]
         initWithSyncService:sync_service_mock_
             userPrefService:pref_service_
+            identityManager:IdentityManagerFactory::GetForBrowserState(
+                                browser_state_.get())
         initialAccountState:SyncSettingsAccountState::kSyncing];
     mediator_.syncSetupService = sync_setup_service_mock_;
     mediator_.consumer = consumer_;
diff --git a/ios/chrome/browser/ui/whats_new/constants.h b/ios/chrome/browser/ui/whats_new/constants.h
index 98ce5ff..abe2aeb 100644
--- a/ios/chrome/browser/ui/whats_new/constants.h
+++ b/ios/chrome/browser/ui/whats_new/constants.h
@@ -20,4 +20,8 @@
 // menu.
 extern NSString* const kWhatsNewUsageEntryKey;
 
+// Key to store whether a user interacted with What's New M116 from the overflow
+// menu.
+extern NSString* const kWhatsNewM116UsageEntryKey;
+
 #endif  // IOS_CHROME_BROWSER_UI_WHATS_NEW_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/whats_new/constants.mm b/ios/chrome/browser/ui/whats_new/constants.mm
index c27f31e..081b1887 100644
--- a/ios/chrome/browser/ui/whats_new/constants.mm
+++ b/ios/chrome/browser/ui/whats_new/constants.mm
@@ -17,3 +17,6 @@
 NSString* const kWhatsNewLaunchesAfterFre = @"whatsNewLaunchesAfterFre";
 
 NSString* const kWhatsNewUsageEntryKey = @"userHasInteractedWithWhatsNew";
+
+NSString* const kWhatsNewM116UsageEntryKey =
+    @"userHasInteractedWithWhatsNewM116";
diff --git a/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent_unittest.mm b/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent_unittest.mm
index 297614e..a476292 100644
--- a/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent_unittest.mm
+++ b/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent_unittest.mm
@@ -48,6 +48,8 @@
       removeObjectForKey:kWhatsNewPromoRegistrationKey];
   [[NSUserDefaults standardUserDefaults]
       removeObjectForKey:kWhatsNewUsageEntryKey];
+  [[NSUserDefaults standardUserDefaults]
+      removeObjectForKey:kWhatsNewM116UsageEntryKey];
 }
 
 }  // namespace
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_util.h b/ios/chrome/browser/ui/whats_new/whats_new_util.h
index fb9115b..bbd90f8 100644
--- a/ios/chrome/browser/ui/whats_new/whats_new_util.h
+++ b/ios/chrome/browser/ui/whats_new/whats_new_util.h
@@ -26,6 +26,9 @@
 // menu.
 extern NSString* const kWhatsNewUsageEntryKey;
 
+// Key to store whether a user interacted with What's New M116.
+extern NSString* const kWhatsNewM116UsageEntryKey;
+
 // Returns whether What's New was used in the overflow menu. This is used to
 // decide on the location of the What's New entry point in the overflow menu.
 bool WasWhatsNewUsed();
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_util.mm b/ios/chrome/browser/ui/whats_new/whats_new_util.mm
index 04fee2a..37671f7 100644
--- a/ios/chrome/browser/ui/whats_new/whats_new_util.mm
+++ b/ios/chrome/browser/ui/whats_new/whats_new_util.mm
@@ -70,6 +70,14 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool WasWhatsNewUsed() {
+  if (IsWhatsNewM116Enabled()) {
+    // Remove the previous user defaults
+    [[NSUserDefaults standardUserDefaults]
+        removeObjectForKey:kWhatsNewUsageEntryKey];
+    return [[NSUserDefaults standardUserDefaults]
+        boolForKey:kWhatsNewM116UsageEntryKey];
+  }
+
   return
       [[NSUserDefaults standardUserDefaults] boolForKey:kWhatsNewUsageEntryKey];
 }
@@ -83,8 +91,13 @@
   DCHECK(promosManager);
   promosManager->DeregisterPromo(promos_manager::Promo::WhatsNew);
 
-  [[NSUserDefaults standardUserDefaults] setBool:YES
-                                          forKey:kWhatsNewUsageEntryKey];
+  if (IsWhatsNewM116Enabled()) {
+    [[NSUserDefaults standardUserDefaults] setBool:YES
+                                            forKey:kWhatsNewM116UsageEntryKey];
+  } else {
+    [[NSUserDefaults standardUserDefaults] setBool:YES
+                                            forKey:kWhatsNewUsageEntryKey];
+  }
 }
 
 void setWhatsNewPromoRegistration() {
diff --git a/ios/chrome/intents_extension/BUILD.gn b/ios/chrome/intents_extension/BUILD.gn
index 41c203b..5e2b4d65 100644
--- a/ios/chrome/intents_extension/BUILD.gn
+++ b/ios/chrome/intents_extension/BUILD.gn
@@ -10,5 +10,8 @@
   ]
   deps = [ "//ios/chrome/common/intents" ]
 
-  frameworks = [ "Intents.framework" ]
+  frameworks = [
+    "Intents.framework",
+    "Foundation.framework",
+  ]
 }
diff --git a/ios/chrome/intents_extension/chrome_intents_handler.mm b/ios/chrome/intents_extension/chrome_intents_handler.mm
index 61318fc0..e4f13be 100644
--- a/ios/chrome/intents_extension/chrome_intents_handler.mm
+++ b/ios/chrome/intents_extension/chrome_intents_handler.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/intents_extension/chrome_intents_handler.h"
 
+#import <Foundation/Foundation.h>
+
 #import "ios/chrome/common/intents/OpenInChromeIncognitoIntent.h"
 #import "ios/chrome/common/intents/OpenInChromeIntent.h"
 #import "ios/chrome/common/intents/SearchInChromeIntent.h"
diff --git a/ios/chrome/widget_kit_extension/shortcuts_widget.swift b/ios/chrome/widget_kit_extension/shortcuts_widget.swift
index a50e7a3..d9a349c 100644
--- a/ios/chrome/widget_kit_extension/shortcuts_widget.swift
+++ b/ios/chrome/widget_kit_extension/shortcuts_widget.swift
@@ -168,7 +168,7 @@
 
   // Shows the widget with 4 shortcuts placeholder in the gallery view to respect user's privacy.
   public var websitesPlaceholder: some View {
-    HStack(spacing: 0.5) {
+    HStack(spacing: 3) {
       WebSitePlaceholder()
       SeparatorVertical()
       WebSitePlaceholder()
@@ -177,9 +177,7 @@
       SeparatorVertical()
       WebSitePlaceholder()
     }
-    .padding(.horizontal, Dimensions.placeholdersPadding)
     .frame(minWidth: 0, maxWidth: .infinity)
-    .padding([.leading, .trailing], Dimensions.iconsPadding)
   }
 
   // Shows the "No shortcuts available" text when the user's delete
@@ -252,8 +250,8 @@
           }
           Spacer()
         }.frame(minWidth: 0, maxWidth: .infinity)
-          .padding([.leading, .trailing], Dimensions.stackFramePadding)
       }
+      Spacer()
     }.background(Colors.widgetMostVisitedSitesRow)
   }
 }
@@ -269,7 +267,7 @@
 // Vertical `|` separator view between two shortcuts in a row of the Shortcuts widget.
 struct SeparatorVertical: View {
   enum Dimensions {
-    static let height: CGFloat = 40
+    static let height: CGFloat = 32
     static let width: CGFloat = 2
     static let cornerRadius: CGFloat = 1
   }
@@ -288,10 +286,13 @@
   enum Dimensions {
     static let placeholderSize: CGFloat = 28
   }
+  enum Colors {
+    static let widgetTextColor = Color("widget_text_color")
+  }
   var body: some View {
     Circle()
       .frame(width: Dimensions.placeholderSize, height: Dimensions.placeholderSize)
-      .foregroundColor(Color(.darkGray))
+      .foregroundColor(Colors.widgetTextColor)
       .opacity(0.2)
       .frame(minWidth: 0, maxWidth: .infinity)
   }
@@ -301,11 +302,13 @@
 struct WebsiteLogo: View {
   enum Dimensions {
     static let placeholderSize: CGFloat = 28
-    static let cornerRadius: CGFloat = 2
+    static let cornerRadius: CGFloat = 4
     static let fontSize: CGFloat = 15
   }
+
   enum Colors {
-    static let widgetTextColor: Color = Color("widget_text_color")
+    static let shortcutBackgroundColor = Color("widget_background_color")
+    static let shortcutTextColor = Color("widget_text_color")
   }
 
   let ntpTile: NTPTile
@@ -314,7 +317,7 @@
     if let backgroundColor = ntpTile.fallbackBackgroundColor {
       return Color(backgroundColor)
     } else {
-      return Color(.darkGray).opacity(0.3)
+      return Colors.shortcutBackgroundColor
     }
   }
   var fallbackMonogram: String {
@@ -324,7 +327,7 @@
     if let fallbackTextColor = ntpTile.fallbackTextColor {
       return Color(fallbackTextColor)
     } else {
-      return Colors.widgetTextColor
+      return Colors.shortcutTextColor
     }
   }
   var faviconImage: Image? {
@@ -343,7 +346,6 @@
     ZStack {
       RoundedRectangle(cornerRadius: Dimensions.cornerRadius, style: .continuous)
         .frame(width: Dimensions.placeholderSize, height: Dimensions.placeholderSize)
-        .foregroundColor(Color.white)
       faviconImage.resizable()
         .frame(width: Dimensions.placeholderSize, height: Dimensions.placeholderSize)
     }
@@ -354,22 +356,21 @@
       RoundedRectangle(cornerRadius: Dimensions.cornerRadius, style: .continuous)
         .frame(width: Dimensions.placeholderSize, height: Dimensions.placeholderSize)
         .foregroundColor(backgroundColor)
-        .frame(minWidth: 0, maxWidth: .infinity)
       monogramText
     }
   }
 
   var monogramText: some View {
     Text(verbatim: fallbackMonogram)
-      .font(.system(size: Dimensions.fontSize, weight: .bold))
-      .foregroundColor(Color.white)
+      .font(.system(size: Dimensions.fontSize))
+      .foregroundColor(fallbackTextColor)
   }
 
   var body: some View {
     if let faviconImage = faviconImage {
-      backgroundWithLogo(faviconImage: faviconImage)
+      backgroundWithLogo(faviconImage: faviconImage).cornerRadius(Dimensions.cornerRadius)
     } else {
-      monogramIcon
+      monogramIcon.cornerRadius(Dimensions.cornerRadius)
     }
   }
 }
diff --git a/ios/web/content/BUILD.gn b/ios/web/content/BUILD.gn
index 16d175b6..2ae3660 100644
--- a/ios/web/content/BUILD.gn
+++ b/ios/web/content/BUILD.gn
@@ -34,6 +34,8 @@
     "web_state/content_web_state_builder.mm",
     "web_state/crc_web_view_proxy_impl.h",
     "web_state/crc_web_view_proxy_impl.mm",
+    "web_state/crc_web_viewport_container_view.h",
+    "web_state/crc_web_viewport_container_view.mm",
   ]
   deps = [
     ":send_webkit_message_js",
diff --git a/ios/web/content/web_state/content_web_state.h b/ios/web/content/web_state/content_web_state.h
index 6816be4..8f7bb29 100644
--- a/ios/web/content/web_state/content_web_state.h
+++ b/ios/web/content/web_state/content_web_state.h
@@ -20,6 +20,7 @@
 #import "ios/web/public/favicon/favicon_status.h"
 #import "ios/web/public/session/session_certificate_policy_cache.h"
 
+@class CRCWebViewportContainerView;
 @class CRWWebViewProxy;
 
 #if !BUILDFLAG(USE_BLINK)
@@ -174,10 +175,18 @@
                       const blink::mojom::WindowFeatures& window_features,
                       bool user_gesture,
                       bool* was_blocked) override;
+  int GetTopControlsHeight() override;
+  int GetTopControlsMinHeight() override;
+  int GetBottomControlsHeight() override;
+  int GetBottomControlsMinHeight() override;
+  bool ShouldAnimateBrowserControlsHeightChanges() override;
+  bool DoBrowserControlsShrinkRendererSize(
+      content::WebContents* web_contents) override;
+  bool OnlyExpandTopControlsAtPageTop() override;
 
  private:
   WebStateDelegate* delegate_ = nullptr;
-  UIScrollView* web_view_;
+  CRCWebViewportContainerView* web_view_;
   CRWSessionStorage* session_storage_;
   std::unique_ptr<content::WebContents> web_contents_;
   std::unique_ptr<content::WebContents> child_web_contents_;
diff --git a/ios/web/content/web_state/content_web_state.mm b/ios/web/content/web_state/content_web_state.mm
index 630613d..389039d 100644
--- a/ios/web/content/web_state/content_web_state.mm
+++ b/ios/web/content/web_state/content_web_state.mm
@@ -4,6 +4,7 @@
 
 #import "ios/web/content/web_state/content_web_state.h"
 
+#import "base/mac/foundation_util.h"
 #import "base/strings/utf_string_conversions.h"
 #import "content/public/browser/navigation_entry.h"
 #import "content/public/browser/web_contents.h"
@@ -11,6 +12,7 @@
 #import "ios/web/content/navigation/content_navigation_context.h"
 #import "ios/web/content/web_state/content_web_state_builder.h"
 #import "ios/web/content/web_state/crc_web_view_proxy_impl.h"
+#import "ios/web/content/web_state/crc_web_viewport_container_view.h"
 #import "ios/web/find_in_page/java_script_find_in_page_manager_impl.h"
 #import "ios/web/public/favicon/favicon_url.h"
 #import "ios/web/public/navigation/navigation_item.h"
@@ -96,18 +98,19 @@
       this, params.browser_state, web_contents_->GetController());
   web_frames_manager_ = std::make_unique<ContentWebFramesManager>(this);
 
-  UIView* web_contents_view = web_contents_->GetNativeView();
-  web_contents_view.translatesAutoresizingMaskIntoConstraints = NO;
-  web_contents_view.layer.backgroundColor = UIColor.grayColor.CGColor;
+  UIScrollView* web_contents_view =
+      base::mac::ObjCCastStrict<UIScrollView>(web_contents_->GetNativeView());
 
-  web_view_ = [[UIScrollView alloc] init];
-  web_view_.translatesAutoresizingMaskIntoConstraints = NO;
-  web_view_.backgroundColor = UIColor.redColor;
+  web_view_ = [[CRCWebViewportContainerView alloc] init];
+  // Comment this back in to show visual glitches that might be present.
+  // web_view_.backgroundColor = UIColor.redColor;
 
   CRCWebViewProxyImpl* proxy = [[CRCWebViewProxyImpl alloc] init];
-  proxy.contentView = web_view_;
+  proxy.contentView = web_contents_view;
   web_view_proxy_ = proxy;
 
+  [web_view_ addSubview:web_contents_view];
+
   // These should be moved when the are removed from CRWWebController.
   web::JavaScriptFindInPageManagerImpl::CreateForWebState(this);
   web::TextFragmentsManagerImpl::CreateForWebState(this);
@@ -177,7 +180,7 @@
 void ContentWebState::SetWebUsageEnabled(bool enabled) {}
 
 UIView* ContentWebState::GetView() {
-  return session_storage_ ? nil : web_contents_->GetNativeView();
+  return web_view_;
 }
 
 void ContentWebState::DidCoverWebContent() {}
@@ -566,4 +569,38 @@
   DCHECK(!child_web_contents_);
 }
 
+int ContentWebState::GetTopControlsHeight() {
+  return [web_view_ maxViewportInsets].top;
+}
+
+int ContentWebState::GetTopControlsMinHeight() {
+  return [web_view_ minViewportInsets].top;
+}
+
+int ContentWebState::GetBottomControlsHeight() {
+  return [web_view_ maxViewportInsets].bottom;
+}
+
+int ContentWebState::GetBottomControlsMinHeight() {
+  return [web_view_ minViewportInsets].bottom;
+}
+
+bool ContentWebState::ShouldAnimateBrowserControlsHeightChanges() {
+  return false;
+}
+
+bool ContentWebState::DoBrowserControlsShrinkRendererSize(
+    content::WebContents* web_contents) {
+  UIScrollView* web_contents_view =
+      base::mac::ObjCCastStrict<UIScrollView>(web_contents->GetNativeView());
+  if (web_contents_view.contentInset.top > GetTopControlsMinHeight()) {
+    return true;
+  }
+  return false;
+}
+
+bool ContentWebState::OnlyExpandTopControlsAtPageTop() {
+  return false;
+}
+
 }  // namespace web
diff --git a/ios/web/content/web_state/crc_web_viewport_container_view.h b/ios/web/content/web_state/crc_web_viewport_container_view.h
new file mode 100644
index 0000000..2abbc95
--- /dev/null
+++ b/ios/web/content/web_state/crc_web_viewport_container_view.h
@@ -0,0 +1,24 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEWPORT_CONTAINER_VIEW_H_
+#define IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEWPORT_CONTAINER_VIEW_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/web/common/crw_content_view.h"
+#import "ios/web/common/crw_viewport_adjustment_container.h"
+
+// Container view class that manages the display of content.
+@interface CRCWebViewportContainerView : UIView <CRWViewportAdjustmentContainer>
+
+// The minimum viewport insets.
+@property(nonatomic, assign) UIEdgeInsets minViewportInsets;
+
+// The maximum viewport insets.
+@property(nonatomic, assign) UIEdgeInsets maxViewportInsets;
+
+@end
+
+#endif  // IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEWPORT_CONTAINER_VIEW_H_
diff --git a/ios/web/content/web_state/crc_web_viewport_container_view.mm b/ios/web/content/web_state/crc_web_viewport_container_view.mm
new file mode 100644
index 0000000..c90e5c2
--- /dev/null
+++ b/ios/web/content/web_state/crc_web_viewport_container_view.mm
@@ -0,0 +1,37 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/web/content/web_state/crc_web_viewport_container_view.h"
+
+#import "base/check.h"
+#import "base/notreached.h"
+#import "ios/web/common/crw_viewport_adjustment.h"
+#import "ios/web/common/crw_viewport_adjustment_container.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface CRCWebViewportContainerView () <CRWViewportAdjustment>
+
+@end
+
+@implementation CRCWebViewportContainerView
+
+@synthesize viewportInsets = _viewportInsets;
+@synthesize viewportEdgesAffectedBySafeArea = _viewportEdgesAffectedBySafeArea;
+@synthesize minViewportInsets = _minViewportInsets;
+@synthesize maxViewportInsets = _maxViewportInsets;
+
+- (UIView<CRWViewportAdjustment>*)fullscreenViewportAdjuster {
+  return self;
+}
+
+- (void)updateMinViewportInsets:(UIEdgeInsets)minInsets
+              maxViewportInsets:(UIEdgeInsets)maxInsets {
+  _minViewportInsets = minInsets;
+  _maxViewportInsets = maxInsets;
+}
+
+@end
diff --git a/media/base/callback_timeout_helpers.h b/media/base/callback_timeout_helpers.h
index 3da31226..f2860c5 100644
--- a/media/base/callback_timeout_helpers.h
+++ b/media/base/callback_timeout_helpers.h
@@ -47,6 +47,16 @@
 
 namespace media {
 
+// Enum class for reporting callback timeout status to UMA.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class CallbackTimeoutStatus {
+  kCreate = 0,
+  kTimeout = 1,
+  kDestructedBeforeTimeout = 2,
+  kMaxValue = kDestructedBeforeTimeout,
+};
+
 // Callback time for the timeout handler in `WrapCallbackWithTimeoutHandler`.
 // If `called_on_destruction` is true, the timeout callback was called because
 // the original callback was destructed without running. Otherwise, it was
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index fef461c..7115fa8 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -14,6 +14,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
@@ -22,6 +23,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
+#include "media/base/callback_timeout_helpers.h"
 #include "media/base/cdm_context.h"
 #include "media/base/decoder.h"
 #include "media/base/demuxer.h"
@@ -52,6 +54,16 @@
   return natural_size;
 }
 
+void OnCallbackTimeout(const std::string& uma_name,
+                       bool called_on_destruction) {
+  DVLOG(1) << "Callback Timeout: " << uma_name
+           << ", called_on_destruction=" << called_on_destruction;
+  base::UmaHistogramEnumeration(
+      uma_name, called_on_destruction
+                    ? CallbackTimeoutStatus::kDestructedBeforeTimeout
+                    : CallbackTimeoutStatus::kTimeout);
+}
+
 }  // namespace
 
 // A wrapper of Renderer that runs on the |media_task_runner|.
@@ -1154,7 +1166,14 @@
   shared_state_.renderer->SetWasPlayedWithUserActivation(
       was_played_with_user_activation_);
 
-  shared_state_.renderer->Initialize(demuxer_, this, std::move(done_cb));
+  // Initialize Renderer and report timeout UMA.
+  std::string uma_name = "Media.InitializeRendererTimeout";
+  base::UmaHistogramEnumeration(uma_name, CallbackTimeoutStatus::kCreate);
+  shared_state_.renderer->Initialize(
+      demuxer_, this,
+      WrapCallbackWithTimeoutHandler(
+          std::move(done_cb), /*timeout_delay=*/base::Seconds(10),
+          base::BindOnce(&OnCallbackTimeout, uma_name)));
 }
 
 void PipelineImpl::RendererWrapper::DestroyRenderer() {
diff --git a/media/gpu/chromeos/image_processor_perf_test.cc b/media/gpu/chromeos/image_processor_perf_test.cc
index 8d7004c..bfa6d1d 100644
--- a/media/gpu/chromeos/image_processor_perf_test.cc
+++ b/media/gpu/chromeos/image_processor_perf_test.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/bits.h"
+#include "base/logging.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
@@ -33,12 +34,15 @@
 
 static constexpr int kNumberOfTestFrames = 10;
 static constexpr int kNumberOfTestCycles = 1000;
+static constexpr int kNumberOfCappedTestCycles = 300;
 
 static constexpr int kTestImageWidth = 1920;
 static constexpr int kTestImageHeight = 1088;
 
 static constexpr int kRandomFrameSeed = 1000;
 
+static constexpr int kUsecPerFrameAt60fps = 16666;
+
 namespace media {
 namespace {
 
@@ -291,6 +295,142 @@
   reporter.AddResult(".frames_per_second", fps);
 }
 
+// Tests GLImageProcessor by feeding in |kNumberOfTestFrames| unique input
+// frames looped over |kNumberOfCappedTestCycles| iterations to the
+// GLImageProcessor at 60fps. Will print out elapsed processing time.
+TEST_F(ImageProcessorPerfTest, CappedGLImageProcessorPerfTest) {
+  InitializeImageProcessorTest();
+
+  scoped_refptr<base::SequencedTaskRunner> client_task_runner =
+      base::SequencedTaskRunner::GetCurrentDefault();
+  base::RepeatingClosure quit_closure = run_loop_.QuitClosure();
+  std::unique_ptr<ImageProcessor> gl_image_processor = ImageProcessorFactory::
+      CreateGLImageProcessorWithInputCandidatesForTesting(
+          candidates_, test_image_visible_rect_, test_image_size_,
+          /*num_buffers=*/1, client_task_runner, pick_format_cb_, error_cb_);
+  ASSERT_TRUE(gl_image_processor) << "Error creating GLImageProcessor";
+
+  LOG(INFO) << "Running GLImageProcessor Capped Perf Test";
+  int loop_iterations = kNumberOfCappedTestCycles;
+  base::TimeTicks start, end;
+  base::RepeatingCallback<void(scoped_refptr<VideoFrame>)>* gl_callback_ptr;
+  base::RepeatingCallback gl_callback =
+      base::BindLambdaForTesting([&](scoped_refptr<VideoFrame> frame) {
+        CHECK(client_task_runner->RunsTasksInCurrentSequence());
+
+        if (!(--loop_iterations)) {
+          quit_closure.Run();
+        } else {
+          end = base::TimeTicks::Now();
+          base::TimeDelta delta_time = end - start;
+          if (delta_time.InMicroseconds() < kUsecPerFrameAt60fps) {
+            usleep(kUsecPerFrameAt60fps - delta_time.InMicroseconds());
+          } else {
+            LOG(WARNING) << "Frame detiling was late by "
+                         << (delta_time.InMicroseconds() - kUsecPerFrameAt60fps)
+                         << "us";
+          }
+          start = base::TimeTicks::Now();
+          gl_image_processor->Process(
+              input_frames_[loop_iterations % kNumberOfTestFrames],
+              output_frame_, *gl_callback_ptr);
+        }
+      });
+
+  gl_callback_ptr = &gl_callback;
+
+  gl_image_processor->Process(input_frames_[0], output_frame_,
+                              *gl_callback_ptr);
+
+  start = base::TimeTicks::Now();
+  auto total_start_time = base::TimeTicks::Now();
+  run_loop_.Run();
+
+  auto total_end_time = base::TimeTicks::Now();
+  base::TimeDelta total_delta_time = total_end_time - total_start_time;
+  const double fps = (kNumberOfCappedTestCycles / total_delta_time.InSeconds());
+
+  perf_test::PerfResultReporter reporter("GLImageProcessor", "Capped Test");
+  reporter.RegisterImportantMetric(".frames_decoded", "frames");
+  reporter.RegisterImportantMetric(".total_duration", "us");
+  reporter.RegisterImportantMetric(".frames_per_second", "fps");
+
+  reporter.AddResult(".frames_decoded",
+                     static_cast<double>(kNumberOfCappedTestCycles));
+  reporter.AddResult(".total_duration",
+                     static_cast<double>(total_delta_time.InMicroseconds()));
+  reporter.AddResult(".frames_per_second", fps);
+}
+
+// Tests LibYUV by feeding in |kNumberOfTestFrames| unique input
+// frames looped over |kNumberOfCappedTestCycles| iterations to the
+// LibYUV at 60fps. Will print out elapsed processing time.
+TEST_F(ImageProcessorPerfTest, CappedLibYUVPerfTest) {
+  InitializeImageProcessorTest();
+
+  scoped_refptr<base::SequencedTaskRunner> client_task_runner =
+      base::SequencedTaskRunner::GetCurrentDefault();
+  base::RepeatingClosure quit_closure = run_loop_.QuitClosure();
+  std::unique_ptr<ImageProcessor> libyuv_image_processor =
+      ImageProcessorFactory::
+          CreateLibYUVImageProcessorWithInputCandidatesForTesting(
+              candidates_, test_image_visible_rect_, test_image_size_,
+              /*num_buffers=*/1, client_task_runner, pick_format_cb_,
+              error_cb_);
+  ASSERT_TRUE(libyuv_image_processor) << "Error creating LibYUV";
+
+  LOG(INFO) << "Running LibYUV Capped Perf Test";
+  int loop_iterations = 0;
+  base::TimeTicks start, end;
+  base::RepeatingCallback<void(scoped_refptr<VideoFrame>)>* libyuv_callback_ptr;
+  base::RepeatingCallback libyuv_callback =
+      base::BindLambdaForTesting([&](scoped_refptr<VideoFrame> frame) {
+        CHECK(client_task_runner->RunsTasksInCurrentSequence());
+
+        if ((++loop_iterations) >= kNumberOfCappedTestCycles) {
+          quit_closure.Run();
+        } else {
+          end = base::TimeTicks::Now();
+          base::TimeDelta delta_time = end - start;
+          if (delta_time.InMicroseconds() < kUsecPerFrameAt60fps) {
+            usleep(kUsecPerFrameAt60fps - delta_time.InMicroseconds());
+          } else {
+            LOG(WARNING) << "Frame detiling was late by "
+                         << (delta_time.InMicroseconds() - kUsecPerFrameAt60fps)
+                         << "us";
+          }
+          start = base::TimeTicks::Now();
+          libyuv_image_processor->Process(
+              input_frames_[loop_iterations % kNumberOfTestFrames],
+              output_frame_, *libyuv_callback_ptr);
+        }
+      });
+
+  libyuv_callback_ptr = &libyuv_callback;
+
+  libyuv_image_processor->Process(input_frames_[0], output_frame_,
+                                  *libyuv_callback_ptr);
+
+  start = base::TimeTicks::Now();
+  auto total_start_time = base::TimeTicks::Now();
+  run_loop_.Run();
+
+  auto total_end_time = base::TimeTicks::Now();
+  base::TimeDelta total_delta_time = total_end_time - total_start_time;
+  const double fps = (kNumberOfCappedTestCycles / total_delta_time.InSeconds());
+
+  perf_test::PerfResultReporter reporter("LibYUV", "Capped Test");
+  reporter.RegisterImportantMetric(".frames_decoded", "frames");
+  reporter.RegisterImportantMetric(".total_duration", "us");
+  reporter.RegisterImportantMetric(".frames_per_second", "fps");
+
+  reporter.AddResult(".frames_decoded",
+                     static_cast<double>(kNumberOfCappedTestCycles));
+  reporter.AddResult(".total_duration",
+                     static_cast<double>(total_delta_time.InMicroseconds()));
+  reporter.AddResult(".frames_per_second", fps);
+}
+
 }  // namespace
 }  // namespace media
 
diff --git a/media/gpu/mac/video_toolbox_decompression_interface.cc b/media/gpu/mac/video_toolbox_decompression_interface.cc
index cbfa6a4..72aed22 100644
--- a/media/gpu/mac/video_toolbox_decompression_interface.cc
+++ b/media/gpu/mac/video_toolbox_decompression_interface.cc
@@ -11,15 +11,18 @@
 #include "base/functional/callback_forward.h"
 #include "base/logging.h"
 #include "base/mac/mac_logging.h"
+#include "media/base/media_log.h"
 #include "media/gpu/mac/video_toolbox_decompression_session.h"
 
 namespace media {
 
 VideoToolboxDecompressionInterface::VideoToolboxDecompressionInterface(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
+    std::unique_ptr<MediaLog> media_log,
     OutputCB output_cb,
     ErrorCB error_cb)
     : task_runner_(std::move(task_runner)),
+      media_log_(std::move(media_log)),
       output_cb_(std::move(output_cb)),
       error_cb_(std::move(error_cb)) {
   DVLOG(1) << __func__;
@@ -27,7 +30,7 @@
   weak_this_ = weak_this_factory_.GetWeakPtr();
   decompression_session_ =
       std::make_unique<VideoToolboxDecompressionSessionImpl>(
-          task_runner_,
+          task_runner_, media_log_->Clone(),
           base::BindRepeating(&VideoToolboxDecompressionInterface::OnOutput,
                               weak_this_));
 }
@@ -50,7 +53,7 @@
   pending_decodes_.push(std::make_pair(std::move(sample), context));
 
   if (!ProcessDecodes()) {
-    NotifyError();
+    NotifyError(DecoderStatus::Codes::kPlatformDecodeFailure);
     return;
   }
 }
@@ -74,7 +77,7 @@
   return pending_decodes_.size() + active_decodes_;
 }
 
-void VideoToolboxDecompressionInterface::NotifyError() {
+void VideoToolboxDecompressionInterface::NotifyError(DecoderStatus status) {
   DVLOG(1) << __func__;
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(error_cb_);
@@ -86,13 +89,14 @@
   task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&VideoToolboxDecompressionInterface::CallErrorCB,
-                     weak_this_, std::move(error_cb_)));
+                     weak_this_, std::move(error_cb_), std::move(status)));
 }
 
-void VideoToolboxDecompressionInterface::CallErrorCB(ErrorCB error_cb) {
+void VideoToolboxDecompressionInterface::CallErrorCB(ErrorCB error_cb,
+                                                     DecoderStatus status) {
   DVLOG(4) << __func__;
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
-  std::move(error_cb).Run();
+  std::move(error_cb).Run(std::move(status));
 }
 
 bool VideoToolboxDecompressionInterface::ProcessDecodes() {
@@ -158,6 +162,7 @@
                                 &kCFTypeDictionaryValueCallBacks));
   if (!decoder_config) {
     DLOG(ERROR) << "CFDictionaryCreateMutable() failed";
+    MEDIA_LOG(ERROR, media_log_.get()) << "CFDictionaryCreateMutable() failed";
     return false;
   }
 
@@ -208,16 +213,20 @@
 
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "VTDecompressionOutputCallback";
-    NotifyError();
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "VTDecompressionOutputCallback";
+    NotifyError(DecoderStatus::Codes::kPlatformDecodeFailure);
     return;
   }
 
   if (!image || CFGetTypeID(image) != CVPixelBufferGetTypeID()) {
     DLOG(ERROR) << "Decoded image is not a CVPixelBuffer";
+    MEDIA_LOG(ERROR, media_log_.get())
+        << "Decoded image is not a CVPixelBuffer";
     // TODO(crbug.com/1331597): Potentially allow intentional dropped frames.
     // (signaled in |flags|). It might make sense to dump without crashing to
     // help track down why this happens.
-    NotifyError();
+    NotifyError(DecoderStatus::Codes::kPlatformDecodeFailure);
     return;
   }
 
@@ -228,7 +237,7 @@
   if (draining_ && !active_decodes_) {
     DestroySession();
     if (!ProcessDecodes()) {
-      NotifyError();
+      NotifyError(DecoderStatus::Codes::kPlatformDecodeFailure);
       return;
     }
   }
diff --git a/media/gpu/mac/video_toolbox_decompression_interface.h b/media/gpu/mac/video_toolbox_decompression_interface.h
index 6a0f183c..a3e5b15 100644
--- a/media/gpu/mac/video_toolbox_decompression_interface.h
+++ b/media/gpu/mac/video_toolbox_decompression_interface.h
@@ -17,11 +17,14 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/sequenced_task_runner.h"
+#include "media/base/decoder_status.h"
 #include "media/gpu/mac/video_toolbox_decompression_session.h"
 #include "media/gpu/media_gpu_export.h"
 
 namespace media {
 
+class MediaLog;
+
 // Wraps VideoToolboxDecompressionSession to handle reconfiguration. Callbacks
 // are never called re-entrantly or after destruction.
 class MEDIA_GPU_EXPORT VideoToolboxDecompressionInterface {
@@ -29,10 +32,11 @@
   using OutputCB =
       base::RepeatingCallback<void(base::ScopedCFTypeRef<CVImageBufferRef>,
                                    void*)>;
-  using ErrorCB = base::OnceClosure;
+  using ErrorCB = base::OnceCallback<void(DecoderStatus)>;
 
   VideoToolboxDecompressionInterface(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
+      std::unique_ptr<MediaLog> media_log,
       OutputCB output_cb,
       ErrorCB error_cb);
 
@@ -59,11 +63,11 @@
 
  private:
   // Shut down and call |error_cb_|.
-  void NotifyError();
+  void NotifyError(DecoderStatus status);
 
   // Helper to call |error_cb|. Used to post |error_cb_| without calling it
   // after destruction.
-  void CallErrorCB(ErrorCB error_cb);
+  void CallErrorCB(ErrorCB error_cb, DecoderStatus status);
 
   // Send queued decodes to VideoToolbox if possible.
   [[nodiscard]] bool ProcessDecodes();
@@ -75,6 +79,7 @@
   void DestroySession();
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  std::unique_ptr<MediaLog> media_log_;
   OutputCB output_cb_;
   ErrorCB error_cb_;  // |!error_cb_| indicates an error state.
 
diff --git a/media/gpu/mac/video_toolbox_decompression_interface_unittest.cc b/media/gpu/mac/video_toolbox_decompression_interface_unittest.cc
index baec38f3..0cb83bc5b3 100644
--- a/media/gpu/mac/video_toolbox_decompression_interface_unittest.cc
+++ b/media/gpu/mac/video_toolbox_decompression_interface_unittest.cc
@@ -3,10 +3,13 @@
 // found in the LICENSE file.
 
 #include <stdint.h>
+#include <memory>
 
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/test/task_environment.h"
+#include "media/base/decoder_status.h"
+#include "media/base/media_util.h"
 #include "media/gpu/mac/video_toolbox_decompression_interface.h"
 #include "media/gpu/mac/video_toolbox_decompression_session.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -139,13 +142,14 @@
   ~VideoToolboxDecompressionInterfaceTest() override = default;
 
  protected:
-  MOCK_METHOD0(OnError, void());
+  MOCK_METHOD1(OnError, void(DecoderStatus));
   MOCK_METHOD2(OnOutput, void(base::ScopedCFTypeRef<CVImageBufferRef>, void*));
 
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<VideoToolboxDecompressionInterface> video_toolbox_{
       std::make_unique<VideoToolboxDecompressionInterface>(
           task_environment_.GetMainThreadTaskRunner(),
+          std::make_unique<NullMediaLog>(),
           base::BindRepeating(&VideoToolboxDecompressionInterfaceTest::OnOutput,
                               base::Unretained(this)),
           base::BindOnce(&VideoToolboxDecompressionInterfaceTest::OnError,
@@ -184,7 +188,7 @@
 
   decompression_session_->can_create = false;
 
-  EXPECT_CALL(*this, OnError());
+  EXPECT_CALL(*this, OnError(_));
 
   video_toolbox_->Decode(sample, context);
 
@@ -262,7 +266,7 @@
 
   decompression_session_->can_decode_frame = false;
 
-  EXPECT_CALL(*this, OnError());
+  EXPECT_CALL(*this, OnError(_));
 
   video_toolbox_->Decode(sample, context);
 
@@ -283,7 +287,7 @@
   EXPECT_EQ(video_toolbox_->PendingDecodes(), 1ul);
   EXPECT_EQ(decompression_session_->ActiveDecodes(), 1ul);
 
-  EXPECT_CALL(*this, OnError());
+  EXPECT_CALL(*this, OnError(_));
 
   decompression_session_->FailDecode();
 
diff --git a/media/gpu/mac/video_toolbox_decompression_session.cc b/media/gpu/mac/video_toolbox_decompression_session.cc
index b00fabb..cac27c81 100644
--- a/media/gpu/mac/video_toolbox_decompression_session.cc
+++ b/media/gpu/mac/video_toolbox_decompression_session.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "base/mac/mac_logging.h"
+#include "media/base/media_log.h"
 
 namespace media {
 
@@ -30,8 +31,11 @@
 
 VideoToolboxDecompressionSessionImpl::VideoToolboxDecompressionSessionImpl(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
+    std::unique_ptr<MediaLog> media_log,
     OutputCB output_cb)
-    : task_runner_(std::move(task_runner)), output_cb_(std::move(output_cb)) {
+    : task_runner_(std::move(task_runner)),
+      media_log_(std::move(media_log)),
+      output_cb_(std::move(output_cb)) {
   DVLOG(1) << __func__;
   weak_this_ = weak_this_factory_.GetWeakPtr();
 }
@@ -61,6 +65,8 @@
       session_.InitializeInto());
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "VTDecompressionSessionCreate()";
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "VTDecompressionSessionCreate()";
     DCHECK(!session_);
     return false;
   }
@@ -114,6 +120,8 @@
       session_, sample, decode_flags, context, nullptr);
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "VTDecompressionSessionDecodeFrame()";
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "VTDecompressionSessionDecodeFrame()";
     return false;
   }
 
diff --git a/media/gpu/mac/video_toolbox_decompression_session.h b/media/gpu/mac/video_toolbox_decompression_session.h
index 6b5bacb0..668eeca 100644
--- a/media/gpu/mac/video_toolbox_decompression_session.h
+++ b/media/gpu/mac/video_toolbox_decompression_session.h
@@ -8,6 +8,8 @@
 #include <CoreMedia/CoreMedia.h>
 #include <VideoToolbox/VideoToolbox.h>
 
+#include <memory>
+
 #include "base/functional/callback.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "base/memory/scoped_refptr.h"
@@ -17,6 +19,8 @@
 
 namespace media {
 
+class MediaLog;
+
 // This interface wraps VideoToolbox platform APIs so that they can be swapped
 // out for testing.
 class MEDIA_GPU_EXPORT VideoToolboxDecompressionSession {
@@ -48,6 +52,7 @@
 
   VideoToolboxDecompressionSessionImpl(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
+      std::unique_ptr<MediaLog> media_log,
       OutputCB output_cb);
   ~VideoToolboxDecompressionSessionImpl() override;
 
@@ -72,6 +77,7 @@
                 base::ScopedCFTypeRef<CVImageBufferRef> image);
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  std::unique_ptr<MediaLog> media_log_;
   OutputCB output_cb_;
 
   base::ScopedCFTypeRef<VTDecompressionSessionRef> session_;
diff --git a/media/gpu/mac/video_toolbox_frame_converter.cc b/media/gpu/mac/video_toolbox_frame_converter.cc
index c5641330..e877aa7 100644
--- a/media/gpu/mac/video_toolbox_frame_converter.cc
+++ b/media/gpu/mac/video_toolbox_frame_converter.cc
@@ -16,6 +16,7 @@
 #include "gpu/ipc/common/gpu_memory_buffer_impl_io_surface.h"
 #include "gpu/ipc/service/gpu_channel.h"
 #include "gpu/ipc/service/shared_image_stub.h"
+#include "media/base/media_log.h"
 #include "media/base/media_switches.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/rect.h"
@@ -37,10 +38,12 @@
 
 VideoToolboxFrameConverter::VideoToolboxFrameConverter(
     scoped_refptr<base::SequencedTaskRunner> gpu_task_runner,
+    std::unique_ptr<MediaLog> media_log,
     GetCommandBufferStubCB get_stub_cb)
     : base::RefCountedDeleteOnSequence<VideoToolboxFrameConverter>(
           gpu_task_runner),
       gpu_task_runner_(std::move(gpu_task_runner)),
+      media_log_(std::move(media_log)),
       get_stub_cb_(std::move(get_stub_cb)) {
   DVLOG(1) << __func__;
   DCHECK(get_stub_cb_);
@@ -69,6 +72,7 @@
   stub_ = std::move(get_stub_cb_).Run();
   if (!stub_) {
     DVLOG(1) << __func__ << ": Failed to get command buffer stub.";
+    MEDIA_LOG(ERROR, media_log_.get()) << "Failed to get command buffer stub.";
     return;
   }
 
@@ -83,6 +87,7 @@
   sis_ = stub_->channel()->shared_image_stub();
   if (!sis_) {
     DVLOG(1) << __func__ << ": Failed to get shared image stub.";
+    MEDIA_LOG(ERROR, media_log_.get()) << "Failed to get shared image stub.";
     DestroyStub();
     return;
   }
@@ -119,6 +124,7 @@
   }
 
   if (!stub_) {
+    MEDIA_LOG(ERROR, media_log_.get()) << "Failed to get command buffer stub.";
     std::move(output_cb).Run(nullptr, context);
   }
 
@@ -148,6 +154,7 @@
       kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType, kSharedImageUsage,
       kSharedImageDebugLabel);
   if (!result) {
+    MEDIA_LOG(ERROR, media_log_.get()) << "Failed to create shared image.";
     std::move(output_cb).Run(nullptr, context);
   }
 
@@ -171,6 +178,8 @@
       visible_rect, natural_size, timestamp);
 
   if (!frame) {
+    MEDIA_LOG(ERROR, media_log_.get()) << "Failed to create VideoFrame.";
+
     // |image| was dropped along with |release_cb|, but the SharedImage is still
     // alive.
     sis_->GetSharedImageDestructionCallback(mailbox).Run(gpu::SyncToken());
diff --git a/media/gpu/mac/video_toolbox_frame_converter.h b/media/gpu/mac/video_toolbox_frame_converter.h
index b07bf92..77a00c17 100644
--- a/media/gpu/mac/video_toolbox_frame_converter.h
+++ b/media/gpu/mac/video_toolbox_frame_converter.h
@@ -7,6 +7,8 @@
 
 #include <CoreMedia/CoreMedia.h>
 
+#include <memory>
+
 #include "base/functional/callback.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "base/memory/raw_ptr.h"
@@ -25,6 +27,8 @@
 
 namespace media {
 
+class MediaLog;
+
 // Converts IOSurface-backed CVImageBuffers to VideoFrames.
 class VideoToolboxFrameConverter
     : public gpu::CommandBufferStub::DestructionObserver,
@@ -40,6 +44,7 @@
   // any sequence, but Convert() must be called on `gpu_task_runner`.
   VideoToolboxFrameConverter(
       scoped_refptr<base::SequencedTaskRunner> gpu_task_runner,
+      std::unique_ptr<MediaLog> media_log,
       GetCommandBufferStubCB get_stub_cb);
 
   void Convert(base::ScopedCFTypeRef<CVImageBufferRef> image,
@@ -65,9 +70,10 @@
       const gpu::SyncToken& sync_token);
 
   scoped_refptr<base::SequencedTaskRunner> gpu_task_runner_;
+  std::unique_ptr<MediaLog> media_log_;
   GetCommandBufferStubCB get_stub_cb_;
-  bool initialized_ = false;
 
+  bool initialized_ = false;
   raw_ptr<gpu::CommandBufferStub> stub_ = nullptr;
   gpu::SequenceId wait_sequence_id_;
   raw_ptr<gpu::SharedImageStub> sis_ = nullptr;
diff --git a/media/gpu/mac/video_toolbox_h264_accelerator.cc b/media/gpu/mac/video_toolbox_h264_accelerator.cc
index f65a7e48..807c23b7 100644
--- a/media/gpu/mac/video_toolbox_h264_accelerator.cc
+++ b/media/gpu/mac/video_toolbox_h264_accelerator.cc
@@ -6,6 +6,7 @@
 
 #include "base/mac/mac_logging.h"
 #include "base/sys_byteorder.h"
+#include "media/base/media_log.h"
 
 namespace media {
 
@@ -13,9 +14,13 @@
 constexpr size_t kNALUHeaderLength = 4;
 }  // namespace
 
-VideoToolboxH264Accelerator::VideoToolboxH264Accelerator(DecodeCB decode_cb,
-                                                         OutputCB output_cb)
-    : decode_cb_(std::move(decode_cb)), output_cb_(std::move(output_cb)) {
+VideoToolboxH264Accelerator::VideoToolboxH264Accelerator(
+    std::unique_ptr<MediaLog> media_log,
+    DecodeCB decode_cb,
+    OutputCB output_cb)
+    : media_log_(std::move(media_log)),
+      decode_cb_(std::move(decode_cb)),
+      output_cb_(std::move(output_cb)) {
   DVLOG(1) << __func__;
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
@@ -86,6 +91,8 @@
     if (status != noErr) {
       OSSTATUS_DLOG(ERROR, status)
           << "CMVideoFormatDescriptionCreateFromH264ParameterSets()";
+      OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+          << "CMVideoFormatDescriptionCreateFromH264ParameterSets()";
       return Status::kFail;
     }
 
@@ -136,12 +143,16 @@
       data.InitializeInto());
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "CMBlockBufferCreateWithMemoryBlock()";
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "CMBlockBufferCreateWithMemoryBlock()";
     return Status::kFail;
   }
 
   status = CMBlockBufferAssureBlockMemory(data);
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "CMBlockBufferAssureBlockMemory()";
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "CMBlockBufferAssureBlockMemory()";
     return Status::kFail;
   }
 
@@ -155,6 +166,8 @@
         CMBlockBufferReplaceDataBytes(&header, data, offset, kNALUHeaderLength);
     if (status != noErr) {
       OSSTATUS_DLOG(ERROR, status) << "CMBlockBufferReplaceDataBytes()";
+      OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+          << "CMBlockBufferReplaceDataBytes()";
       return Status::kFail;
     }
     offset += kNALUHeaderLength;
@@ -164,6 +177,8 @@
                                            nalu_data.size());
     if (status != noErr) {
       OSSTATUS_DLOG(ERROR, status) << "CMBlockBufferReplaceDataBytes()";
+      OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+          << "CMBlockBufferReplaceDataBytes()";
       return Status::kFail;
     }
     offset += nalu_data.size();
@@ -185,6 +200,8 @@
                                 sample.InitializeInto());
   if (status != noErr) {
     OSSTATUS_DLOG(ERROR, status) << "CMSampleBufferCreate()";
+    OSSTATUS_MEDIA_LOG(ERROR, status, media_log_.get())
+        << "CMSampleBufferCreate()";
     return Status::kFail;
   }
 
diff --git a/media/gpu/mac/video_toolbox_h264_accelerator.h b/media/gpu/mac/video_toolbox_h264_accelerator.h
index fff3387..e7c6fddd 100644
--- a/media/gpu/mac/video_toolbox_h264_accelerator.h
+++ b/media/gpu/mac/video_toolbox_h264_accelerator.h
@@ -8,6 +8,7 @@
 #include <CoreMedia/CoreMedia.h>
 
 #include <stdint.h>
+#include <memory>
 #include <vector>
 
 #include "base/containers/flat_map.h"
@@ -20,6 +21,8 @@
 
 namespace media {
 
+class MediaLog;
+
 class MEDIA_GPU_EXPORT VideoToolboxH264Accelerator
     : public H264Decoder::H264Accelerator {
  public:
@@ -28,7 +31,9 @@
                                    scoped_refptr<CodecPicture>)>;
   using OutputCB = base::RepeatingCallback<void(scoped_refptr<CodecPicture>)>;
 
-  VideoToolboxH264Accelerator(DecodeCB decode_cb, OutputCB output_cb);
+  VideoToolboxH264Accelerator(std::unique_ptr<MediaLog> media_log,
+                              DecodeCB decode_cb,
+                              OutputCB output_cb);
   ~VideoToolboxH264Accelerator() override;
 
   // H264Accelerator implementation.
@@ -57,6 +62,8 @@
   void Reset() override;
 
  private:
+  std::unique_ptr<MediaLog> media_log_;
+
   // Callbacks are called synchronously, which is always re-entrant.
   DecodeCB decode_cb_;
   OutputCB output_cb_;
diff --git a/media/gpu/mac/video_toolbox_h264_accelerator_unittest.cc b/media/gpu/mac/video_toolbox_h264_accelerator_unittest.cc
index 6f9151a6..2df33b3 100644
--- a/media/gpu/mac/video_toolbox_h264_accelerator_unittest.cc
+++ b/media/gpu/mac/video_toolbox_h264_accelerator_unittest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 
 #include "base/containers/span.h"
+#include "media/base/media_util.h"
 #include "media/gpu/codec_picture.h"
 #include "media/gpu/mac/video_toolbox_h264_accelerator.h"
 #include "media/video/h264_parser.h"
@@ -15,8 +16,6 @@
 
 using testing::_;
 using testing::ElementsAre;
-using testing::Eq;
-using testing::Not;
 using testing::SaveArg;
 
 namespace {
@@ -52,6 +51,7 @@
 
   std::unique_ptr<VideoToolboxH264Accelerator> accelerator_{
       std::make_unique<VideoToolboxH264Accelerator>(
+          std::make_unique<NullMediaLog>(),
           base::BindRepeating(&VideoToolboxH264AcceleratorTest::OnDecode,
                               base::Unretained(this)),
           base::BindRepeating(&VideoToolboxH264AcceleratorTest::OnOutput,
diff --git a/media/gpu/mac/video_toolbox_video_decoder.cc b/media/gpu/mac/video_toolbox_video_decoder.cc
index a9cafd5..87205c67 100644
--- a/media/gpu/mac/video_toolbox_video_decoder.cc
+++ b/media/gpu/mac/video_toolbox_video_decoder.cc
@@ -16,6 +16,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/memory/scoped_policy.h"
 #include "base/task/bind_post_task.h"
+#include "media/base/decoder_status.h"
 #include "media/base/media_log.h"
 #include "media/base/video_frame.h"
 #include "media/gpu/accelerated_video_decoder.h"
@@ -86,33 +87,30 @@
   DVLOG(1) << __func__;
   DCHECK(config.IsValidConfig());
 
-  if (has_error_) {
+  if (!has_error_) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(init_cb), DecoderStatus::Codes::kFailed));
     return;
   }
 
+  // Make |init_cb| available to NotifyError().
+  init_cb_ = std::move(init_cb);
+
   if (!IsSupportedProfile(config.profile())) {
-    task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(std::move(init_cb),
-                                  DecoderStatus::Codes::kUnsupportedProfile));
-    NotifyError();
+    NotifyError(DecoderStatus::Codes::kUnsupportedProfile);
     return;
   }
 
   if (config.is_encrypted()) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(std::move(init_cb),
-                       DecoderStatus::Codes::kUnsupportedEncryptionMode));
-    NotifyError();
+    NotifyError(DecoderStatus::Codes::kUnsupportedEncryptionMode);
     return;
   }
 
   if (!accelerator_) {
     accelerator_ = std::make_unique<H264Decoder>(
         std::make_unique<VideoToolboxH264Accelerator>(
+            media_log_->Clone(),
             base::BindRepeating(&VideoToolboxVideoDecoder::OnAcceleratorDecode,
                                 base::Unretained(this)),
             base::BindRepeating(&VideoToolboxVideoDecoder::OnAcceleratorOutput,
@@ -120,22 +118,19 @@
         config.profile(), config.color_space_info());
 
     video_toolbox_ = std::make_unique<VideoToolboxDecompressionInterface>(
-        task_runner_,
+        task_runner_, media_log_->Clone(),
         base::BindRepeating(&VideoToolboxVideoDecoder::OnVideoToolboxOutput,
                             base::Unretained(this)),
         base::BindRepeating(&VideoToolboxVideoDecoder::OnVideoToolboxError,
                             base::Unretained(this)));
 
     converter_ = base::MakeRefCounted<VideoToolboxFrameConverter>(
-        gpu_task_runner_, std::move(get_stub_cb_));
+        gpu_task_runner_, media_log_->Clone(), std::move(get_stub_cb_));
   } else {
     // TODO(crbug.com/1331597): Support codec changes.
     // TODO(crbug.com/1331597): Handle color space changes.
     if (config.codec() != config_.codec()) {
-      task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(std::move(init_cb), DecoderStatus::Codes::kFailed));
-      NotifyError();
+      NotifyError(DecoderStatus::Codes::kCantChangeCodec);
       return;
     }
   }
@@ -143,8 +138,8 @@
   config_ = config;
   output_cb_ = output_cb;
 
-  task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(std::move(init_cb), DecoderStatus::Codes::kOk));
+  task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(init_cb_),
+                                                   DecoderStatus::Codes::kOk));
 }
 
 void VideoToolboxVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -161,7 +156,7 @@
   if (buffer->end_of_stream()) {
     flush_cb_ = std::move(decode_cb);
     if (!accelerator_->Flush()) {
-      NotifyError();
+      NotifyError(DecoderStatus::Codes::kMalformedBitstream);
       return;
     }
     ProcessOutputs();
@@ -182,7 +177,8 @@
       case AcceleratedVideoDecoder::kRanOutOfSurfaces:
       case AcceleratedVideoDecoder::kNeedContextUpdate:
       case AcceleratedVideoDecoder::kTryAgain:
-        NotifyError();
+        // More specific reasons are logged to the media log.
+        NotifyError(DecoderStatus::Codes::kMalformedBitstream);
         return;
 
       case AcceleratedVideoDecoder::kConfigChange:
@@ -210,7 +206,7 @@
   task_runner_->PostTask(FROM_HERE, std::move(reset_cb));
 }
 
-void VideoToolboxVideoDecoder::NotifyError() {
+void VideoToolboxVideoDecoder::NotifyError(DecoderStatus status) {
   DVLOG(1) << __func__;
 
   if (has_error_) {
@@ -218,12 +214,17 @@
   }
 
   has_error_ = true;
-  ResetInternal(DecoderStatus::Codes::kFailed);
+  ResetInternal(status);
 }
 
 void VideoToolboxVideoDecoder::ResetInternal(DecoderStatus status) {
   DVLOG(4) << __func__;
 
+  if (init_cb_) {
+    task_runner_->PostTask(FROM_HERE,
+                           base::BindOnce(std::move(init_cb_), status));
+  }
+
   while (!decode_cbs_.empty()) {
     task_runner_->PostTask(
         FROM_HERE, base::BindOnce(std::move(decode_cbs_.front()), status));
@@ -328,9 +329,9 @@
   ReleaseDecodeCallbacks();
 }
 
-void VideoToolboxVideoDecoder::OnVideoToolboxError() {
+void VideoToolboxVideoDecoder::OnVideoToolboxError(DecoderStatus status) {
   DVLOG(1) << __func__;
-  NotifyError();
+  NotifyError(std::move(status));
 }
 
 void VideoToolboxVideoDecoder::OnConverterOutput(
@@ -343,7 +344,8 @@
   }
 
   if (!frame) {
-    NotifyError();
+    // More specific reasons are logged to the media log.
+    NotifyError(DecoderStatus::Codes::kFailedToGetVideoFrame);
     return;
   }
 
diff --git a/media/gpu/mac/video_toolbox_video_decoder.h b/media/gpu/mac/video_toolbox_video_decoder.h
index 8c2ea522..337873c 100644
--- a/media/gpu/mac/video_toolbox_video_decoder.h
+++ b/media/gpu/mac/video_toolbox_video_decoder.h
@@ -14,6 +14,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/queue.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
 #include "base/mac/scoped_cftyperef.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/task/sequenced_task_runner.h"
@@ -63,7 +64,7 @@
 
  private:
   // Shut down and enter a permanent error state.
-  void NotifyError();
+  void NotifyError(DecoderStatus status);
 
   // Drop all state, calling decode callbacks with |status|.
   void ResetInternal(DecoderStatus status);
@@ -82,7 +83,7 @@
   // |video_toolbox_| callbacks.
   void OnVideoToolboxOutput(base::ScopedCFTypeRef<CVImageBufferRef> image,
                             void* context);
-  void OnVideoToolboxError();
+  void OnVideoToolboxError(DecoderStatus status);
 
   // |converter_| callbacks.
   void OnConverterOutput(scoped_refptr<VideoFrame> frame, void* context);
@@ -92,10 +93,10 @@
   scoped_refptr<base::SequencedTaskRunner> gpu_task_runner_;
   GetCommandBufferStubCB get_stub_cb_;
 
-  // TODO(crbug.com/1331597): Store a DecoderStatus to report to future
-  // calls, and log errors to the MediaLog.
   bool has_error_ = false;
+
   VideoDecoderConfig config_;
+  InitCB init_cb_;
   OutputCB output_cb_;
   DecodeCB flush_cb_;
 
diff --git a/media/mojo/clients/mojo_cdm.cc b/media/mojo/clients/mojo_cdm.cc
index d5b0d87..464fce5 100644
--- a/media/mojo/clients/mojo_cdm.cc
+++ b/media/mojo/clients/mojo_cdm.cc
@@ -37,16 +37,8 @@
                         connection_error_happened);
 }
 
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class CallbackTimeoutStatus {
-  kCreate = 0,
-  kTimeout = 1,
-  kDestructedBeforeTimeout = 2,
-  kMaxValue = kDestructedBeforeTimeout,
-};
-
-void OnCallbackTimeout(const std::string uma_name, bool called_on_destruction) {
+void OnCallbackTimeout(const std::string& uma_name,
+                       bool called_on_destruction) {
   DVLOG(1) << "Callback Timeout: " << uma_name
            << ", called_on_destruction=" << called_on_destruction;
   base::UmaHistogramEnumeration(
diff --git a/net/cookies/cookie_util.cc b/net/cookies/cookie_util.cc
index f4859b3..f4004f8f 100644
--- a/net/cookies/cookie_util.cc
+++ b/net/cookies/cookie_util.cc
@@ -1006,7 +1006,9 @@
 }
 
 NET_EXPORT bool IsForceThirdPartyCookieBlockingEnabled() {
-  return base::FeatureList::IsEnabled(features::kForceThirdPartyCookieBlocking);
+  return base::FeatureList::IsEnabled(
+             features::kForceThirdPartyCookieBlocking) &&
+         base::FeatureList::IsEnabled(features::kThirdPartyStoragePartitioning);
 }
 
 }  // namespace net::cookie_util
diff --git a/net/cookies/cookie_util.h b/net/cookies/cookie_util.h
index 8c7ecff..82bba3e6 100644
--- a/net/cookies/cookie_util.h
+++ b/net/cookies/cookie_util.h
@@ -333,7 +333,7 @@
 
 // Returns the default third-party cookie blocking setting, which is false
 // unless you enable ForceThirdPartyCookieBlocking with the command line switch
-// --block-third-party-cookies.
+// --test-third-party-cookie-phaseout.
 NET_EXPORT bool IsForceThirdPartyCookieBlockingEnabled();
 
 }  // namespace cookie_util
diff --git a/services/data_decoder/data_decoder_service.cc b/services/data_decoder/data_decoder_service.cc
index 65c82e2..a0545bc 100644
--- a/services/data_decoder/data_decoder_service.cc
+++ b/services/data_decoder/data_decoder_service.cc
@@ -13,6 +13,7 @@
 #include "components/web_package/web_bundle_parser_factory.h"
 #include "mojo/public/cpp/bindings/generic_pending_receiver.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "services/data_decoder/cbor_parser_impl.h"
 #include "services/data_decoder/gzipper.h"
 #include "services/data_decoder/json_parser_impl.h"
 #include "services/data_decoder/public/mojom/image_decoder.mojom.h"
@@ -92,6 +93,12 @@
   mojo::MakeSelfOwnedReceiver(std::make_unique<Gzipper>(), std::move(receiver));
 }
 
+void DataDecoderService::BindCborParser(
+    mojo::PendingReceiver<mojom::CborParser> receiver) {
+  mojo::MakeSelfOwnedReceiver(std::make_unique<CborParserImpl>(),
+                              std::move(receiver));
+}
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void DataDecoderService::BindBleScanParser(
     mojo::PendingReceiver<mojom::BleScanParser> receiver) {
diff --git a/services/data_decoder/data_decoder_service.h b/services/data_decoder/data_decoder_service.h
index d081862..bc95284 100644
--- a/services/data_decoder/data_decoder_service.h
+++ b/services/data_decoder/data_decoder_service.h
@@ -9,6 +9,7 @@
 #include "components/web_package/mojom/web_bundle_parser.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "services/data_decoder/public/mojom/cbor_parser.mojom.h"
 #include "services/data_decoder/public/mojom/data_decoder_service.mojom.h"
 #include "services/data_decoder/public/mojom/gzipper.mojom.h"
 #include "services/data_decoder/public/mojom/image_decoder.mojom.h"
@@ -72,6 +73,8 @@
       mojo::PendingReceiver<web_package::mojom::WebBundleParserFactory>
           receiver) override;
   void BindGzipper(mojo::PendingReceiver<mojom::Gzipper> receiver) override;
+  void BindCborParser(
+      mojo::PendingReceiver<mojom::CborParser> receiver) override;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   void BindBleScanParser(
diff --git a/services/data_decoder/public/cpp/data_decoder.cc b/services/data_decoder/public/cpp/data_decoder.cc
index 2c9bf0c..461775f 100644
--- a/services/data_decoder/public/cpp/data_decoder.cc
+++ b/services/data_decoder/public/cpp/data_decoder.cc
@@ -19,6 +19,7 @@
 #include "build/blink_buildflags.h"
 #include "build/build_config.h"
 #include "net/http/structured_headers.h"
+#include "services/data_decoder/public/mojom/cbor_parser.mojom.h"
 #include "services/data_decoder/public/mojom/gzipper.mojom.h"
 #include "services/data_decoder/public/mojom/json_parser.mojom.h"
 #include "services/data_decoder/public/mojom/structured_headers_parser.mojom.h"
@@ -415,4 +416,34 @@
                      request));
 }
 
+void DataDecoder::ParseCbor(base::span<const uint8_t> data,
+                            ValueParseCallback callback) {
+  auto request =
+      base::MakeRefCounted<ValueParseRequest<mojom::CborParser, base::Value>>(
+          std::move(callback), cancel_requests_);
+  GetService()->BindCborParser(request->BindRemote());
+  request->remote()->Parse(
+      data,
+      base::BindOnce(&ValueParseRequest<mojom::CborParser,
+                                        base::Value>::OnServiceValueOrError,
+                     request));
+}
+
+// static
+void DataDecoder::ParseCborIsolated(base::span<const uint8_t> data,
+                                    ValueParseCallback callback) {
+  auto decoder = std::make_unique<DataDecoder>();
+  auto* raw_decoder = decoder.get();
+
+  // We bind the DataDecoder's ownership into the result callback to ensure that
+  // it stays alive until the operation is complete.
+  raw_decoder->ParseCbor(
+      data, base::BindOnce(
+                [](std::unique_ptr<DataDecoder>, ValueParseCallback callback,
+                   ValueOrError result) {
+                  std::move(callback).Run(std::move(result));
+                },
+                std::move(decoder), std::move(callback)));
+}
+
 }  // namespace data_decoder
diff --git a/services/data_decoder/public/cpp/data_decoder.h b/services/data_decoder/public/cpp/data_decoder.h
index 77efe71d..6adc821 100644
--- a/services/data_decoder/public/cpp/data_decoder.h
+++ b/services/data_decoder/public/cpp/data_decoder.h
@@ -175,6 +175,25 @@
   // or fails before this DataDecoder is destroyed.
   void GzipUncompress(base::span<const uint8_t> data, GzipperCallback callback);
 
+  // Parses the potentially unsafe CBOR bytes in |cbor| using this
+  // DataDecoder's service instance or some other platform-specific decoding
+  // facility. The parser conforms to RFC 7049, except a few limitations:
+  // - Does not support null or undefined values.
+  // - Integers must fit in the 'int' type.
+  // - Does not support float values (limitations in components/cbor library).
+  // - The keys in Maps must be a string or byte-string.
+  // - If at least one Map key is invalid, an error will be returned.
+  //
+  // Note that |callback| will only be called if the parsing operation succeeds
+  // or fails before this DataDecoder is destroyed.
+  void ParseCbor(base::span<const uint8_t> cbor, ValueParseCallback callback);
+
+  // Parses the potentially unsafe CBOR bytes in |cbor|. This static helper
+  // uses a dedicated instance of the Data Decoder service on applicable
+  // platforms.
+  static void ParseCborIsolated(base::span<const uint8_t> cbor,
+                                ValueParseCallback callback);
+
  private:
   // The amount of idle time to tolerate on a DataDecoder instance. If the
   // instance is unused for this period of time, the underlying service process
diff --git a/services/data_decoder/public/cpp/data_decoder_unittest.cc b/services/data_decoder/public/cpp/data_decoder_unittest.cc
index 8c3bab3..538090d 100644
--- a/services/data_decoder/public/cpp/data_decoder_unittest.cc
+++ b/services/data_decoder/public/cpp/data_decoder_unittest.cc
@@ -12,8 +12,11 @@
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
+#include "base/types/expected.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
+#include "services/data_decoder/public/mojom/cbor_parser.mojom.h"
 #include "services/data_decoder/public/mojom/json_parser.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -28,7 +31,7 @@
   test::InProcessDataDecoder in_process_data_decoder_;
 };
 
-TEST_F(DataDecoderTest, Reuse) {
+TEST_F(DataDecoderTest, ReuseJson) {
   // Verify that a single DataDecoder with concurrent interface connections will
   // only use one service instance.
 
@@ -47,7 +50,7 @@
   EXPECT_EQ(1u, service().receivers().size());
 }
 
-TEST_F(DataDecoderTest, Isolation) {
+TEST_F(DataDecoderTest, IsolationJson) {
   // Verify that separate DataDecoder instances make separate connections to the
   // service.
 
@@ -66,6 +69,83 @@
   EXPECT_EQ(2u, service().receivers().size());
 }
 
+TEST_F(DataDecoderTest, ReuseCbor) {
+  // Verify that a single DataDecoder with concurrent interface connections will
+  // only use one service instance.
+  DataDecoder decoder;
+  mojo::Remote<mojom::CborParser> parser1;
+  decoder.GetService()->BindCborParser(parser1.BindNewPipeAndPassReceiver());
+  parser1.FlushForTesting();
+  EXPECT_TRUE(parser1.is_connected());
+  EXPECT_EQ(1u, service().receivers().size());
+
+  mojo::Remote<mojom::CborParser> parser2;
+  decoder.GetService()->BindCborParser(parser2.BindNewPipeAndPassReceiver());
+  parser2.FlushForTesting();
+  EXPECT_TRUE(parser1.is_connected());
+  EXPECT_TRUE(parser2.is_connected());
+  EXPECT_EQ(1u, service().receivers().size());
+}
+
+TEST_F(DataDecoderTest, IsolationCbor) {
+  // Verify that separate DataDecoder instances make separate connections to the
+  // service.
+  DataDecoder decoder1;
+  mojo::Remote<mojom::CborParser> parser1;
+  decoder1.GetService()->BindCborParser(parser1.BindNewPipeAndPassReceiver());
+  parser1.FlushForTesting();
+  EXPECT_TRUE(parser1.is_connected());
+  EXPECT_EQ(1u, service().receivers().size());
+
+  DataDecoder decoder2;
+  mojo::Remote<mojom::CborParser> parser2;
+  decoder2.GetService()->BindCborParser(parser2.BindNewPipeAndPassReceiver());
+  parser2.FlushForTesting();
+  EXPECT_TRUE(parser2.is_connected());
+  EXPECT_EQ(2u, service().receivers().size());
+}
+
+TEST_F(DataDecoderTest, ParseCborToInteger) {
+  base::RunLoop run_loop;
+  DataDecoder decoder;
+  DataDecoder::ValueOrError result;
+  // 100
+  std::vector<uint8_t> input = {0x18, 0x64};
+
+  decoder.ParseCborIsolated(
+      input,
+      base::BindLambdaForTesting(
+          [&run_loop, &result](DataDecoder::ValueOrError value_or_error) {
+            result = std::move(value_or_error);
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+
+  ASSERT_TRUE(result.has_value());
+  ASSERT_TRUE(result->is_int());
+  ASSERT_EQ(result->GetInt(), 100);
+}
+
+TEST_F(DataDecoderTest, ParseCborAndFailed) {
+  base::RunLoop run_loop;
+  DataDecoder decoder;
+  DataDecoder::ValueOrError result;
+  // Null
+  std::vector<uint8_t> input = {0xF6};
+
+  decoder.ParseCborIsolated(
+      input,
+      base::BindLambdaForTesting(
+          [&run_loop, &result](DataDecoder::ValueOrError value_or_error) {
+            result = std::move(value_or_error);
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+
+  ASSERT_FALSE(result.has_value());
+  ASSERT_EQ(result.error(), "Error unexpected CBOR value.");
+}
+
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(BUILD_RUST_JSON_READER)
 
 class DataDecoderMultiThreadTest : public testing::Test {
diff --git a/services/data_decoder/public/mojom/data_decoder_service.mojom b/services/data_decoder/public/mojom/data_decoder_service.mojom
index 254d8a5..31cb918 100644
--- a/services/data_decoder/public/mojom/data_decoder_service.mojom
+++ b/services/data_decoder/public/mojom/data_decoder_service.mojom
@@ -6,6 +6,7 @@
 
 import "components/web_package/mojom/web_bundle_parser.mojom";
 import "sandbox/policy/mojom/sandbox.mojom";
+import "services/data_decoder/public/mojom/cbor_parser.mojom";
 import "services/data_decoder/public/mojom/gzipper.mojom";
 import "services/data_decoder/public/mojom/image_decoder.mojom";
 import "services/data_decoder/public/mojom/json_parser.mojom";
@@ -42,4 +43,7 @@
 
   // Binds an interface which can be used to parse structured headers.
   BindStructuredHeadersParser(pending_receiver<StructuredHeadersParser> receiver);
+
+  // Binds an interface which can be used to parse CBOR data.
+  BindCborParser(pending_receiver<CborParser> receiver);
 };
diff --git a/services/network/cookie_settings_unittest.cc b/services/network/cookie_settings_unittest.cc
index a53131c0..9e642f2 100644
--- a/services/network/cookie_settings_unittest.cc
+++ b/services/network/cookie_settings_unittest.cc
@@ -1291,8 +1291,12 @@
 
 TEST_P(CookieSettingsTest, ForceThirdPartyCookieBlocking) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      net::features::kForceThirdPartyCookieBlocking);
+  feature_list.InitWithFeatures(
+      {
+          net::features::kForceThirdPartyCookieBlocking,
+          net::features::kThirdPartyStoragePartitioning,
+      },
+      {});
 
   CookieSettings settings;
   EXPECT_TRUE(settings.are_third_party_cookies_blocked());
diff --git a/services/network/public/cpp/network_switches.cc b/services/network/public/cpp/network_switches.cc
index 97914ca..9b41edc 100644
--- a/services/network/public/cpp/network_switches.cc
+++ b/services/network/public/cpp/network_switches.cc
@@ -6,8 +6,6 @@
 
 namespace network::switches {
 
-const char kBlockThirdPartyCookies[] = "block-third-party-cookies";
-
 // Forces Network Quality Estimator (NQE) to return a specific effective
 // connection type.
 const char kForceEffectiveConnectionType[] = "force-effective-connection-type";
@@ -75,6 +73,8 @@
 // for the format.
 const char kSSLKeyLogFile[] = "ssl-key-log-file";
 
+const char kTestThirdPartyCookiePhaseout[] = "test-third-party-cookie-phaseout";
+
 // Treat given (insecure) origins as secure origins. Multiple origins can be
 // supplied as a comma-separated list. For the definition of secure contexts,
 // see https://w3c.github.io/webappsec-secure-contexts/ and
diff --git a/services/network/public/cpp/network_switches.h b/services/network/public/cpp/network_switches.h
index 598dd71..348f46f 100644
--- a/services/network/public/cpp/network_switches.h
+++ b/services/network/public/cpp/network_switches.h
@@ -11,7 +11,6 @@
 
 namespace switches {
 
-COMPONENT_EXPORT(NETWORK_CPP) extern const char kBlockThirdPartyCookies[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kForceEffectiveConnectionType[];
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const char kHostResolverRules[];
@@ -25,6 +24,7 @@
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kLogNetLog[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kNetLogCaptureMode[];
 COMPONENT_EXPORT(NETWORK_CPP) extern const char kSSLKeyLogFile[];
+COMPONENT_EXPORT(NETWORK_CPP) extern const char kTestThirdPartyCookiePhaseout[];
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const char kUnsafelyTreatInsecureOriginAsSecure[];
 COMPONENT_EXPORT(NETWORK_CPP)
diff --git a/styleguide/web/web.md b/styleguide/web/web.md
index 09b0887..4a24223 100644
--- a/styleguide/web/web.md
+++ b/styleguide/web/web.md
@@ -296,8 +296,7 @@
 
 ## JavaScript/TypeScript
 
-New WebUI code (except for ChromeOS specific code) should be written in
-TypeScript.
+New WebUI code should be written in TypeScript.
 
 ### Style
 
@@ -341,10 +340,11 @@
   feature when the code needs to handle null/undefined gracefully.
 
 
-### Closure compiler (ChromeOS Ash code only)
+### Closure compiler (legacy ChromeOS Ash code only)
 
-* Closure compiler can only be used on ChromeOS Ash. All other platforms
-  are required to use TypeScript to add type checking.
+* Closure compiler can only be used on legacy ChromeOS Ash code. All other
+  platforms and new ChromeOS code are required to use TypeScript to add type
+  checking.
 
 * Use the [closure
   compiler](https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md)
diff --git a/testing/buildbot/chromium.cft.json b/testing/buildbot/chromium.cft.json
index 0e0f89e8f5..7d41615 100644
--- a/testing/buildbot/chromium.cft.json
+++ b/testing/buildbot/chromium.cft.json
@@ -4345,7 +4345,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4363,7 +4363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4381,7 +4381,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4400,7 +4400,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4418,7 +4418,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4436,7 +4436,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4454,7 +4454,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4472,7 +4472,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4490,7 +4490,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4509,7 +4509,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4527,7 +4527,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4545,7 +4545,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4567,7 +4567,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4589,7 +4589,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4607,7 +4607,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4625,7 +4625,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4643,7 +4643,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4661,7 +4661,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4679,7 +4679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4697,7 +4697,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4715,7 +4715,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4733,7 +4733,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4752,7 +4752,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4770,7 +4770,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4788,7 +4788,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4806,7 +4806,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4824,7 +4824,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4842,7 +4842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4860,7 +4860,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4878,7 +4878,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4897,7 +4897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4915,7 +4915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4933,7 +4933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4951,7 +4951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4969,7 +4969,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4987,7 +4987,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5005,7 +5005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5023,7 +5023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5041,7 +5041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5059,7 +5059,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5077,7 +5077,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5095,7 +5095,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5113,7 +5113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5134,7 +5134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -5153,7 +5153,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5171,7 +5171,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5190,7 +5190,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5208,7 +5208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5226,7 +5226,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5244,7 +5244,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5262,7 +5262,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5280,7 +5280,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5298,7 +5298,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5316,7 +5316,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5334,7 +5334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5352,7 +5352,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5370,7 +5370,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5388,7 +5388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5406,7 +5406,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5424,7 +5424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5442,7 +5442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5460,7 +5460,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5478,7 +5478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5496,7 +5496,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5514,7 +5514,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5532,7 +5532,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5550,7 +5550,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5568,7 +5568,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5586,7 +5586,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5604,7 +5604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5623,7 +5623,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -5642,7 +5642,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5660,7 +5660,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5678,7 +5678,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5696,7 +5696,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5714,7 +5714,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5732,7 +5732,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5750,7 +5750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5768,7 +5768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5787,7 +5787,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5805,7 +5805,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5830,7 +5830,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5862,7 +5862,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -5889,7 +5889,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5908,7 +5908,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5933,7 +5933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5956,7 +5956,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5979,7 +5979,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6001,7 +6001,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6023,7 +6023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6045,7 +6045,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "idempotent": false,
@@ -6072,7 +6072,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "idempotent": false,
@@ -6100,7 +6100,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "idempotent": false,
@@ -6127,7 +6127,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index bc3bfcd8..7530ca8 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -2345,7 +2345,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -2417,7 +2417,7 @@
             {
               "cpu": "x86-64",
               "device": "iPhone9,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "expiration": 21600,
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 908978b..67dd49f 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -10274,7 +10274,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10327,7 +10327,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10380,7 +10380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10433,7 +10433,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10486,7 +10486,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10539,7 +10539,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10592,7 +10592,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10645,7 +10645,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10698,7 +10698,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10751,7 +10751,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10804,7 +10804,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10857,7 +10857,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10910,7 +10910,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10963,7 +10963,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11016,7 +11016,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11069,7 +11069,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11122,7 +11122,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11175,7 +11175,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11228,7 +11228,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11281,7 +11281,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11334,7 +11334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11387,7 +11387,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11440,7 +11440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11493,7 +11493,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11546,7 +11546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11599,7 +11599,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11652,7 +11652,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11705,7 +11705,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11758,7 +11758,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11811,7 +11811,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11864,7 +11864,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11917,7 +11917,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11970,7 +11970,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12023,7 +12023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12076,7 +12076,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12129,7 +12129,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12182,7 +12182,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12235,7 +12235,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12288,7 +12288,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12341,7 +12341,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12394,7 +12394,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12447,7 +12447,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12501,7 +12501,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12555,7 +12555,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12609,7 +12609,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12663,7 +12663,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12717,7 +12717,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12771,7 +12771,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12825,7 +12825,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12879,7 +12879,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12933,7 +12933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12988,7 +12988,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13043,7 +13043,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13098,7 +13098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13153,7 +13153,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13208,7 +13208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13263,7 +13263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13318,7 +13318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13373,7 +13373,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13428,7 +13428,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13483,7 +13483,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13538,7 +13538,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13593,7 +13593,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13648,7 +13648,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13703,7 +13703,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13758,7 +13758,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13813,7 +13813,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13868,7 +13868,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13923,7 +13923,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13978,7 +13978,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14033,7 +14033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14088,7 +14088,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14143,7 +14143,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14198,7 +14198,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14253,7 +14253,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14307,7 +14307,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14361,7 +14361,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14415,7 +14415,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14469,7 +14469,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14523,7 +14523,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14577,7 +14577,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14631,7 +14631,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14685,7 +14685,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14740,7 +14740,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14795,7 +14795,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14850,7 +14850,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14905,7 +14905,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14960,7 +14960,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15015,7 +15015,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15070,7 +15070,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15124,7 +15124,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15177,7 +15177,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15230,7 +15230,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15283,7 +15283,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15336,7 +15336,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15389,7 +15389,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15442,7 +15442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15495,7 +15495,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15548,7 +15548,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15601,7 +15601,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15655,7 +15655,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15710,7 +15710,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15765,7 +15765,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15820,7 +15820,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15875,7 +15875,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15930,7 +15930,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15985,7 +15985,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16040,7 +16040,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16094,7 +16094,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16147,7 +16147,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16200,7 +16200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16254,7 +16254,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16308,7 +16308,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16361,7 +16361,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16415,7 +16415,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16469,7 +16469,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16523,7 +16523,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16577,7 +16577,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16631,7 +16631,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16685,7 +16685,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16739,7 +16739,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16793,7 +16793,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16846,7 +16846,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16899,7 +16899,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16952,7 +16952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17005,7 +17005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17058,7 +17058,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17111,7 +17111,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17164,7 +17164,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17217,7 +17217,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17270,7 +17270,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17323,7 +17323,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17376,7 +17376,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17429,7 +17429,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17483,7 +17483,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17537,7 +17537,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17591,7 +17591,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17645,7 +17645,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17699,7 +17699,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17753,7 +17753,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17807,7 +17807,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17861,7 +17861,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17914,7 +17914,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17967,7 +17967,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18020,7 +18020,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18073,7 +18073,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18126,7 +18126,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18179,7 +18179,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18232,7 +18232,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18285,7 +18285,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18338,7 +18338,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18391,7 +18391,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18444,7 +18444,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18497,7 +18497,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18550,7 +18550,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18603,7 +18603,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18656,7 +18656,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18709,7 +18709,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18762,7 +18762,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18815,7 +18815,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18868,7 +18868,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18921,7 +18921,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18974,7 +18974,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19027,7 +19027,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19080,7 +19080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19133,7 +19133,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19186,7 +19186,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19239,7 +19239,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19292,7 +19292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19345,7 +19345,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19398,7 +19398,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19451,7 +19451,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19504,7 +19504,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19557,7 +19557,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19610,7 +19610,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19663,7 +19663,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19716,7 +19716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19769,7 +19769,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19822,7 +19822,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19875,7 +19875,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19928,7 +19928,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19981,7 +19981,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20034,7 +20034,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20087,7 +20087,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20140,7 +20140,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20193,7 +20193,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20246,7 +20246,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20299,7 +20299,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20352,7 +20352,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20405,7 +20405,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20458,7 +20458,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20511,7 +20511,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20564,7 +20564,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20617,7 +20617,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20670,7 +20670,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20723,7 +20723,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20776,7 +20776,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20829,7 +20829,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20882,7 +20882,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20935,7 +20935,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -26529,7 +26529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26547,7 +26547,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26565,7 +26565,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26584,7 +26584,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26602,7 +26602,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26620,7 +26620,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26638,7 +26638,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26656,7 +26656,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26674,7 +26674,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26693,7 +26693,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26711,7 +26711,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26729,7 +26729,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26750,7 +26750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26768,7 +26768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26786,7 +26786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26804,7 +26804,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26822,7 +26822,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26840,7 +26840,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26858,7 +26858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26876,7 +26876,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26897,7 +26897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -26916,7 +26916,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26934,7 +26934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26952,7 +26952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26970,7 +26970,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -26988,7 +26988,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27006,7 +27006,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27024,7 +27024,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27042,7 +27042,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27061,7 +27061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27079,7 +27079,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27097,7 +27097,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27115,7 +27115,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27133,7 +27133,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27151,7 +27151,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27169,7 +27169,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27187,7 +27187,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27205,7 +27205,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27223,7 +27223,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27241,7 +27241,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27259,7 +27259,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27277,7 +27277,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27298,7 +27298,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -27317,7 +27317,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27335,7 +27335,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27354,7 +27354,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27372,7 +27372,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27390,7 +27390,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27408,7 +27408,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27426,7 +27426,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27444,7 +27444,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27462,7 +27462,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27480,7 +27480,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27498,7 +27498,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27516,7 +27516,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27534,7 +27534,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27552,7 +27552,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27570,7 +27570,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27588,7 +27588,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27606,7 +27606,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27624,7 +27624,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27642,7 +27642,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27660,7 +27660,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27678,7 +27678,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27696,7 +27696,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27714,7 +27714,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27732,7 +27732,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27750,7 +27750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27768,7 +27768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27786,7 +27786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27807,7 +27807,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -27826,7 +27826,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27844,7 +27844,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27862,7 +27862,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27880,7 +27880,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27898,7 +27898,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27916,7 +27916,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27934,7 +27934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27952,7 +27952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27971,7 +27971,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -27989,7 +27989,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.dev.json b/testing/buildbot/chromium.dev.json
index 867de27..34086d9 100644
--- a/testing/buildbot/chromium.dev.json
+++ b/testing/buildbot/chromium.dev.json
@@ -313,7 +313,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -330,7 +330,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -347,7 +347,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -364,7 +364,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -381,7 +381,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -398,7 +398,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 277a266c..ef3299e 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -4818,7 +4818,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -4869,7 +4869,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -4921,7 +4921,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -4972,7 +4972,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5023,7 +5023,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5074,7 +5074,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5125,7 +5125,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5176,7 +5176,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5227,7 +5227,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5278,7 +5278,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5329,7 +5329,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5380,7 +5380,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5431,7 +5431,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5482,7 +5482,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5533,7 +5533,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5584,7 +5584,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5637,7 +5637,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "expiration": 10800,
@@ -5692,7 +5692,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5743,7 +5743,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5794,7 +5794,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5845,7 +5845,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5896,7 +5896,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5947,7 +5947,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -5998,7 +5998,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6049,7 +6049,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6100,7 +6100,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6151,7 +6151,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6202,7 +6202,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6253,7 +6253,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6304,7 +6304,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6355,7 +6355,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6406,7 +6406,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6457,7 +6457,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6508,7 +6508,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6559,7 +6559,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6610,7 +6610,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6661,7 +6661,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6712,7 +6712,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6763,7 +6763,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6814,7 +6814,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6865,7 +6865,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6916,7 +6916,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -6967,7 +6967,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7018,7 +7018,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7069,7 +7069,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7120,7 +7120,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7171,7 +7171,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7222,7 +7222,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7273,7 +7273,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7324,7 +7324,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7375,7 +7375,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -7432,7 +7432,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7486,7 +7486,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7540,7 +7540,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7595,7 +7595,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7650,7 +7650,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7705,7 +7705,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7760,7 +7760,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7815,7 +7815,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7870,7 +7870,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7924,7 +7924,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -7978,7 +7978,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8033,7 +8033,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8088,7 +8088,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8143,7 +8143,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8198,7 +8198,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8252,7 +8252,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8306,7 +8306,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8360,7 +8360,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -8419,7 +8419,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8470,7 +8470,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8521,7 +8521,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8572,7 +8572,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8623,7 +8623,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8674,7 +8674,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8725,7 +8725,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8776,7 +8776,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8827,7 +8827,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8878,7 +8878,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8929,7 +8929,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -8980,7 +8980,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9031,7 +9031,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9082,7 +9082,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9133,7 +9133,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9184,7 +9184,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9235,7 +9235,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9286,7 +9286,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9340,7 +9340,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9394,7 +9394,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9448,7 +9448,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9502,7 +9502,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9557,7 +9557,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9612,7 +9612,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9667,7 +9667,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9722,7 +9722,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9777,7 +9777,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9832,7 +9832,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9887,7 +9887,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9942,7 +9942,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -9997,7 +9997,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10052,7 +10052,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10106,7 +10106,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10160,7 +10160,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10214,7 +10214,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10269,7 +10269,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10324,7 +10324,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10376,7 +10376,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10427,7 +10427,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10478,7 +10478,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10529,7 +10529,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10583,7 +10583,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10638,7 +10638,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10693,7 +10693,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10745,7 +10745,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10796,7 +10796,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10848,7 +10848,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10902,7 +10902,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -10956,7 +10956,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11010,7 +11010,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11061,7 +11061,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11112,7 +11112,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11163,7 +11163,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11214,7 +11214,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11265,7 +11265,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11319,7 +11319,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11373,7 +11373,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11427,7 +11427,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11481,7 +11481,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11532,7 +11532,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11583,7 +11583,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11634,7 +11634,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11685,7 +11685,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11736,7 +11736,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11787,7 +11787,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11838,7 +11838,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11889,7 +11889,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11940,7 +11940,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -11991,7 +11991,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12042,7 +12042,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12093,7 +12093,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12144,7 +12144,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12195,7 +12195,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12246,7 +12246,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12297,7 +12297,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12348,7 +12348,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12399,7 +12399,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12450,7 +12450,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12501,7 +12501,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12552,7 +12552,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12603,7 +12603,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12654,7 +12654,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12705,7 +12705,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12760,7 +12760,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12815,7 +12815,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12870,7 +12870,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12921,7 +12921,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12972,7 +12972,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13023,7 +13023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13074,7 +13074,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13125,7 +13125,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13176,7 +13176,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13227,7 +13227,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13278,7 +13278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13330,7 +13330,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13382,7 +13382,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13435,7 +13435,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13488,7 +13488,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13541,7 +13541,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13593,7 +13593,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13645,7 +13645,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13697,7 +13697,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13749,7 +13749,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13800,7 +13800,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13852,7 +13852,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13904,7 +13904,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13955,7 +13955,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14006,7 +14006,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14058,7 +14058,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14109,7 +14109,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14160,7 +14160,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14211,7 +14211,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14262,7 +14262,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14313,7 +14313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14364,7 +14364,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14415,7 +14415,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14466,7 +14466,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14517,7 +14517,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14574,7 +14574,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14627,7 +14627,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14680,7 +14680,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14733,7 +14733,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14786,7 +14786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14839,7 +14839,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14892,7 +14892,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14945,7 +14945,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14998,7 +14998,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15051,7 +15051,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15104,7 +15104,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15157,7 +15157,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15210,7 +15210,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15263,7 +15263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15316,7 +15316,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15369,7 +15369,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15422,7 +15422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15475,7 +15475,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15529,7 +15529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15583,7 +15583,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15637,7 +15637,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15692,7 +15692,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15747,7 +15747,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15802,7 +15802,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15857,7 +15857,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15912,7 +15912,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15967,7 +15967,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16021,7 +16021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16075,7 +16075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16130,7 +16130,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16184,7 +16184,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16237,7 +16237,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16291,7 +16291,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16346,7 +16346,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16400,7 +16400,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16453,7 +16453,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16506,7 +16506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16560,7 +16560,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16614,7 +16614,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16667,7 +16667,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16721,7 +16721,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16775,7 +16775,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16828,7 +16828,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16881,7 +16881,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16934,7 +16934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16987,7 +16987,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17041,7 +17041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17095,7 +17095,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17148,7 +17148,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17201,7 +17201,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17254,7 +17254,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17307,7 +17307,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17360,7 +17360,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17413,7 +17413,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17466,7 +17466,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17519,7 +17519,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17572,7 +17572,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17625,7 +17625,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17678,7 +17678,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17731,7 +17731,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17784,7 +17784,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17837,7 +17837,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17890,7 +17890,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17943,7 +17943,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17996,7 +17996,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18049,7 +18049,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18103,7 +18103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "expiration": 18000,
@@ -44394,7 +44394,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -44417,7 +44417,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -44439,7 +44439,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -44461,7 +44461,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chromium.tests.finch"
             }
           ],
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index dabe249..9b0f7dd 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -7043,7 +7043,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7061,7 +7061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7079,7 +7079,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7098,7 +7098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7116,7 +7116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7134,7 +7134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7152,7 +7152,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7170,7 +7170,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7188,7 +7188,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7207,7 +7207,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7225,7 +7225,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7243,7 +7243,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7262,7 +7262,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -7284,7 +7284,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7302,7 +7302,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7320,7 +7320,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7338,7 +7338,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7356,7 +7356,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7374,7 +7374,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7392,7 +7392,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7410,7 +7410,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7428,7 +7428,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -7447,7 +7447,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7465,7 +7465,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7483,7 +7483,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7501,7 +7501,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7519,7 +7519,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7537,7 +7537,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7555,7 +7555,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7573,7 +7573,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7592,7 +7592,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7610,7 +7610,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7628,7 +7628,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7646,7 +7646,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7664,7 +7664,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7682,7 +7682,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7700,7 +7700,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7718,7 +7718,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7736,7 +7736,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7754,7 +7754,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7772,7 +7772,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7790,7 +7790,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7808,7 +7808,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7826,7 +7826,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -7845,7 +7845,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7863,7 +7863,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7882,7 +7882,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7900,7 +7900,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7918,7 +7918,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7936,7 +7936,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7954,7 +7954,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7972,7 +7972,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7990,7 +7990,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8008,7 +8008,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8026,7 +8026,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8044,7 +8044,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8062,7 +8062,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8080,7 +8080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8098,7 +8098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8116,7 +8116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8134,7 +8134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8152,7 +8152,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8170,7 +8170,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8188,7 +8188,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8206,7 +8206,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8224,7 +8224,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8242,7 +8242,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8260,7 +8260,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8278,7 +8278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8296,7 +8296,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8315,7 +8315,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -8334,7 +8334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8352,7 +8352,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8370,7 +8370,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8388,7 +8388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8406,7 +8406,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8424,7 +8424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8442,7 +8442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8460,7 +8460,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8479,7 +8479,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8497,7 +8497,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8522,7 +8522,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8553,7 +8553,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -8585,7 +8585,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -8612,7 +8612,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8631,7 +8631,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8656,7 +8656,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8679,7 +8679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8702,7 +8702,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8724,7 +8724,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8743,7 +8743,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8765,7 +8765,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8787,7 +8787,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -8814,7 +8814,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -8842,7 +8842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -8866,7 +8866,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8891,7 +8891,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -8913,7 +8913,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -12478,8 +12478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12531,8 +12530,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12584,8 +12582,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12637,8 +12634,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12690,8 +12686,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12743,8 +12738,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12796,8 +12790,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12849,8 +12842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12902,8 +12894,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -12955,8 +12946,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13008,8 +12998,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13061,8 +13050,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13115,8 +13103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13169,8 +13156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13222,8 +13208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13275,8 +13260,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13328,8 +13312,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13382,8 +13365,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13435,8 +13417,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13488,8 +13469,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13541,8 +13521,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13595,8 +13574,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13648,8 +13626,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13701,8 +13678,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13754,8 +13730,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13807,8 +13782,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13860,8 +13834,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13913,8 +13886,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -13966,8 +13938,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14019,8 +13990,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14072,8 +14042,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14125,8 +14094,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14178,8 +14146,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14231,8 +14198,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14284,8 +14250,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14337,8 +14302,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14397,8 +14361,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14450,8 +14413,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14503,8 +14465,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14556,8 +14517,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14609,8 +14569,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14662,8 +14621,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14715,8 +14673,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14768,8 +14725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14821,8 +14777,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14874,8 +14829,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14927,8 +14881,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14980,8 +14933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15033,8 +14985,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15086,8 +15037,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15139,8 +15089,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15192,8 +15141,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15245,8 +15193,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15298,8 +15245,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15352,8 +15298,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15406,8 +15351,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15460,8 +15404,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15514,8 +15457,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15568,8 +15510,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15623,8 +15564,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15678,8 +15618,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15733,8 +15672,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15788,8 +15726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15843,8 +15780,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15898,8 +15834,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15953,8 +15888,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16008,8 +15942,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16063,8 +15996,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16118,8 +16050,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16173,8 +16104,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16228,8 +16158,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16282,8 +16211,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16336,8 +16264,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16390,8 +16317,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16444,8 +16370,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16499,8 +16424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16554,8 +16478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16609,8 +16532,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16663,8 +16585,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16716,8 +16637,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16769,8 +16689,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16822,8 +16741,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16876,8 +16794,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16931,8 +16848,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16986,8 +16902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17041,8 +16956,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17095,8 +17009,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17148,8 +17061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17202,8 +17114,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17256,8 +17167,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17310,8 +17220,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17364,8 +17273,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17418,8 +17326,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17471,8 +17378,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17524,8 +17430,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17577,8 +17482,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17630,8 +17534,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17683,8 +17586,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17737,8 +17639,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17791,8 +17692,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17845,8 +17745,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17899,8 +17798,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17952,8 +17850,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18005,8 +17902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18058,8 +17954,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18111,8 +18006,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18164,8 +18058,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18217,8 +18110,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18270,8 +18162,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18323,8 +18214,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18376,8 +18266,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18429,8 +18318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18482,8 +18370,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18535,8 +18422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18588,8 +18474,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18641,8 +18526,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18694,8 +18578,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18747,8 +18630,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18800,8 +18682,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18853,8 +18734,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18906,8 +18786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -18959,8 +18838,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19012,8 +18890,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19065,8 +18942,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19118,8 +18994,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19171,8 +19046,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19230,7 +19104,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19281,7 +19155,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19332,7 +19206,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19383,7 +19257,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19434,7 +19308,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19485,7 +19359,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19536,7 +19410,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19587,7 +19461,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19638,7 +19512,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19689,7 +19563,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19740,7 +19614,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19791,7 +19665,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19845,7 +19719,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19900,7 +19774,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -19954,7 +19828,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20008,7 +19882,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20063,7 +19937,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20118,7 +19992,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20174,7 +20048,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20229,7 +20103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20284,7 +20158,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20340,7 +20214,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20395,7 +20269,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20450,7 +20324,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20505,7 +20379,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20559,7 +20433,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20613,7 +20487,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20669,7 +20543,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20724,7 +20598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20776,7 +20650,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20827,7 +20701,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20878,7 +20752,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20929,7 +20803,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -20983,7 +20857,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21039,7 +20913,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21094,7 +20968,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21147,7 +21021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21201,7 +21075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21256,7 +21130,7 @@
             {
               "cpu": "x86-64",
               "mac_model": "Macmini8,1",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21310,7 +21184,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21361,7 +21235,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21412,7 +21286,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21463,7 +21337,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21514,7 +21388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21568,7 +21442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21622,7 +21496,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21673,7 +21547,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21724,7 +21598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21775,7 +21649,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21826,7 +21700,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21877,7 +21751,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21928,7 +21802,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -21979,7 +21853,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22030,7 +21904,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22081,7 +21955,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22132,7 +22006,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22183,7 +22057,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22234,7 +22108,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22285,7 +22159,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22336,7 +22210,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22387,7 +22261,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22438,7 +22312,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22489,7 +22363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22540,7 +22414,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22591,7 +22465,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -22642,7 +22516,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -24336,7 +24210,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24354,7 +24228,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24372,7 +24246,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24391,7 +24265,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24409,7 +24283,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24427,7 +24301,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24445,7 +24319,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24463,7 +24337,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24481,7 +24355,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24500,7 +24374,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24518,7 +24392,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24536,7 +24410,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24557,7 +24431,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24575,7 +24449,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24593,7 +24467,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24611,7 +24485,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24629,7 +24503,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24647,7 +24521,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24665,7 +24539,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24683,7 +24557,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24701,7 +24575,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -24720,7 +24594,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24738,7 +24612,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24756,7 +24630,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24774,7 +24648,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24792,7 +24666,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24810,7 +24684,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24828,7 +24702,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24846,7 +24720,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24864,7 +24738,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24882,7 +24756,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24900,7 +24774,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24918,7 +24792,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24936,7 +24810,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24954,7 +24828,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24972,7 +24846,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -24990,7 +24864,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25008,7 +24882,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25026,7 +24900,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25044,7 +24918,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25062,7 +24936,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25080,7 +24954,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -25099,7 +24973,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25117,7 +24991,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25135,7 +25009,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25153,7 +25027,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25171,7 +25045,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25189,7 +25063,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25207,7 +25081,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25225,7 +25099,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25243,7 +25117,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25261,7 +25135,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25279,7 +25153,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25297,7 +25171,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25315,7 +25189,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25333,7 +25207,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25351,7 +25225,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25369,7 +25243,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25387,7 +25261,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25405,7 +25279,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25423,7 +25297,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25441,7 +25315,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25459,7 +25333,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25477,7 +25351,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25495,7 +25369,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25513,7 +25387,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25531,7 +25405,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25549,7 +25423,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25567,7 +25441,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25585,7 +25459,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25603,7 +25477,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25621,7 +25495,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25639,7 +25513,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25657,7 +25531,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25675,7 +25549,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25693,7 +25567,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25712,7 +25586,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25730,7 +25604,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25755,7 +25629,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25786,7 +25660,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -25818,7 +25692,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -25845,7 +25719,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25864,7 +25738,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25889,7 +25763,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25912,7 +25786,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25935,7 +25809,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25954,7 +25828,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25976,7 +25850,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -25998,7 +25872,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -26024,7 +25898,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -26051,7 +25925,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index a984f77..a4f54d8 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -14684,7 +14684,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14735,7 +14735,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14786,7 +14786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14837,7 +14837,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14888,7 +14888,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14939,7 +14939,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -14990,7 +14990,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15041,7 +15041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15092,7 +15092,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15143,7 +15143,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15194,7 +15194,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15245,7 +15245,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15296,7 +15296,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15347,7 +15347,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15398,7 +15398,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15449,7 +15449,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15500,7 +15500,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15551,7 +15551,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15602,7 +15602,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15653,7 +15653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15704,7 +15704,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15755,7 +15755,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15806,7 +15806,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15858,7 +15858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15910,7 +15910,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -15961,7 +15961,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16012,7 +16012,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16063,7 +16063,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16114,7 +16114,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16165,7 +16165,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16216,7 +16216,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16267,7 +16267,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16318,7 +16318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16369,7 +16369,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16420,7 +16420,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16471,7 +16471,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16522,7 +16522,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16573,7 +16573,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16624,7 +16624,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16675,7 +16675,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16726,7 +16726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16777,7 +16777,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16828,7 +16828,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16879,7 +16879,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16930,7 +16930,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -16981,7 +16981,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17032,7 +17032,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -17083,7 +17083,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
diff --git a/testing/buildbot/chromium.rust.json b/testing/buildbot/chromium.rust.json
index f04fe66c..536aa39 100644
--- a/testing/buildbot/chromium.rust.json
+++ b/testing/buildbot/chromium.rust.json
@@ -750,7 +750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -770,7 +770,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -787,7 +787,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -804,7 +804,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -821,7 +821,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -839,7 +839,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -857,7 +857,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -878,7 +878,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index d1f203e..495cc227 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -381,7 +381,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -404,7 +404,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -424,7 +424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -447,7 +447,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -471,7 +471,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -491,7 +491,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -511,7 +511,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -726,7 +726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
@@ -777,7 +777,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "named_caches": [
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json
index 99754bd..ef00874 100644
--- a/testing/buildbot/chromium.webrtc.json
+++ b/testing/buildbot/chromium.webrtc.json
@@ -297,7 +297,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -320,7 +320,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -340,7 +340,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -363,7 +363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -387,7 +387,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -407,7 +407,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -427,7 +427,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-12|Mac-13"
+              "os": "Mac-13"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter
index 100c718..e1691cd0 100644
--- a/testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_11.chrome_public_test_apk.filter
@@ -6,10 +6,6 @@
 -org.chromium.chrome.browser.download.OMADownloadHandlerTest.testQueryDownloadResult
 
 # crbug.com/1193814
--org.chromium.chrome.browser.download.DownloadTest.testDangerousDownload__UseDownloadOfflineContentProviderDisabled
--org.chromium.chrome.browser.download.DownloadTest.testDangerousDownload__UseDownloadOfflineContentProviderEnabled
--org.chromium.chrome.browser.download.DownloadTest.testDuplicateHttpPostDownload_Dismiss__UseDownloadOfflineContentProviderDisabled
--org.chromium.chrome.browser.download.DownloadTest.testDuplicateHttpPostDownload_Dismiss__UseDownloadOfflineContentProviderEnabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpGetDownload__UseDownloadOfflineContentProviderDisabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpGetDownload__UseDownloadOfflineContentProviderEnabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpPostDownload__UseDownloadOfflineContentProviderDisabled
diff --git a/testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter
index c618df2..c4dc326b 100644
--- a/testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter
@@ -6,10 +6,6 @@
 -org.chromium.chrome.browser.download.OMADownloadHandlerTest.testQueryDownloadResult
 
 # crbug.com/1193814
--org.chromium.chrome.browser.download.DownloadTest.testDangerousDownload__UseDownloadOfflineContentProviderDisabled
--org.chromium.chrome.browser.download.DownloadTest.testDangerousDownload__UseDownloadOfflineContentProviderEnabled
--org.chromium.chrome.browser.download.DownloadTest.testDuplicateHttpPostDownload_Dismiss__UseDownloadOfflineContentProviderDisabled
--org.chromium.chrome.browser.download.DownloadTest.testDuplicateHttpPostDownload_Dismiss__UseDownloadOfflineContentProviderEnabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpGetDownload__UseDownloadOfflineContentProviderDisabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpGetDownload__UseDownloadOfflineContentProviderEnabled
 -org.chromium.chrome.browser.download.DownloadTest.testHttpPostDownload__UseDownloadOfflineContentProviderDisabled
diff --git a/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter b/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter
index 81ccbcb..b328c74 100644
--- a/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter
@@ -74,9 +74,6 @@
 -org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testManualInitiationWithBarOpen
 -org.chromium.chrome.browser.translate.TranslateCompactInfoBarTest.testStartTranslateOnManualInitiation
 
-# crbug.com/1128665
--org.chromium.chrome.browser.download.DownloadTest.testDuplicateHttpPostDownload_Cancel__UseDownloadOfflineContentProviderEnabled
-
 # crbug.com/1165459
 -org.chromium.chrome.browser.share.long_screenshots.LongScreenshotsEntryTest.testCaptured
 
diff --git a/testing/buildbot/internal.chrome.fyi.json b/testing/buildbot/internal.chrome.fyi.json
index 2845200..1baffcf 100644
--- a/testing/buildbot/internal.chrome.fyi.json
+++ b/testing/buildbot/internal.chrome.fyi.json
@@ -212,7 +212,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-12|Mac-13",
+              "os": "Mac-13",
               "pool": "chrome.tests.finch"
             }
           ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 9365c87..833bd62 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -906,34 +906,6 @@
       },
     },
   },
-  # TODO (crbug/1448671): remove the 3 OR mixins below after Mac13 upgrade completes
-  'mac_12_or_13_arm64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'arm64',
-        'os': 'Mac-12|Mac-13',
-      },
-    },
-  },
-  # this can be replaced with mac_13_x64 mixins after upgrade completes. Mac13 machines
-  # are automatically on T2 or above
-  'mac_12_or_13_t2_x64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'x86-64',
-        'mac_model': 'Macmini8,1',
-        'os': 'Mac-12|Mac-13',
-      },
-    },
-  },
-  'mac_12_or_13_x64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'x86-64',
-        'os': 'Mac-12|Mac-13',
-      },
-    },
-  },
   'mac_12_x64': {
     'swarming': {
       'dimensions': {
@@ -1008,6 +980,22 @@
       },
     },
   },
+  'mac_default_arm64': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'arm64',
+        'os': 'Mac-13',
+      },
+    },
+  },
+  'mac_default_x64': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'x86-64',
+        'os': 'Mac-13',
+      },
+    },
+  },
   'mac_mini_intel_gpu_experimental': {
     'swarming': {
       'dimensions': {
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index fac99e9..fa60f6b 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1359,7 +1359,7 @@
       # which doesn't exist in the CfT config.
       'mac-rel-cft': {
         'mixins': [
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'isolate_profile_data',
         ],
         # TODO(crbug.com/1399527) - for some reason gcapi_example
@@ -2084,7 +2084,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -2118,7 +2118,7 @@
           'has_native_resultdb_integration',
           'ios_restart_device',
           'limited_capacity_bot',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -2220,7 +2220,7 @@
           'has_native_resultdb_integration',
           'ios_output_disabled_tests',
           'isolate_profile_data',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -2280,7 +2280,7 @@
       'mac-code-coverage': {
         'mixins': [
           'isolate_profile_data',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests',
@@ -2729,7 +2729,7 @@
       },
       'mac-arm-rel-dev': {
         'mixins': [
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
         ],
         'test_suites': {
            'gtest_tests': 'chromium_dev_desktop_gtests',
@@ -3094,7 +3094,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3290,7 +3290,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3304,7 +3304,7 @@
         'mixins': [
           'finch-chromium-swarming-pool',
           'has_native_resultdb_integration',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3322,7 +3322,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3335,7 +3335,7 @@
       'ios-m1-simulator-cronet': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3348,7 +3348,7 @@
       'ios-simulator-cronet': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3361,7 +3361,7 @@
       'ios-simulator-multi-window': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3375,7 +3375,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'ios_custom_webkit',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -3388,7 +3388,7 @@
       'ios-wpt-fyi-rel': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'xcode_14_main',
         ],
@@ -3742,7 +3742,7 @@
       'mac-fieldtrial-tester': {
         'mixins': [
           'finch-chromium-swarming-pool',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
         ],
         'test_suites': {
           'gtest_tests': 'fieldtrial_browser_tests',
@@ -4967,7 +4967,7 @@
       },
       'Mac12 Tests': {
         'mixins': [
-            'mac_12_or_13_x64',
+            'mac_12_x64',
             'isolate_profile_data',
         ],
         'test_suites': {
@@ -5015,7 +5015,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_12_or_13_t2_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5032,7 +5032,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_12_or_13_t2_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5048,7 +5048,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5086,7 +5086,7 @@
         'mixins': [
             # Only run selected test suites on CQ. https://crbug.com/1234525.
             'ci_only',
-            'mac_12_or_13_arm64',
+            'mac_12_arm64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests_no_nacl_no_nocompile',
@@ -5243,7 +5243,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5468,7 +5468,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5496,7 +5496,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -5637,7 +5637,7 @@
           'rust_build_tests',
         ],
         'mixins': [
-          'mac_12_or_13_x64',
+          'mac_default_x64',
         ],
         'test_suites': {
           'gtest_tests': 'rust_host_gtests',
@@ -6053,7 +6053,7 @@
       },
       'WebRTC Chromium Mac Tester': {
         'mixins': [
-          'mac_12_or_13_x64',
+          'mac_default_x64',
         ],
         'test_suites': {
           # TODO(crbug.com/1409418): Reenable baremetal_tests.
@@ -6142,7 +6142,7 @@
       },
       'WebRTC Chromium FYI Mac Tester': {
         'mixins': [
-          'mac_12_or_13_x64',
+          'mac_default_x64',
         ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_gtests',
@@ -6170,7 +6170,7 @@
       'WebRTC Chromium FYI ios-simulator': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_12_or_13_x64',
+          'mac_default_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_14_main',
@@ -6575,7 +6575,7 @@
       'mac-arm64-finch-smoke-chrome': {
         'mixins': [
           'chrome-finch-swarming-pool',
-          'mac_12_or_13_arm64',
+          'mac_default_arm64',
         ],
         'test_suites': {
           'isolated_scripts': 'chrome_finch_smoke_tests',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index e7986db..5ed13e3 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -9175,6 +9175,27 @@
             ]
         }
     ],
+    "OmniboxTailSuggestIOS": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "OmniboxTailSuggest"
+                    ]
+                },
+                {
+                    "name": "Enabled_WithSuggestEmbed",
+                    "enable_features": [
+                        "OmniboxTailSuggest"
+                    ]
+                }
+            ]
+        }
+    ],
     "OmniboxUISimplificationDesktop": [
         {
             "platforms": [
diff --git a/third_party/blink/renderer/core/animation/timeline_offset.cc b/third_party/blink/renderer/core/animation/timeline_offset.cc
index 8e9dca7..6025fc8 100644
--- a/third_party/blink/renderer/core/animation/timeline_offset.cc
+++ b/third_party/blink/renderer/core/animation/timeline_offset.cc
@@ -222,7 +222,8 @@
   CSSToLengthConversionData::Flags ignored_flags = 0;
   CSSToLengthConversionData length_conversion_data(
       element->ComputedStyleRef(), element_resolve_context.ParentStyle(),
-      element_resolve_context.RootElementStyle(), document.GetLayoutView(),
+      element_resolve_context.RootElementStyle(),
+      CSSToLengthConversionData::ViewportSize(document.GetLayoutView()),
       CSSToLengthConversionData::ContainerSizes(element),
       element->GetComputedStyle()->EffectiveZoom(), ignored_flags);
 
diff --git a/third_party/blink/renderer/core/animation/view_timeline.cc b/third_party/blink/renderer/core/animation/view_timeline.cc
index 3878653b..011aaf7 100644
--- a/third_party/blink/renderer/core/animation/view_timeline.cc
+++ b/third_party/blink/renderer/core/animation/view_timeline.cc
@@ -150,7 +150,8 @@
     CSSToLengthConversionData::Flags ignored_flags = 0;
     CSSToLengthConversionData length_conversion_data(
         subject->ComputedStyleRef(), element_resolve_context.ParentStyle(),
-        element_resolve_context.RootElementStyle(), document.GetLayoutView(),
+        element_resolve_context.RootElementStyle(),
+        CSSToLengthConversionData::ViewportSize(document.GetLayoutView()),
         CSSToLengthConversionData::ContainerSizes(subject),
         subject->GetComputedStyle()->EffectiveZoom(), ignored_flags);
 
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.cc b/third_party/blink/renderer/core/css/css_gradient_value.cc
index 67c39e1..eba5cdb 100644
--- a/third_party/blink/renderer/core/css/css_gradient_value.cc
+++ b/third_party/blink/renderer/core/css/css_gradient_value.cc
@@ -147,8 +147,9 @@
   // TODO(crbug.com/947377): Conversion is not supposed to happen here.
   CSSToLengthConversionData::Flags ignored_flags = 0;
   CSSToLengthConversionData conversion_data(
-      style, &style, root_style, document.GetLayoutView(), container_sizes,
-      style.EffectiveZoom(), ignored_flags);
+      style, &style, root_style,
+      CSSToLengthConversionData::ViewportSize(document.GetLayoutView()),
+      container_sizes, style.EffectiveZoom(), ignored_flags);
 
   scoped_refptr<Gradient> gradient;
   switch (GetClassType()) {
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node_test.cc b/third_party/blink/renderer/core/css/css_math_expression_node_test.cc
index 960c1af6..977e73f 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node_test.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node_test.cc
@@ -99,7 +99,8 @@
   scoped_refptr<const ComputedStyle> style = builder.TakeStyle();
   CSSToLengthConversionData::Flags ignored_flags = 0;
   CSSToLengthConversionData conversion_data(
-      *style, style.get(), style.get(), nullptr,
+      *style, style.get(), style.get(),
+      CSSToLengthConversionData::ViewportSize(nullptr),
       CSSToLengthConversionData::ContainerSizes(), style->EffectiveZoom(),
       ignored_flags);
 
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
index 101e1bc..5840e04a 100644
--- a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
+++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
@@ -138,6 +138,7 @@
           dynamic_height_(height) {}
 
     explicit ViewportSize(const LayoutView*);
+    bool operator==(const ViewportSize&) const = default;
 
     // v*
     double Width() const { return LargeWidth(); }
@@ -240,7 +241,7 @@
   CSSToLengthConversionData(const ComputedStyleOrBuilder& element_style,
                             const ComputedStyle* parent_style,
                             const ComputedStyle* root_style,
-                            const LayoutView* layout_view,
+                            const ViewportSize& viewport_size,
                             const ContainerSizes& container_sizes,
                             float zoom,
                             Flags& flags)
@@ -250,7 +251,7 @@
             LineHeightSize(parent_style ? parent_style->GetFontSizeStyle()
                                         : element_style.GetFontSizeStyle(),
                            root_style),
-            ViewportSize(layout_view),
+            viewport_size,
             container_sizes,
             zoom,
             flags) {}
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc b/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
index b541bce2..2edd8df6 100644
--- a/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
+++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data_test.cc
@@ -52,7 +52,7 @@
     return CSSToLengthConversionData(
         div->ComputedStyleRef(), GetDocument().body()->GetComputedStyle(),
         GetDocument().documentElement()->GetComputedStyle(),
-        GetDocument().GetLayoutView(),
+        CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView()),
         CSSToLengthConversionData::ContainerSizes(),
         data_zoom.value_or(div->GetComputedStyle()->EffectiveZoom()), flags);
   }
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
index 4a7e5e08..849915e 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -226,6 +226,7 @@
   Element* Body() const { return GetDocument().body(); }
 
   static StyleResolverState& InitState(StyleResolverState& state) {
+    state.GetDocument().GetStyleEngine().UpdateViewportSize();
     state.SetStyle(*InitialStyle(state.GetDocument()));
     state.SetParentStyle(InitialStyle(state.GetDocument()));
     state.SetOldStyle(state.GetElement().GetComputedStyle());
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index f5e3c06..95bec9f1 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -2249,6 +2249,7 @@
                            nullptr /* StyleRecalcContext */,
                            StyleRequest(parent.get()));
 
+  GetDocument().GetStyleEngine().UpdateViewportSize();
   state.SetStyle(*parent);
 
   StyleBuilder::ApplyProperty(GetCSSPropertyFilter(), state,
@@ -2429,6 +2430,7 @@
   StyleResolverState state(GetDocument(), element,
                            nullptr /* StyleRecalcContext */,
                            StyleRequest(&style));
+  GetDocument().GetStyleEngine().UpdateViewportSize();
   state.SetStyle(style);
   if (const ComputedStyle* parent_style = element.GetComputedStyle()) {
     state.SetParentStyle(parent_style);
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
index 48e61d65..4f70533 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
@@ -120,7 +120,7 @@
 void StyleResolverState::UpdateLengthConversionData() {
   css_to_length_conversion_data_ = CSSToLengthConversionData(
       *style_builder_, ParentStyle(), RootElementStyle(),
-      GetDocument().GetLayoutView(),
+      GetDocument().GetStyleEngine().GetViewportSize(),
       CSSToLengthConversionData::ContainerSizes(container_unit_context_),
       StyleBuilder().EffectiveZoom(), length_conversion_flags_);
   element_style_resources_.UpdateLengthConversionData(
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index ed6ac08..0f10a1f 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -177,6 +177,7 @@
                            const RuleData& rule_data) {
   rules.push_back(rule_data);
   rules.back().ComputeBloomFilterHashes();
+  rules.back().ComputeEntirelyCoveredByBucketing();
   need_compaction_ = true;
 }
 
diff --git a/third_party/blink/renderer/core/css/selector_checker-inl.h b/third_party/blink/renderer/core/css/selector_checker-inl.h
index da86fd2bb..5fc640b2 100644
--- a/third_party/blink/renderer/core/css/selector_checker-inl.h
+++ b/third_party/blink/renderer/core/css/selector_checker-inl.h
@@ -91,11 +91,6 @@
   const CSSSelector* rewind_on_failure = nullptr;
 
   while (selector != nullptr) {
-    if (selector->IsCoveredByBucketing()) {
-      DCHECK(MatchOne(selector, element))
-          << selector->SelectorText() << " unexpectedly didn't match "
-          << element;
-    }
     if (selector->IsCoveredByBucketing() || MatchOne(selector, element)) {
       if (selector->Relation() == CSSSelector::kDescendant) {
         // We matched the entire compound, but there are more.
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index 90b693e..9bc636b 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -215,6 +215,9 @@
       WebThemeEngineHelper::GetNativeThemeEngine()->GetForcedColors();
   UpdateForcedBackgroundColor();
   UpdateColorScheme();
+
+  // Mostly for the benefit of unit tests.
+  UpdateViewportSize();
 }
 
 StyleEngine::~StyleEngine() = default;
@@ -3149,6 +3152,7 @@
   if (cq_data->SkippedStyleRecalc()) {
     DecrementSkippedContainerRecalc();
   }
+  UpdateViewportSize();
   RecalcStyleForContainer(container, change);
 
   if (container.NeedsReattachLayoutTree()) {
@@ -3329,6 +3333,7 @@
   UpdateViewportStyle();
 
   if (GetDocument().documentElement()) {
+    UpdateViewportSize();
     NthIndexCache nth_index_cache(GetDocument());
     if (NeedsStyleRecalc()) {
       TRACE_EVENT0("blink,blink_style", "Document::recalcStyle");
@@ -3956,4 +3961,9 @@
   fill_or_clip_path_uri_value_cache_.clear();
 }
 
+void StyleEngine::UpdateViewportSize() {
+  viewport_size_ =
+      CSSToLengthConversionData::ViewportSize(GetDocument().GetLayoutView());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h
index 9e146dca..4d2ac3e 100644
--- a/third_party/blink/renderer/core/css/style_engine.h
+++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -43,6 +43,7 @@
 #include "third_party/blink/renderer/core/css/active_style_sheets.h"
 #include "third_party/blink/renderer/core/css/color_scheme_flags.h"
 #include "third_party/blink/renderer/core/css/css_global_rule_set.h"
+#include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h"
 #include "third_party/blink/renderer/core/css/invalidation/pending_invalidations.h"
 #include "third_party/blink/renderer/core/css/invalidation/style_invalidator.h"
 #include "third_party/blink/renderer/core/css/layout_tree_rebuild_root.h"
@@ -52,6 +53,7 @@
 #include "third_party/blink/renderer/core/css/style_invalidation_root.h"
 #include "third_party/blink/renderer/core/css/style_recalc_root.h"
 #include "third_party/blink/renderer/core/css/vision_deficiency.h"
+#include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/layout/geometry/axis.h"
 #include "third_party/blink/renderer/platform/bindings/name_client.h"
@@ -665,6 +667,14 @@
     return active_user_style_sheets_;
   }
 
+  // See comment on viewport_size_.
+  void UpdateViewportSize();
+  const CSSToLengthConversionData::ViewportSize& GetViewportSize() const {
+    DCHECK(viewport_size_ == CSSToLengthConversionData::ViewportSize(
+                                 GetDocument().GetLayoutView()));
+    return viewport_size_;
+  }
+
  private:
   // FontSelectorClient implementation.
   void FontsNeedUpdate(FontSelector*, FontInvalidationReason) override;
@@ -1020,6 +1030,10 @@
   // for more info.
   HeapHashMap<AtomicString, Member<const CSSValue>>
       fill_or_clip_path_uri_value_cache_;
+
+  // Cached because it can be expensive to compute anew for each element.
+  // You must call UpdateViewportSize() once before resolving style.
+  CSSToLengthConversionData::ViewportSize viewport_size_;
 };
 
 void PossiblyScheduleNthPseudoInvalidations(Node& node);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index aeb1803..f49b76a0 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2700,6 +2700,7 @@
   AtomicString page_name;
   if (const LayoutView* layout_view = GetLayoutView())
     page_name = layout_view->NamedPageAtIndex(page_index);
+  GetStyleEngine().UpdateViewportSize();
   GetStyleEngine().UpdateActiveStyle();
   return GetStyleEngine().GetStyleResolver().StyleForPage(page_index,
                                                           page_name);
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 6a645a4..a9152c04 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -6206,6 +6206,7 @@
   SelectorFilterParentScope::EnsureParentStackIsPushed();
   SelectorFilter& filter =
       top->GetDocument().GetStyleResolver().GetSelectorFilter();
+  GetDocument().GetStyleEngine().UpdateViewportSize();
 
   // Don't call FromAncestors for elements whose parent is outside the
   // flat-tree, since those elements don't actually participate in style recalc.
@@ -6795,6 +6796,8 @@
 scoped_refptr<const ComputedStyle> Element::StyleForPseudoElement(
     const StyleRecalcContext& style_recalc_context,
     const StyleRequest& request) {
+  GetDocument().GetStyleEngine().UpdateViewportSize();
+
   const bool is_before_or_after = request.pseudo_id == kPseudoIdBefore ||
                                   request.pseudo_id == kPseudoIdAfter;
 
diff --git a/third_party/blink/renderer/core/svg/svg_element_rare_data.cc b/third_party/blink/renderer/core/svg/svg_element_rare_data.cc
index 66279b1..ca9bbbe 100644
--- a/third_party/blink/renderer/core/svg/svg_element_rare_data.cc
+++ b/third_party/blink/renderer/core/svg/svg_element_rare_data.cc
@@ -46,6 +46,7 @@
     // The style computed here contains no CSS Animations/Transitions or SMIL
     // induced rules - this is needed to compute the "base value" for the SMIL
     // animation sandwhich model.
+    element->GetDocument().GetStyleEngine().UpdateViewportSize();
     override_computed_style_ =
         element->GetDocument().GetStyleResolver().ResolveStyle(
             element, style_recalc_context, style_request);
diff --git a/third_party/blink/renderer/core/svg/svg_length_context.cc b/third_party/blink/renderer/core/svg/svg_length_context.cc
index 6f136d1a..44c8e56 100644
--- a/third_party/blink/renderer/core/svg/svg_length_context.cc
+++ b/third_party/blink/renderer/core/svg/svg_length_context.cc
@@ -102,7 +102,8 @@
     : CSSToLengthConversionData(style,
                                 &style,
                                 RootElementStyle(context),
-                                context.GetDocument().GetLayoutView(),
+                                CSSToLengthConversionData::ViewportSize(
+                                    context.GetDocument().GetLayoutView()),
                                 CSSToLengthConversionData::ContainerSizes(
                                     context.ParentOrShadowHostElement()),
                                 1.0f,
diff --git a/third_party/blink/renderer/core/testing/page_test_base.cc b/third_party/blink/renderer/core/testing/page_test_base.cc
index 2d901ff8..fd91619 100644
--- a/third_party/blink/renderer/core/testing/page_test_base.cc
+++ b/third_party/blink/renderer/core/testing/page_test_base.cc
@@ -126,6 +126,10 @@
 
   // Use desktop page scale limits by default.
   GetPage().SetDefaultPageScaleLimits(1, 4);
+
+  // We do a lot of one-offs in unit tests, so update this so that every
+  // single test doesn't have to.
+  GetStyleEngine().UpdateViewportSize();
 }
 
 void PageTestBase::SetUp(gfx::Size size) {
@@ -142,6 +146,10 @@
 
   // Use desktop page scale limits by default.
   GetPage().SetDefaultPageScaleLimits(1, 4);
+
+  // We do a lot of one-offs in unit tests, so update this so that every
+  // single test doesn't have to.
+  GetStyleEngine().UpdateViewportSize();
 }
 
 void PageTestBase::SetupPageWithClients(
@@ -165,6 +173,10 @@
 
   // Use desktop page scale limits by default.
   GetPage().SetDefaultPageScaleLimits(1, 4);
+
+  // We do a lot of one-offs in unit tests, so update this so that every
+  // single test doesn't have to.
+  GetStyleEngine().UpdateViewportSize();
 }
 
 void PageTestBase::TearDown() {
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index b657789..c17a6f3 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -350,11 +350,9 @@
           CreateDepthManagerIfEnabled(enabled_features_, *device_config)),
       input_sources_(MakeGarbageCollected<XRInputSourceArray>()),
       client_receiver_(this, xr->GetExecutionContext()),
-      input_receiver_(this, xr->GetExecutionContext()),
       callback_collection_(
           MakeGarbageCollected<XRFrameRequestCallbackCollection>(
               xr->GetExecutionContext())),
-      uses_input_eventing_(device_config->uses_input_eventing),
       supports_viewport_scaling_(immersive() &&
                                  device_config->supports_viewport_scaling),
       enable_anti_aliasing_(device_config->enable_anti_aliasing),
@@ -467,13 +465,6 @@
   return event_target_names::kXRSession;
 }
 
-mojo::PendingAssociatedRemote<device::mojom::blink::XRInputSourceButtonListener>
-XRSession::GetInputClickListener() {
-  DCHECK(!input_receiver_.is_bound());
-  return input_receiver_.BindNewEndpointAndPassRemote(
-      xr_->GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI));
-}
-
 void XRSession::updateRenderState(XRRenderStateInit* init,
                                   ExceptionState& exception_state) {
   if (ended_) {
@@ -1738,11 +1729,7 @@
     // after OnInputStateChangeInternal which updated input sources.
     UpdateWorldUnderstandingStateForFrame(timestamp, frame_data);
 
-    // If this session uses input eventing, XR select events are handled via
-    // OnButtonEvent, so they need to be ignored here to avoid duplicate events.
-    if (!uses_input_eventing_) {
-      ProcessInputSourceEvents(input_states);
-    }
+    ProcessInputSourceEvents(input_states);
   } else {
     UpdateWorldUnderstandingStateForFrame(timestamp, frame_data);
   }
@@ -2067,14 +2054,6 @@
   canvas_was_resized_ = true;
 }
 
-void XRSession::OnButtonEvent(
-    device::mojom::blink::XRInputSourceStatePtr input_state) {
-  DCHECK(uses_input_eventing_);
-  auto input_states = base::make_span(&input_state, 1u);
-  OnInputStateChangeInternal(last_frame_id_, input_states);
-  ProcessInputSourceEvents(input_states);
-}
-
 void XRSession::OnInputStateChangeInternal(
     int16_t frame_id,
     base::span<const device::mojom::blink::XRInputSourceStatePtr>
@@ -2413,7 +2392,6 @@
   visitor->Trace(overlay_element_);
   visitor->Trace(dom_overlay_state_);
   visitor->Trace(client_receiver_);
-  visitor->Trace(input_receiver_);
   visitor->Trace(callback_collection_);
   visitor->Trace(create_anchor_promises_);
   visitor->Trace(request_hit_test_source_promises_);
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h
index 19275da..066e0aa 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.h
+++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -65,11 +65,9 @@
 
 using XRSessionFeatureSet = HashSet<device::mojom::XRSessionFeature>;
 
-class XRSession final
-    : public EventTargetWithInlineData,
-      public device::mojom::blink::XRSessionClient,
-      public device::mojom::blink::XRInputSourceButtonListener,
-      public ActiveScriptWrappable<XRSession> {
+class XRSession final : public EventTargetWithInlineData,
+                        public device::mojom::blink::XRSessionClient,
+                        public ActiveScriptWrappable<XRSession> {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
@@ -269,10 +267,6 @@
       const absl::optional<gpu::MailboxHolder>& output_mailbox_holder,
       const absl::optional<gpu::MailboxHolder>& camera_image_mailbox_holder);
 
-  // XRInputSourceButtonListener
-  void OnButtonEvent(
-      device::mojom::blink::XRInputSourceStatePtr input_source) override;
-
   const HeapVector<Member<XRViewData>>& views();
 
   void AddTransientInputSource(XRInputSource* input_source);
@@ -284,10 +278,6 @@
     return stage_parameters_;
   }
 
-  mojo::PendingAssociatedRemote<
-      device::mojom::blink::XRInputSourceButtonListener>
-  GetInputClickListener();
-
   bool EmulatedPosition() const {
     // If we don't have display info then we should be using the identity
     // reference space, which by definition will be emulating the position.
@@ -325,7 +315,6 @@
   bool RemoveHitTestSource(XRHitTestSource* hit_test_source);
   bool RemoveHitTestSource(XRTransientInputHitTestSource* hit_test_source);
 
-  bool UsesInputEventing() { return uses_input_eventing_; }
   bool LightEstimationEnabled() { return !!world_light_probe_; }
 
   void Trace(Visitor* visitor) const override;
@@ -586,9 +575,6 @@
 
   HeapMojoReceiver<device::mojom::blink::XRSessionClient, XRSession>
       client_receiver_;
-  HeapMojoAssociatedReceiver<device::mojom::blink::XRInputSourceButtonListener,
-                             XRSession>
-      input_receiver_;
 
   // Used to schedule video.rVFC callbacks for immersive sessions.
   Vector<ExecuteVfcCallback> vfc_execution_queue_;
@@ -613,7 +599,6 @@
   int output_width_ = 1;
   int output_height_ = 1;
 
-  bool uses_input_eventing_ = false;
   float recommended_framebuffer_scale_ = 1.0;
 
   // Corresponds to mojo XRSession.supportsViewportScaling
diff --git a/third_party/blink/renderer/modules/xr/xr_system.cc b/third_party/blink/renderer/modules/xr/xr_system.cc
index e7a4d421..b7a90b3 100644
--- a/third_party/blink/renderer/modules/xr/xr_system.cc
+++ b/third_party/blink/renderer/modules/xr/xr_system.cc
@@ -1577,12 +1577,6 @@
       // element is already in fullscreen mode, and the session can proceed.
       session->SetDOMOverlayElement(query->DOMOverlayElement());
     }
-
-    if (query->mode() == device::mojom::blink::XRSessionMode::kImmersiveVr &&
-        session->UsesInputEventing()) {
-      frameProvider()->GetImmersiveDataProvider()->SetInputSourceButtonListener(
-          session->GetInputClickListener());
-    }
   }
 
   UseCounter::Count(ExecutionContext::From(query->GetScriptState()),
diff --git a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer.py b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer.py
index f753cb4..ce90f8c 100644
--- a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer.py
+++ b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer.py
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 """Module for all matching analyzers."""
 
-import numpy as np
 from typing import List
 
 from blinkpy.web_tests.fuzzy_diff_analyzer import data_types as dt
@@ -27,21 +26,21 @@
 
 class FuzzyMatchingAnalyzer(ImageMatchingAnalyzer):
     def __init__(self,
-                 fuzzy_match_image_num_threshold: int = 3,
+                 fuzzy_match_image_diff_num_threshold: int = 3,
                  fuzzy_match_distinct_diff_num_threshold: int = 3):
         """Class for the fuzzy matching analyzer for web tests.
 
         Args:
-          fuzzy_match_image_num_threshold: An int denoting the number of image
-              test result at least to get the suggested fuzzy match range.
+          fuzzy_match_image_diff_num_threshold: An int denoting the number of
+              image test result at least to get the suggested fuzzy match range.
           fuzzy_match_distinct_diff_num_threshold: An int denoting the number of
               different image diff result at least to calculate the suggested
               fuzzy match range.
         """
         super().__init__()
-        assert fuzzy_match_image_num_threshold >= 0
+        assert fuzzy_match_image_diff_num_threshold >= 0
         assert fuzzy_match_distinct_diff_num_threshold >= 0
-        self._image_num_threshold = fuzzy_match_image_num_threshold
+        self._image_diff_num_threshold = fuzzy_match_image_diff_num_threshold
         self._distinct_diff_num_threshold = fuzzy_match_distinct_diff_num_threshold
 
     def run_analyzer(self, test_results: dt.TestToTypTagsType) -> str:
@@ -55,24 +54,24 @@
           A string of fuzzy match range suggestion
         """
         # Check the image num threshold
-        total_image_num = 0
+        total_image_diff_num = 0
         image_diff_counts = {}
         for image_diff_list in test_results.values():
-            total_image_num += len(image_diff_list)
+            total_image_diff_num += len(image_diff_list)
             for image_diff in image_diff_list:
                 key = dt.ImageDiffTagTupleType(image_diff.color_difference,
                                                image_diff.pixel_difference, "")
                 image_diff_counts[key] = image_diff_counts.get(key, 0) + 1
 
-        # Total image number does not reach the threshold, return no result.
-        if total_image_num < self._image_num_threshold:
-            return ('Total image number is less than %d, no result' %
-                    self._image_num_threshold)
+        # Total image diff number does not meet the threshold, return no result.
+        if total_image_diff_num < self._image_diff_num_threshold:
+            return ('Total image diff number is less than %d, no result' %
+                    self._image_diff_num_threshold)
 
         # Total distinct image diff number does not reach the threshold, return all
         # these image diff as suggested matching.
         if len(image_diff_counts) < self._distinct_diff_num_threshold:
-            result = 'Total image diff number is %d. ' % total_image_num
+            result = 'Total image diff number is %d. ' % total_image_diff_num
             result += 'Total distinct image diff number is less '
             result += 'than %d. Suggested ' % self._distinct_diff_num_threshold
             result += 'make all following image diff (color_difference, '
@@ -90,7 +89,7 @@
             color_diff_list += [image_diff.color_difference] * count
             pixel_diff_list += [image_diff.pixel_difference] * count
 
-        result = 'Total image diff number is %d. ' % total_image_num
+        result = 'Total image diff number is %d. ' % total_image_diff_num
         result += 'The list of fuzzy match range suggested for this test: '
         result += '\nFor color difference:\n'
         result += self._calculate_data_percentile(color_diff_list)
@@ -126,8 +125,8 @@
         return "No data."
 
     def description(self) -> str:
-        des = ('Fuzzy match analyzer with image_num_threshold of %d and ' %
-               self._image_num_threshold)
+        des = ('Fuzzy match analyzer with image_diff_num_threshold of %d and ' %
+               self._image_diff_num_threshold)
         des += ('distinct_diff_num_threshold of %d' %
                 self._distinct_diff_num_threshold)
         return des
diff --git a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer_unittest.py b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer_unittest.py
index da8cbab..cc62370 100644
--- a/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/fuzzy_diff_analyzer/analyzer_unittest.py
@@ -9,9 +9,9 @@
 
 
 class FuzzyMatchingAnalyzerTest(unittest.TestCase):
-    def test_run_analyzer_in_image_num_threshold(self) -> None:
+    def test_run_analyzer_in_image_diff_num_threshold(self) -> None:
         fuzzy_match_analyzer = analyzer.FuzzyMatchingAnalyzer(
-            fuzzy_match_image_num_threshold=4,
+            fuzzy_match_image_diff_num_threshold=4,
             fuzzy_match_distinct_diff_num_threshold=5)
 
         test_data = \
@@ -26,12 +26,12 @@
                     10, 40, 'http://ci.chromium.org/b/3333')],
         }
         actual_result = fuzzy_match_analyzer.run_analyzer(test_data)
-        expected_result = 'Total image number is less than 4, no result'
+        expected_result = 'Total image diff number is less than 4, no result'
         self.assertEqual(actual_result, expected_result)
 
     def test_run_analyzer_in_distinct_diff_num_threshold(self) -> None:
         fuzzy_match_analyzer = analyzer.FuzzyMatchingAnalyzer(
-            fuzzy_match_image_num_threshold=3,
+            fuzzy_match_image_diff_num_threshold=3,
             fuzzy_match_distinct_diff_num_threshold=4)
 
         test_data = \
@@ -56,7 +56,7 @@
     def test_run_analyzer_in_fuzzy_match_range_in_different_platform(
             self) -> None:
         fuzzy_match_analyzer = analyzer.FuzzyMatchingAnalyzer(
-            fuzzy_match_image_num_threshold=3,
+            fuzzy_match_image_diff_num_threshold=3,
             fuzzy_match_distinct_diff_num_threshold=3)
 
         test_data = \
@@ -87,7 +87,7 @@
     def test_run_analyzer_in_fuzzy_match_range_with_large_even_number_tests(
             self) -> None:
         fuzzy_match_analyzer = analyzer.FuzzyMatchingAnalyzer(
-            fuzzy_match_image_num_threshold=3,
+            fuzzy_match_image_diff_num_threshold=3,
             fuzzy_match_distinct_diff_num_threshold=3)
         image_diffs = []
         for i in range(1, 101):
@@ -109,7 +109,7 @@
     def test_run_analyzer_in_fuzzy_match_range_with_large_odd_number_tests(
             self) -> None:
         fuzzy_match_analyzer = analyzer.FuzzyMatchingAnalyzer(
-            fuzzy_match_image_num_threshold=3,
+            fuzzy_match_image_diff_num_threshold=3,
             fuzzy_match_distinct_diff_num_threshold=3)
         image_diffs = []
         for i in range(1, 102):
@@ -132,10 +132,10 @@
         # Test negative number.
         with self.assertRaises(AssertionError):
             analyzer.FuzzyMatchingAnalyzer(
-                fuzzy_match_image_num_threshold=-1,
+                fuzzy_match_image_diff_num_threshold=-1,
                 fuzzy_match_distinct_diff_num_threshold=0)
         # Test negative number.
         with self.assertRaises(AssertionError):
             analyzer.FuzzyMatchingAnalyzer(
-                fuzzy_match_image_num_threshold=0,
+                fuzzy_match_image_diff_num_threshold=0,
                 fuzzy_match_distinct_diff_num_threshold=-1)
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
index 1c2d76e3..04866b6 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
@@ -33,6 +33,7 @@
 import re
 from collections import defaultdict
 from collections import OrderedDict
+from dataclasses import dataclass, field
 from functools import reduce
 from typing import (
     ClassVar,
@@ -40,6 +41,7 @@
     Dict,
     FrozenSet,
     List,
+    Mapping,
     Optional,
     Set,
     Tuple,
@@ -107,6 +109,37 @@
         return 'ParseError(errors=%s)' % str(self.errors)
 
 
+@dataclass
+class ExpectationsChange:
+    lines_added: List[typ_types.Expectation] = field(default_factory=list)
+    lines_removed: List[typ_types.Expectation] = field(default_factory=list)
+
+    def __add__(self, other: 'ExpectationsChange') -> 'ExpectationsChange':
+        lines_added = {line.to_string(): line for line in self.lines_added}
+        lines_removed = {line.to_string(): line for line in self.lines_removed}
+        self._add_delta(other.lines_added, lines_removed, lines_added)
+        self._add_delta(other.lines_removed, lines_added, lines_removed)
+        return ExpectationsChange(list(lines_added.values()),
+                                  list(lines_removed.values()))
+
+    def _add_delta(self, lines: Collection[typ_types.Expectation],
+                   negative: Dict[str, typ_types.Expectation],
+                   positive: Dict[str, typ_types.Expectation]):
+        for line in lines:
+            formatted_line = line.to_string()
+            if formatted_line in negative:
+                negative.pop(formatted_line)
+            else:
+                positive[formatted_line] = line
+
+
+def _exp_order(exp: typ_types.Expectation):
+    formatted_line = exp.to_string().strip()
+    meaningful = formatted_line and not formatted_line.startswith('#')
+    # Format empty lines and comments before semantically meaningful content.
+    return meaningful, formatted_line
+
+
 class TestExpectations:
     def __init__(self, port, expectations_dict=None):
         self._port = port
@@ -215,7 +248,7 @@
 
         for pattern_to_exps in (typ_expectations.individual_exps,
                                 typ_expectations.glob_exps):
-            for test in sorted(pattern_to_exps.keys()):
+            for test in sorted(pattern_to_exps):
                 exps = pattern_to_exps[test]
                 for exp in exps:
                     lineno_to_exps[exp.lineno].append(exp)
@@ -239,7 +272,7 @@
                     self._maybe_remove_comments_and_whitespace(lines)
             else:
                 exps = lineno_to_exps[lineno]
-                lines.extend(sorted(exps, key=lambda exp: exp.to_string()))
+                lines.extend(sorted(exps, key=_exp_order))
                 lineno_to_exps.pop(lineno)
 
         # Handle Expectation instances with line numbers outside of the
@@ -446,7 +479,7 @@
                     test=test, results=results).to_string() + '\n'
             self.merge_raw_expectations(raw_expectations)
 
-    def remove_expectations(self, path, exps):
+    def remove_expectations(self, path, exps) -> ExpectationsChange:
         """This method removes Expectation instances from an expectations file.
         It will delete the line in the expectations file associated with the
         Expectation instance.
@@ -466,11 +499,12 @@
             pattern_to_exps[exp.test].remove(exp)
             if not pattern_to_exps[exp.test]:
                 pattern_to_exps.pop(exp.test)
+        return ExpectationsChange(lines_removed=exps)
 
     def add_expectations(self,
                          path: str,
                          exps: List[typ_types.Expectation],
-                         lineno: int = 0):
+                         lineno: int = 0) -> ExpectationsChange:
         """This method adds Expectation instances to an expectations file. It will
         add the new instances after the line number passed through the lineno parameter.
         If the lineno is set to a value outside the range of line numbers in the file
@@ -507,14 +541,20 @@
             typ_expectations.glob_exps = OrderedDict()
             for exp in glob_exps:
                 typ_expectations.glob_exps.setdefault(exp.test, []).append(exp)
+        return ExpectationsChange(lines_added=exps)
 
 
 class SystemConfigurationEditor:
     ALL_SYSTEMS: ClassVar[str] = ''  # Sentinel value to indicate no tag
 
-    def __init__(self, test_expectations: TestExpectations):
+    def __init__(self,
+                 test_expectations: TestExpectations,
+                 exp_path: Optional[str] = None,
+                 macros: Optional[Mapping[str, Collection[str]]] = None):
         self._test_expectations = test_expectations
-        macros = self._test_expectations.port.configuration_specifier_macros()
+        macros = (
+            macros
+            or self._test_expectations.port.configuration_specifier_macros())
         self._versions_by_os = {
             os.lower(): frozenset(version.lower() for version in os_versions)
             for os, os_versions in macros.items()
@@ -524,12 +564,12 @@
             for os, versions in self._versions_by_os.items()
             for version in versions
         }
-        self._generic_exp_file_path = \
-            self._test_expectations.port.path_to_generic_test_expectations_file()
-        fs = self._test_expectations.port.host.filesystem
+        port = self._test_expectations.port
+        self._exp_path = (exp_path
+                          or port.path_to_generic_test_expectations_file())
         self._tags_in_file = self._tags_in_expectation_file(
-            self._generic_exp_file_path,
-            fs.read_text_file(self._generic_exp_file_path))
+            self._exp_path,
+            port.host.filesystem.read_text_file(self._exp_path))
 
     @property
     def _os_specifiers(self) -> FrozenSet[str]:
@@ -555,6 +595,7 @@
         return self._versions_by_os.get(tag, {tag})
 
     def _system_tag(self, tags: FrozenSet[str]) -> str:
+        tags = frozenset(tag.lower() for tag in tags)
         maybe_version = tags & self._version_specifiers
         maybe_os = tags & self._os_specifiers
         if maybe_version:
@@ -589,15 +630,16 @@
         return {
             new_tag: old_tags
             for new_tag, old_tags in system_specifiers.items()
-            if new_tag in self._tags_in_file
+            if new_tag in self._tags_in_file and old_tags
         }
 
     def update_versions(self,
                         test_name: str,
                         versions: Collection[str],
                         results: Collection[ResultType],
+                        reason: str = '',
                         marker: Optional[str] = None,
-                        autotriage: bool = True):
+                        autotriage: bool = True) -> ExpectationsChange:
         """Update TestExpectations safely.
 
         Arguments:
@@ -611,43 +653,50 @@
             autotriage: Attempt to write the new expectation near an existing
                 related line, if possible.
         """
-        self.remove_os_versions(test_name, versions)
+        versions = versions or self._version_specifiers
+        versions = frozenset(version.lower() for version in versions)
+        change = self.remove_os_versions(test_name, versions)
         expectations = self._test_expectations.get_expectations_from_file(
-            self._generic_exp_file_path, test_name)
-        expectations = []
+            self._exp_path, test_name)
         if autotriage:
             # Get expectations for this test with all specifiers matching except
             # for the system tag.
             expectations = [
                 exp for exp in expectations
-                if not (exp.tags - {self._system_tag(exp.tags)})
+                if not ({tag.lower()
+                         for tag in exp.tags} - {self._system_tag(exp.tags)})
                 and exp.results == results
             ]
+        else:
+            expectations = []
         tags = sorted(self._system_tag(exp.tags) for exp in expectations)
         marker_line = self._find_marker(marker)
         for version in versions:
             anchor_exp = marker_line
             if expectations:
-                index = bisect.bisect(tags, version.lower())
+                index = bisect.bisect(tags, version)
                 anchor_exp = expectations[max(0, index - 1)]
             new_exp = typ_types.Expectation(
                 tags={version},
                 results=results,
                 is_slow_test=anchor_exp.is_slow_test,
-                reason=anchor_exp.reason,
+                reason=(reason or anchor_exp.reason),
                 test=test_name,
                 lineno=anchor_exp.lineno,
                 trailing_comments=anchor_exp.trailing_comments)
-            self._test_expectations.add_expectations(
-                self._generic_exp_file_path, [new_exp], anchor_exp.lineno)
+            change += self._test_expectations.add_expectations(
+                self._exp_path, [new_exp], anchor_exp.lineno)
+        return change
 
-    def merge_versions(self, test_name: str):
+    def merge_versions(self, test_name: str) -> ExpectationsChange:
         """Merge test expectations for systems with the same results."""
+        change = ExpectationsChange()
         expectations = self._test_expectations.get_expectations_from_file(
-            self._generic_exp_file_path, test_name)
+            self._exp_path, test_name)
         exps_by_other_tags = defaultdict(list)
         for exp in expectations:
-            other_tags = exp.tags - {self._system_tag(exp.tags)}
+            other_tags = frozenset(tag.lower() for tag in exp.tags)
+            other_tags -= {self._system_tag(exp.tags)}
             exps_by_other_tags[other_tags, exp.results].append(exp)
         exps_to_remove = []
         # Try to collapse the group along the system tag dimension.
@@ -667,10 +716,11 @@
                         new_tags.add(new_tag)
                     old_exps = [exps_by_system_tags[tag] for tag in old_tags]
                     new_exp = self._merge_expectations(old_exps, new_tags)
-                    self._test_expectations.add_expectations(
-                        self._generic_exp_file_path, [new_exp], new_exp.lineno)
-        self._test_expectations.remove_expectations(
-            self._generic_exp_file_path, exps_to_remove)
+                    change += self._test_expectations.add_expectations(
+                        self._exp_path, [new_exp], new_exp.lineno)
+        change += self._test_expectations.remove_expectations(
+            self._exp_path, exps_to_remove)
+        return change
 
     def _merge_expectations(self, exps: List[typ_types.Expectation],
                             tags: FrozenSet[str]) -> typ_types.Expectation:
@@ -696,17 +746,20 @@
 
     def _find_marker(self,
                      marker: Optional[str] = None) -> typ_types.Expectation:
-        lines = self._test_expectations.get_updated_lines(
-            self._generic_exp_file_path)
+        lines = self._test_expectations.get_updated_lines(self._exp_path)
         if marker:
             for line in lines:
                 contents = line.to_string().lstrip()
                 if marker in contents and contents.startswith('#'):
                     return line
+            exps = [_NotExpectation(f'# {marker}', 0)]
+            self._test_expectations.add_expectations(self._exp_path, exps)
+            lines = self._test_expectations.get_updated_lines(self._exp_path)
         return lines[-1]
 
-    def remove_os_versions(self, test_name: str,
-                           versions_to_remove: Collection[str]):
+    def remove_os_versions(
+            self, test_name: str,
+            versions_to_remove: Collection[str]) -> ExpectationsChange:
         """Remove system specifiers (e.g., `Mac10.10`) from expectations.
 
         This method will also split an expectation with no OS or OS version
@@ -714,22 +767,23 @@
         These residual expectations are written with OS-family specifiers (e.g.,
         `Mac`) when possible.
         """
+        change = ExpectationsChange()
         versions_to_remove = frozenset(
             specifier.lower() for specifier in versions_to_remove)
         if not versions_to_remove:
             # This will prevent making changes to test expectations which
             # have no OS versions to remove.
-            return
+            return change
 
         expectations = self._test_expectations.get_expectations_from_file(
-            self._generic_exp_file_path, test_name)
-
+            self._exp_path, test_name)
         for exp in expectations:
-            versions = self._resolve_versions(exp.tags)
+            tags = frozenset(tag.lower() for tag in exp.tags)
+            versions = self._resolve_versions(tags)
             if not versions & versions_to_remove:
                 continue
             versions -= versions_to_remove
-            other_specifiers = (exp.tags - self._os_specifiers -
+            other_specifiers = (tags - self._os_specifiers -
                                 self._version_specifiers)
             systems = self._simplify_versions(versions)
             tag_sets = [({system} if system != self.ALL_SYSTEMS else set())
@@ -744,10 +798,11 @@
                                       trailing_comments=exp.trailing_comments)
                 for tags in tag_sets
             ]
-            self._test_expectations.remove_expectations(
-                self._generic_exp_file_path, [exp])
-            self._test_expectations.add_expectations(
-                self._generic_exp_file_path, residual_exps, exp.lineno)
+            change += self._test_expectations.remove_expectations(
+                self._exp_path, [exp])
+            change += self._test_expectations.add_expectations(
+                self._exp_path, residual_exps, exp.lineno)
+        return change
 
     def update_expectations(self):
         self._test_expectations.commit_changes()
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
index f4ccb46e..50c6fded 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations_unittest.py
@@ -355,8 +355,10 @@
             crbug.com/123 [ Mac ] failures/expected/text.html?\* [ Failure ]
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.update_versions(
+        change = self._system_config_remover.update_versions(
             'failures/expected/text.html?*', {'Mac10.11'}, {ResultType.Crash})
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 3)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -383,9 +385,11 @@
             [ Mac ] failures/expected/text.html?\* [ Failure ]
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.update_versions(
+        change = self._system_config_remover.update_versions(
             'failures/expected/image.html', {'Mac10.11'}, {ResultType.Crash},
             marker='=== wpt-importer ===')
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 1)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -411,10 +415,12 @@
             [ Mac Debug ] failures/expected/text.html?\* [ Failure ]
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.update_versions(
+        change = self._system_config_remover.update_versions(
             'failures/expected/text.html?*', {'Mac10.11'},
             {ResultType.Failure},
-            marker='does-not-exist')
+            marker='create-me')
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 3)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -426,6 +432,8 @@
                 # results: [ Failure Crash ]
                 [ Debug Mac10.10 ] failures/expected/text.html?\* [ Failure ]
                 [ Debug Mac10.12 ] failures/expected/text.html?\* [ Failure ]
+
+                # create-me
                 [ Mac10.11 ] failures/expected/text.html?\* [ Failure ]
                 """))
 
@@ -438,10 +446,12 @@
 
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.update_versions(
+        change = self._system_config_remover.update_versions(
             'failures/expected/text.html?*', {'Mac10.11'},
             {ResultType.Failure, ResultType.Crash},
             autotriage=False)
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 3)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -457,6 +467,24 @@
                 [ Mac10.11 ] failures/expected/text.html?\* [ Crash Failure ]
                 """))
 
+    def test_update_then_merge_without_net_change(self):
+        raw_expectations = textwrap.dedent("""\
+            # tags: [ Win7 Win10 Win ]
+            # results: [ Failure Crash ]
+            crbug.com/123 [ Win ] failures/expected/text.html?\* [ Failure ]
+            """)
+        self.set_up_using_raw_expectations(raw_expectations)
+        change = self._system_config_remover.update_versions(
+            'failures/expected/text.html?*', {'Win7'}, {ResultType.Failure})
+        change += self._system_config_remover.merge_versions(
+            'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 0)
+        self._system_config_remover.update_expectations()
+        updated_exps = self._port.host.filesystem.read_text_file(
+            self._general_exp_filename)
+        self.assertEqual(updated_exps, raw_expectations)
+
     def test_merge_versions_os(self):
         raw_expectations = textwrap.dedent("""\
             # tags: [ Mac10.10 Mac10.11 Mac10.12 Mac10.13 Mac Win7 Win10 Win ]
@@ -469,8 +497,10 @@
             crbug.com/456 [ Mac10.13 ] failures/expected/text.html?\* [ Failure ]  # comment 2
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.merge_versions(
+        change = self._system_config_remover.merge_versions(
             'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 4)
+        self.assertEqual(len(change.lines_added), 1)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -496,8 +526,10 @@
             crbug.com/123 [ Trusty ] failures/expected/text.html?\* [ Failure ]  # comment
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.merge_versions(
+        change = self._system_config_remover.merge_versions(
             'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 5)
+        self.assertEqual(len(change.lines_added), 1)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -519,8 +551,10 @@
             crbug.com/123 [ Debug Win10 ] failures/expected/text.html?\* [ Crash ]
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.merge_versions(
+        change = self._system_config_remover.merge_versions(
             'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 2)
+        self.assertEqual(len(change.lines_added), 1)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -546,8 +580,10 @@
             crbug.com/123 [ Trusty ] failures/expected/text.html?\* [ Failure ]  # comment
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.merge_versions(
+        change = self._system_config_remover.merge_versions(
             'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 4)
+        self.assertEqual(len(change.lines_added), 2)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -573,8 +609,10 @@
             crbug.com/123 [ Release Win10 ] failures/expected/text.html?\* [ Failure ]
             """)
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.merge_versions(
+        change = self._system_config_remover.merge_versions(
             'failures/expected/text.html?*')
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -596,8 +634,10 @@
             '# Below Expectation should be split\n'
             '[ Mac ] failures/expected/text.html?\* [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html?*', set(['Mac10.10']))
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 2)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -616,8 +656,10 @@
             '# Below Expectation should be unaffected\n'
             '[ Linux ] failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', set(['Mac10.10']))
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -630,8 +672,10 @@
             '# Below Expectation should be split\n'
             'failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', set(['Mac10.10']))
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 4)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -652,9 +696,11 @@
             '# The expectation below and this comment block should be deleted\n'
             '[ Mac ] failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html',
             {'Mac10.10', 'Mac10.11', 'Mac10.12'})
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -669,9 +715,11 @@
             '# Below Expectation should be split\n'
             'failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html',
             {'Mac10.10', 'Mac10.11', 'Mac10.12'})
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 2)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -690,9 +738,11 @@
             '# Below Expectation should be unaffected\n'
             '[ Linux ] failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html',
             {'Mac10.10', 'Mac10.11', 'Mac10.12'})
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -708,8 +758,10 @@
         all_versions = reduce(
             lambda x, y: x + y,
             list(self._port.configuration_specifier_macros_dict.values()))
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', all_versions)
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -728,8 +780,10 @@
         all_versions = reduce(
             lambda x, y: x + y,
             list(self._port.configuration_specifier_macros_dict.values()))
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', all_versions)
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -745,8 +799,10 @@
             '# Below Expectation should be unaffected\n'
             '[ Mac10.11 ] failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', set(['Mac10.10']))
+        self.assertEqual(len(change.lines_removed), 0)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
@@ -759,8 +815,10 @@
             '# Below Expectation as well as this comment should be deleted\n'
             '[ Mac10.10 ] failures/expected/text.html [ Failure ]\n')
         self.set_up_using_raw_expectations(raw_expectations)
-        self._system_config_remover.remove_os_versions(
+        change = self._system_config_remover.remove_os_versions(
             'failures/expected/text.html', set(['Mac10.10']))
+        self.assertEqual(len(change.lines_removed), 1)
+        self.assertEqual(len(change.lines_added), 0)
         self._system_config_remover.update_expectations()
         updated_exps = self._port.host.filesystem.read_text_file(
             self._general_exp_filename)
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 8f0c30e..d0e4f84 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1467,6 +1467,19 @@
     "expires": "Aug 10, 2023"
   },
   {
+    "prefix": "private-aggregation",
+    "platforms": ["Linux"],
+    "bases": [
+      "external/wpt/private-aggregation"
+    ],
+    "exclusive_tests": [
+      "external/wpt/private-aggregation"
+    ],
+    "args": [
+      "--enable-features=SharedStorageAPI,FencedFrames:implementation_type/mparch,PrivacySandboxAdsAPIsOverride,FencedFramesAPIChanges,FencedFramesDefaultMode,PrivateAggregationApi"],
+    "expires": "Jan 1, 2024"
+  },
+  {
     "prefix": "shared-storage-fenced-frame-mparch",
     "platforms": ["Linux", "Mac", "Win"],
     "bases": [
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure-2.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure-2.https.html
new file mode 100644
index 0000000..b39ecd8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure-2.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/private-aggregation/resources/util.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+// Note: This file should contain at most 6 shared storage subtests due to the
+// budget on selectURL().
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1n, value: -2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with a negative value');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure.https.html
new file mode 100644
index 0000000..9dc62b1b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-failure.https.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/private-aggregation/resources/util.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+// Note: This file should contain at most 6 shared storage subtests due to the
+// budget on selectURL().
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 340282366920938463463374607431768211456n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with a bucket too large');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: -1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with negative bucket');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with non-BigInt bucket');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    enableDebugModeArgs: 1234n,
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'Invalid enableDebugMode argument');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    enableDebugModeArgs: {debugKey: 1234},
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with a non-BigInt debugKey');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    enableDebugModeExtraTime: true,
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'enableDebugMode called twice');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success-2.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success-2.https.html
new file mode 100644
index 0000000..8203fd1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success-2.https.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/private-aggregation/resources/util.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+// Note: This file should contain at most 6 shared storage subtests due to the
+// budget on selectURL().
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    enableDebugModeArgs: {debugKey: 1234n},
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a valid debugKey');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success.https.html
new file mode 100644
index 0000000..7012180
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-api-surface-success.https.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/private-aggregation/resources/util.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+// Note: This file should contain at most 6 shared storage subtests due to the
+// budget on selectURL().
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'basic contributeToHistogram() test');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 0n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a zero bucket');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1n, value: 0}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a zero value');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 18446744073709551616n, value: 5}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a large bucket');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 340282366920938463463374607431768211455n, value: 5}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a max bucket');
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1n, value: 2.3}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/false);
+}, 'contributeToHistogram() with a non-integer value');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html
new file mode 100644
index 0000000..3593ed7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/shared-storage/resources/util.js"></script>
+<script src="/private-aggregation/resources/util.js"></script>
+<script src="/fenced-frame/resources/utils.js"></script>
+
+<body>
+<script>
+'use strict';
+
+promise_test(async () => {
+  const paa_data = {
+    enableDebugMode: true,
+    contributions: [{bucket: 1n, value: 2}]
+  };
+
+  await VerifyContributeToHistogram(paa_data, /*expected_error=*/true);
+}, 'contributeToHistogram() with disabled "private-aggregation" permissions policy');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html.headers b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html.headers
new file mode 100644
index 0000000..87819101
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/private-aggregation-permissions-policy-none.https.html.headers
@@ -0,0 +1 @@
+Permissions-Policy: private-aggregation=()
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/resources/private-aggregation-helper-module.js b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/private-aggregation-helper-module.js
new file mode 100644
index 0000000..f5a8533
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/private-aggregation-helper-module.js
@@ -0,0 +1,23 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+class ContributeToHistogramOperation {
+  async run(urls, data) {
+    if (data.enableDebugMode) {
+      privateAggregation.enableDebugMode(data.enableDebugModeArgs);
+
+      if (data.enableDebugModeExtraTime) {
+        privateAggregation.enableDebugMode(data.enableDebugModeArgs);
+      }
+    }
+    for (const contribution of data.contributions) {
+      privateAggregation.contributeToHistogram(contribution);
+    }
+
+    // If an error occurs, the default URL will be picked instead.
+    return 1;
+  }
+}
+
+register('contribute-to-histogram', ContributeToHistogramOperation);
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/resources/util.js b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/util.js
new file mode 100644
index 0000000..7b3a2c5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/util.js
@@ -0,0 +1,24 @@
+// Execute Private Aggregation functions in shared storage worklet given
+// `paa_data`, and expect that success/failure result is `expected_error`.
+async function VerifyContributeToHistogram(paa_data, expected_error) {
+  const ancestor_key = token();
+  let url0 = generateURL("/shared-storage/resources/frame0.html",
+                         [ancestor_key]);
+  let url1 = generateURL("/shared-storage/resources/frame1.html",
+                         [ancestor_key]);
+
+  await addModuleOnce("/private-aggregation/resources/private-aggregation-helper-module.js");
+
+  let select_url_result = await sharedStorage.selectURL(
+    "contribute-to-histogram", [{url: url0}, {url: url1}],
+    {data: paa_data, keepAlive: true});
+
+  attachFencedFrame(select_url_result, 'opaque-ads');
+  const result = await nextValueFromServer(ancestor_key);
+
+  if (expected_error) {
+    assert_equals(result, "frame0_loaded");
+  } else {
+    assert_equals(result, "frame1_loaded");
+  }
+}
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
index ab2c6fa..c5eb1bd 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -985,8 +985,6 @@
         environmentProviderRequest.handle);
   }
 
-  setInputSourceButtonListener(listener) { listener.$.close(); }
-
   // XREnvironmentIntegrationProvider implementation:
   subscribeToHitTest(nativeOriginInformation, entityTypes, ray) {
     if (!this.supportedModes_.includes(xrSessionMojom.XRSessionMode.kImmersiveAr)) {
@@ -1212,7 +1210,6 @@
             clientReceiver: clientReceiver,
             enabledFeatures: enabled_features,
             deviceConfig: {
-              usesInputEventing: false,
               defaultFramebufferScale: this.defaultFramebufferScale_,
               supportsViewportScaling: true,
               depthConfiguration:
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-failure-status-update.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-failure-status-update.js
index 208d30f..cb7c6e91 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-failure-status-update.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-failure-status-update.js
@@ -1,15 +1,26 @@
- (async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
+(async function(testRunner) {
+  const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
       `Test that prerender navigations receives the failure status updates`);
-  await dp.Preload.enable();
+
+  const childTargetManager =
+      new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+  await childTargetManager.startAutoAttach();
+  const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+  const dp1 = session1.protocol;
+  await dp1.Preload.enable();
 
   // Navigate to speculation rules Prerender Page.
-  page.navigate('resources/bad-http-prerender.html');
-  let statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
-  statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
-  statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
+  session1.navigate('resources/bad-http-prerender.html');
+
+  testRunner.log(
+      await dp1.Preload.oncePrerenderStatusUpdated(), '',
+      ['loaderId', 'sessionId']);
+  testRunner.log(
+      await dp1.Preload.oncePrerenderStatusUpdated(), '',
+      ['loaderId', 'sessionId']);
+  testRunner.log(
+      await dp1.Preload.oncePrerenderStatusUpdated(), '',
+      ['loaderId', 'sessionId']);
+
   testRunner.completeTest();
 });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update-expected.txt
index d63ec6d..02ed7ed 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update-expected.txt
@@ -1,11 +1,5 @@
 Test that prerender navigations receives the status updates
 {
-    id : <number>
-    result : {
-    }
-    sessionId : <string>
-}
-{
     method : Preload.prerenderStatusUpdated
     params : {
         key : {
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update.js
index 3d4f0cf..604b1bdb 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/prerender-status-update.js
@@ -1,26 +1,41 @@
 (async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
+  const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
       `Test that prerender navigations receives the status updates`);
-  const enableResponse = await dp.Preload.enable();
-  testRunner.log(enableResponse);
 
-  // Navigate to speculation rules Prerender Page.
-  page.navigate('resources/simple-prerender.html');
+  const childTargetManager =
+      new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+  await childTargetManager.startAutoAttach();
+  const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+  const dp1 = session1.protocol;
+  await dp1.Preload.enable();
 
-  let statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
-  let loaderId = statusReport.params.key.loaderId;
-  statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
-  statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
+  session1.navigate('resources/simple-prerender.html');
 
-  session.evaluate(`document.getElementById('link').click()`);
-  statusReport = await dp.Preload.oncePrerenderStatusUpdated();
-  testRunner.log(statusReport, '', ['loaderId', 'sessionId']);
-  let loaderIdActivation = statusReport.params.key.loaderId;
+  // Pending
+  const resultPending = await dp1.Preload.oncePrerenderStatusUpdated();
+  testRunner.log(resultPending, '', ['loaderId', 'sessionId']);
 
-  if (loaderId !== loaderIdActivation) {
+  // Running
+  testRunner.log(
+      await dp1.Preload.oncePrerenderStatusUpdated(), '',
+      ['loaderId', 'sessionId']);
+  // Ready
+  testRunner.log(
+      await dp1.Preload.oncePrerenderStatusUpdated(), '',
+      ['loaderId', 'sessionId']);
+
+  const session2 = childTargetManager.findAttachedSessionPrerender();
+  const dp2 = session2.protocol;
+  await dp2.Preload.enable();
+
+  // Activate prerendered page.
+  session1.evaluate(`document.getElementById('link').click()`);
+
+  // Success
+  const resultSuccess = await dp2.Preload.oncePrerenderStatusUpdated();
+  testRunner.log(resultSuccess, '', ['loaderId', 'sessionId']);
+
+  if (resultPending.params.key.loaderId !== resultSuccess.params.key.loaderId) {
     testRunner.log('loaderId should remain consistent.');
   }
 
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-bad-http-cancellation.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-bad-http-cancellation.js
index 0eb6734c..0a30686 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-bad-http-cancellation.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-bad-http-cancellation.js
@@ -1,12 +1,19 @@
 (async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
+  const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
       `Test that prerender navigations reports bad http status failure on triggering`);
-  await dp.Preload.enable();
+
+  const childTargetManager =
+      new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+  await childTargetManager.startAutoAttach();
+  const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+  const dp1 = session1.protocol;
+  await dp1.Preload.enable();
 
   // Navigate to speculation rules Prerender Page.
-  page.navigate('resources/bad-http-prerender.html');
-  const statusReport = await dp.Preload.oncePrerenderAttemptCompleted();
-  testRunner.log(statusReport, '', ['loaderId', 'initiatingFrameId', 'sessionId']);
+  session1.navigate('resources/bad-http-prerender.html');
+  testRunner.log(
+      await dp1.Preload.oncePrerenderAttemptCompleted(), '',
+      ['loaderId', 'initiatingFrameId', 'sessionId']);
 
   testRunner.completeTest();
 });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-cancellation-status.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-cancellation-status.js
index 9e41abc..95b0bc838 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-cancellation-status.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-cancellation-status.js
@@ -2,15 +2,24 @@
  // prerendering is cancelled for some reasons. To emulate the cancellation,
  // this test navigates the prerender trigger page to an unrelated page so that
  // prerendering is cancelled with the `Destroyed` final status.
-(async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
-      `Test that prerender navigations report the final status`);
-  await dp.Preload.enable();
+ (async function(testRunner) {
+   const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
+       `Test that prerender navigations report the final status`);
 
-  // Navigate to speculation rules Prerender Page.
-  await page.navigate('resources/simple-prerender.html');
-  page.navigate('resources/empty.html?navigateaway');
-  const statusReport = await dp.Preload.oncePrerenderAttemptCompleted();
-  testRunner.log(statusReport, '', ['loaderId', 'initiatingFrameId', 'sessionId']);
-  testRunner.completeTest();
-});
+   const childTargetManager =
+       new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+   await childTargetManager.startAutoAttach();
+   const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+   const dp1 = session1.protocol;
+   await dp1.Preload.enable();
+
+   // Navigate to speculation rules Prerender Page.
+   await session1.navigate('resources/simple-prerender.html');
+   session1.navigate('resources/empty.html?navigateaway');
+
+   testRunner.log(
+       await dp1.Preload.oncePrerenderAttemptCompleted(), '',
+       ['loaderId', 'initiatingFrameId', 'sessionId']);
+
+   testRunner.completeTest();
+ });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-final-status.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-final-status.js
index 7bdf34e..9c54690 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-final-status.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-final-status.js
@@ -1,13 +1,25 @@
 (async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
+  const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
       `Test that prerender navigations report the final status`);
-  await dp.Preload.enable();
+
+  const childTargetManager =
+      new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+  await childTargetManager.startAutoAttach();
+  const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+  const dp1 = session1.protocol;
+  await dp1.Preload.enable();
 
   // Navigate to speculation rules Prerender Page.
-  await page.navigate('resources/simple-prerender.html');
-  session.evaluate(`document.getElementById('link').click()`);
-  const statusReport = await dp.Preload.oncePrerenderAttemptCompleted();
-  testRunner.log(statusReport, '', ['loaderId', 'initiatingFrameId', 'sessionId']);
+  await session1.navigate('resources/simple-prerender.html');
+
+  const session2 = childTargetManager.findAttachedSessionPrerender();
+  const dp2 = session2.protocol;
+  await dp2.Preload.enable();
+
+  session1.evaluate(`document.getElementById('link').click()`);
+  testRunner.log(
+      await dp2.Preload.oncePrerenderAttemptCompleted(), '',
+      ['loaderId', 'initiatingFrameId', 'sessionId']);
 
   testRunner.completeTest();
 });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-maximum-exceeded.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-maximum-exceeded.js
index cd0a734..2081c571 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-maximum-exceeded.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prerender/report-prerender-maximum-exceeded.js
@@ -1,12 +1,19 @@
 (async function(testRunner) {
-  const {page, session, dp} = await testRunner.startBlank(
+  const {tabTargetSession} = await testRunner.startBlankWithTabTarget(
       `Test that prerender navigations reports failure on triggering`);
-  await dp.Preload.enable();
+
+  const childTargetManager =
+      new TestRunner.ChildTargetManager(testRunner, tabTargetSession);
+  await childTargetManager.startAutoAttach();
+  const session1 = childTargetManager.findAttachedSessionPrimaryMainFrame();
+  const dp1 = session1.protocol;
+  await dp1.Preload.enable();
 
   // Navigate to speculation rules Prerender Page.
-  page.navigate('resources/multiple-prerender.html');
-  const statusReport = await dp.Preload.oncePrerenderAttemptCompleted();
-  testRunner.log(statusReport, '', ['loaderId', 'initiatingFrameId', 'sessionId']);
+  session1.navigate('resources/multiple-prerender.html');
+  testRunner.log(
+      await dp1.Preload.oncePrerenderAttemptCompleted(), '',
+      ['loaderId', 'initiatingFrameId', 'sessionId']);
 
   testRunner.completeTest();
 });
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
index 77c3410..b5e227933 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js
@@ -269,6 +269,28 @@
     return this._start(description, options);
   }
 
+  async startBlankWithTabTarget(description) {
+    try {
+      if (!description)
+        throw new Error('Please provide a description for the test!');
+      this.log(description);
+
+      const bp = this.browserP();
+      const params = {url: 'about:blank', forTab: true};
+      const tabTargetId =
+          (await bp.Target.createTarget(params)).result.targetId;
+      const tabTargetSessionId = (await bp.Target.attachToTarget({
+                                   targetId: tabTargetId,
+                                   flatten: true
+                                 })).result.sessionId;
+      const tabTargetSession = new TestRunner.Session(this, tabTargetSessionId);
+
+      return {tabTargetSession};
+    } catch (e) {
+      this.die('Error starting the test', e);
+    }
+  }
+
   async logStackTrace(debuggers, stackTrace, debuggerId) {
     while (stackTrace) {
       const {description, callFrames, parent, parentId} = stackTrace;
@@ -492,6 +514,54 @@
   }
 };
 
+// Helper class to collect information of auto attached targets and
+// create `TestRunner.Session` from them.
+TestRunner.ChildTargetManager = class {
+  // @param {TestRunner} testRunner
+  // @param {Session} session
+  constructor(testRunner, session) {
+    this._testRunner = testRunner;
+    this._session = session;
+    this._attachedTargets = [];
+  }
+
+  // @param {object|undefined} autoAttachParams
+  // @return {void}
+  //
+  // Issues `Target.setAutoAttach` and starts collecting auto attached
+  // `TargetInfo`.
+  async startAutoAttach(autoAttachParams) {
+    autoAttachParams = autoAttachParams ||
+        {autoAttach: true, flatten: true, waitForDebuggerOnStart: false};
+    this._session.protocol.Target.onAttachedToTarget(event => {
+      this._attachedTargets.push(event.params);
+    });
+    await this._session.protocol.Target.setAutoAttach(autoAttachParams);
+  }
+
+  // @param {(TargetInfo): bool} pred
+  // @return {TestRunner.Session|null}
+  findAttachedSession(pred) {
+    const found =
+        this._attachedTargets.find(({targetInfo}) => pred(targetInfo));
+    return found ? this._session.createChild(found.sessionId) : null;
+  }
+
+  // @return {TestRunner.Session|null}
+  findAttachedSessionPrimaryMainFrame() {
+    return this.findAttachedSession(
+        targetInfo =>
+            targetInfo.type === 'page' && targetInfo.subtype === undefined);
+  }
+
+  // @return {TestRunner.Session|null}
+  findAttachedSessionPrerender() {
+    return this.findAttachedSession(
+        targetInfo =>
+            targetInfo.type === 'page' && targetInfo.subtype === 'prerender');
+  }
+};
+
 var DevToolsAPI = {};
 DevToolsAPI._requestId = 0;
 DevToolsAPI._embedderMessageId = 0;
diff --git a/third_party/blink/web_tests/virtual/private-aggregation/README.md b/third_party/blink/web_tests/virtual/private-aggregation/README.md
new file mode 100644
index 0000000..021f839a
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/private-aggregation/README.md
@@ -0,0 +1,10 @@
+# Private Aggregation
+
+The tests are run with the flag:
+
+```
+--enable-features=SharedStorageAPI,FencedFrames:implementation_type/mparch,PrivacySandboxAdsAPIsOverride,FencedFramesAPIChanges,FencedFramesDefaultMode,PrivateAggregationApi
+```
+
+You can run these tests by targeting the following directory:
+`virtual/private-aggregation/external/wpt/private-aggregation.
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium
index 9e62861..9d12157 100644
--- a/third_party/libaom/README.chromium
+++ b/third_party/libaom/README.chromium
@@ -2,8 +2,8 @@
 Short Name: libaom
 URL: https://aomedia.googlesource.com/aom/
 Version: 0
-Date: Friday June 02 2023
-Revision: b6ead6c2763416c98277c299cfd92befa1376fd6
+Date: Tuesday June 13 2023
+Revision: 233000f66e9ff0bb09226a2f222a029bb4c89de6
 CPEPrefix: cpe:/a:aomedia:aomedia:3.6.0
 License: BSD
 License File: source/libaom/LICENSE
diff --git a/third_party/libaom/libaom_srcs.gni b/third_party/libaom/libaom_srcs.gni
index de808901..15d2858 100644
--- a/third_party/libaom/libaom_srcs.gni
+++ b/third_party/libaom/libaom_srcs.gni
@@ -207,6 +207,7 @@
   "//third_party/libaom/source/libaom/av1/encoder/arm/neon/av1_fwd_txfm2d_neon.c",
   "//third_party/libaom/source/libaom/av1/encoder/arm/neon/highbd_fwd_txfm_neon.c",
   "//third_party/libaom/source/libaom/av1/encoder/arm/neon/wedge_utils_neon.c",
+  "//third_party/libaom/source/libaom/av1/encoder/arm/neon/reconinter_enc_neon.c",
   "//third_party/libaom/source/libaom/av1/encoder/arm/neon/temporal_filter_neon.c",
   "//third_party/libaom/source/libaom/av1/encoder/arm/neon/av1_temporal_denoiser_neon.c",
 ]
@@ -572,6 +573,7 @@
   "//third_party/libaom/source/libaom/aom_dsp/arm/sadxd_neon.c",
   "//third_party/libaom/source/libaom/aom_dsp/arm/sad_neon.c",
   "//third_party/libaom/source/libaom/aom_dsp/arm/masked_sad_neon.c",
+  "//third_party/libaom/source/libaom/aom_dsp/arm/masked_sad4d_neon.c",
   "//third_party/libaom/source/libaom/aom_dsp/arm/subpel_variance_neon.c",
   "//third_party/libaom/source/libaom/aom_dsp/arm/variance_neon.c",
   "//third_party/libaom/source/libaom/aom_dsp/arm/hadamard_neon.c",
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h
index 8bad106..70d12b8b 100644
--- a/third_party/libaom/source/config/config/aom_version.h
+++ b/third_party/libaom/source/config/config/aom_version.h
@@ -12,8 +12,8 @@
 #define VERSION_MAJOR 3
 #define VERSION_MINOR 6
 #define VERSION_PATCH 1
-#define VERSION_EXTRA "676-gb6ead6c27"
+#define VERSION_EXTRA "733-g233000f66"
 #define VERSION_PACKED \
   ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH))
-#define VERSION_STRING_NOSP "3.6.1-676-gb6ead6c27"
-#define VERSION_STRING " 3.6.1-676-gb6ead6c27"
+#define VERSION_STRING_NOSP "3.6.1-733-g233000f66"
+#define VERSION_STRING " 3.6.1-733-g233000f66"
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
index d268891..b9049395 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
@@ -995,112 +995,256 @@
 #define aom_masked_sad128x128 aom_masked_sad128x128_neon
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_neon
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad128x64 aom_masked_sad128x64_neon
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_neon
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x16 aom_masked_sad16x16_neon
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_neon
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x32 aom_masked_sad16x32_neon
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_neon
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x8 aom_masked_sad16x8_neon
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_neon
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x16 aom_masked_sad32x16_neon
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_neon
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x32 aom_masked_sad32x32_neon
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_neon
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x64 aom_masked_sad32x64_neon
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_neon
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x4 aom_masked_sad4x4_neon
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_neon
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x8 aom_masked_sad4x8_neon
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_neon
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x128 aom_masked_sad64x128_neon
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_neon
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x32 aom_masked_sad64x32_neon
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_neon
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x64 aom_masked_sad64x64_neon
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_neon
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x16 aom_masked_sad8x16_neon
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_neon
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x4 aom_masked_sad8x4_neon
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_neon
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x8 aom_masked_sad8x8_neon
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_neon
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h b/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
index 99a0c0a..13aceb4 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
@@ -80,14 +80,21 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_neon
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +109,20 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+#define aom_upsampled_pred aom_upsampled_pred_neon
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
diff --git a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
index d268891..b9049395 100644
--- a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
@@ -995,112 +995,256 @@
 #define aom_masked_sad128x128 aom_masked_sad128x128_neon
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_neon
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad128x64 aom_masked_sad128x64_neon
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_neon
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x16 aom_masked_sad16x16_neon
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_neon
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x32 aom_masked_sad16x32_neon
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_neon
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x8 aom_masked_sad16x8_neon
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_neon
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x16 aom_masked_sad32x16_neon
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_neon
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x32 aom_masked_sad32x32_neon
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_neon
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x64 aom_masked_sad32x64_neon
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_neon
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x4 aom_masked_sad4x4_neon
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_neon
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x8 aom_masked_sad4x8_neon
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_neon
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x128 aom_masked_sad64x128_neon
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_neon
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x32 aom_masked_sad64x32_neon
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_neon
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x64 aom_masked_sad64x64_neon
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_neon
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x16 aom_masked_sad8x16_neon
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_neon
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x4 aom_masked_sad8x4_neon
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_neon
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x8 aom_masked_sad8x8_neon
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_neon
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
diff --git a/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
index 99a0c0a..13aceb4 100644
--- a/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
@@ -80,14 +80,21 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_neon
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +109,20 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+#define aom_upsampled_pred aom_upsampled_pred_neon
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
index 6c9152db..7d353ef 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
@@ -1251,112 +1251,384 @@
 RTCD_EXTERN unsigned int (*aom_masked_sad128x128)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad128x128x4d)(const uint8_t* src,
+                                             int src_stride,
+                                             const uint8_t* ref[4],
+                                             int ref_stride,
+                                             const uint8_t* second_pred,
+                                             const uint8_t* msk,
+                                             int msk_stride,
+                                             int invert_mask,
+                                             unsigned sads[4]);
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad128x64)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad128x64x4d)(const uint8_t* src,
+                                            int src_stride,
+                                            const uint8_t* ref[4],
+                                            int ref_stride,
+                                            const uint8_t* second_pred,
+                                            const uint8_t* msk,
+                                            int msk_stride,
+                                            int invert_mask,
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad16x16)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad16x16x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad16x32)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad16x32x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad16x8)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad16x8x4d)(const uint8_t* src,
+                                          int src_stride,
+                                          const uint8_t* ref[4],
+                                          int ref_stride,
+                                          const uint8_t* second_pred,
+                                          const uint8_t* msk,
+                                          int msk_stride,
+                                          int invert_mask,
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad32x16)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad32x16x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad32x32)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad32x32x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad32x64)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad32x64x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad4x4)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad4x4x4d)(const uint8_t* src,
+                                         int src_stride,
+                                         const uint8_t* ref[4],
+                                         int ref_stride,
+                                         const uint8_t* second_pred,
+                                         const uint8_t* msk,
+                                         int msk_stride,
+                                         int invert_mask,
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad4x8)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad4x8x4d)(const uint8_t* src,
+                                         int src_stride,
+                                         const uint8_t* ref[4],
+                                         int ref_stride,
+                                         const uint8_t* second_pred,
+                                         const uint8_t* msk,
+                                         int msk_stride,
+                                         int invert_mask,
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad64x128)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad64x128x4d)(const uint8_t* src,
+                                            int src_stride,
+                                            const uint8_t* ref[4],
+                                            int ref_stride,
+                                            const uint8_t* second_pred,
+                                            const uint8_t* msk,
+                                            int msk_stride,
+                                            int invert_mask,
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad64x32)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad64x32x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad64x64)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad64x64x4d)(const uint8_t* src,
+                                           int src_stride,
+                                           const uint8_t* ref[4],
+                                           int ref_stride,
+                                           const uint8_t* second_pred,
+                                           const uint8_t* msk,
+                                           int msk_stride,
+                                           int invert_mask,
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad8x16)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad8x16x4d)(const uint8_t* src,
+                                          int src_stride,
+                                          const uint8_t* ref[4],
+                                          int ref_stride,
+                                          const uint8_t* second_pred,
+                                          const uint8_t* msk,
+                                          int msk_stride,
+                                          int invert_mask,
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad8x4)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad8x4x4d)(const uint8_t* src,
+                                         int src_stride,
+                                         const uint8_t* ref[4],
+                                         int ref_stride,
+                                         const uint8_t* second_pred,
+                                         const uint8_t* msk,
+                                         int msk_stride,
+                                         int invert_mask,
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 RTCD_EXTERN unsigned int (*aom_masked_sad8x8)(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+RTCD_EXTERN void (*aom_masked_sad8x8x4d)(const uint8_t* src,
+                                         int src_stride,
+                                         const uint8_t* ref[4],
+                                         int ref_stride,
+                                         const uint8_t* second_pred,
+                                         const uint8_t* msk,
+                                         int msk_stride,
+                                         int invert_mask,
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
@@ -3540,36 +3812,100 @@
     if (flags & HAS_NEON) aom_lpf_vertical_8_quad = aom_lpf_vertical_8_quad_neon;
     aom_masked_sad128x128 = aom_masked_sad128x128_c;
     if (flags & HAS_NEON) aom_masked_sad128x128 = aom_masked_sad128x128_neon;
+    aom_masked_sad128x128x4d = aom_masked_sad128x128x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad128x128x4d = aom_masked_sad128x128x4d_neon;
+    }
     aom_masked_sad128x64 = aom_masked_sad128x64_c;
     if (flags & HAS_NEON) aom_masked_sad128x64 = aom_masked_sad128x64_neon;
+    aom_masked_sad128x64x4d = aom_masked_sad128x64x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad128x64x4d = aom_masked_sad128x64x4d_neon;
+    }
     aom_masked_sad16x16 = aom_masked_sad16x16_c;
     if (flags & HAS_NEON) aom_masked_sad16x16 = aom_masked_sad16x16_neon;
+    aom_masked_sad16x16x4d = aom_masked_sad16x16x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad16x16x4d = aom_masked_sad16x16x4d_neon;
+    }
     aom_masked_sad16x32 = aom_masked_sad16x32_c;
     if (flags & HAS_NEON) aom_masked_sad16x32 = aom_masked_sad16x32_neon;
+    aom_masked_sad16x32x4d = aom_masked_sad16x32x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad16x32x4d = aom_masked_sad16x32x4d_neon;
+    }
     aom_masked_sad16x8 = aom_masked_sad16x8_c;
     if (flags & HAS_NEON) aom_masked_sad16x8 = aom_masked_sad16x8_neon;
+    aom_masked_sad16x8x4d = aom_masked_sad16x8x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad16x8x4d = aom_masked_sad16x8x4d_neon;
+    }
     aom_masked_sad32x16 = aom_masked_sad32x16_c;
     if (flags & HAS_NEON) aom_masked_sad32x16 = aom_masked_sad32x16_neon;
+    aom_masked_sad32x16x4d = aom_masked_sad32x16x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad32x16x4d = aom_masked_sad32x16x4d_neon;
+    }
     aom_masked_sad32x32 = aom_masked_sad32x32_c;
     if (flags & HAS_NEON) aom_masked_sad32x32 = aom_masked_sad32x32_neon;
+    aom_masked_sad32x32x4d = aom_masked_sad32x32x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad32x32x4d = aom_masked_sad32x32x4d_neon;
+    }
     aom_masked_sad32x64 = aom_masked_sad32x64_c;
     if (flags & HAS_NEON) aom_masked_sad32x64 = aom_masked_sad32x64_neon;
+    aom_masked_sad32x64x4d = aom_masked_sad32x64x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad32x64x4d = aom_masked_sad32x64x4d_neon;
+    }
     aom_masked_sad4x4 = aom_masked_sad4x4_c;
     if (flags & HAS_NEON) aom_masked_sad4x4 = aom_masked_sad4x4_neon;
+    aom_masked_sad4x4x4d = aom_masked_sad4x4x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad4x4x4d = aom_masked_sad4x4x4d_neon;
+    }
     aom_masked_sad4x8 = aom_masked_sad4x8_c;
     if (flags & HAS_NEON) aom_masked_sad4x8 = aom_masked_sad4x8_neon;
+    aom_masked_sad4x8x4d = aom_masked_sad4x8x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad4x8x4d = aom_masked_sad4x8x4d_neon;
+    }
     aom_masked_sad64x128 = aom_masked_sad64x128_c;
     if (flags & HAS_NEON) aom_masked_sad64x128 = aom_masked_sad64x128_neon;
+    aom_masked_sad64x128x4d = aom_masked_sad64x128x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad64x128x4d = aom_masked_sad64x128x4d_neon;
+    }
     aom_masked_sad64x32 = aom_masked_sad64x32_c;
     if (flags & HAS_NEON) aom_masked_sad64x32 = aom_masked_sad64x32_neon;
+    aom_masked_sad64x32x4d = aom_masked_sad64x32x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad64x32x4d = aom_masked_sad64x32x4d_neon;
+    }
     aom_masked_sad64x64 = aom_masked_sad64x64_c;
     if (flags & HAS_NEON) aom_masked_sad64x64 = aom_masked_sad64x64_neon;
+    aom_masked_sad64x64x4d = aom_masked_sad64x64x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad64x64x4d = aom_masked_sad64x64x4d_neon;
+    }
     aom_masked_sad8x16 = aom_masked_sad8x16_c;
     if (flags & HAS_NEON) aom_masked_sad8x16 = aom_masked_sad8x16_neon;
+    aom_masked_sad8x16x4d = aom_masked_sad8x16x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad8x16x4d = aom_masked_sad8x16x4d_neon;
+    }
     aom_masked_sad8x4 = aom_masked_sad8x4_c;
     if (flags & HAS_NEON) aom_masked_sad8x4 = aom_masked_sad8x4_neon;
+    aom_masked_sad8x4x4d = aom_masked_sad8x4x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad8x4x4d = aom_masked_sad8x4x4d_neon;
+    }
     aom_masked_sad8x8 = aom_masked_sad8x8_c;
     if (flags & HAS_NEON) aom_masked_sad8x8 = aom_masked_sad8x8_neon;
+    aom_masked_sad8x8x4d = aom_masked_sad8x8x4d_c;
+    if (flags & HAS_NEON) {
+      aom_masked_sad8x8x4d = aom_masked_sad8x8x4d_neon;
+    }
     aom_masked_sub_pixel_variance128x128 =
         aom_masked_sub_pixel_variance128x128_c;
     if (flags & HAS_NEON) {
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
index 8807417b..aafa4e9 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
@@ -80,14 +80,35 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+RTCD_EXTERN void (*aom_comp_avg_upsampled_pred)(
+    MACROBLOCKD* xd,
+    const struct AV1Common* const cm,
+    int mi_row,
+    int mi_col,
+    const MV* const mv,
+    uint8_t* comp_pred,
+    const uint8_t* pred,
+    int width,
+    int height,
+    int subpel_x_q3,
+    int subpel_y_q3,
+    const uint8_t* ref,
+    int ref_stride,
+    int subpel_search);
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +123,32 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+RTCD_EXTERN void (*aom_upsampled_pred)(MACROBLOCKD* xd,
+                                       const struct AV1Common* const cm,
+                                       int mi_row,
+                                       int mi_col,
+                                       const MV* const mv,
+                                       uint8_t* comp_pred,
+                                       int width,
+                                       int height,
+                                       int subpel_x_q3,
+                                       int subpel_y_q3,
+                                       const uint8_t* ref,
+                                       int ref_stride,
+                                       int subpel_search);
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
@@ -598,8 +644,16 @@
 
     (void)flags;
 
+    aom_comp_avg_upsampled_pred = aom_comp_avg_upsampled_pred_c;
+    if (flags & HAS_NEON) {
+      aom_comp_avg_upsampled_pred = aom_comp_avg_upsampled_pred_neon;
+    }
     aom_quantize_b_helper = aom_quantize_b_helper_c;
     if (flags & HAS_NEON) aom_quantize_b_helper = aom_quantize_b_helper_neon;
+    aom_upsampled_pred = aom_upsampled_pred_c;
+    if (flags & HAS_NEON) {
+      aom_upsampled_pred = aom_upsampled_pred_neon;
+    }
     av1_apply_selfguided_restoration = av1_apply_selfguided_restoration_c;
     if (flags & HAS_NEON) av1_apply_selfguided_restoration = av1_apply_selfguided_restoration_neon;
     av1_block_error = av1_block_error_c;
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
index d268891..b9049395 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
@@ -995,112 +995,256 @@
 #define aom_masked_sad128x128 aom_masked_sad128x128_neon
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_neon
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad128x64 aom_masked_sad128x64_neon
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_neon
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x16 aom_masked_sad16x16_neon
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_neon
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x32 aom_masked_sad16x32_neon
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_neon
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x8 aom_masked_sad16x8_neon
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_neon
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x16 aom_masked_sad32x16_neon
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_neon
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x32 aom_masked_sad32x32_neon
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_neon
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x64 aom_masked_sad32x64_neon
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_neon
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x4 aom_masked_sad4x4_neon
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_neon
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x8 aom_masked_sad4x8_neon
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_neon
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x128 aom_masked_sad64x128_neon
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_neon
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x32 aom_masked_sad64x32_neon
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_neon
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x64 aom_masked_sad64x64_neon
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_neon
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x16 aom_masked_sad8x16_neon
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_neon
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x4 aom_masked_sad8x4_neon
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_neon
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x8 aom_masked_sad8x8_neon
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_neon
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
index 99a0c0a..13aceb4 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
@@ -80,14 +80,21 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_neon
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +109,20 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+#define aom_upsampled_pred aom_upsampled_pred_neon
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
diff --git a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
index 37b426a..91a6e2d 100644
--- a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
@@ -82,13 +82,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
index d268891..b9049395 100644
--- a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
@@ -995,112 +995,256 @@
 #define aom_masked_sad128x128 aom_masked_sad128x128_neon
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_neon
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad128x64 aom_masked_sad128x64_neon
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_neon
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x16 aom_masked_sad16x16_neon
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_neon
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x32 aom_masked_sad16x32_neon
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_neon
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x8 aom_masked_sad16x8_neon
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_neon
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x16 aom_masked_sad32x16_neon
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_neon
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x32 aom_masked_sad32x32_neon
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_neon
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x64 aom_masked_sad32x64_neon
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_neon
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x4 aom_masked_sad4x4_neon
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_neon
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x8 aom_masked_sad4x8_neon
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_neon
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x128 aom_masked_sad64x128_neon
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_neon
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x32 aom_masked_sad64x32_neon
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_neon
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x64 aom_masked_sad64x64_neon
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_neon
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x16 aom_masked_sad8x16_neon
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_neon
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x4 aom_masked_sad8x4_neon
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_neon
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x8 aom_masked_sad8x8_neon
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_neon
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
diff --git a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
index 99a0c0a..13aceb4 100644
--- a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
@@ -80,14 +80,21 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_neon
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +109,20 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+#define aom_upsampled_pred aom_upsampled_pred_neon
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
diff --git a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
index 77657a9..80b0aed3 100644
--- a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
@@ -82,13 +82,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
index 0f4e73f..70c2e7f 100644
--- a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
@@ -86,18 +86,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_sse2
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-void aom_comp_mask_upsampled_pred_sse2(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_sse2
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
index 0f4e73f..70c2e7f 100644
--- a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
@@ -86,18 +86,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_sse2
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-void aom_comp_mask_upsampled_pred_sse2(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_sse2
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
index d268891..b9049395 100644
--- a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
@@ -995,112 +995,256 @@
 #define aom_masked_sad128x128 aom_masked_sad128x128_neon
 
 void aom_masked_sad128x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
+void aom_masked_sad128x128x4d_neon(const uint8_t* src,
+                                   int src_stride,
+                                   const uint8_t* ref[4],
+                                   int ref_stride,
+                                   const uint8_t* second_pred,
+                                   const uint8_t* msk,
+                                   int msk_stride,
+                                   int invert_mask,
+                                   unsigned sads[4]);
+#define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_neon
 
 unsigned int aom_masked_sad128x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad128x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad128x64 aom_masked_sad128x64_neon
 
 void aom_masked_sad128x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
+void aom_masked_sad128x64x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_neon
 
 unsigned int aom_masked_sad16x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x16 aom_masked_sad16x16_neon
 
 void aom_masked_sad16x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
+void aom_masked_sad16x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_neon
 
 unsigned int aom_masked_sad16x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x32 aom_masked_sad16x32_neon
 
 void aom_masked_sad16x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
+void aom_masked_sad16x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_neon
 
 unsigned int aom_masked_sad16x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad16x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad16x8 aom_masked_sad16x8_neon
 
 void aom_masked_sad16x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
+void aom_masked_sad16x8x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_neon
 
 unsigned int aom_masked_sad32x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x16 aom_masked_sad32x16_neon
 
 void aom_masked_sad32x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
+void aom_masked_sad32x16x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_neon
 
 unsigned int aom_masked_sad32x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x32 aom_masked_sad32x32_neon
 
 void aom_masked_sad32x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
+void aom_masked_sad32x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_neon
 
 unsigned int aom_masked_sad32x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad32x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad32x64 aom_masked_sad32x64_neon
 
 void aom_masked_sad32x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
+void aom_masked_sad32x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_neon
 
 unsigned int aom_masked_sad4x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x4 aom_masked_sad4x4_neon
 
 void aom_masked_sad4x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
+void aom_masked_sad4x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_neon
 
 unsigned int aom_masked_sad4x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad4x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad4x8 aom_masked_sad4x8_neon
 
 void aom_masked_sad4x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
+void aom_masked_sad4x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_neon
 
 unsigned int aom_masked_sad64x128_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x128_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x128 aom_masked_sad64x128_neon
 
 void aom_masked_sad64x128x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
+void aom_masked_sad64x128x4d_neon(const uint8_t* src,
+                                  int src_stride,
+                                  const uint8_t* ref[4],
+                                  int ref_stride,
+                                  const uint8_t* second_pred,
+                                  const uint8_t* msk,
+                                  int msk_stride,
+                                  int invert_mask,
+                                  unsigned sads[4]);
+#define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_neon
 
 unsigned int aom_masked_sad64x32_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x32_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x32 aom_masked_sad64x32_neon
 
 void aom_masked_sad64x32x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
+void aom_masked_sad64x32x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_neon
 
 unsigned int aom_masked_sad64x64_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad64x64_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad64x64 aom_masked_sad64x64_neon
 
 void aom_masked_sad64x64x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
+void aom_masked_sad64x64x4d_neon(const uint8_t* src,
+                                 int src_stride,
+                                 const uint8_t* ref[4],
+                                 int ref_stride,
+                                 const uint8_t* second_pred,
+                                 const uint8_t* msk,
+                                 int msk_stride,
+                                 int invert_mask,
+                                 unsigned sads[4]);
+#define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_neon
 
 unsigned int aom_masked_sad8x16_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x16_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x16 aom_masked_sad8x16_neon
 
 void aom_masked_sad8x16x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
+void aom_masked_sad8x16x4d_neon(const uint8_t* src,
+                                int src_stride,
+                                const uint8_t* ref[4],
+                                int ref_stride,
+                                const uint8_t* second_pred,
+                                const uint8_t* msk,
+                                int msk_stride,
+                                int invert_mask,
+                                unsigned sads[4]);
+#define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_neon
 
 unsigned int aom_masked_sad8x4_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x4_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x4 aom_masked_sad8x4_neon
 
 void aom_masked_sad8x4x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
+void aom_masked_sad8x4x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_neon
 
 unsigned int aom_masked_sad8x8_c(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 unsigned int aom_masked_sad8x8_neon(const uint8_t *src, int src_stride, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask);
 #define aom_masked_sad8x8 aom_masked_sad8x8_neon
 
 void aom_masked_sad8x8x4d_c(const uint8_t *src, int src_stride, const uint8_t *ref[4], int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned sads[4]);
-#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
+void aom_masked_sad8x8x4d_neon(const uint8_t* src,
+                               int src_stride,
+                               const uint8_t* ref[4],
+                               int ref_stride,
+                               const uint8_t* second_pred,
+                               const uint8_t* msk,
+                               int msk_stride,
+                               int invert_mask,
+                               unsigned sads[4]);
+#define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_neon
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t *src, int src_stride, int xoffset, int yoffset, const uint8_t *ref, int ref_stride, const uint8_t *second_pred, const uint8_t *msk, int msk_stride, int invert_mask, unsigned int *sse);
 unsigned int aom_masked_sub_pixel_variance128x128_neon(
diff --git a/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
index 99a0c0a..13aceb4 100644
--- a/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
@@ -80,14 +80,21 @@
                                                    const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                    int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
                                                    int ref_stride, int subpel_search);
-#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_c
-
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_c
+void aom_comp_avg_upsampled_pred_neon(MACROBLOCKD* xd,
+                                      const struct AV1Common* const cm,
+                                      int mi_row,
+                                      int mi_col,
+                                      const MV* const mv,
+                                      uint8_t* comp_pred,
+                                      const uint8_t* pred,
+                                      int width,
+                                      int height,
+                                      int subpel_x_q3,
+                                      int subpel_y_q3,
+                                      const uint8_t* ref,
+                                      int ref_stride,
+                                      int subpel_search);
+#define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_neon
 
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
@@ -102,7 +109,20 @@
 void aom_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                           const MV *const mv, uint8_t *comp_pred, int width, int height, int subpel_x_q3,
                                           int subpel_y_q3, const uint8_t *ref, int ref_stride, int subpel_search);
-#define aom_upsampled_pred aom_upsampled_pred_c
+void aom_upsampled_pred_neon(MACROBLOCKD* xd,
+                             const struct AV1Common* const cm,
+                             int mi_row,
+                             int mi_col,
+                             const MV* const mv,
+                             uint8_t* comp_pred,
+                             int width,
+                             int height,
+                             int subpel_x_q3,
+                             int subpel_y_q3,
+                             const uint8_t* ref,
+                             int ref_stride,
+                             int subpel_search);
+#define aom_upsampled_pred aom_upsampled_pred_neon
 
 void av1_apply_selfguided_restoration_c(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
 void av1_apply_selfguided_restoration_neon(const uint8_t *dat, int width, int height, int stride, int eps, const int *xqd, uint8_t *dst, int dst_stride, int32_t *tmpbuf, int bit_depth, int highbd);
diff --git a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
index 0f4e73f..70c2e7f 100644
--- a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
@@ -86,18 +86,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_sse2
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-void aom_comp_mask_upsampled_pred_sse2(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_sse2
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
index 0f4e73f..70c2e7f 100644
--- a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
@@ -86,18 +86,6 @@
                                                    int ref_stride, int subpel_search);
 #define aom_comp_avg_upsampled_pred aom_comp_avg_upsampled_pred_sse2
 
-void aom_comp_mask_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-void aom_comp_mask_upsampled_pred_sse2(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
-                                                       const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
-                                                       int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
-                                                       int ref_stride, const uint8_t *mask, int mask_stride, int invert_mask,
-                                                       int subpel_search);
-#define aom_comp_mask_upsampled_pred aom_comp_mask_upsampled_pred_sse2
-
 void aom_dist_wtd_comp_avg_upsampled_pred_c(MACROBLOCKD *xd, const struct AV1Common *const cm, int mi_row, int mi_col,
                                                        const MV *const mv, uint8_t *comp_pred, const uint8_t *pred, int width,
                                                        int height, int subpel_x_q3, int subpel_y_q3, const uint8_t *ref,
diff --git a/tools/clang/scripts/upload_revision.py b/tools/clang/scripts/upload_revision.py
index 6796e2b..63730aa 100755
--- a/tools/clang/scripts/upload_revision.py
+++ b/tools/clang/scripts/upload_revision.py
@@ -17,8 +17,8 @@
 import sys
 import urllib.request
 
-from build import (CheckoutGitRepo, GetCommitDescription, LLVM_DIR,
-                   LLVM_GIT_URL, RunCommand)
+from build import (CheckoutGitRepo, GetCommitDescription, GetLatestLLVMCommit,
+                   LLVM_DIR, LLVM_GIT_URL, RunCommand)
 from update import CHROMIUM_DIR, DownloadAndUnpack
 
 # Access to //tools/rust
@@ -26,7 +26,7 @@
     os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '..',
                  'rust'))
 
-from build_rust import RUST_GIT_URL, RUST_SRC_DIR
+from build_rust import RUST_GIT_URL, RUST_SRC_DIR, GetLatestRustCommit
 
 # Path constants.
 THIS_DIR = os.path.dirname(__file__)
@@ -36,11 +36,6 @@
                                    'update_rust.py')
 BUILD_RUST_PY_PATH = os.path.join(THIS_DIR, '..', '..', 'rust', 'build_rust.py')
 
-# Constants for finding HEAD.
-CLANG_URL = 'https://api.github.com/repos/llvm/llvm-project/git/refs/heads/main'
-RUST_URL = 'https://api.github.com/repos/rust-lang/rust/git/refs/heads/master'
-HEAD_SHA_REGEX = b'"sha":"([^"]+)"'
-
 # Bots where we build Clang + Rust.
 BUILD_CLANG_BOTS = [
     'linux_upload_clang',
@@ -136,12 +131,6 @@
             and self.sub_revision == o.sub_revision)
 
 
-def GetLatestGitHash(url):
-  with urllib.request.urlopen(url) as response:
-    m = re.search(HEAD_SHA_REGEX, response.read())
-    return m.group(1).decode('utf-8')
-
-
 def PatchClangRevision(new_version: ClangVersion) -> ClangVersion:
   with open(CLANG_UPDATE_PY_PATH) as f:
     content = f.read()
@@ -307,7 +296,7 @@
     if args.clang_git_hash:
       clang_git_hash = args.clang_git_hash
     else:
-      clang_git_hash = GetLatestGitHash(CLANG_URL)
+      clang_git_hash = GetLatestLLVMCommit()
     # To `GetCommitDescription()`, we need a checkout. On success, the
     # CheckoutLLVM() makes `LLVM_DIR` be the current working directory, so that
     # we can GetCommitDescription() without changing directory.
@@ -322,7 +311,7 @@
     if args.rust_git_hash:
       rust_git_hash = args.rust_git_hash
     else:
-      rust_git_hash = GetLatestGitHash(RUST_URL)
+      rust_git_hash = GetLatestRustCommit()
     CheckoutGitRepo("Rust", RUST_GIT_URL, rust_git_hash, RUST_SRC_DIR)
     rust_version = RustVersion(rust_git_hash, args.rust_sub_revision)
     os.chdir(CHROMIUM_DIR)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 95f75587..e4efaf4 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -1174,6 +1174,7 @@
     'tryserver.chromium.linux': {
       'cast-binary-size': 'cast_binary_size',
       'chromeos-js-code-coverage': 'chromeos_js_coverage_reclient',
+      'chromeos-js-code-coverage-rel': 'chromeos_js_coverage_reclient',
       'chromium_presubmit': 'presubmit',
       'gpu-fyi-try-lacros-amd-rel': 'gpu_tests_ozone_linux_non_x11_release_trybot_reclient',
       'gpu-fyi-try-lacros-intel-rel': 'gpu_tests_ozone_linux_non_x11_release_trybot_reclient',
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index 8a0217b..f791fcf0 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -23,6 +23,19 @@
       "use_remoteexec": true
     }
   },
+  "chromeos-js-code-coverage-rel": {
+    "gn_args": {
+      "dcheck_always_on": false,
+      "ffmpeg_branding": "ChromeOS",
+      "is_component_build": false,
+      "is_debug": false,
+      "optimize_webui": false,
+      "proprietary_codecs": true,
+      "target_os": "chromeos",
+      "use_javascript_coverage": true,
+      "use_remoteexec": true
+    }
+  },
   "gpu-fyi-try-lacros-amd-rel": {
     "gn_args": {
       "dcheck_always_on": true,
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index d6c762f..2f1f321 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -5173,7 +5173,6 @@
   <suffix name="SMS_FETCH_REQUEST" label="SMS Fetch Request"/>
   <suffix name="UNKNOWN_MESSAGE" label="Unknown Message"/>
   <suffix name="WEB_RTC_SIGNALING_FRAME" label="Web RTC Signalling Message"/>
-  <affected-histogram name="Sharing.MessageHandlerTime"/>
   <affected-histogram name="Sharing.SendMessageResult"/>
   <affected-histogram name="Sharing.SendMessageResult.Android"/>
   <affected-histogram name="Sharing.SendMessageResult.ChromeOS"/>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 210093a..669c4ad 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -3266,6 +3266,13 @@
   </summary>
 </histogram>
 
+<histogram name="Media.InitializeRendererTimeout" enum="CallbackTimeoutStatus"
+    expires_after="2024-04-11">
+  <owner>xhwang@chromium.org</owner>
+  <owner>media-dev@chromium.org</owner>
+  <summary>The timeout status of Renderer initialization.</summary>
+</histogram>
+
 <histogram name="Media.InputErrorMac" enum="OSStatus_Audio"
     expires_after="never">
 <!-- expires-never: essential indicator for audio input stability in Chrome -->
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index 7f64bc4..ebffa56 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -127,38 +127,6 @@
   </summary>
 </histogram>
 
-<histogram name="Sharing.DeviceRegistrationResult"
-    enum="SharingDeviceRegistrationResult" expires_after="M97">
-  <owner>knollr@chromium.org</owner>
-  <owner>peter@chromium.org</owner>
-  <summary>
-    Result of Sharing device registration. Logged after Sharing registration is
-    attempted.
-  </summary>
-</histogram>
-
-<histogram name="Sharing.DeviceUnregistrationResult"
-    enum="SharingDeviceRegistrationResult" expires_after="M97">
-  <owner>knollr@chromium.org</owner>
-  <owner>peter@chromium.org</owner>
-  <summary>
-    Result of Sharing device un-registration. Logged after Sharing
-    un-registration is attempted.
-  </summary>
-</histogram>
-
-<histogram name="Sharing.MessageHandlerTime" units="ms" expires_after="M97">
-<!-- Name completed by histogram_suffix name="SharingMessage" -->
-
-  <owner>mvanouwerkerk@chromium.org</owner>
-  <owner>knollr@chromium.org</owner>
-  <summary>
-    The time from receiving a SharingMessage in SharingFCMHandler until an ack
-    is sent back. Recorded when SendAckMessage callback is run in
-    SharingMessageHandler.
-  </summary>
-</histogram>
-
 <histogram name="Sharing.MessageReceivedType" enum="SharingMessageType"
     expires_after="2023-12-10">
   <owner>mvanouwerkerk@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 4cf7e24..448ede5 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -235,6 +235,21 @@
   </metric>
 </event>
 
+<event name="Accessibility.ReadAnything.EmptyState">
+  <owner>abigailbklein@google.com</owner>
+  <summary>
+    Recorded when an empty state is shown in Read Anything. The empty state is
+    shown whenever distillation fails. When this happens, the user can
+    &quot;select to distill&quot;, meaning they can manually select text in the
+    main web page they would like to see in reading mode.
+  </summary>
+  <metric name="TotalNumSelections">
+    <summary>
+      Total number of selections made.
+    </summary>
+  </metric>
+</event>
+
 <event name="Accessibility.Renderer">
   <owner>aleventhal@chromium.org</owner>
   <owner>nektar@chromium.org</owner>
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index cfb41faf..387004e 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -70,7 +70,7 @@
     window_bounds_ = new_bounds;
   }
   gfx::NativeCursor GetCursor(const gfx::Point& point) override {
-    return gfx::kNullCursor;
+    return gfx::NativeCursor{};
   }
   int GetNonClientComponent(const gfx::Point& point) const override {
     return HTCAPTION;
diff --git a/ui/aura/test/test_window_delegate.cc b/ui/aura/test/test_window_delegate.cc
index 73a686c..d7880590 100644
--- a/ui/aura/test/test_window_delegate.cc
+++ b/ui/aura/test/test_window_delegate.cc
@@ -52,7 +52,7 @@
 }
 
 gfx::NativeCursor TestWindowDelegate::GetCursor(const gfx::Point& point) {
-  return gfx::kNullCursor;
+  return gfx::NativeCursor{};
 }
 
 int TestWindowDelegate::GetNonClientComponent(const gfx::Point& point) const {
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index da42daa..cbad57d 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -667,7 +667,7 @@
 }
 
 gfx::NativeCursor Window::GetCursor(const gfx::Point& point) const {
-  return delegate_ ? delegate_->GetCursor(point) : gfx::kNullCursor;
+  return delegate_ ? delegate_->GetCursor(point) : gfx::NativeCursor{};
 }
 
 void Window::AddObserver(WindowObserver* observer) {
diff --git a/ui/aura_extra/image_window_delegate.cc b/ui/aura_extra/image_window_delegate.cc
index 8c3a9f3..772e592 100644
--- a/ui/aura_extra/image_window_delegate.cc
+++ b/ui/aura_extra/image_window_delegate.cc
@@ -42,7 +42,7 @@
 }
 
 gfx::NativeCursor ImageWindowDelegate::GetCursor(const gfx::Point& point) {
-  return gfx::kNullCursor;
+  return gfx::NativeCursor{};
 }
 
 int ImageWindowDelegate::GetNonClientComponent(const gfx::Point& point) const {
diff --git a/ui/color/color_id.h b/ui/color/color_id.h
index a8cc3f5c..713dacb 100644
--- a/ui/color/color_id.h
+++ b/ui/color/color_id.h
@@ -110,32 +110,34 @@
   E_CPONLY(kColorRefNeutralVariant99) \
   E_CPONLY(kColorRefNeutralVariant100) \
   \
-  /* UI material system color tokens */ \
-  /* Primary. */ \
-  E_CPONLY(kColorSysOnPrimary) \
-  E_CPONLY(kColorSysOnPrimaryContainer) \
+  /* UI material system color tokens. Id ordering matches UX design spec. */ \
   E_CPONLY(kColorSysPrimary) \
+  E_CPONLY(kColorSysOnPrimary) \
   E_CPONLY(kColorSysPrimaryContainer) \
+  E_CPONLY(kColorSysOnPrimaryContainer) \
   /* Secondary. */ \
-  E_CPONLY(kColorSysOnSecondary) \
-  E_CPONLY(kColorSysOnSecondaryContainer) \
   E_CPONLY(kColorSysSecondary) \
+  E_CPONLY(kColorSysOnSecondary) \
   E_CPONLY(kColorSysSecondaryContainer) \
+  E_CPONLY(kColorSysOnSecondaryContainer) \
   /* Tertiary. */ \
-  E_CPONLY(kColorSysOnTertiary) \
-  E_CPONLY(kColorSysOnTertiaryContainer) \
   E_CPONLY(kColorSysTertiary) \
+  E_CPONLY(kColorSysOnTertiary) \
   E_CPONLY(kColorSysTertiaryContainer) \
+  E_CPONLY(kColorSysOnTertiaryContainer) \
   /* Error. */ \
   E_CPONLY(kColorSysError) \
-  E_CPONLY(kColorSysErrorContainer) \
   E_CPONLY(kColorSysOnError) \
+  E_CPONLY(kColorSysErrorContainer) \
   E_CPONLY(kColorSysOnErrorContainer) \
   /* Neutral. */ \
   E_CPONLY(kColorSysOnSurface) \
   E_CPONLY(kColorSysOnSurfaceVariant) \
   E_CPONLY(kColorSysOutline) \
   E_CPONLY(kColorSysSurfaceVariant) \
+  /* Constant. */\
+  E_CPONLY(kColorSysBlack) \
+  E_CPONLY(kColorSysWhite) \
   /* Inverse. */ \
   E_CPONLY(kColorSysInversePrimary) \
   E_CPONLY(kColorSysInverseOnSurface) \
@@ -161,7 +163,6 @@
   E_CPONLY(kColorSysBase) \
   E_CPONLY(kColorSysBaseContainer) \
   E_CPONLY(kColorSysBaseContainerElevated) \
-  E_CPONLY(kColorSysOnBaseSecondary) \
   E_CPONLY(kColorSysOnBaseDivider) \
   E_CPONLY(kColorSysHeader) \
   E_CPONLY(kColorSysHeaderInactive) \
@@ -181,23 +182,25 @@
   E_CPONLY(kColorSysStateFocusHighlight) \
   E_CPONLY(kColorSysStateDisabled) \
   E_CPONLY(kColorSysStateDisabledContainer) \
-  E_CPONLY(kColorSysStateHoverCutout) \
-  E_CPONLY(kColorSysStateHoverInverseCutout) \
-  E_CPONLY(kColorSysStateOnHeaderHover) \
-  E_CPONLY(kColorSysStateHeaderHover) \
   E_CPONLY(kColorSysStateHoverDimBlendProtection) \
   E_CPONLY(kColorSysStateHoverBrightBlendProtection) \
+  E_CPONLY(kColorSysStateOnHeaderHover) \
+  E_CPONLY(kColorSysStateHeaderHover) \
+  E_CPONLY(kColorSysStateHeaderSelect) \
   /* Effects. */ \
   E_CPONLY(kColorSysShadow) \
   /* Experimentation. */ \
   E_CPONLY(kColorSysOmniboxContainer) \
   /* Deprecated */ \
   E_CPONLY(kColorSysOnBase) \
+  E_CPONLY(kColorSysOnBaseSecondary) \
   E_CPONLY(kColorSysOnBaseBorder) \
   E_CPONLY(kColorSysStateHover) \
   E_CPONLY(kColorSysStateFocus) \
   E_CPONLY(kColorSysStatePressed) \
   E_CPONLY(kColorSysStateDrag) \
+  E_CPONLY(kColorSysStateHoverCutout) \
+  E_CPONLY(kColorSysStateHoverInverseCutout) \
   /* Core color concepts */ \
   /* kColorAccent is used in color_provider_css_colors_test.ts. */ \
   /* If changing the variable name, the variable name in the test needs to */ \
diff --git a/ui/color/sys_color_mixer.cc b/ui/color/sys_color_mixer.cc
index 4ce3066..2b882cb 100644
--- a/ui/color/sys_color_mixer.cc
+++ b/ui/color/sys_color_mixer.cc
@@ -116,6 +116,10 @@
                                               : kColorRefNeutralVariant90};
 
   // Inverse.
+  mixer[kColorSysBlack] = {kColorRefNeutral0};
+  mixer[kColorSysWhite] = {kColorRefNeutral100};
+
+  // Inverse.
   mixer[kColorSysInversePrimary] = {dark_mode ? kColorRefPrimary40
                                               : kColorRefPrimary80};
   mixer[kColorSysInverseOnSurface] = {dark_mode ? kColorRefNeutral10
@@ -125,30 +129,40 @@
   mixer[kColorSysSurface] = {dark_mode ? kColorRefNeutral10
                                        : kColorRefNeutral100};
   mixer[kColorSysSurface1] =
-      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x0C),
-                                         {kColorRefNeutral10})
-                : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x0C),
-                                         {kColorRefNeutral99});
+      dark_mode ? GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0xD1, 0xE1, 0xFF)}, 0x0C),
+                      {kColorRefNeutral10})
+                : GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0x69, 0x91, 0xD6)}, 0x0C),
+                      {kColorRefNeutral99});
   mixer[kColorSysSurface2] =
-      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x14),
-                                         {kColorRefNeutral10})
-                : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x14),
-                                         {kColorRefNeutral99});
+      dark_mode ? GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0xD1, 0xE1, 0xFF)}, 0x14),
+                      {kColorRefNeutral10})
+                : GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0x69, 0x91, 0xD6)}, 0x14),
+                      {kColorRefNeutral99});
   mixer[kColorSysSurface3] =
-      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x1C),
-                                         {kColorRefNeutral10})
-                : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x1C),
-                                         {kColorRefNeutral99});
+      dark_mode ? GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0xD1, 0xE1, 0xFF)}, 0x1C),
+                      {kColorRefNeutral10})
+                : GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0x69, 0x91, 0xD6)}, 0x1C),
+                      {kColorRefNeutral99});
   mixer[kColorSysSurface4] =
-      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x1E),
-                                         {kColorRefNeutral10})
-                : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x1E),
-                                         {kColorRefNeutral99});
+      dark_mode ? GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0xD1, 0xE1, 0xFF)}, 0x1E),
+                      {kColorRefNeutral10})
+                : GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0x69, 0x91, 0xD6)}, 0x1E),
+                      {kColorRefNeutral99});
   mixer[kColorSysSurface5] =
-      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary80}, 0x23),
-                                         {kColorRefNeutral10})
-                : GetResultingPaintColor(SetAlpha({kColorRefPrimary40}, 0x23),
-                                         {kColorRefNeutral99});
+      dark_mode ? GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0xD1, 0xE1, 0xFF)}, 0x23),
+                      {kColorRefNeutral10})
+                : GetResultingPaintColor(
+                      SetAlpha({SkColorSetRGB(0x69, 0x91, 0xD6)}, 0x23),
+                      {kColorRefNeutral99});
 
   // General.
   mixer[kColorSysOnSurfaceSecondary] = {dark_mode ? kColorRefNeutral80
@@ -184,8 +198,10 @@
 
   mixer[kColorSysHeader] = {dark_mode ? kColorRefNeutral15
                                       : kColorRefPrimary90};
-  mixer[kColorSysHeaderInactive] = {dark_mode ? kColorSysSurface1
-                                              : kColorSysSurface3};
+  mixer[kColorSysHeaderInactive] = {
+      dark_mode ? kColorSysSurface1
+                : GetResultingPaintColor(SetAlpha({kColorSysHeader}, 0x48),
+                                         {kColorSysSurfaceVariant})};
   mixer[kColorSysHeaderContainer] = {dark_mode ? kColorRefNeutral25
                                                : kColorRefPrimary95};
   mixer[kColorSysHeaderContainerInactive] = {dark_mode ? kColorRefNeutral25
@@ -226,23 +242,17 @@
   mixer[kColorSysStateDisabledContainer] =
       dark_mode ? SetAlpha({kColorRefNeutral90}, 0x1E)
                 : SetAlpha({kColorRefNeutral10}, 0x1E);
-  mixer[kColorSysStateHoverCutout] = {
-      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x0F)
-                : SetAlpha({kColorRefNeutral20}, 0x1F)};
-  mixer[kColorSysStateHoverInverseCutout] = {
-      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x29)
-                : SetAlpha({kColorRefNeutral10}, 0x0F)};
   mixer[kColorSysStateHoverDimBlendProtection] = {
       dark_mode ? SetAlpha({kColorRefNeutral99}, 0x1A)
                 : SetAlpha({kColorRefPrimary20}, 0x2E)};
   mixer[kColorSysStateHoverBrightBlendProtection] = {
       dark_mode ? SetAlpha({kColorRefNeutral99}, 0x29)
                 : SetAlpha({kColorRefNeutral10}, 0x0F)};
-
   mixer[kColorSysStateOnHeaderHover] = {dark_mode ? kColorRefSecondary90
                                                   : kColorRefPrimary20};
   mixer[kColorSysStateHeaderHover] = {dark_mode ? kColorRefSecondary30
                                                 : kColorRefPrimary80};
+  mixer[kColorSysStateHeaderSelect] = {SetAlpha({kColorSysBase}, 0x9A)};
 
   // Effects.
   mixer[kColorSysShadow] = {kColorRefNeutral0};
@@ -267,6 +277,12 @@
                                      : SetAlpha({kColorRefNeutral10}, 0x1E);
   mixer[kColorSysStateDrag] = dark_mode ? SetAlpha({kColorRefNeutral90}, 0x29)
                                         : SetAlpha({kColorRefNeutral10}, 0x29);
+  mixer[kColorSysStateHoverCutout] = {
+      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x0F)
+                : SetAlpha({kColorRefNeutral20}, 0x1F)};
+  mixer[kColorSysStateHoverInverseCutout] = {
+      dark_mode ? SetAlpha({kColorRefNeutral10}, 0x29)
+                : SetAlpha({kColorRefNeutral10}, 0x0F)};
 
   if (key.user_color.has_value()) {
     AddThemedSysColorOverrides(mixer, key);
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index 4fb4a862..082c6bc 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -199,6 +199,7 @@
       "mac/test/virtual_display_mac_util.h",
       "mac/test/virtual_display_mac_util.mm",
     ]
+    configs += [ "//build/config/compiler:enable_arc" ]
   }
 
   if (is_chromeos_ash) {
diff --git a/ui/display/mac/test/test_screen_mac.mm b/ui/display/mac/test/test_screen_mac.mm
index d375464..49cbd9b7 100644
--- a/ui/display/mac/test/test_screen_mac.mm
+++ b/ui/display/mac/test/test_screen_mac.mm
@@ -12,11 +12,15 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace display {
 namespace test {
 
 TestScreenMac::TestScreenMac(const gfx::Size& size)
-    : TestScreen(/* create_display = */ false) {
+    : TestScreen(/*create_display=*/false) {
   NSScreen* screen = [[NSScreen screens] firstObject];
   CGDirectDisplayID display_id =
       [[screen deviceDescription][@"NSScreenNumber"] unsignedIntValue];
diff --git a/ui/display/mac/test/virtual_display_mac_util.mm b/ui/display/mac/test/virtual_display_mac_util.mm
index d52d163..1b762449 100644
--- a/ui/display/mac/test/virtual_display_mac_util.mm
+++ b/ui/display/mac/test/virtual_display_mac_util.mm
@@ -12,60 +12,35 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "base/mac/scoped_cftyperef.h"
-#include "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/size.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 // These interfaces were generated from CoreGraphics binaries.
 API_AVAILABLE(macos(10.14))
-@interface CGVirtualDisplay : NSObject {
-  unsigned int _vendorID;
-  unsigned int _productID;
-  unsigned int _serialNum;
-  NSString* _name;
-  struct CGSize _sizeInMillimeters;
-  unsigned int _maxPixelsWide;
-  unsigned int _maxPixelsHigh;
-  struct CGPoint _redPrimary;
-  struct CGPoint _greenPrimary;
-  struct CGPoint _bluePrimary;
-  struct CGPoint _whitePoint;
-  id _queue;
-  id _terminationHandler;
-  unsigned int _displayID;
-  unsigned int _hiDPI;
-  NSArray* _modes;
-}
+@interface CGVirtualDisplay : NSObject
 
-@property(readonly, nonatomic)
-    unsigned int vendorID;  // @synthesize vendorID=_vendorID;
-@property(readonly, nonatomic)
-    unsigned int productID;  // @synthesize productID=_productID;
-@property(readonly, nonatomic)
-    unsigned int serialNum;  // @synthesize serialNum=_serialNum;
-@property(readonly, nonatomic) NSString* name;  // @synthesize name=_name;
-@property(readonly, nonatomic) struct CGSize
-    sizeInMillimeters;  // @synthesize sizeInMillimeters=_sizeInMillimeters;
-@property(readonly, nonatomic)
-    unsigned int maxPixelsWide;  // @synthesize maxPixelsWide=_maxPixelsWide;
-@property(readonly, nonatomic)
-    unsigned int maxPixelsHigh;  // @synthesize maxPixelsHigh=_maxPixelsHigh;
-@property(readonly, nonatomic)
-    struct CGPoint redPrimary;  // @synthesize redPrimary=_redPrimary;
-@property(readonly, nonatomic)
-    struct CGPoint greenPrimary;  // @synthesize greenPrimary=_greenPrimary;
-@property(readonly, nonatomic)
-    struct CGPoint bluePrimary;  // @synthesize bluePrimary=_bluePrimary;
-@property(readonly, nonatomic)
-    struct CGPoint whitePoint;            // @synthesize whitePoint=_whitePoint;
-@property(readonly, nonatomic) id queue;  // @synthesize queue=_queue;
-@property(readonly, nonatomic) id
-    terminationHandler;  // @synthesize terminationHandler=_terminationHandler;
-@property(readonly, nonatomic)
-    unsigned int displayID;  // @synthesize displayID=_displayID;
-@property(readonly, nonatomic) unsigned int hiDPI;  // @synthesize hiDPI=_hiDPI;
-@property(readonly, nonatomic) NSArray* modes;      // @synthesize modes=_modes;
+@property(readonly, nonatomic) unsigned int vendorID;
+@property(readonly, nonatomic) unsigned int productID;
+@property(readonly, nonatomic) unsigned int serialNum;
+@property(readonly, nonatomic) NSString* name;
+@property(readonly, nonatomic) struct CGSize sizeInMillimeters;
+@property(readonly, nonatomic) unsigned int maxPixelsWide;
+@property(readonly, nonatomic) unsigned int maxPixelsHigh;
+@property(readonly, nonatomic) struct CGPoint redPrimary;
+@property(readonly, nonatomic) struct CGPoint greenPrimary;
+@property(readonly, nonatomic) struct CGPoint bluePrimary;
+@property(readonly, nonatomic) struct CGPoint whitePoint;
+@property(readonly, nonatomic) id queue;
+@property(readonly, nonatomic) id terminationHandler;
+@property(readonly, nonatomic) unsigned int displayID;
+@property(readonly, nonatomic) unsigned int hiDPI;
+@property(readonly, nonatomic) NSArray* modes;
 - (BOOL)applySettings:(id)arg1;
 - (void)dealloc;
 - (id)initWithDescriptor:(id)arg1;
@@ -74,45 +49,21 @@
 
 // These interfaces were generated from CoreGraphics binaries.
 API_AVAILABLE(macos(10.14))
-@interface CGVirtualDisplayDescriptor : NSObject {
-  unsigned int _vendorID;
-  unsigned int _productID;
-  unsigned int _serialNum;
-  NSString* _name;
-  struct CGSize _sizeInMillimeters;
-  unsigned int _maxPixelsWide;
-  unsigned int _maxPixelsHigh;
-  struct CGPoint _redPrimary;
-  struct CGPoint _greenPrimary;
-  struct CGPoint _bluePrimary;
-  struct CGPoint _whitePoint;
-  id _queue;
-  id _terminationHandler;
-}
+@interface CGVirtualDisplayDescriptor : NSObject
 
-@property(nonatomic) unsigned int vendorID;  // @synthesize vendorID=_vendorID;
-@property(nonatomic)
-    unsigned int productID;  // @synthesize productID=_productID;
-@property(nonatomic)
-    unsigned int serialNum;  // @synthesize serialNum=_serialNum;
-@property(strong, nonatomic) NSString* name;  // @synthesize name=_name;
-@property(nonatomic) struct CGSize
-    sizeInMillimeters;  // @synthesize sizeInMillimeters=_sizeInMillimeters;
-@property(nonatomic)
-    unsigned int maxPixelsWide;  // @synthesize maxPixelsWide=_maxPixelsWide;
-@property(nonatomic)
-    unsigned int maxPixelsHigh;  // @synthesize maxPixelsHigh=_maxPixelsHigh;
-@property(nonatomic)
-    struct CGPoint redPrimary;  // @synthesize redPrimary=_redPrimary;
-@property(nonatomic)
-    struct CGPoint greenPrimary;  // @synthesize greenPrimary=_greenPrimary;
-@property(nonatomic)
-    struct CGPoint bluePrimary;  // @synthesize bluePrimary=_bluePrimary;
-@property(nonatomic)
-    struct CGPoint whitePoint;          // @synthesize whitePoint=_whitePoint;
-@property(retain, nonatomic) id queue;  // @synthesize queue=_queue;
-@property(copy, nonatomic) id
-    terminationHandler;  // @synthesize terminationHandler=_terminationHandler;
+@property(nonatomic) unsigned int vendorID;
+@property(nonatomic) unsigned int productID;
+@property(nonatomic) unsigned int serialNum;
+@property(strong, nonatomic) NSString* name;
+@property(nonatomic) struct CGSize sizeInMillimeters;
+@property(nonatomic) unsigned int maxPixelsWide;
+@property(nonatomic) unsigned int maxPixelsHigh;
+@property(nonatomic) struct CGPoint redPrimary;
+@property(nonatomic) struct CGPoint greenPrimary;
+@property(nonatomic) struct CGPoint bluePrimary;
+@property(nonatomic) struct CGPoint whitePoint;
+@property(strong, nonatomic) id queue;
+@property(copy, nonatomic) id terminationHandler;
 - (void)dealloc;
 - (id)init;
 - (id)dispatchQueue;
@@ -122,17 +73,11 @@
 
 // These interfaces were generated from CoreGraphics binaries.
 API_AVAILABLE(macos(10.14))
-@interface CGVirtualDisplayMode : NSObject {
-  unsigned int _width;
-  unsigned int _height;
-  double _refreshRate;
-}
+@interface CGVirtualDisplayMode : NSObject
 
-@property(readonly, nonatomic) unsigned int width;  // @synthesize width=_width;
-@property(readonly, nonatomic)
-    unsigned int height;  // @synthesize height=_height;
-@property(readonly, nonatomic)
-    double refreshRate;  // @synthesize refreshRate=_refreshRate;
+@property(readonly, nonatomic) unsigned int width;
+@property(readonly, nonatomic) unsigned int height;
+@property(readonly, nonatomic) double refreshRate;
 - (id)initWithWidth:(unsigned int)arg1
              height:(unsigned int)arg2
         refreshRate:(double)arg3;
@@ -141,13 +86,10 @@
 
 // These interfaces were generated from CoreGraphics binaries.
 API_AVAILABLE(macos(10.14))
-@interface CGVirtualDisplaySettings : NSObject {
-  NSArray* _modes;
-  unsigned int _hiDPI;
-}
+@interface CGVirtualDisplaySettings : NSObject
 
-@property(strong, nonatomic) NSArray* modes;  // @synthesize modes=_modes;
-@property(nonatomic) unsigned int hiDPI;      // @synthesize hiDPI=_hiDPI;
+@property(strong, nonatomic) NSArray* modes;
+@property(nonatomic) unsigned int hiDPI;
 - (void)dealloc;
 - (id)init;
 
@@ -158,56 +100,55 @@
 static bool g_need_display_removal_workaround = true;
 
 // A global singleton that tracks the current set of mocked displays.
-std::map<int64_t, base::scoped_nsobject<CGVirtualDisplay>> g_display_map
+std::map<int64_t, CGVirtualDisplay * __strong> g_display_map
     API_AVAILABLE(macos(10.14));
 
 // A helper function for creating virtual display and return CGVirtualDisplay
 // object.
-base::scoped_nsobject<CGVirtualDisplay> CreateVirtualDisplay(int width,
-                                                             int height,
-                                                             int ppi,
-                                                             BOOL hiDPI,
-                                                             NSString* name)
+CGVirtualDisplay* CreateVirtualDisplay(int width,
+                                       int height,
+                                       int ppi,
+                                       BOOL hiDPI,
+                                       NSString* name)
     API_AVAILABLE(macos(10.14)) {
-  base::scoped_nsobject<CGVirtualDisplaySettings> settings(
-      [[CGVirtualDisplaySettings alloc] init]);
-  [settings setHiDPI:hiDPI];
+  CGVirtualDisplaySettings* settings = [[CGVirtualDisplaySettings alloc] init];
+  settings.hiDPI = hiDPI;
 
-  base::scoped_nsobject<CGVirtualDisplayDescriptor> descriptor(
-      [[CGVirtualDisplayDescriptor alloc] init]);
-  [descriptor
-      setQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)];
-  [descriptor setName:name];
+  CGVirtualDisplayDescriptor* descriptor =
+      [[CGVirtualDisplayDescriptor alloc] init];
+  descriptor.queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
+  descriptor.name = name;
 
   // See System Preferences > Displays > Color > Open Profile > Apple display
   // native information
-  [descriptor setWhitePoint:CGPointMake(0.3125, 0.3291)];
-  [descriptor setBluePrimary:CGPointMake(0.1494, 0.0557)];
-  [descriptor setGreenPrimary:CGPointMake(0.2559, 0.6983)];
-  [descriptor setRedPrimary:CGPointMake(0.6797, 0.3203)];
-  [descriptor setMaxPixelsHigh:height];
-  [descriptor setMaxPixelsWide:width];
-  [descriptor
-      setSizeInMillimeters:CGSizeMake(25.4 * width / ppi, 25.4 * height / ppi)];
-  [descriptor setSerialNum:0];
-  [descriptor setProductID:0];
-  [descriptor setVendorID:0];
+  descriptor.whitePoint = CGPointMake(0.3125, 0.3291);
+  descriptor.bluePrimary = CGPointMake(0.1494, 0.0557);
+  descriptor.greenPrimary = CGPointMake(0.2559, 0.6983);
+  descriptor.redPrimary = CGPointMake(0.6797, 0.3203);
+  descriptor.maxPixelsHigh = height;
+  descriptor.maxPixelsWide = width;
+  descriptor.sizeInMillimeters =
+      CGSizeMake(25.4 * width / ppi, 25.4 * height / ppi);
+  descriptor.serialNum = 0;
+  descriptor.productID = 0;
+  descriptor.vendorID = 0;
 
-  base::scoped_nsobject<CGVirtualDisplay> display(
-      [[CGVirtualDisplay alloc] initWithDescriptor:descriptor]);
+  CGVirtualDisplay* display =
+      [[CGVirtualDisplay alloc] initWithDescriptor:descriptor];
 
-  if ([settings hiDPI]) {
+  if (settings.hiDPI) {
     width /= 2;
     height /= 2;
   }
-  base::scoped_nsobject<CGVirtualDisplayMode> mode([[CGVirtualDisplayMode alloc]
-      initWithWidth:width
-             height:height
-        refreshRate:60]);
-  [settings setModes:@[ mode ]];
+  CGVirtualDisplayMode* mode =
+      [[CGVirtualDisplayMode alloc] initWithWidth:width
+                                           height:height
+                                      refreshRate:60];
+  settings.modes = @[ mode ];
 
-  if (![display applySettings:settings])
-    return base::scoped_nsobject<CGVirtualDisplay>();
+  if (![display applySettings:settings]) {
+    return nil;
+  }
 
   return display;
 }
@@ -316,17 +257,17 @@
       CGDisplayCopyAllDisplayModes(display_id, nullptr));
   DCHECK(display_modes);
 
-  CGDisplayModeRef prefered_display_mode = nullptr;
+  CGDisplayModeRef preferred_display_mode = nullptr;
   for (CFIndex i = 0; i < CFArrayGetCount(display_modes); ++i) {
     CGDisplayModeRef display_mode =
         (CGDisplayModeRef)CFArrayGetValueAtIndex(display_modes, i);
     if (gfx::Size(CGDisplayModeGetWidth(display_mode),
                   CGDisplayModeGetHeight(display_mode)) == size) {
-      prefered_display_mode = display_mode;
+      preferred_display_mode = display_mode;
       break;
     }
   }
-  DCHECK(prefered_display_mode);
+  DCHECK(preferred_display_mode);
 
   uint32_t expected_changed_metrics =
       display::DisplayObserver::DISPLAY_METRIC_BOUNDS |
@@ -338,7 +279,7 @@
   // This operation is always synchronous. The function doesn’t return until the
   // mode switch is complete.
   CGError result =
-      CGDisplaySetDisplayMode(display_id, prefered_display_mode, nullptr);
+      CGDisplaySetDisplayMode(display_id, preferred_display_mode, nullptr);
   DCHECK_EQ(result, kCGErrorSuccess);
 
   // Wait for `display::Screen` and `display::Display` structures to be updated.
@@ -359,19 +300,17 @@
         height(height),
         ppi(ppi),
         hiDPI(hiDPI),
-        description([NSString
-            stringWithCString:description.c_str()
-                     encoding:[NSString defaultCStringEncoding]]) {}
+        description(base::SysUTF8ToNSString(description)) {}
 
   bool IsValid() const {
-    return width > 0 && height > 0 && ppi > 0 && [description length] > 0;
+    return width > 0 && height > 0 && ppi > 0 && description.length > 0;
   }
 
   int width;
   int height;
   int ppi;
   BOOL hiDPI;
-  base::scoped_nsobject<NSString> description;
+  NSString* __strong description;
 };
 
 VirtualDisplayMacUtil::VirtualDisplayMacUtil() {
@@ -390,10 +329,10 @@
 
     NSString* display_name =
         [NSString stringWithFormat:@"Virtual Display #%lld", display_id];
-    base::scoped_nsobject<CGVirtualDisplay> display = CreateVirtualDisplay(
+    CGVirtualDisplay* display = CreateVirtualDisplay(
         display_params.width, display_params.height, display_params.ppi,
         display_params.hiDPI, display_name);
-    DCHECK(display.get());
+    DCHECK(display);
 
     // TODO(crbug.com/1126278): Please remove this log or replace it with
     // [D]CHECK() ASAP when the TEST is stable.
@@ -401,7 +340,7 @@
               << " - display id: " << display_id
               << ". CreateVirtualDisplay success.";
 
-    int64_t id = [display displayID];
+    int64_t id = display.displayID;
     DCHECK_NE(id, 0u);
 
     WaitForDisplay(id, /*added=*/true);
diff --git a/ui/gfx/android/android_surface_control_compat.cc b/ui/gfx/android/android_surface_control_compat.cc
index 30ea3665..9d9c77f 100644
--- a/ui/gfx/android/android_surface_control_compat.cc
+++ b/ui/gfx/android/android_surface_control_compat.cc
@@ -867,11 +867,10 @@
   uint64_t data_space = ADATASPACE_UNKNOWN;
   float extended_range_brightness_ratio = 1.f;
   float desired_brightness_ratio = 1.f;
-  if (metadata && metadata->extended_range_brightness &&
+  if (metadata && metadata->extended_range &&
       SurfaceControlMethods::Get()
           .ASurfaceTransaction_setExtendedRangeBrightnessFn) {
-    desired_brightness_ratio =
-        metadata->extended_range_brightness->desired_ratio;
+    desired_brightness_ratio = metadata->extended_range->desired_headroom;
   }
   ColorSpaceToADataSpace(color_space, desired_brightness_ratio, data_space,
                          extended_range_brightness_ratio);
diff --git a/ui/gfx/display_color_spaces.cc b/ui/gfx/display_color_spaces.cc
index 10df605..5bb4ab67 100644
--- a/ui/gfx/display_color_spaces.cc
+++ b/ui/gfx/display_color_spaces.cc
@@ -205,4 +205,14 @@
   return !(*this == other);
 }
 
+// static
+bool DisplayColorSpaces::EqualExceptForHdrParameters(
+    const DisplayColorSpaces& a,
+    const DisplayColorSpaces& b) {
+  DisplayColorSpaces b_with_a_params = b;
+  b_with_a_params.sdr_max_luminance_nits_ = a.sdr_max_luminance_nits_;
+  b_with_a_params.hdr_max_luminance_relative_ = a.hdr_max_luminance_relative_;
+  return a == b_with_a_params;
+}
+
 }  // namespace gfx
diff --git a/ui/gfx/display_color_spaces.h b/ui/gfx/display_color_spaces.h
index 8763a08f..3b7da56 100644
--- a/ui/gfx/display_color_spaces.h
+++ b/ui/gfx/display_color_spaces.h
@@ -130,6 +130,11 @@
   bool operator==(const DisplayColorSpaces& other) const;
   bool operator!=(const DisplayColorSpaces& other) const;
 
+  // Return true if the two parameters are equal except for their
+  // `hdr_max_luminance_relative_` and `sdr_max_luminance_nits_` members.
+  static bool EqualExceptForHdrParameters(const DisplayColorSpaces& a,
+                                          const DisplayColorSpaces& b);
+
  private:
   // Serialization of DisplayColorSpaces directly accesses members.
   friend struct IPC::ParamTraits<gfx::DisplayColorSpaces>;
diff --git a/ui/gfx/hdr_metadata.cc b/ui/gfx/hdr_metadata.cc
index c9606a8..ff486d91 100644
--- a/ui/gfx/hdr_metadata.cc
+++ b/ui/gfx/hdr_metadata.cc
@@ -34,6 +34,14 @@
   return ss.str();
 }
 
+std::string HdrMetadataExtendedRange::ToString() const {
+  std::stringstream ss;
+  ss << std::fixed << std::setprecision(4) << "{"
+     << "current_headroom:" << current_headroom << ", "
+     << "desired_headroom:" << desired_headroom << "}";
+  return ss.str();
+}
+
 // static
 HDRMetadata HDRMetadata::PopulateUnspecifiedWithDefaults(
     const absl::optional<gfx::HDRMetadata>& hdr_metadata) {
@@ -72,11 +80,9 @@
   if (cta_861_3) {
     ss << "cta_861_3:" << cta_861_3->ToString() << ", ";
   }
-  if (extended_range_brightness) {
-    ss << "cur_ratio: " << extended_range_brightness->current_buffer_ratio;
-    ss << "desired_ratio: " << extended_range_brightness->desired_ratio;
+  if (extended_range) {
+    ss << "extended_range:" << extended_range->ToString() << ", ";
   }
-
   ss << "}";
   return ss.str();
 }
diff --git a/ui/gfx/hdr_metadata.h b/ui/gfx/hdr_metadata.h
index 0477b30..05e9754e 100644
--- a/ui/gfx/hdr_metadata.h
+++ b/ui/gfx/hdr_metadata.h
@@ -90,24 +90,29 @@
 };
 
 // HDR metadata for extended range color spaces.
-struct COLOR_SPACE_EXPORT ExtendedRangeBrightness {
-  // The current hdr/sdr ratio of the current buffer. For example if the buffer
-  // was rendered with a target SDR whitepoint of 100 nits and a max display
-  // brightness of 200 nits, this should be set to 2.0f.
-  float current_buffer_ratio = 1.0f;
+struct COLOR_SPACE_EXPORT HdrMetadataExtendedRange {
+  constexpr HdrMetadataExtendedRange() = default;
+  constexpr HdrMetadataExtendedRange(float current_headroom,
+                                     float desired_headroom)
+      : current_headroom(current_headroom),
+        desired_headroom(desired_headroom) {}
 
-  // The desired hdr/sdr ratio. This can be used to communicate the max desired
-  // brightness range. This is similar to the "max luminance" value in other HDR
-  // metadata formats, but represented as a ratio of the target SDR whitepoint
-  // to the max display brightness.
-  float desired_ratio = 1.0f;
+  // The HDR headroom of the contents of the current buffer.
+  float current_headroom = 1.f;
 
-  bool operator==(const ExtendedRangeBrightness& rhs) const {
-    return (current_buffer_ratio == rhs.current_buffer_ratio &&
-            desired_ratio == rhs.desired_ratio);
+  // The desired HDR headroom of the content in the current buffer. This may be
+  // greater than `current_headroom` if the content in the current buffer had
+  // to be tonemapped to fit into `current_headroom`.
+  float desired_headroom = 1.f;
+
+  std::string ToString() const;
+
+  bool operator==(const HdrMetadataExtendedRange& rhs) const {
+    return (current_headroom == rhs.current_headroom &&
+            desired_headroom == rhs.desired_headroom);
   }
 
-  bool operator!=(const ExtendedRangeBrightness& rhs) const {
+  bool operator!=(const HdrMetadataExtendedRange& rhs) const {
     return !(*this == rhs);
   }
 };
@@ -119,7 +124,7 @@
 
   // Brightness points for extended range color spaces.
   // NOTE: Is not serialized over IPC.
-  absl::optional<ExtendedRangeBrightness> extended_range_brightness;
+  absl::optional<HdrMetadataExtendedRange> extended_range;
 
   HDRMetadata() = default;
   HDRMetadata(const HdrMetadataSmpteSt2086& smpte_st_2086,
@@ -134,8 +139,7 @@
 
   bool IsValid() const {
     return (cta_861_3 && cta_861_3->IsValid()) ||
-           (smpte_st_2086 && smpte_st_2086->IsValid()) ||
-           extended_range_brightness;
+           (smpte_st_2086 && smpte_st_2086->IsValid()) || extended_range;
   }
 
   // Return a copy of `hdr_metadata` with its `smpte_st_2086` fully
@@ -151,7 +155,7 @@
 
   bool operator==(const HDRMetadata& rhs) const {
     return cta_861_3 == rhs.cta_861_3 && smpte_st_2086 == rhs.smpte_st_2086 &&
-           extended_range_brightness == rhs.extended_range_brightness;
+           extended_range == rhs.extended_range;
   }
 
   bool operator!=(const HDRMetadata& rhs) const { return !(*this == rhs); }
diff --git a/ui/gfx/mojom/BUILD.gn b/ui/gfx/mojom/BUILD.gn
index 3cca6a9..82d95c7 100644
--- a/ui/gfx/mojom/BUILD.gn
+++ b/ui/gfx/mojom/BUILD.gn
@@ -449,6 +449,10 @@
           cpp = "::gfx::HdrMetadataSmpteSt2086"
         },
         {
+          mojom = "gfx.mojom.HdrMetadataExtendedRange"
+          cpp = "::gfx::HdrMetadataExtendedRange"
+        },
+        {
           mojom = "gfx.mojom.HDRMetadata"
           cpp = "::gfx::HDRMetadata"
         },
diff --git a/ui/gfx/mojom/hdr_metadata.mojom b/ui/gfx/mojom/hdr_metadata.mojom
index ff15d97a..4a70fde1 100644
--- a/ui/gfx/mojom/hdr_metadata.mojom
+++ b/ui/gfx/mojom/hdr_metadata.mojom
@@ -26,8 +26,16 @@
   float luminance_min;
 };
 
+// Mojo equivalent of gfx::HdrMetadataExtendedRange. No validation is done on
+// any of these values during serialization.
+struct HdrMetadataExtendedRange {
+  float current_headroom;
+  float desired_headroom;
+};
+
 // Mojo equivalent of gfx::HDRMetadata.
 struct HDRMetadata {
   HdrMetadataSmpteSt2086? smpte_st_2086;
   HdrMetadataCta861_3? cta_861_3;
+  HdrMetadataExtendedRange? extended_range;
 };
diff --git a/ui/gfx/mojom/hdr_metadata_mojom_traits.cc b/ui/gfx/mojom/hdr_metadata_mojom_traits.cc
index d6adae0..3949188 100644
--- a/ui/gfx/mojom/hdr_metadata_mojom_traits.cc
+++ b/ui/gfx/mojom/hdr_metadata_mojom_traits.cc
@@ -26,6 +26,15 @@
   return true;
 }
 
+bool StructTraits<gfx::mojom::HdrMetadataExtendedRangeDataView,
+                  gfx::HdrMetadataExtendedRange>::
+    Read(gfx::mojom::HdrMetadataExtendedRangeDataView data,
+         gfx::HdrMetadataExtendedRange* output) {
+  output->current_headroom = data.current_headroom();
+  output->desired_headroom = data.desired_headroom();
+  return true;
+}
+
 bool StructTraits<gfx::mojom::HDRMetadataDataView, gfx::HDRMetadata>::Read(
     gfx::mojom::HDRMetadataDataView data,
     gfx::HDRMetadata* output) {
@@ -35,6 +44,9 @@
   if (!data.ReadSmpteSt2086(&output->smpte_st_2086)) {
     return false;
   }
+  if (!data.ReadExtendedRange(&output->extended_range)) {
+    return false;
+  }
   return true;
 }
 
diff --git a/ui/gfx/mojom/hdr_metadata_mojom_traits.h b/ui/gfx/mojom/hdr_metadata_mojom_traits.h
index 215838d..90416f2 100644
--- a/ui/gfx/mojom/hdr_metadata_mojom_traits.h
+++ b/ui/gfx/mojom/hdr_metadata_mojom_traits.h
@@ -71,6 +71,20 @@
 };
 
 template <>
+struct StructTraits<gfx::mojom::HdrMetadataExtendedRangeDataView,
+                    gfx::HdrMetadataExtendedRange> {
+  static float current_headroom(const gfx::HdrMetadataExtendedRange& input) {
+    return input.current_headroom;
+  }
+  static float desired_headroom(const gfx::HdrMetadataExtendedRange& input) {
+    return input.desired_headroom;
+  }
+
+  static bool Read(gfx::mojom::HdrMetadataExtendedRangeDataView data,
+                   gfx::HdrMetadataExtendedRange* output);
+};
+
+template <>
 struct StructTraits<gfx::mojom::HDRMetadataDataView, gfx::HDRMetadata> {
   static const absl::optional<gfx::HdrMetadataCta861_3>& cta_861_3(
       const gfx::HDRMetadata& input) {
@@ -80,6 +94,10 @@
       const gfx::HDRMetadata& input) {
     return input.smpte_st_2086;
   }
+  static const absl::optional<gfx::HdrMetadataExtendedRange>& extended_range(
+      const gfx::HDRMetadata& input) {
+    return input.extended_range;
+  }
 
   static bool Read(gfx::mojom::HDRMetadataDataView data,
                    gfx::HDRMetadata* output);
diff --git a/ui/gfx/mojom/mojom_traits_unittest.cc b/ui/gfx/mojom/mojom_traits_unittest.cc
index 052a27f..cad38d4 100644
--- a/ui/gfx/mojom/mojom_traits_unittest.cc
+++ b/ui/gfx/mojom/mojom_traits_unittest.cc
@@ -11,11 +11,15 @@
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
+#include "skia/ext/skcolorspace_primaries.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/rrect_f.h"
 #include "ui/gfx/geometry/transform.h"
+#include "ui/gfx/hdr_metadata.h"
 #include "ui/gfx/mojom/accelerated_widget_mojom_traits.h"
 #include "ui/gfx/mojom/buffer_types_mojom_traits.h"
+#include "ui/gfx/mojom/hdr_metadata.mojom.h"
+#include "ui/gfx/mojom/hdr_metadata_mojom_traits.h"
 #include "ui/gfx/mojom/presentation_feedback.mojom.h"
 #include "ui/gfx/mojom/presentation_feedback_mojom_traits.h"
 #include "ui/gfx/mojom/traits_test_service.mojom.h"
@@ -330,4 +334,27 @@
   EXPECT_EQ(input, output);
 }
 
+TEST_F(StructTraitsTest, HDRMetadata) {
+  // Test an empty input/output.
+  gfx::HDRMetadata input;
+  gfx::HDRMetadata output;
+  mojo::test::SerializeAndDeserialize<gfx::mojom::HDRMetadata>(input, output);
+  EXPECT_EQ(input, output);
+
+  // Include CTA 861.3.
+  input.cta_861_3.emplace(123, 456);
+  mojo::test::SerializeAndDeserialize<gfx::mojom::HDRMetadata>(input, output);
+  EXPECT_EQ(input, output);
+
+  // Include SMPTE ST 2086.
+  input.smpte_st_2086.emplace(SkNamedPrimariesExt::kRec2020, 789, 123);
+  mojo::test::SerializeAndDeserialize<gfx::mojom::HDRMetadata>(input, output);
+  EXPECT_EQ(input, output);
+
+  // Include extended range.
+  input.extended_range.emplace(10.f, 4.f);
+  mojo::test::SerializeAndDeserialize<gfx::mojom::HDRMetadata>(input, output);
+  EXPECT_EQ(input, output);
+}
+
 }  // namespace gfx
diff --git a/ui/gfx/native_widget_types.cc b/ui/gfx/native_widget_types.cc
index 89bd8a4..ac66b86 100644
--- a/ui/gfx/native_widget_types.cc
+++ b/ui/gfx/native_widget_types.cc
@@ -4,11 +4,10 @@
 
 #include "ui/gfx/native_widget_types.h"
 
-// TODO(https://crbug.com/1443009): ui::PlatformEvent has its own version of
-// this function. When unifying, remove one of these copies.
-
 namespace gfx {
 
+// TODO(https://crbug.com/1443009): ui::PlatformEvent has its own version of
+// this function. When unifying, remove one of these copies.
 GFX_EXPORT bool IsNativeEventValid(const NativeEvent& event) {
 #if BUILDFLAG(IS_APPLE)
   return event.IsValid();
diff --git a/ui/gfx/native_widget_types.h b/ui/gfx/native_widget_types.h
index 5199fc6c..de74d89 100644
--- a/ui/gfx/native_widget_types.h
+++ b/ui/gfx/native_widget_types.h
@@ -52,6 +52,9 @@
 // TODO(https://crbug.com/1443009): Both gfx::NativeEvent and ui::PlatformEvent
 // are typedefs for native event types on different platforms, but they're
 // slightly different and used in different places. They should be merged.
+//
+// TODO(https://crbug.com/1149906): gfx::NativeCursor is ui::Cursor in Aura;
+// perhaps remove gfx::NativeCursor and use ui::Cursor everywhere?
 
 #if defined(USE_AURA)
 namespace aura {
@@ -75,27 +78,21 @@
 @class UIImage;
 @class UIView;
 @class UIWindow;
-@class UITextField;
 #else
 class UIImage;
 class UIView;
 class UIWindow;
-class UITextField;
 #endif  // __OBJC__
 #elif BUILDFLAG(IS_MAC)
 #ifdef __OBJC__
-@class NSCursor;
 @class NSImage;
 @class NSView;
 @class NSWindow;
-@class NSTextField;
 #else
 struct objc_object;
-class NSCursor;
 class NSImage;
 class NSView;
 class NSWindow;
-class NSTextField;
 #endif  // __OBJC__
 #endif
 
@@ -134,7 +131,7 @@
 constexpr NativeView kNullNativeView = nullptr;
 constexpr NativeWindow kNullNativeWindow = nullptr;
 #elif BUILDFLAG(IS_MAC)
-using NativeCursor = NSCursor*;
+using NativeCursor = base::apple::OwnedNSCursor;
 using NativeEvent = base::apple::OwnedNSEvent;
 // NativeViews and NativeWindows on macOS are not necessarily in the same
 // process as the NSViews and NSWindows that they represent. Require an explicit
@@ -249,14 +246,6 @@
 // Returns if the event is valid.
 GFX_EXPORT bool IsNativeEventValid(const NativeEvent& event);
 
-// A constant value to indicate that gfx::NativeCursor refers to no cursor.
-#if defined(USE_AURA)
-const ui::mojom::CursorType kNullCursor =
-    static_cast<ui::mojom::CursorType>(-1);
-#else
-const NativeCursor kNullCursor = static_cast<NativeCursor>(nullptr);
-#endif
-
 // Note: for test_shell we're packing a pointer into the NativeViewId. So, if
 // you make it a type which is smaller than a pointer, you have to fix
 // test_shell.
diff --git a/ui/gl/delegated_ink_point_renderer_gpu.h b/ui/gl/delegated_ink_point_renderer_gpu.h
index 3bc033a..6030104 100644
--- a/ui/gl/delegated_ink_point_renderer_gpu.h
+++ b/ui/gl/delegated_ink_point_renderer_gpu.h
@@ -247,8 +247,8 @@
     TRACE_EVENT_WITH_FLOW1(
         "delegated_ink_trails",
         "DelegatedInkPointRendererGpu::SetDelegatedInkTrailStartPoint",
-        TRACE_ID_GLOBAL(metadata_->trace_id()), TRACE_EVENT_FLAG_FLOW_IN,
-        "metadata", metadata_->ToString());
+        TRACE_ID_GLOBAL(metadata->trace_id()), TRACE_EVENT_FLAG_FLOW_IN,
+        "metadata", metadata->ToString());
 
     DCHECK(ink_visual_);
     DCHECK(delegated_ink_trail_);
diff --git a/ui/views/controls/styled_label.cc b/ui/views/controls/styled_label.cc
index 5fc2b10..2270679 100644
--- a/ui/views/controls/styled_label.cc
+++ b/ui/views/controls/styled_label.cc
@@ -573,8 +573,11 @@
         style_info.text_style.value_or(default_text_style_));
   }
 
-  if (style_info.override_color)
+  if (style_info.override_color_id) {
+    result->SetEnabledColorId(style_info.override_color_id.value());
+  } else if (style_info.override_color) {
     result->SetEnabledColor(style_info.override_color.value());
+  }
   if (!style_info.tooltip.empty())
     result->SetTooltipText(style_info.tooltip);
   if (!style_info.accessible_name.empty())
diff --git a/ui/views/controls/styled_label.h b/ui/views/controls/styled_label.h
index 2757c861..f692edd 100644
--- a/ui/views/controls/styled_label.h
+++ b/ui/views/controls/styled_label.h
@@ -65,6 +65,9 @@
     // DEPRECATED: Use TextStyle.
     absl::optional<SkColor> override_color;
 
+    // Overrides the text color given by |text_style| for this range.
+    absl::optional<ui::ColorId> override_color_id;
+
     // A callback to be called when this link is clicked. Only used if
     // |text_style| is style::STYLE_LINK.
     Link::ClickedCallback callback;
diff --git a/ui/views/examples/BUILD.gn b/ui/views/examples/BUILD.gn
index a3b79f56..3e7c8d6 100644
--- a/ui/views/examples/BUILD.gn
+++ b/ui/views/examples/BUILD.gn
@@ -100,6 +100,8 @@
     "toggle_button_example.h",
     "tree_view_example.cc",
     "tree_view_example.h",
+    "typography_example.cc",
+    "typography_example.h",
     "vector_example.cc",
     "vector_example.h",
     "views_examples_export.h",
diff --git a/ui/views/examples/create_examples.cc b/ui/views/examples/create_examples.cc
index b524934..db8d376d 100644
--- a/ui/views/examples/create_examples.cc
+++ b/ui/views/examples/create_examples.cc
@@ -45,6 +45,7 @@
 #include "ui/views/examples/throbber_example.h"
 #include "ui/views/examples/toggle_button_example.h"
 #include "ui/views/examples/tree_view_example.h"
+#include "ui/views/examples/typography_example.h"
 #include "ui/views/examples/vector_example.h"
 #include "ui/views/examples/widget_example.h"
 
@@ -97,6 +98,7 @@
   examples.push_back(std::make_unique<ToggleButtonExample>());
   examples.push_back(std::make_unique<ThrobberExample>());
   examples.push_back(std::make_unique<TreeViewExample>());
+  examples.push_back(std::make_unique<TypographyExample>());
   examples.push_back(std::make_unique<VectorExample>());
   examples.push_back(std::make_unique<WidgetExample>());
   return examples;
diff --git a/ui/views/examples/typography_example.cc b/ui/views/examples/typography_example.cc
new file mode 100644
index 0000000..38fc82a1
--- /dev/null
+++ b/ui/views/examples/typography_example.cc
@@ -0,0 +1,149 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/examples/typography_example.h"
+
+#include <memory>
+#include <utility>
+
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/scroll_view.h"
+#include "ui/views/examples/grit/views_examples_resources.h"
+#include "ui/views/layout/box_layout_view.h"
+#include "ui/views/layout/table_layout_view.h"
+#include "ui/views/metadata/view_factory.h"
+#include "ui/views/view_class_properties.h"
+
+namespace views::examples {
+
+TypographyExample::TypographyExample()
+    : ExampleBase(
+          l10n_util::GetStringUTF8(IDS_TYPOGRAPHY_SELECT_LABEL).c_str()) {}
+
+TypographyExample::~TypographyExample() = default;
+
+void TypographyExample::CreateExampleView(View* container) {
+  container->SetUseDefaultFillLayout(true);
+
+  std::u16string headline_text =
+      l10n_util::GetStringUTF16(IDS_TYPOGRAPHY_HEADLINE_PLACEHOLDER_TEXT);
+  std::u16string body_text =
+      l10n_util::GetStringUTF16(IDS_TYPOGRAPHY_BODY_PLACEHOLDER_TEXT);
+
+  auto headlines =
+      Builder<TableLayoutView>()
+          .AddColumn(LayoutAlignment::kStart, LayoutAlignment::kStart,
+                     TableLayout::kFixedSize,
+                     TableLayout::ColumnSize::kUsePreferred, 0, 0)
+          .AddPaddingColumn(TableLayout::kFixedSize, 4)
+          .AddColumn(LayoutAlignment::kStart, LayoutAlignment::kStart,
+                     TableLayout::kFixedSize, TableLayout::ColumnSize::kFixed,
+                     600, 0)
+          .AddRows(5, TableLayout::kFixedSize, 0)
+          .AddChildren(
+              Builder<Label>().SetText(u"HeadLine1"),
+              Builder<Label>()
+                  .SetText(headline_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_HEADLINE_1),
+              Builder<Label>().SetText(u"HeadLine2"),
+              Builder<Label>()
+                  .SetText(headline_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_HEADLINE_2),
+              Builder<Label>().SetText(u"HeadLine3"),
+              Builder<Label>()
+                  .SetText(headline_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_HEADLINE_3),
+              Builder<Label>().SetText(u"HeadLine4"),
+              Builder<Label>()
+                  .SetText(headline_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_HEADLINE_4),
+              Builder<Label>().SetText(u"HeadLine5"),
+              Builder<Label>()
+                  .SetText(headline_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_HEADLINE_5))
+          .Build();
+
+  auto bodies =
+      Builder<TableLayoutView>()
+          .AddColumn(LayoutAlignment::kStart, LayoutAlignment::kStart,
+                     TableLayout::kFixedSize,
+                     TableLayout::ColumnSize::kUsePreferred, 0, 0)
+          .AddPaddingColumn(TableLayout::kFixedSize, 4)
+          .AddColumn(LayoutAlignment::kStart, LayoutAlignment::kStart,
+                     TableLayout::kFixedSize, TableLayout::ColumnSize::kFixed,
+                     220, 0)
+          .AddRows(8, TableLayout::kFixedSize, 0)
+          .AddChildren(
+              Builder<Label>().SetText(u"Body1"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BODY_1),
+              Builder<Label>().SetText(u"Body2"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BODY_2),
+              Builder<Label>().SetText(u"Body3"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BODY_3),
+              Builder<Label>().SetText(u"Body4"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BODY_5),
+              Builder<Label>().SetText(u"Body5"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BODY_5),
+              Builder<Label>().SetText(u"Caption"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_CAPTION),
+              Builder<Label>().SetText(u"Button"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_BUTTON),
+              Builder<Label>().SetText(u"Label"),
+              Builder<Label>()
+                  .SetText(body_text)
+                  .SetMultiLine(true)
+                  .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
+                  .SetTextStyle(style::STYLE_LABEL))
+          .Build();
+
+  auto wrapper = std::make_unique<BoxLayoutView>();
+  wrapper->SetOrientation(BoxLayout::Orientation::kVertical);
+  wrapper->AddChildView(std::move(headlines));
+  wrapper->AddChildView(std::move(bodies));
+
+  auto scroll_view = std::make_unique<ScrollView>();
+  scroll_view->SetContents(std::move(wrapper));
+  container->AddChildView(std::move(scroll_view));
+}
+
+}  // namespace views::examples
diff --git a/ui/views/examples/typography_example.h b/ui/views/examples/typography_example.h
new file mode 100644
index 0000000..d3069f2a
--- /dev/null
+++ b/ui/views/examples/typography_example.h
@@ -0,0 +1,27 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_EXAMPLES_TYPOGRAPHY_EXAMPLE_H_
+#define UI_VIEWS_EXAMPLES_TYPOGRAPHY_EXAMPLE_H_
+
+#include "ui/views/examples/example_base.h"
+
+namespace views::examples {
+
+class VIEWS_EXAMPLES_EXPORT TypographyExample : public ExampleBase {
+ public:
+  TypographyExample();
+
+  TypographyExample(const TypographyExample&) = delete;
+  TypographyExample& operator=(const TypographyExample&) = delete;
+
+  ~TypographyExample() override;
+
+  // ExampleBase:
+  void CreateExampleView(View* container) override;
+};
+
+}  // namespace views::examples
+
+#endif  // UI_VIEWS_EXAMPLES_TYPOGRAPHY_EXAMPLE_H_
diff --git a/ui/views/examples/views_examples_resources.grd b/ui/views/examples/views_examples_resources.grd
index 49c5d0a..3ce083c 100644
--- a/ui/views/examples/views_examples_resources.grd
+++ b/ui/views/examples/views_examples_resources.grd
@@ -523,6 +523,17 @@
         Edit
       </message>
 
+      <!-- typography example -->
+      <message translateable="false" name="IDS_TYPOGRAPHY_SELECT_LABEL">
+        Typography
+      </message>
+      <message translateable="false" name="IDS_TYPOGRAPHY_HEADLINE_PLACEHOLDER_TEXT">
+        The quick brown fox jumps over the lazy dog
+      </message>
+      <message translateable="false" name="IDS_TYPOGRAPHY_BODY_PLACEHOLDER_TEXT">
+        The quick brown fox jumps over the lazy dog&#10;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
+      </message>
+
       <!-- vector example -->
       <message translateable="false" name="IDS_VECTOR_FILE_SELECT_LABEL">
         Enter a file or folder to read
diff --git a/ui/views/style/typography.cc b/ui/views/style/typography.cc
index 6dc8e9d..e3d774db 100644
--- a/ui/views/style/typography.cc
+++ b/ui/views/style/typography.cc
@@ -37,6 +37,28 @@
                                                                    style);
 }
 
+int GetFontSizeDeltaIgnoringUserOrLocaleSettings(int desired_font_size) {
+  int size_delta = desired_font_size - gfx::PlatformFont::kDefaultBaseFontSize;
+  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
+  gfx::FontList base_font = bundle.GetFontListWithDelta(size_delta);
+
+  // The ResourceBundle's default font may not actually be kDefaultBaseFontSize
+  // if, for example, the user has changed their system font sizes or the
+  // current locale has been overridden to use a different default font size.
+  // Adjust for the difference in default font sizes.
+  int user_or_locale_delta = 0;
+  if (base_font.GetFontSize() != desired_font_size) {
+    user_or_locale_delta = desired_font_size - base_font.GetFontSize();
+    base_font = bundle.GetFontListWithDelta(size_delta + user_or_locale_delta);
+  }
+  DCHECK_EQ(desired_font_size, base_font.GetFontSize());
+
+  // To ensure a subsequent request from the ResourceBundle ignores the delta
+  // due to user or locale settings, include it here.
+  return base_font.GetFontSize() - gfx::PlatformFont::kDefaultBaseFontSize +
+         user_or_locale_delta;
+}
+
 int GetLineHeight(int context, int style) {
   ValidateContextAndStyle(context, style);
   return LayoutProvider::Get()->GetTypographyProvider().GetLineHeight(context,
diff --git a/ui/views/style/typography.h b/ui/views/style/typography.h
index 68924119..774743d 100644
--- a/ui/views/style/typography.h
+++ b/ui/views/style/typography.h
@@ -7,6 +7,7 @@
 
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/color/color_id.h"
+#include "ui/gfx/platform_font.h"
 #include "ui/views/views_export.h"
 
 namespace gfx {
@@ -118,6 +119,24 @@
   // Active tab in a tabbed pane.
   STYLE_TAB_ACTIVE,
 
+  // CR2023 typography tokens.
+  // These styles override the style specified by TextContext.
+  STYLE_OVERRIDE_TYPOGRAPHY_START,
+  STYLE_HEADLINE_1,
+  STYLE_HEADLINE_2,
+  STYLE_HEADLINE_3,
+  STYLE_HEADLINE_4,
+  STYLE_HEADLINE_5,
+  STYLE_BODY_1,
+  STYLE_BODY_2,
+  STYLE_BODY_3,
+  STYLE_BODY_4,
+  STYLE_BODY_5,
+  STYLE_CAPTION,
+  STYLE_BUTTON,
+  STYLE_LABEL,
+  STYLE_OVERRIDE_TYPOGRAPHY_END,
+
   // Embedders must start TextStyle enum values from here.
   VIEWS_TEXT_STYLE_END
 };
@@ -133,6 +152,9 @@
 
 VIEWS_EXPORT ui::ColorId GetColorId(int context, int style);
 
+VIEWS_EXPORT int GetFontSizeDeltaIgnoringUserOrLocaleSettings(
+    int desired_font_size);
+
 }  // namespace views::style
 
 #endif  // UI_VIEWS_STYLE_TYPOGRAPHY_H_
diff --git a/ui/views/style/typography_provider.cc b/ui/views/style/typography_provider.cc
index 7e63a91..c5e163f 100644
--- a/ui/views/style/typography_provider.cc
+++ b/ui/views/style/typography_provider.cc
@@ -4,8 +4,11 @@
 
 #include "ui/views/style/typography_provider.h"
 
+#include <map>
 #include <string>
 
+#include "base/containers/contains.h"
+#include "base/containers/fixed_flat_map.h"
 #include "build/build_config.h"
 #include "ui/base/default_style.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -114,6 +117,61 @@
     case style::STYLE_EMPHASIZED_SECONDARY:
       details.weight = gfx::Font::Weight::SEMIBOLD;
       break;
+    case style::STYLE_HEADLINE_1:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(24);
+      details.weight = gfx::Font::Weight::MEDIUM;
+      break;
+    case style::STYLE_HEADLINE_2:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(20);
+      details.weight = gfx::Font::Weight::MEDIUM;
+      break;
+    case style::STYLE_HEADLINE_3:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(18);
+      details.weight = gfx::Font::Weight::MEDIUM;
+      break;
+    case style::STYLE_HEADLINE_4:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(16);
+      details.weight = gfx::Font::Weight::MEDIUM;
+      break;
+    case style::STYLE_HEADLINE_5:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
+      details.weight = gfx::Font::Weight::MEDIUM;
+      break;
+    case style::STYLE_BODY_1:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(16);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
+    case style::STYLE_BODY_2:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(14);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
+    case style::STYLE_BODY_3:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(13);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
+    case style::STYLE_BODY_4:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(12);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
+    case style::STYLE_BODY_5:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(11);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
+    case style::STYLE_CAPTION:
+      details.size_delta =
+          style::GetFontSizeDeltaIgnoringUserOrLocaleSettings(9);
+      details.weight = gfx::Font::Weight::NORMAL;
+      break;
   }
 
   return details;
@@ -169,6 +227,24 @@
 }
 
 int TypographyProvider::GetLineHeight(int context, int style) const {
+  constexpr auto line_heights = base::MakeFixedFlatMap<int, int>({
+      {style::STYLE_HEADLINE_1, 32},
+      {style::STYLE_HEADLINE_2, 24},
+      {style::STYLE_HEADLINE_3, 24},
+      {style::STYLE_HEADLINE_4, 24},
+      {style::STYLE_HEADLINE_5, 20},
+      {style::STYLE_BODY_1, 24},
+      {style::STYLE_BODY_2, 20},
+      {style::STYLE_BODY_3, 20},
+      {style::STYLE_BODY_4, 16},
+      {style::STYLE_BODY_5, 16},
+      {style::STYLE_CAPTION, 12},
+  });
+
+  if (base::Contains(line_heights, style)) {
+    return line_heights.at(style);
+  }
+
   return GetFont(context, style).GetHeight();
 }
 
diff --git a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
index 1dcb402..0877e00 100644
--- a/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
+++ b/ui/views/widget/desktop_aura/desktop_native_widget_aura.cc
@@ -301,9 +301,7 @@
     : desktop_window_tree_host_(nullptr),
 
       content_window_(new aura::Window(this)),
-      native_widget_delegate_(delegate->AsWidget()->GetWeakPtr()),
-
-      cursor_(gfx::kNullCursor) {
+      native_widget_delegate_(delegate->AsWidget()->GetWeakPtr()) {
   aura::client::SetFocusChangeObserver(content_window_, this);
   wm::SetActivationChangeObserver(content_window_, this);
 }
diff --git a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
index 1910687..5552598 100644
--- a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
+++ b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
@@ -115,6 +115,7 @@
   }
 }
 
+// <if expr="chromeos_ash">
 /**
  * Starts listening for ColorProvider changes from the browser and updates the
  * top level HTML document whenever changes occur.
@@ -122,3 +123,4 @@
 export function startColorChangeUpdater() {
   ColorChangeUpdater.forDocument().start();
 }
+// </if>