diff --git a/DEPS b/DEPS
index b16936d..08b9f242 100644
--- a/DEPS
+++ b/DEPS
@@ -308,15 +308,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'cfb11bc3be9443efa086444a8dcb8ac43804d47f',
+  'skia_revision': '34bb500bea6c2d21d9c0584815b1ea6045fc4c12',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '60ec1064b0f8fa40fe9d305479979cccfd7e5e6e',
+  'v8_revision': '1fb791bbf223ae1b1ee560acbf06a52832cc2e67',
   # 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': 'c5fc9c229133646ec8e3ebdc8533aad8bae91028',
+  'angle_revision': '3cc948ad94d6d34505120e5be8854e82ab5ba7ad',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -324,7 +324,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '525a4270b77552c11ec72a3540e10315c35d10a3',
+  'pdfium_revision': 'b01b2cdd16aca30022e26c8fd35c91d1913e0508',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -335,7 +335,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220929.1.1',
+  'fuchsia_version': 'version:9.20220929.2.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -387,7 +387,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': 'f6a1e8e361c0a0dc2ce349dbe95debbb96227142',
+  'devtools_frontend_revision': '4c25e2f022864cdc91e50eec6f9befaffe6072cc',
   # 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.
@@ -423,7 +423,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'feb14eb7613436bf5fe5ff46ae312523ebf23e85',
+  'dawn_revision': 'fdbc31f76b30377c449c918abaac3fb74f114204',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -818,7 +818,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'b9ca3384fa254e5d0bfecc99537f89d006ec01b9',
+    'url': Var('chromium_git') + '/website.git' + '@' + '4a2d5e77ade4fa22575ca66b48af09538078692c',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1246,7 +1246,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'acb86eb2a4cd5f4c86f1859706d81137374f6b5d',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '678643d9b1d52e3083d6807b162a62a8432b3ca0',
     'condition': 'checkout_src_internal',
   },
 
@@ -1803,7 +1803,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@d9371f187fccddc221a56ab94eaf1af17afd4309',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@0d73e9c2aa9a40b965440bf86021418c2277ce62',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1843,7 +1843,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e84b11b1d90efe59e94bb24d1f1276071f50481e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2e43afb501fed7eff4ebeb7b261aef94477fea55',
+    Var('webrtc_git') + '/src.git' + '@' + '73009ec64102a64f80849a7ea30316566da46b4b',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1916,7 +1916,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f8633bb53a8f752662d074ba850d6793ec1e9879',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@149d900ec73924bc49197935689a0c2f05cbff7e',
     'condition': 'checkout_src_internal',
   },
 
@@ -3343,7 +3343,18 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/libs/org_checkerframework_checker_qual',
-              'version': 'version:2@3.22.1.cr1',
+              'version': 'version:2@3.25.0.cr1',
+          },
+      ],
+      'condition': 'checkout_android',
+      'dep_type': 'cipd',
+  },
+
+  'src/third_party/android_deps/libs/org_checkerframework_checker_util': {
+      'packages': [
+          {
+              'package': 'chromium/third_party/android_deps/libs/org_checkerframework_checker_util',
+              'version': 'version:2@3.25.0.cr1',
           },
       ],
       'condition': 'checkout_android',
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 1d040cc..aeae99d6 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -1341,6 +1341,9 @@
       <message name="IDS_ASH_HOLDING_SPACE_SUGGESTIONS_TITLE" desc="Title of the suggestions area in the holding space bubble.">
         Suggested files
       </message>
+      <message name="IDS_ASH_HOLDING_SPACE_RECENT_FILES_PLACEHOLDER" desc="Text displayed in the holding space recent files bubble when the user has no downloads or screen captures.">
+        You'll find your recent downloads and screen captures here
+      </message>
       <message name="IDS_ASH_HOLDING_SPACE_DOWNLOADS_TITLE" desc="Title of the downloads area in the holding space bubble.">
         Downloads
       </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_RECENT_FILES_PLACEHOLDER.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_RECENT_FILES_PLACEHOLDER.png.sha1
new file mode 100644
index 0000000..0c2703e
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_HOLDING_SPACE_RECENT_FILES_PLACEHOLDER.png.sha1
@@ -0,0 +1 @@
+3d4b637749700dd4b1d75e05d70fe2b12517e283
\ No newline at end of file
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 550de76..1806b92 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1070,10 +1070,10 @@
              "HoldingSpacePredictability",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enables rebranding of holding space to convey the relationship with
-// Files to simplify feature comprehension.
-BASE_FEATURE(kHoldingSpaceRebrand,
-             "HoldingSpaceRebrand",
+// Enables refresh of holding space UI to better convey the relationship with
+// the Files app to simplify feature comprehension.
+BASE_FEATURE(kHoldingSpaceRefresh,
+             "HoldingSpaceRefresh",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables suggestions in the pinned files section of Holding Space.
@@ -2453,8 +2453,8 @@
   return base::FeatureList::IsEnabled(kHoldingSpacePredictability);
 }
 
-bool IsHoldingSpaceRebrandEnabled() {
-  return base::FeatureList::IsEnabled(kHoldingSpaceRebrand);
+bool IsHoldingSpaceRefreshEnabled() {
+  return base::FeatureList::IsEnabled(kHoldingSpaceRefresh);
 }
 
 bool IsHoldingSpaceSuggestionsEnabled() {
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 54323445..9f4c7a7 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -316,7 +316,7 @@
 BASE_DECLARE_FEATURE(kHoldingSpaceInProgressDownloadsNotificationSuppression);
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kHoldingSpacePredictability);
-COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kHoldingSpaceRebrand);
+COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kHoldingSpaceRefresh);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kHoldingSpaceSuggestions);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kHotspot);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kVirtualKeyboardNewHeader);
@@ -672,7 +672,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsHoldingSpaceInProgressDownloadsNotificationSuppressionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpacePredictabilityEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceRebrandEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceRefreshEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceSuggestionsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHostnameSettingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHotspotEnabled();
diff --git a/ash/constants/ash_pref_names.cc b/ash/constants/ash_pref_names.cc
index 5f4b79a..ce355a58e 100644
--- a/ash/constants/ash_pref_names.cc
+++ b/ash/constants/ash_pref_names.cc
@@ -82,6 +82,18 @@
 // as the active one for audio I/O, or it's a new plugged device.
 const char kAudioDevicesState[] = "settings.audio.device_state";
 
+// A dictionary maps each input device to a unique natural number
+// representing the user preference priority among all.
+// E.g {(0x9a, 1), (0xab, 2), (0xbc, 3), (0xcd, 4)}
+const char kAudioInputDevicesUserPriority[] =
+    "settings.audio.input_user_priority";
+
+// A dictionary maps each input device to a unique natural number
+// representing the user preference priority among all.
+// E.g {(0x9a, 1), (0xab, 2), (0xbc, 3), (0xcd, 4)}
+const char kAudioOutputDevicesUserPriority[] =
+    "settings.audio.output_user_priority";
+
 // A string pref storing an identifier that is getting sent with parental
 // consent in EDU account addition flow.
 const char kEduCoexistenceId[] = "account_manager.edu_coexistence_id";
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h
index e4833d9..cb3a404 100644
--- a/ash/constants/ash_pref_names.h
+++ b/ash/constants/ash_pref_names.h
@@ -37,6 +37,10 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kAudioOutputAllowed[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kAudioVolumePercent[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kAudioDevicesState[];
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const char kAudioInputDevicesUserPriority[];
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const char kAudioOutputDevicesUserPriority[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kEduCoexistenceId[];
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const char kEduCoexistenceToSVersion[];
diff --git a/ash/in_session_auth/auth_dialog_contents_view.cc b/ash/in_session_auth/auth_dialog_contents_view.cc
index a3fb7216..a5f953d 100644
--- a/ash/in_session_auth/auth_dialog_contents_view.cc
+++ b/ash/in_session_auth/auth_dialog_contents_view.cc
@@ -89,7 +89,7 @@
     // views::View
     void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
       node_data->role = ax::mojom::Role::kStaticText;
-      node_data->SetName(accessible_name_);
+      node_data->SetNameChecked(accessible_name_);
     }
 
     void SetAccessibleName(const std::u16string& name) {
@@ -308,7 +308,7 @@
   // views::View
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
     node_data->role = ax::mojom::Role::kStaticText;
-    node_data->SetName(accessible_name_);
+    node_data->SetNameChecked(accessible_name_);
   }
 
  private:
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
index fc9404a..d32033e 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
@@ -832,7 +832,7 @@
         l10n_util::GetStringUTF8(
             IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
   }
-  node_data->SetName(accessible_name_);
+  node_data->SetNameChecked(accessible_name_);
 }
 
 void ArcNotificationContentView::OnAccessibilityEvent(ax::mojom::Event event) {
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index eb938fe..782b0262 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -104,7 +104,7 @@
     "hide_closed_caption.icon",
     "holding_space.icon",
     "holding_space_download.icon",
-    "holding_space_rebrand.icon",
+    "holding_space_refresh.icon",
     "hollow_check_circle.icon",
     "ime_menu_emoticon.icon",
     "ime_menu_microphone.icon",
diff --git a/ash/resources/vector_icons/holding_space_rebrand.icon b/ash/resources/vector_icons/holding_space_refresh.icon
similarity index 100%
rename from ash/resources/vector_icons/holding_space_rebrand.icon
rename to ash/resources/vector_icons/holding_space_refresh.icon
diff --git a/ash/shelf/shelf_control_button.cc b/ash/shelf/shelf_control_button.cc
index 0318438..22f5104 100644
--- a/ash/shelf/shelf_control_button.cc
+++ b/ash/shelf/shelf_control_button.cc
@@ -82,7 +82,7 @@
 
 void ShelfControlButton::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   ShelfButton::GetAccessibleNodeData(node_data);
-  node_data->SetName(GetAccessibleName());
+  node_data->SetNameChecked(GetAccessibleName());
 }
 
 void ShelfControlButton::PaintButtonContents(gfx::Canvas* canvas) {
diff --git a/ash/shelf/shelf_shutdown_confirmation_bubble.cc b/ash/shelf/shelf_shutdown_confirmation_bubble.cc
index 9935d129..031f0214 100644
--- a/ash/shelf/shelf_shutdown_confirmation_bubble.cc
+++ b/ash/shelf/shelf_shutdown_confirmation_bubble.cc
@@ -204,7 +204,7 @@
 void ShelfShutdownConfirmationBubble::GetAccessibleNodeData(
     ui::AXNodeData* node_data) {
   node_data->role = ax::mojom::Role::kDialog;
-  node_data->SetName(title_->GetText());
+  node_data->SetNameChecked(title_->GetText());
 }
 
 std::u16string ShelfShutdownConfirmationBubble::GetAccessibleWindowTitle()
diff --git a/ash/system/holding_space/holding_space_tray.cc b/ash/system/holding_space/holding_space_tray.cc
index c54bc4d..f901a7d 100644
--- a/ash/system/holding_space/holding_space_tray.cc
+++ b/ash/system/holding_space/holding_space_tray.cc
@@ -301,7 +301,7 @@
 std::u16string HoldingSpaceTray::GetAccessibleNameForTray() {
   return l10n_util::GetStringFUTF16(
       IDS_ASH_HOLDING_SPACE_A11Y_NAME,
-      features::IsHoldingSpaceRebrandEnabled()
+      features::IsHoldingSpaceRefreshEnabled()
           ? l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE_REFRESH)
           : l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE));
 }
@@ -313,7 +313,7 @@
 }
 
 std::u16string HoldingSpaceTray::GetTooltipText(const gfx::Point& point) const {
-  return features::IsHoldingSpaceRebrandEnabled()
+  return features::IsHoldingSpaceRefreshEnabled()
              ? l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE_REFRESH)
              : l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE);
 }
@@ -487,7 +487,7 @@
 
   // Default tray icon.
   default_tray_icon_->SetImage(gfx::CreateVectorIcon(
-      features::IsHoldingSpaceRebrandEnabled() ? kHoldingSpaceRebrandIcon
+      features::IsHoldingSpaceRefreshEnabled() ? kHoldingSpaceRefreshIcon
                                                : kHoldingSpaceIcon,
       kHoldingSpaceTrayIconSize, color));
 
diff --git a/ash/system/holding_space/holding_space_tray_bubble.cc b/ash/system/holding_space/holding_space_tray_bubble.cc
index a313c0b..1995b533 100644
--- a/ash/system/holding_space/holding_space_tray_bubble.cc
+++ b/ash/system/holding_space/holding_space_tray_bubble.cc
@@ -273,8 +273,8 @@
   void OnPaint(gfx::Canvas* canvas) override {
     views::View::OnPaint(canvas);
 
-    // Separators are drawn between child bubbles iff rebranding is enabled.
-    if (!features::IsHoldingSpaceRebrandEnabled())
+    // Separators are drawn between child bubbles iff refresh is enabled.
+    if (!features::IsHoldingSpaceRefreshEnabled())
       return;
 
     // Cache `x`, `height`, and `width` which is consistent across separators.
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc
index a2c29db2..b4e3b83 100644
--- a/ash/system/holding_space/holding_space_tray_unittest.cc
+++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -3621,43 +3621,43 @@
 }
 
 // Base class for tests of holding space parameterized by whether the
-// `kHoldingSpaceRebrand` feature flag is enabled.
-class HoldingSpaceTrayRebrandTest
+// `kHoldingSpaceRefresh` feature flag is enabled.
+class HoldingSpaceTrayRefreshTest
     : public HoldingSpaceTrayTestBase,
-      public testing::WithParamInterface</*rebrand_enabled=*/bool> {
+      public testing::WithParamInterface</*refresh_enabled=*/bool> {
  public:
-  HoldingSpaceTrayRebrandTest() {
-    scoped_feature_list_.InitWithFeatureState(features::kHoldingSpaceRebrand,
-                                              IsHoldingSpaceRebrandEnabled());
+  HoldingSpaceTrayRefreshTest() {
+    scoped_feature_list_.InitWithFeatureState(features::kHoldingSpaceRefresh,
+                                              IsHoldingSpaceRefreshEnabled());
   }
 
-  bool IsHoldingSpaceRebrandEnabled() const { return GetParam(); }
+  bool IsHoldingSpaceRefreshEnabled() const { return GetParam(); }
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 INSTANTIATE_TEST_SUITE_P(All,
-                         HoldingSpaceTrayRebrandTest,
-                         /*rebrand_enabled=*/testing::Bool());
+                         HoldingSpaceTrayRefreshTest,
+                         /*refresh_enabled=*/testing::Bool());
 
-TEST_P(HoldingSpaceTrayRebrandTest, CheckTrayAccessibilityText) {
+TEST_P(HoldingSpaceTrayRefreshTest, CheckTrayAccessibilityText) {
   StartSession(/*pre_mark_time_of_first_add=*/true);
   GetTray()->FirePreviewsUpdateTimerIfRunningForTesting();
   EXPECT_EQ(
       GetTray()->GetAccessibleNameForTray(),
-      IsHoldingSpaceRebrandEnabled()
+      IsHoldingSpaceRefreshEnabled()
           ? u"Quick files: recent screen captures, downloads, and pinned files"
           : u"Tote: recent screen captures, downloads, and pinned files");
 }
 
-TEST_P(HoldingSpaceTrayRebrandTest, TrayButtonWithRebrandIcon) {
+TEST_P(HoldingSpaceTrayRefreshTest, TrayButtonWithRefreshIcon) {
   StartSession(/*pre_mark_time_of_first_add=*/true);
   GetTray()->FirePreviewsUpdateTimerIfRunningForTesting();
   EXPECT_TRUE(gfx::BitmapsAreEqual(
       *test_api()->GetDefaultTrayIcon()->GetImage().bitmap(),
       *gfx::CreateVectorIcon(
-           IsHoldingSpaceRebrandEnabled() ? kHoldingSpaceRebrandIcon
+           IsHoldingSpaceRefreshEnabled() ? kHoldingSpaceRefreshIcon
                                           : kHoldingSpaceIcon,
            kHoldingSpaceTrayIconSize,
            AshColorProvider::Get()->GetContentLayerColor(
@@ -3665,14 +3665,14 @@
            .bitmap()));
 }
 
-TEST_P(HoldingSpaceTrayRebrandTest, CheckTrayTooltipText) {
+TEST_P(HoldingSpaceTrayRefreshTest, CheckTrayTooltipText) {
   StartSession(/*pre_mark_time_of_first_add=*/true);
   GetTray()->FirePreviewsUpdateTimerIfRunningForTesting();
   EXPECT_EQ(GetTray()->GetTooltipText(gfx::Point()),
-            IsHoldingSpaceRebrandEnabled() ? u"Quick files" : u"Tote");
+            IsHoldingSpaceRefreshEnabled() ? u"Quick files" : u"Tote");
 }
 
-TEST_P(HoldingSpaceTrayRebrandTest, PaintsSeparatorBetweenBubbles) {
+TEST_P(HoldingSpaceTrayRefreshTest, PaintsSeparatorBetweenBubbles) {
   StartSession();
 
   // Add a pinned file and a download to holding space so that both the
@@ -3714,7 +3714,7 @@
   SkColor actual_color =
       bitmap.getColor(separator_midpoint_x, separator_midpoint_y);
   SkColor expected_color = color_utils::GetResultingPaintColor(
-      /*foreground=*/IsHoldingSpaceRebrandEnabled()
+      /*foreground=*/IsHoldingSpaceRefreshEnabled()
           ? AshColorProvider::Get()->GetContentLayerColor(
                 AshColorProvider::ContentLayerType::kSeparatorColor)
           : SK_ColorTRANSPARENT,
diff --git a/ash/system/holding_space/recent_files_bubble.cc b/ash/system/holding_space/recent_files_bubble.cc
index 72051cc..b2bf55e9 100644
--- a/ash/system/holding_space/recent_files_bubble.cc
+++ b/ash/system/holding_space/recent_files_bubble.cc
@@ -8,8 +8,10 @@
 #include "ash/constants/ash_features.h"
 #include "ash/public/cpp/holding_space/holding_space_constants.h"
 #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
+#include "ash/strings/grit/ash_strings.h"
 #include "ash/system/holding_space/downloads_section.h"
 #include "ash/system/holding_space/screen_captures_section.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -56,8 +58,8 @@
           views::Builder<views::Label>(
               bubble_utils::CreateLabel(
                   bubble_utils::LabelStyle::kSubheader,
-                  u"[i18n]Your recently downloaded files and screen captures "
-                  u"would show up here"))
+                  l10n_util::GetStringUTF16(
+                      IDS_ASH_HOLDING_SPACE_RECENT_FILES_PLACEHOLDER)))
               .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER)
               .SetMultiLine(true))
       .Build();
diff --git a/ash/system/network/network_tray_view.cc b/ash/system/network/network_tray_view.cc
index 2502c7a..69ddd8a 100644
--- a/ash/system/network/network_tray_view.cc
+++ b/ash/system/network/network_tray_view.cc
@@ -54,7 +54,7 @@
 void NetworkTrayView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   // A valid role must be set prior to setting the name.
   node_data->role = ax::mojom::Role::kImage;
-  node_data->SetName(accessible_name_);
+  node_data->SetNameChecked(accessible_name_);
   node_data->SetDescription(accessible_description_);
 }
 
diff --git a/ash/system/power/tray_power.cc b/ash/system/power/tray_power.cc
index 49079fa..db9ecae 100644
--- a/ash/system/power/tray_power.cc
+++ b/ash/system/power/tray_power.cc
@@ -63,7 +63,7 @@
 void PowerTrayView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   // A valid role must be set prior to setting the name.
   node_data->role = ax::mojom::Role::kImage;
-  node_data->SetName(accessible_name_);
+  node_data->SetNameChecked(accessible_name_);
 }
 
 views::View* PowerTrayView::GetTooltipHandlerForPoint(const gfx::Point& point) {
diff --git a/ash/webui/os_feedback_ui/os_feedback_ui.cc b/ash/webui/os_feedback_ui/os_feedback_ui.cc
index bc6e2313..e5bb572 100644
--- a/ash/webui/os_feedback_ui/os_feedback_ui.cc
+++ b/ash/webui/os_feedback_ui/os_feedback_ui.cc
@@ -103,6 +103,7 @@
       {"bluetoothLogsMessage", IDS_FEEDBACK_TOOL_BLUETOOTH_LOGS_MESSAGE},
       {"includeAssistantLogsCheckboxLabel",
        IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_CHECKBOX},
+      {"assistantLogsMessage", IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE},
   };
 
   source->AddLocalizedStrings(kLocalizedStrings);
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js
index b7c9d6a..6fc3b7e 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -54,6 +54,7 @@
   DESCRIPTION_TEMPLATE: 'description_template',
   EXTRA_DIAGNOSTICS: 'extra_diagnostics',
   CATEGORY_TAG: 'category_tag',
+  PAGE_URL: 'page_url',
 };
 
 /**
@@ -326,6 +327,10 @@
     const categoryTag = params.get(AdditionalContextQueryParam.CATEGORY_TAG);
     this.feedbackContext_.categoryTag =
         categoryTag ? decodeURIComponent(categoryTag) : '';
+    const pageUrl = params.get(AdditionalContextQueryParam.PAGE_URL);
+    if (pageUrl) {
+      this.feedbackContext_.pageUrl = {url: pageUrl};
+    }
   }
 
   /**
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html
index 6e0c11c..3427109 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.html
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -89,7 +89,7 @@
 
   .checkbox-field-container {
     align-items: start;
-    display: inline-flex;
+    display: flex;
     margin-bottom: 8px;
   }
 
@@ -306,3 +306,14 @@
     </cr-button>
   </div>
 </cr-dialog>
+<cr-dialog id="assistantDialog">
+  <div slot="body">
+    [[i18n('assistantLogsMessage')]]
+  </div>
+  <div slot="button-container">
+    <cr-button id="assistantDialogDoneButton" class="action-button"
+        on-click="handleCloseAssistantDialogClicked_">
+      [[i18n('buttonDone')]]
+    </cr-button>
+  </div>
+</cr-dialog>
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js
index 6ebc2fa..5d062624 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.js
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -232,6 +232,26 @@
    * @param {!Event} e
    * @protected
    */
+  handleOpenAssistantLogsDialog_(e) {
+    // The default behavior of clicking on an anchor tag
+    // with href="#" is a scroll to the top of the page.
+    // This link opens a dialog, so we want to prevent
+    // this default behavior.
+    e.preventDefault();
+
+    this.getElement_('#assistantDialog').showModal();
+    this.getElement_('#assistantDialogDoneButton').focus();
+  }
+
+  /** @protected */
+  handleCloseAssistantDialogClicked_() {
+    this.getElement_('#assistantDialog').close();
+  }
+
+  /**
+   * @param {!Event} e
+   * @protected
+   */
   handleBackButtonClicked_(e) {
     e.stopPropagation();
 
@@ -323,6 +343,12 @@
       report.sendBluetoothLogs = false;
     }
 
+    if (this.getElement_('#performanceTraceCheckbox').checked) {
+      report.feedbackContext.traceId = this.feedbackContext.traceId;
+    } else {
+      report.feedbackContext.traceId = 0;
+    }
+
     return report;
   }
 
@@ -391,8 +417,12 @@
   setAssistantLogsCheckboxLabelAndAttributes_() {
     this.assistantLogsCheckboxLabel_ =
         this.i18nAdvanced('includeAssistantLogsCheckboxLabel', {attrs: ['id']});
-    // TODO(yyhyyh): Clicking the link will open a dialog showing assistant
-    // log message.
+
+    const assistantLogsLink = this.getElement_('#assistantLogsLink');
+    // Setting href causes <a> tag to display as link.
+    assistantLogsLink.setAttribute('href', '#');
+    assistantLogsLink.addEventListener(
+        'click', (e) => void this.handleOpenAssistantLogsDialog_(e));
   }
 
   /** @private */
diff --git a/ash/wm/desks/desks_textfield.cc b/ash/wm/desks/desks_textfield.cc
index 8712c73..42c8b7d9 100644
--- a/ash/wm/desks/desks_textfield.cc
+++ b/ash/wm/desks/desks_textfield.cc
@@ -91,7 +91,7 @@
 
 void DesksTextfield::GetAccessibleNodeData(ui::AXNodeData* node_data) {
   Textfield::GetAccessibleNodeData(node_data);
-  node_data->SetName(GetAccessibleName());
+  node_data->SetNameChecked(GetAccessibleName());
 }
 
 void DesksTextfield::OnMouseEntered(const ui::MouseEvent& event) {
diff --git a/base/allocator/partition_allocator/partition_address_space.cc b/base/allocator/partition_allocator/partition_address_space.cc
index 6b8c56a7..690ec67 100644
--- a/base/allocator/partition_allocator/partition_address_space.cc
+++ b/base/allocator/partition_allocator/partition_address_space.cc
@@ -28,7 +28,7 @@
 #include <windows.h>
 #endif  // BUILDFLAG(IS_WIN)
 
-#if defined(PA_ENABLE_SHADOW_GIGACAGE)
+#if defined(PA_ENABLE_SHADOW_METADATA)
 #include <sys/mman.h>
 #endif
 
@@ -168,7 +168,7 @@
     return;
 
   size_t regular_pool_size = RegularPoolSize();
-#if defined(PA_ENABLE_SHADOW_GIGACAGE)
+#if defined(PA_ENABLE_SHADOW_METADATA)
   int regular_pool_fd = memfd_create("/regular_pool", MFD_CLOEXEC);
 #else
   int regular_pool_fd = -1;
@@ -194,7 +194,7 @@
       !IsInRegularPool(setup_.regular_pool_base_address_ + regular_pool_size));
 
   size_t brp_pool_size = BRPPoolSize();
-#if defined(PA_ENABLE_SHADOW_GIGACAGE)
+#if defined(PA_ENABLE_SHADOW_METADATA)
   int brp_pool_fd = memfd_create("/brp_pool", MFD_CLOEXEC);
 #else
   int brp_pool_fd = -1;
diff --git a/base/allocator/partition_allocator/partition_alloc.gni b/base/allocator/partition_allocator/partition_alloc.gni
index ba19a47..9320d9b 100644
--- a/base/allocator/partition_allocator/partition_alloc.gni
+++ b/base/allocator/partition_allocator/partition_alloc.gni
@@ -26,7 +26,7 @@
 }
 
 declare_args() {
-  use_freeslot_bitmap = false
+  use_freeslot_bitmap = true
 }
 
 declare_args() {
diff --git a/base/allocator/partition_allocator/shim/DEPS b/base/allocator/partition_allocator/shim/DEPS
index f220157..7bf8635 100644
--- a/base/allocator/partition_allocator/shim/DEPS
+++ b/base/allocator/partition_allocator/shim/DEPS
@@ -13,7 +13,6 @@
     "+base/allocator/partition_allocator/partition_alloc_base",
     "+base/base_export.h",
     "+base/bind.h",
-    "+base/compiler_specific.h",
     "+base/logging.h",
     "+base/mac/mach_logging.h",
     "+base/memory/nonscannable_memory.h",
diff --git a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc
index 33349981..81db8b5 100644
--- a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc
+++ b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_glibc.cc
@@ -4,8 +4,8 @@
 
 #include <limits>
 
+#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
 #include "base/allocator/partition_allocator/shim/allocator_shim.h"
-#include "base/compiler_specific.h"
 #include "base/numerics/checked_math.h"
 #include "base/process/memory.h"
 
@@ -36,7 +36,7 @@
 void* GlibcMalloc(const AllocatorDispatch*, size_t size, void* context) {
   // Cannot force glibc's malloc() to crash when a large size is requested, do
   // it in the shim instead.
-  if (UNLIKELY(size >= kMaxAllowedSize))
+  if (PA_UNLIKELY(size >= kMaxAllowedSize))
     base::TerminateBecauseOutOfMemory(size);
 
   return __libc_malloc(size);
@@ -45,7 +45,7 @@
 void* GlibcUncheckedMalloc(const AllocatorDispatch*,
                            size_t size,
                            void* context) {
-  if (UNLIKELY(size >= kMaxAllowedSize))
+  if (PA_UNLIKELY(size >= kMaxAllowedSize))
     return nullptr;
 
   return __libc_malloc(size);
@@ -56,7 +56,7 @@
                   size_t size,
                   void* context) {
   const auto total = base::CheckMul(n, size);
-  if (UNLIKELY(!total.IsValid() || total.ValueOrDie() >= kMaxAllowedSize))
+  if (PA_UNLIKELY(!total.IsValid() || total.ValueOrDie() >= kMaxAllowedSize))
     base::TerminateBecauseOutOfMemory(size * n);
 
   return __libc_calloc(n, size);
@@ -66,7 +66,7 @@
                    void* address,
                    size_t size,
                    void* context) {
-  if (UNLIKELY(size >= kMaxAllowedSize))
+  if (PA_UNLIKELY(size >= kMaxAllowedSize))
     base::TerminateBecauseOutOfMemory(size);
 
   return __libc_realloc(address, size);
@@ -76,7 +76,7 @@
                     size_t alignment,
                     size_t size,
                     void* context) {
-  if (UNLIKELY(size >= kMaxAllowedSize))
+  if (PA_UNLIKELY(size >= kMaxAllowedSize))
     base::TerminateBecauseOutOfMemory(size);
 
   return __libc_memalign(alignment, size);
@@ -86,7 +86,7 @@
   __libc_free(address);
 }
 
-NO_SANITIZE("cfi-icall")
+PA_NO_SANITIZE("cfi-icall")
 size_t GlibcGetSizeEstimate(const AllocatorDispatch*,
                             void* address,
                             void* context) {
diff --git a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
index a77b5b1..f49d5621 100644
--- a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -16,6 +16,7 @@
 #include "base/allocator/partition_allocator/memory_reclaimer.h"
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/bits.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/no_destructor.h"
 #include "base/allocator/partition_allocator/partition_alloc_base/threading/platform_thread.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
@@ -24,7 +25,6 @@
 #include "base/allocator/partition_allocator/partition_root.h"
 #include "base/allocator/partition_allocator/partition_stats.h"
 #include "base/allocator/partition_allocator/shim/allocator_shim_internals.h"
-#include "base/compiler_specific.h"
 #include "base/memory/nonscannable_memory.h"
 #include "base/numerics/checked_math.h"
 #include "base/numerics/safe_conversions.h"
@@ -77,9 +77,9 @@
  public:
   constexpr LeakySingleton() = default;
 
-  ALWAYS_INLINE T* Get() {
+  PA_ALWAYS_INLINE T* Get() {
     auto* instance = instance_.load(std::memory_order_acquire);
-    if (LIKELY(instance))
+    if (PA_LIKELY(instance))
       return instance;
 
     return GetSlowPath();
@@ -176,7 +176,7 @@
 
 LeakySingleton<partition_alloc::ThreadSafePartitionRoot,
                MainPartitionConstructor>
-    g_root CONSTINIT = {};
+    g_root PA_CONSTINIT = {};
 partition_alloc::ThreadSafePartitionRoot* Allocator() {
   return g_root.Get();
 }
@@ -193,7 +193,7 @@
 
 LeakySingleton<partition_alloc::ThreadSafePartitionRoot,
                AlignedPartitionConstructor>
-    g_aligned_root CONSTINIT = {};
+    g_aligned_root PA_CONSTINIT = {};
 
 partition_alloc::ThreadSafePartitionRoot* OriginalAllocator() {
   return g_original_root.load(std::memory_order_relaxed);
@@ -231,7 +231,7 @@
 #endif  // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86)
 
 // TODO(brucedawson): Remove this when https://crbug.com/1151455 is fixed.
-ALWAYS_INLINE size_t MaybeAdjustSize(size_t size) {
+PA_ALWAYS_INLINE size_t MaybeAdjustSize(size_t size) {
 #if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86)
   return base::CheckAdd(size, g_extra_bytes).ValueOrDie();
 #else   // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86)
@@ -385,9 +385,9 @@
                        void* context) {
   partition_alloc::ScopedDisallowAllocations guard{};
 #if BUILDFLAG(IS_APPLE)
-  if (UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
-                   reinterpret_cast<uintptr_t>(address)) &&
-               address)) {
+  if (PA_UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
+                      reinterpret_cast<uintptr_t>(address)) &&
+                  address)) {
     // A memory region allocated by the system allocator is passed in this
     // function.  Forward the request to `realloc` which supports zone-
     // dispatching so that it appropriately selects the right zone.
@@ -410,9 +410,9 @@
   partition_alloc::ScopedDisallowAllocations guard{};
 #if BUILDFLAG(IS_APPLE)
   // TODO(bartekn): Add MTE unmasking here (and below).
-  if (UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
-                   reinterpret_cast<uintptr_t>(object)) &&
-               object)) {
+  if (PA_UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
+                      reinterpret_cast<uintptr_t>(object)) &&
+                  object)) {
     // A memory region allocated by the system allocator is passed in this
     // function.  Forward the request to `free` which supports zone-
     // dispatching so that it appropriately selects the right zone.
@@ -425,9 +425,9 @@
   // the pointer, pass it along. This should not have a runtime cost vs regular
   // Android, since on Android we have a PA_CHECK() rather than the branch here.
 #if BUILDFLAG(IS_CAST_ANDROID)
-  if (UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
-                   reinterpret_cast<uintptr_t>(object)) &&
-               object)) {
+  if (PA_UNLIKELY(!partition_alloc::IsManagedByPartitionAlloc(
+                      reinterpret_cast<uintptr_t>(object)) &&
+                  object)) {
     // A memory region allocated by the system allocator is passed in this
     // function.  Forward the request to `free()`, which is `__real_free()`
     // here.
diff --git a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
index e550dc3f..e13fe60 100644
--- a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc_unittest.cc
@@ -8,8 +8,8 @@
 #include <cstring>
 
 #include "base/allocator/buildflags.h"
+#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
-#include "base/compiler_specific.h"
 #include "base/memory/page_size.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -26,7 +26,7 @@
 // Platforms on which we override weak libc symbols.
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
-NOINLINE void FreeForTest(void* data) {
+PA_NOINLINE void FreeForTest(void* data) {
   free(data);
 }
 
@@ -68,8 +68,9 @@
   EXPECT_GT(after_alloc.uordblks, before.uordblks);
 
   // a simple malloc() / free() pair can be discarded by the compiler (and is),
-  // making the test fail. It is sufficient to make |FreeForTest()| a NOINLINE
-  // function for the call to not be eliminated, but this is required.
+  // making the test fail. It is sufficient to make |FreeForTest()| a
+  // PA_NOINLINE function for the call to not be eliminated, but this is
+  // required.
   FreeForTest(data);
   FreeForTest(aligned_data);
   FreeForTest(direct_mapped_data);
diff --git a/base/allocator/partition_allocator/shim/allocator_shim_override_cpp_symbols.h b/base/allocator/partition_allocator/shim/allocator_shim_override_cpp_symbols.h
index a1129eb..33bfedae 100644
--- a/base/allocator/partition_allocator/shim/allocator_shim_override_cpp_symbols.h
+++ b/base/allocator/partition_allocator/shim/allocator_shim_override_cpp_symbols.h
@@ -15,8 +15,8 @@
 
 #include <new>
 
+#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h"
 #include "base/allocator/partition_allocator/shim/allocator_shim_internals.h"
-#include "base/compiler_specific.h"
 #include "build/build_config.h"
 
 #if !BUILDFLAG(IS_APPLE)
@@ -28,7 +28,7 @@
 // it is also needless, since no library used on macOS imports these.
 //
 // TODO(lizeb): It may not be necessary anywhere to export these.
-#define SHIM_CPP_SYMBOLS_EXPORT NOINLINE
+#define SHIM_CPP_SYMBOLS_EXPORT PA_NOINLINE
 #endif
 
 SHIM_CPP_SYMBOLS_EXPORT void* operator new(size_t size) {
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index 85a665b..2b6624d 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -86,7 +86,6 @@
 
   double GetEntropyForTrial(StringPiece trial_name,
                             uint32_t randomization_seed) const override {
-    DCHECK_EQ(randomization_seed, 0u);
     return RandDouble();
   }
 };
diff --git a/base/metrics/field_trial_params.h b/base/metrics/field_trial_params.h
index 1b7945b..0caab78 100644
--- a/base/metrics/field_trial_params.h
+++ b/base/metrics/field_trial_params.h
@@ -229,7 +229,7 @@
 //         &kPerAgentSchedulingExperiments, "delay", base::TimeDelta()};
 //
 // If the parameter is not set, or set to an invalid value (as defined by
-// base::TimeDelta::FromString()), then Get() will return the default value.
+// base::TimeDeltaFromString()), then Get() will return the default value.
 template <>
 struct FeatureParam<base::TimeDelta> {
   constexpr FeatureParam(const Feature* feature,
diff --git a/base/profiler/libunwindstack_unwinder_android_unittest.cc b/base/profiler/libunwindstack_unwinder_android_unittest.cc
index 96c5f5a..e6a4293 100644
--- a/base/profiler/libunwindstack_unwinder_android_unittest.cc
+++ b/base/profiler/libunwindstack_unwinder_android_unittest.cc
@@ -68,13 +68,10 @@
 }  // namespace
 
 // Checks that the expected information is present in sampled frames.
-#if defined(ADDRESS_SANITIZER)
-// TODO(https://crbug.com/1147315): Fix, re-enable.
-#define MAYBE_PlainFunction DISABLED_PlainFunction
-#else
-#define MAYBE_PlainFunction PlainFunction
-#endif
-TEST(LibunwindstackUnwinderAndroidTest, MAYBE_PlainFunction) {
+// TODO(https://crbug.com/1147315): Fix, re-enable  on all ASAN bots.
+// TODO(https://crbug.com/1368981): After fix, re-enable on all bots except
+// if defined(ADDRESS_SANITIZER).
+TEST(LibunwindstackUnwinderAndroidTest, DISABLED_PlainFunction) {
   UnwindScenario scenario(BindRepeating(&CallWithPlainFunction));
 
   ModuleCache module_cache;
@@ -104,13 +101,10 @@
 
 // Checks that the unwinder handles stacks containing dynamically-allocated
 // stack memory.
-#if defined(ADDRESS_SANITIZER)
-// TODO(https://crbug.com/1147315): Fix, re-enable.
-#define MAYBE_Alloca DISABLED_Alloca
-#else
-#define MAYBE_Alloca Alloca
-#endif
-TEST(LibunwindstackUnwinderAndroidTest, MAYBE_Alloca) {
+// TODO(https://crbug.com/1147315): Fix, re-enable  on all ASAN bots.
+// TODO(https://crbug.com/1368981): After fix, re-enable on all bots except
+// if defined(ADDRESS_SANITIZER).
+TEST(LibunwindstackUnwinderAndroidTest, DISABLED_Alloca) {
   UnwindScenario scenario(BindRepeating(&CallWithAlloca));
 
   ModuleCache module_cache;
@@ -140,13 +134,10 @@
 
 // Checks that a stack that runs through another library produces a stack with
 // the expected functions.
-#if defined(ADDRESS_SANITIZER)
-// TODO(https://crbug.com/1147315): Fix, re-enable.
-#define MAYBE_OtherLibrary DISABLED_OtherLibrary
-#else
-#define MAYBE_OtherLibrary OtherLibrary
-#endif
-TEST(LibunwindstackUnwinderAndroidTest, MAYBE_OtherLibrary) {
+// TODO(https://crbug.com/1147315): Fix, re-enable  on all ASAN bots.
+// TODO(https://crbug.com/1368981): After fix, re-enable on all bots except
+// if defined(ADDRESS_SANITIZER).
+TEST(LibunwindstackUnwinderAndroidTest, DISABLED_OtherLibrary) {
   NativeLibrary other_library = LoadOtherLibrary();
   UnwindScenario scenario(
       BindRepeating(&CallThroughOtherLibrary, Unretained(other_library)));
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc
index 2cf6ea3..40308eb 100644
--- a/base/sampling_heap_profiler/sampling_heap_profiler.cc
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -13,7 +13,6 @@
 #include "base/bind.h"
 #include "base/compiler_specific.h"
 #include "base/debug/stack_trace.h"
-#include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
@@ -48,12 +47,6 @@
 
 using StackUnwinder = SamplingHeapProfiler::StackUnwinder;
 
-#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
-BASE_FEATURE(kAvoidFramePointerUnwinding,
-             "HeapProfilerAvoidFramePointerUnwinding",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-#endif
-
 // If a thread name has been set from ThreadIdNameManager, use that. Otherwise,
 // gets the thread name from kernel if available or returns a string with id.
 // This function intentionally leaks the allocated strings since they are used
@@ -113,10 +106,9 @@
           ->can_unwind_stack_frames()) {
     return StackUnwinder::kCFIBacktrace;
   }
-  return CheckForDefaultUnwindTables();
-#elif BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
-  if (base::FeatureList::IsEnabled(kAvoidFramePointerUnwinding))
-    return CheckForDefaultUnwindTables();
+#endif
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+  // Use frame pointers if available, since they can be faster than the default.
   return StackUnwinder::kFramePointers;
 #elif BUILDFLAG(IS_ANDROID)
   // Default unwind tables aren't always present on Android.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
index ed0f3c0..93c60072 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
@@ -123,7 +123,7 @@
      * and {@link CommandLineFlags.Remove} to the {@link org.chromium.base.CommandLine}. Note that
      * trying to remove a flag set externally, i.e. by the command-line flags file, will not work.
      */
-    private static void setUpClass(Class<?> clazz) {
+    public static void setUpClass(Class<?> clazz) {
         // The command line may already have been initialized by Application-level init. We need to
         // re-initialize it with test flags.
         if (!sInitializedForTest) {
@@ -139,7 +139,7 @@
         applyFlags(flags, null, sClassFlagsToRemove, sClassFlagsToAdd);
     }
 
-    private static void tearDownClass() {
+    public static void tearDownClass() {
         if (ApplicationStatus.isInitialized()) {
             for (Activity a : ApplicationStatus.getRunningActivities()) {
                 if (ApplicationStatus.getStateForActivity(a) < ActivityState.RESUMED) {
@@ -154,7 +154,7 @@
         sClassFlagsToAdd = null;
     }
 
-    private static void setUpMethod(Method method) {
+    public static void setUpMethod(Method method) {
         Set<String> flagsToAdd = new HashSet<>();
         Set<String> flagsToRemove = new HashSet<>();
         updateFlagsForMethod(method, flagsToAdd, flagsToRemove);
@@ -163,19 +163,19 @@
         applyFlags(flagsToAdd, flagsToRemove, sMethodFlagsToRemove, sMethodFlagsToAdd);
     }
 
-    private static void tearDownMethod() {
+    public static void tearDownMethod() {
         restoreFlags(sMethodFlagsToRemove, sMethodFlagsToAdd);
         sMethodFlagsToRemove = null;
         sMethodFlagsToAdd = null;
     }
 
     private static void restoreFlags(Set<String> flagsToRemove, Map<String, String> flagsToAdd) {
-        for (String flag : flagsToRemove) {
-            CommandLine.getInstance().removeSwitch(flag);
-        }
         for (Entry<String, String> flag : flagsToAdd.entrySet()) {
             CommandLine.getInstance().appendSwitchWithValue(flag.getKey(), flag.getValue());
         }
+        for (String flag : flagsToRemove) {
+            CommandLine.getInstance().removeSwitch(flag);
+        }
     }
 
     private static void applyFlags(Set<String> flagsToAdd, Set<String> flagsToRemove,
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
index 2cf0119..d20cae6a 100644
--- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
+++ b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
@@ -12,11 +12,11 @@
 import org.robolectric.TestLifecycle;
 
 import org.chromium.base.ApplicationStatus;
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.LifetimeAssert;
 import org.chromium.base.PathUtils;
 import org.chromium.base.metrics.UmaRecorderHolder;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
@@ -38,7 +38,8 @@
                     ApplicationProvider.getApplicationContext());
             ApplicationStatus.initialize(ApplicationProvider.getApplicationContext());
             UmaRecorderHolder.resetForTesting();
-            CommandLine.init(null);
+            CommandLineFlags.setUpClass(method.getDeclaringClass());
+            CommandLineFlags.setUpMethod(method);
             super.beforeTest(method);
         }
 
@@ -47,6 +48,8 @@
             try {
                 LifetimeAssert.assertAllInstancesDestroyedForTesting();
             } finally {
+                CommandLineFlags.tearDownMethod();
+                CommandLineFlags.tearDownClass();
                 ApplicationStatus.destroyForJUnitTests();
                 ContextUtils.clearApplicationContextForTests();
                 PathUtils.resetForTesting();
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsNoClassAnnotationCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsNoClassAnnotationCheckTest.java
index 3bd944d..c8550ae 100644
--- a/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsNoClassAnnotationCheckTest.java
+++ b/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsNoClassAnnotationCheckTest.java
@@ -5,9 +5,7 @@
 package org.chromium.base.test.util;
 
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
@@ -21,13 +19,10 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class CommandLineFlagsNoClassAnnotationCheckTest {
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Test
     public void testNoAnnotation() throws Throwable {
-        Assert.assertTrue("CommandLine switches should be empty by default",
-                CommandLine.getInstance().getSwitches().isEmpty());
+        var switches = CommandLine.getInstance().getSwitches();
+        Assert.assertTrue("CommandLine switches should be empty: " + switches, switches.isEmpty());
     }
 
     @Test
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsWithClassAnnotationCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsWithClassAnnotationCheckTest.java
index 927bb31..4dd97a350 100644
--- a/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsWithClassAnnotationCheckTest.java
+++ b/base/test/android/junit/src/org/chromium/base/test/util/CommandLineFlagsWithClassAnnotationCheckTest.java
@@ -5,9 +5,7 @@
 package org.chromium.base.test.util;
 
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
@@ -22,9 +20,6 @@
 @Config(manifest = Config.NONE)
 @CommandLineFlags.Add("some-switch")
 public class CommandLineFlagsWithClassAnnotationCheckTest {
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Test
     public void testOnlyClassAnnotation() throws Throwable {
         Assert.assertTrue("some-switch should be appended by the class",
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 2675c15f..d93a77b 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-9.20220929.1.1
+9.20220930.0.1
diff --git a/build/linux/sysroot_scripts/sysroot-creator.sh b/build/linux/sysroot_scripts/sysroot-creator.sh
index 39eab9a5..15a10d5 100644
--- a/build/linux/sysroot_scripts/sysroot-creator.sh
+++ b/build/linux/sysroot_scripts/sysroot-creator.sh
@@ -484,8 +484,9 @@
     dpkg-deb -e ${package} ${INSTALL_ROOT}/debian/${base_package}/DEBIAN
   done
 
-  # Prune /usr/share, leaving only pkgconfig.
-  ls -d ${INSTALL_ROOT}/usr/share/* | grep -v "/pkgconfig$" | xargs rm -r
+  # Prune /usr/share, leaving only pkgconfig and wayland-protocols.
+  ls -d ${INSTALL_ROOT}/usr/share/* | \
+    grep -v "/\(pkgconfig\|wayland-protocols\)$" | xargs rm -r
 }
 
 
diff --git a/build/linux/sysroot_scripts/sysroots.json b/build/linux/sysroot_scripts/sysroots.json
index 3cc6bfd9..fec4188 100644
--- a/build/linux/sysroot_scripts/sysroots.json
+++ b/build/linux/sysroot_scripts/sysroots.json
@@ -1,36 +1,36 @@
 {
     "bullseye_amd64": {
-        "Sha1Sum": "5b5c18439d5ff28af731aee196d8c7007b07d645",
+        "Sha1Sum": "538c28a35982ebc680ca8111c4c06dfa7adf4948",
         "SysrootDir": "debian_bullseye_amd64-sysroot",
         "Tarball": "debian_bullseye_amd64_sysroot.tar.xz"
     },
     "bullseye_arm": {
-        "Sha1Sum": "09fdc52caab014a007ad6925bbfae61c253701b0",
+        "Sha1Sum": "377dede7e003c11c729e0b3f9f88ed2c8e91e403",
         "SysrootDir": "debian_bullseye_arm-sysroot",
         "Tarball": "debian_bullseye_arm_sysroot.tar.xz"
     },
     "bullseye_arm64": {
-        "Sha1Sum": "18fb14f3effc8931fa9bc0b284d17812db0ba1e7",
+        "Sha1Sum": "2e3f631551d94198958b6fe2981c7fab136f3d01",
         "SysrootDir": "debian_bullseye_arm64-sysroot",
         "Tarball": "debian_bullseye_arm64_sysroot.tar.xz"
     },
     "bullseye_armel": {
-        "Sha1Sum": "3854f74db40b2575a6ee8c590181c75c92f76f3c",
+        "Sha1Sum": "79e323d256849defe51521812efa0c60e841e07c",
         "SysrootDir": "debian_bullseye_armel-sysroot",
         "Tarball": "debian_bullseye_armel_sysroot.tar.xz"
     },
     "bullseye_i386": {
-        "Sha1Sum": "eabc62418af7fd0a72c2cd41aa1b0a0d86ed9ff4",
+        "Sha1Sum": "7a8849c90ad9c6b602c98165f78ffbe4eeb00366",
         "SysrootDir": "debian_bullseye_i386-sysroot",
         "Tarball": "debian_bullseye_i386_sysroot.tar.xz"
     },
     "bullseye_mips": {
-        "Sha1Sum": "c89ef52768cf21376abb663f56860f17fd880a4d",
+        "Sha1Sum": "57e6628ecf6650dfd880c60c3fba8c006788435b",
         "SysrootDir": "debian_bullseye_mips-sysroot",
         "Tarball": "debian_bullseye_mips_sysroot.tar.xz"
     },
     "bullseye_mips64el": {
-        "Sha1Sum": "93c90e3ef7bc8a405ca0141fa5125f0eee266b85",
+        "Sha1Sum": "d23f639437eb51e788cf18738b69dafdca96defe",
         "SysrootDir": "debian_bullseye_mips64el-sysroot",
         "Tarball": "debian_bullseye_mips64el_sysroot.tar.xz"
     }
diff --git a/chrome/VERSION b/chrome/VERSION
index 558a9a5..dd9a29c 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=108
 MINOR=0
-BUILD=5331
+BUILD=5332
 PATCH=0
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java
index de1c74f..792bfc5f 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java
@@ -6,7 +6,6 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.when;
 
 import org.junit.After;
 import org.junit.Before;
@@ -14,14 +13,13 @@
 import org.junit.Test;
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.BaseSwitches;
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.SysUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.CachedFlag;
@@ -41,9 +39,6 @@
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
 
-    @Mock
-    CommandLine mCommandLine;
-
     private void setAccessibilityEnabledForTesting(Boolean value) {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(value));
@@ -53,16 +48,12 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        when(mCommandLine.isNativeImplementation()).thenReturn(true);
-        CommandLine.setInstanceForTesting(mCommandLine);
-
         setAccessibilityEnabledForTesting(false);
         CachedFeatureFlags.resetFlagsForTesting();
     }
 
     @After
     public void tearDown() {
-        CommandLine.reset();
         CachedFeatureFlags.resetFlagsForTesting();
         setAccessibilityEnabledForTesting(null);
         DeviceClassManager.resetForTesting();
@@ -83,9 +74,9 @@
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_NoEnabledFlags() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -111,9 +102,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_Layout() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -143,9 +134,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_Layout() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -175,9 +166,9 @@
                                 ChromeFeatureList.TAB_GROUPS_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_LayoutGroup() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -207,9 +198,9 @@
                                 ChromeFeatureList.TAB_GROUPS_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_LayoutGroup() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -238,9 +229,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_Group() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -269,9 +260,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_Group() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -300,9 +291,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_Continuation() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -331,9 +322,9 @@
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_SelectionEditorV2() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -366,9 +357,9 @@
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_AllFlags() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -401,10 +392,9 @@
                                 ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_AllFlags() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
-
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -437,9 +427,9 @@
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_LayoutContinuation() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -468,9 +458,9 @@
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_LayoutContinuation() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -499,9 +489,9 @@
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.DISABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_HighEnd_GroupContinuation() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.DISABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -530,9 +520,9 @@
                                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridTabSwitcher_LowEnd_GroupContinuation() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
@@ -561,9 +551,9 @@
             ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
                                 ChromeFeatureList.TAB_SELECTION_EDITOR_V2})
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testCacheGridAndGroup_LowEnd_enabledThenDisabled_withContinuationFlag() {
         // clang-format on
-        when(mCommandLine.hasSwitch(BaseSwitches.ENABLE_LOW_END_DEVICE_MODE)).thenReturn(true);
         cacheFeatureFlags();
 
         CachedFeatureFlags.resetFlagsForTesting();
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
index 51ab2d2..36bd7543 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java
@@ -42,9 +42,6 @@
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
 
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Mock
     TabContext mTabContext;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
index 73a3f18..e55f1f2d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
@@ -67,7 +67,7 @@
 public abstract class ClearBrowsingDataFragment extends PreferenceFragmentCompat
         implements BrowsingDataBridge.OnClearBrowsingDataListener,
                    Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener,
-                   SignOutDialogCoordinator.Listener {
+                   SignOutDialogCoordinator.Listener, SigninManager.SignInStateObserver {
     private static final String CLEAR_DATA_PROGRESS_DIALOG_TAG = "clear_data_progress";
 
     /**
@@ -228,6 +228,8 @@
 
     private OtherFormsOfHistoryDialogFragment mDialogAboutOtherFormsOfBrowsingHistory;
 
+    private SigninManager mSigninManager;
+
     private ProgressDialog mProgressDialog;
     private Item[] mItems;
     private ClearBrowsingDataFetcher mFetcher;
@@ -537,6 +539,8 @@
         }
         getActivity().setTitle(R.string.clear_browsing_data_title);
         SettingsUtils.addPreferencesFromResource(this, R.xml.clear_browsing_data_preferences_tab);
+        mSigninManager = IdentityServicesProvider.get().getSigninManager(
+                Profile.getLastUsedRegularProfile());
         List<Integer> options = getDialogOptions();
         mItems = new Item[options.size()];
         for (int i = 0; i < options.size(); i++) {
@@ -587,19 +591,9 @@
         spinner.setOnPreferenceChangeListener(this);
 
         // Text for sign-out option.
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ENABLE_CBD_SIGN_OUT)
-                && IdentityServicesProvider.get()
-                           .getIdentityManager(Profile.getLastUsedRegularProfile())
-                           .hasPrimaryAccount(ConsentLevel.SIGNIN)
-                && IdentityServicesProvider.get()
-                           .getSigninManager(Profile.getLastUsedRegularProfile())
-                           .isSignOutAllowed()) {
-            ClickableSpansTextMessagePreference signOutOfChromeTextPref =
-                    findPreference(ClearBrowsingDataFragment.PREF_SIGN_OUT_OF_CHROME_TEXT);
-            signOutOfChromeTextPref.setSummary(buildSignOutOfChromeText());
-        } else {
-            deleteSignOutOfChromeTextIfExists();
-        }
+        updateSignOutOfChromeText();
+
+        mSigninManager.addSignInStateObserver(this);
     }
 
     @Override
@@ -645,6 +639,7 @@
         for (Item item : mItems) {
             item.destroy();
         }
+        mSigninManager.removeSignInStateObserver(this);
     }
 
     // We either show the dialog, or modify the current one to display our messages.  This avoids
@@ -667,6 +662,18 @@
         return mConfirmImportantSitesDialog;
     }
 
+    private void updateSignOutOfChromeText() {
+        ClickableSpansTextMessagePreference signOutOfChromeTextPref =
+                findPreference(ClearBrowsingDataFragment.PREF_SIGN_OUT_OF_CHROME_TEXT);
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ENABLE_CBD_SIGN_OUT)
+                && mSigninManager.isSignOutAllowed()) {
+            signOutOfChromeTextPref.setSummary(buildSignOutOfChromeText());
+            signOutOfChromeTextPref.setVisible(true);
+        } else {
+            signOutOfChromeTextPref.setVisible(false);
+        }
+    }
+
     @VisibleForTesting
     SpannableString buildSignOutOfChromeText() {
         return SpanApplier.applySpans(getContext().getString(R.string.sign_out_of_chrome_link),
@@ -682,14 +689,6 @@
                         ActionType.CLEAR_PRIMARY_ACCOUNT, GAIAServiceType.GAIA_SERVICE_TYPE_NONE);
     }
 
-    private void deleteSignOutOfChromeTextIfExists() {
-        Preference signOutOfChromeTextPref =
-                findPreference(ClearBrowsingDataFragment.PREF_SIGN_OUT_OF_CHROME_TEXT);
-        if (signOutOfChromeTextPref != null) {
-            getPreferenceScreen().removePreference(signOutOfChromeTextPref);
-        }
-    }
-
     /**
      * This method shows the important sites dialog. After the dialog is shown, we correctly clear.
      */
@@ -757,23 +756,19 @@
     @Override
     public void onSignOutClicked(boolean forceWipeUserData) {
         // In case the user is not signed in, we guard the sign out so we do not hit a native crash.
-        if (!IdentityServicesProvider.get()
-                        .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .hasPrimaryAccount(ConsentLevel.SIGNIN)) {
+        if (!mSigninManager.getIdentityManager().hasPrimaryAccount(ConsentLevel.SIGNIN)) {
             return;
         }
-        final SigninManager signinManager = IdentityServicesProvider.get().getSigninManager(
-                Profile.getLastUsedRegularProfile());
-        signinManager.runAfterOperationInProgress(() -> {
+        mSigninManager.runAfterOperationInProgress(() -> {
             // In case supervised users reach this flow, remove the preference and guard against
             // signing out.
-            if (!signinManager.isSignOutAllowed()) {
-                deleteSignOutOfChromeTextIfExists();
+            if (!mSigninManager.isSignOutAllowed()) {
+                updateSignOutOfChromeText();
                 return;
             }
             final DialogFragment clearDataProgressDialog = new ClearDataProgressDialog();
-            signinManager.signOut(org.chromium.components.signin.metrics.SignoutReason
-                                          .USER_CLICKED_SIGNOUT_FROM_CLEAR_BROWSING_DATA_PAGE,
+            mSigninManager.signOut(org.chromium.components.signin.metrics.SignoutReason
+                                           .USER_CLICKED_SIGNOUT_FROM_CLEAR_BROWSING_DATA_PAGE,
                     new SigninManager.SignOutCallback() {
                         @Override
                         public void preWipeData() {
@@ -787,9 +782,12 @@
                         }
                     },
                     forceWipeUserData);
-            // TODO(https://crbug.com/1334918): Observe SignInStateObserver and move this inside
-            // onSignOutAllowedChanged().
-            deleteSignOutOfChromeTextIfExists();
         });
     }
+
+    /** {@link SigninManager.SignInStateObserver} implementation. */
+    @Override
+    public void onSignOutAllowedChanged() {
+        updateSignOutOfChromeText();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
index 3556c21..fe5cd87 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -284,6 +284,7 @@
                 mTabMenu.dismiss();
                 if (position == ID_CLOSE_ALL_TABS) {
                     mModel.closeAllTabs(false);
+                    RecordUserAction.record("MobileToolbarCloseAllTabs");
                 }
             }
         });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
index bc013ff..dd2297c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
@@ -185,6 +185,14 @@
                 && isSigninSupported();
     }
 
+    /** Returns true if sign out can be started now. */
+    @Override
+    public boolean isSignOutAllowed() {
+        return mSignOutState == null && mSignInState == null
+                && mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) != null
+                && !Profile.getLastUsedRegularProfile().isChild();
+    }
+
     /**
      * Returns true if signin is disabled by policy.
      */
@@ -234,6 +242,14 @@
         });
     }
 
+    private void notifySignOutAllowedChanged() {
+        PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
+            for (SignInStateObserver observer : mSignInStateObservers) {
+                observer.onSignOutAllowedChanged();
+            }
+        });
+    }
+
     /**
      * Starts the sign-in flow, and executes the callback when finished.
      *
@@ -358,6 +374,7 @@
         mSignInState = null;
         notifyCallbacksWaitingForOperation();
         notifySignInAllowedChanged();
+        notifySignOutAllowedChanged();
 
         for (SignInStateObserver observer : mSignInStateObservers) {
             observer.onSignedIn();
@@ -392,6 +409,7 @@
                             getManagementDomain() != null
                                     ? SignOutState.DataWipeAction.WIPE_ALL_PROFILE_DATA
                                     : SignOutState.DataWipeAction.WIPE_SIGNIN_DATA_ONLY);
+                    notifySignOutAllowedChanged();
                 }
 
                 // TODO(https://crbug.com/1091858): Remove this after migrating the legacy code that
@@ -407,6 +425,7 @@
                         // Don't wipe data as the user is not syncing.
                         mSignOutState = new SignOutState(
                                 null, SignOutState.DataWipeAction.WIPE_SIGNIN_DATA_ONLY);
+                        notifySignOutAllowedChanged();
                     }
                     disableSyncAndWipeData(this::finishSignOut);
                 }
@@ -482,14 +501,6 @@
     }
 
     /**
-     * Returns true if sign out can be started now.
-     */
-    @Override
-    public boolean isSignOutAllowed() {
-        return !Profile.getLastUsedRegularProfile().isChild();
-    }
-
-    /**
      * Signs out of Chrome. This method clears the signed-in username, stops sync and sends out a
      * sign-out notification on the native side.
      *
@@ -524,6 +535,7 @@
                 // Android has just a single-profile which is never deleted upon
                 // sign-out.
                 SignoutDelete.IGNORE_METRIC);
+        notifySignOutAllowedChanged();
     }
 
     /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java
index 0adc1fa..b823c72 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsTest.java
@@ -7,6 +7,7 @@
 import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL;
 import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL;
 
+import android.app.Activity;
 import android.support.test.InstrumentationRegistry;
 import android.view.KeyEvent;
 
@@ -29,6 +30,7 @@
 import org.chromium.base.test.params.ParameterAnnotations;
 import org.chromium.base.test.params.ParameterSet;
 import org.chromium.base.test.params.ParameterizedRunner;
+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.Criteria;
@@ -96,6 +98,7 @@
     private OmniboxTestUtils mOmniboxUtils;
     private boolean mIncognito;
     private LocationBarLayout mLocationBarLayout;
+    private Activity mTargetActivity;
 
     public OmniboxPedalsTest(boolean incognito) {
         mIncognito = incognito;
@@ -125,9 +128,12 @@
     }
 
     @After
-    public void tearDown() {
+    public void tearDown() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> { IncognitoTabHostUtils.closeAllIncognitoTabs(); });
+        if (mTargetActivity != null) {
+            ApplicationTestUtils.finishActivity(mTargetActivity);
+        }
     }
 
     /**
@@ -196,8 +202,10 @@
      */
     private <T> T clickOnPedalToSettings(
             final Class<T> activityType, @OmniboxPedalType int pedalType) {
-        return ActivityTestUtils.waitForActivity(InstrumentationRegistry.getInstrumentation(),
-                activityType, () -> clickOnPedal());
+        mTargetActivity = (Activity) ActivityTestUtils.waitForActivity(
+                InstrumentationRegistry.getInstrumentation(), activityType, () -> clickOnPedal());
+
+        return (T) mTargetActivity;
     }
 
     /**
@@ -291,8 +299,6 @@
                 settingsActivity, ClearBrowsingDataTabsFragment.class);
 
         verifyHistogram(OmniboxPedalType.CLEAR_BROWSING_DATA);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -310,8 +316,6 @@
         checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, PasswordSettings.class);
 
         verifyHistogram(OmniboxPedalType.MANAGE_PASSWORDS);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -330,8 +334,6 @@
                 settingsActivity, AutofillPaymentMethodsFragment.class);
 
         verifyHistogram(OmniboxPedalType.UPDATE_CREDIT_CARD);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -375,8 +377,6 @@
                     mHistogramTester.getHistogramTotalCount("Settings.SafetyCheck.UpdatesResult"),
                     Matchers.is(1));
         });
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -394,8 +394,6 @@
         checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, SiteSettings.class);
 
         verifyHistogram(OmniboxPedalType.MANAGE_SITE_SETTINGS);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -413,8 +411,6 @@
         checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, MainSettings.class);
 
         verifyHistogram(OmniboxPedalType.MANAGE_CHROME_SETTINGS);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -448,8 +444,6 @@
         Assert.assertNotNull("Could not find the history activity", historyActivity);
 
         verifyHistogram(OmniboxPedalType.VIEW_CHROME_HISTORY);
-
-        historyActivity.finish();
     }
 
     @Test
@@ -469,13 +463,11 @@
         checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, AccessibilitySettings.class);
 
         verifyHistogram(OmniboxPedalType.MANAGE_CHROME_ACCESSIBILITY);
-
-        settingsActivity.finish();
     }
 
     @Test
     @MediumTest
-    public void testPedalsStartedOnCtrlEnterKeyStroke() throws InterruptedException {
+    public void testPedalsStartedOnCtrlEnterKeyStroke() throws Exception {
         typeInOmnibox("Chrome accessibility");
         SuggestionInfo<PedalSuggestionView> pedal =
                 mOmniboxUtils.getSuggestionByType(OmniboxSuggestionUiType.PEDAL_SUGGESTION);
@@ -485,16 +477,15 @@
         // Select Pedal with the TAB key and activate it with an ENTER key.
         mOmniboxUtils.sendKey(KeyEvent.KEYCODE_TAB);
 
-        SettingsActivity settingsActivity = ActivityTestUtils.waitForActivity(
+        mTargetActivity = ActivityTestUtils.waitForActivity(
                 InstrumentationRegistry.getInstrumentation(), SettingsActivity.class,
                 () -> mOmniboxUtils.sendKey(KeyEvent.KEYCODE_ENTER));
-        Assert.assertNotNull("Could not find the Settings activity", settingsActivity);
+        Assert.assertNotNull("Could not find the Settings activity", mTargetActivity);
 
-        checkSettingsWasShownAndOmniboxNoFocus(settingsActivity, AccessibilitySettings.class);
+        checkSettingsWasShownAndOmniboxNoFocus(
+                (SettingsActivity) mTargetActivity, AccessibilitySettings.class);
 
         verifyHistogram(OmniboxPedalType.MANAGE_CHROME_ACCESSIBILITY);
-
-        settingsActivity.finish();
     }
 
     @Test
@@ -556,7 +547,7 @@
     @Test
     @MediumTest
     @EnableFeatures({ChromeFeatureList.HISTORY_JOURNEYS})
-    public void testHistoryClustersAction() {
+    public void testHistoryClustersAction() throws Exception {
         if (mIncognito) return;
         mOmniboxUtils.requestFocus();
         List<AutocompleteMatch> suggestionsList = buildDummySuggestionsList(2, "Suggestion");
@@ -580,8 +571,9 @@
                         tab.getUrl().getSpec(), Matchers.startsWith("chrome://history/journeys"));
             });
         } else {
-            ActivityTestUtils.waitForActivity(
+            mTargetActivity = ActivityTestUtils.waitForActivity(
                     InstrumentationRegistry.getInstrumentation(), HistoryActivity.class);
+            Assert.assertNotNull("Could not find the history activity", mTargetActivity);
         }
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java
index a72c5ce3..32fb406 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java
@@ -30,9 +30,9 @@
 
 import org.chromium.base.BaseSwitches;
 import org.chromium.base.Callback;
-import org.chromium.base.CommandLine;
 import org.chromium.base.SysUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.device.ShadowDeviceConditions;
@@ -51,11 +51,8 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowDeviceConditions.class})
+@CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
 public class BackgroundSyncBackgroundTaskTest {
-    private static final String IS_LOW_END_DEVICE_SWITCH =
-            "--" + BaseSwitches.ENABLE_LOW_END_DEVICE_MODE;
-
-
     @Rule
     public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
 
@@ -89,16 +86,12 @@
 
         ShadowDeviceConditions.setCurrentNetworkConnectionType(ConnectionType.CONNECTION_NONE);
 
-        // Run tests as a low-end device.
-        CommandLine.init(new String[] {"testcommand", IS_LOW_END_DEVICE_SWITCH});
-
         mocker.mock(BackgroundSyncBackgroundTaskJni.TEST_HOOKS, mNativeMock);
     }
 
     @After
     public void tearDown() {
         // Clean up static state for subsequent Robolectric tests.
-        CommandLine.reset();
         SysUtils.resetForTesting();
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTaskTest.java
index 551397a..8b74488 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTaskTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/PeriodicBackgroundSyncChromeWakeUpTaskTest.java
@@ -29,9 +29,9 @@
 
 import org.chromium.base.BaseSwitches;
 import org.chromium.base.Callback;
-import org.chromium.base.CommandLine;
 import org.chromium.base.SysUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.device.ShadowDeviceConditions;
@@ -49,11 +49,8 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowDeviceConditions.class})
+@CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
 public class PeriodicBackgroundSyncChromeWakeUpTaskTest {
-    private static final String IS_LOW_END_DEVICE_SWITCH =
-            "--" + BaseSwitches.ENABLE_LOW_END_DEVICE_MODE;
-
-
     @Rule
     public JniMocker mocker = new JniMocker();
 
@@ -84,16 +81,12 @@
 
         ShadowDeviceConditions.setCurrentNetworkConnectionType(ConnectionType.CONNECTION_NONE);
 
-        // Run tests as a low-end device.
-        CommandLine.init(new String[] {"testcommand", IS_LOW_END_DEVICE_SWITCH});
-
         mocker.mock(PeriodicBackgroundSyncChromeWakeUpTaskJni.TEST_HOOKS, mNativeMock);
     }
 
     @After
     public void tearDown() {
         // Clean up static state for subsequent Robolectric tests.
-        CommandLine.reset();
         SysUtils.resetForTesting();
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProviderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProviderTest.java
index fbd047f7..7d136f9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProviderTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProviderTest.java
@@ -63,8 +63,6 @@
 public class CustomTabIntentDataProviderTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
 
     private static final String BUTTON_DESCRIPTION = "buttonDescription";
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java
index 921c1fb2e..400b37ff 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java
@@ -51,8 +51,6 @@
 
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
 
     @After
     public void tearDown() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
index dc62ded4..92a80456 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
@@ -24,7 +24,6 @@
 import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowUserManager;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.UmaRecorderHolder;
@@ -32,6 +31,7 @@
 import org.chromium.base.task.test.ShadowPostTask;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.PayloadCallbackHelper;
 import org.chromium.components.policy.PolicySwitches;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -52,8 +52,6 @@
 
     @Mock
     private Bundle mMockBundle;
-    @Mock
-    private CommandLine mCommandLine;
 
     private boolean mPauseDuringPostTask;
     private Runnable mPendingPostTask;
@@ -82,7 +80,6 @@
     @After
     public void tearDown() {
         FirstRunAppRestrictionInfo.setInitializedInstanceForTest(null);
-        CommandLine.reset();
     }
 
     private void verifyHistograms(int expectedCallCount) {
@@ -201,12 +198,8 @@
 
     @Test
     @SmallTest
+    @CommandLineFlags.Add({PolicySwitches.CHROME_POLICY})
     public void testCommandLine() {
-        // TODO(https://crbug.com/1119410): Switch to @CommandLineFlag once supported for junit.
-        CommandLine.setInstanceForTesting(mCommandLine);
-        Mockito.when(mCommandLine.hasSwitch(Mockito.eq(PolicySwitches.CHROME_POLICY)))
-                .thenReturn(true);
-
         final PayloadCallbackHelper<Boolean> appResCallbackHelper = new PayloadCallbackHelper<>();
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
index ece5368..68d25b30 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
@@ -58,9 +58,6 @@
     public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
 
     @Rule
-    public final TestRule mCommandLindFlagRule = CommandLineFlags.getTestRule();
-
-    @Rule
     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
 
     @Rule
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
index 9011d88..a54f81a 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
@@ -37,7 +37,6 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
@@ -167,8 +166,6 @@
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-    @Rule
     public JniMocker jniMocker = new JniMocker();
 
     @Mock
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
index 833916e..de03e9c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java
@@ -16,15 +16,14 @@
 import android.graphics.Color;
 import android.os.Build;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.BaseSwitches;
-import org.chromium.base.CommandLine;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.components.browser_ui.media.MediaNotificationInfo;
 import org.chromium.components.favicon.IconType;
@@ -43,8 +42,6 @@
         sdk = Build.VERSION_CODES.N_MR1, shadows = {MediaNotificationTestShadowResources.class})
 public class MediaNotificationFaviconTest extends MediaNotificationTestBase {
     private static final int TAB_ID_1 = 1;
-    private static final String IS_LOW_END_DEVICE_SWITCH =
-            "--" + BaseSwitches.ENABLE_LOW_END_DEVICE_MODE;
 
     private final Bitmap mFavicon = Bitmap.createBitmap(192, 192, Bitmap.Config.ARGB_8888);
     private GURL mFaviconUrl;
@@ -86,12 +83,6 @@
         mFaviconUrl = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
     }
 
-    @Override
-    @After
-    public void tearDown() {
-        CommandLine.reset();
-    }
-
     @Test
     public void testSetNotificationIcon() {
         mTabHolder.simulateMediaSessionStateChanged(true, false);
@@ -101,10 +92,8 @@
 
     @Test
     @Config(sdk = Build.VERSION_CODES.N_MR1)
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testSetNotificationIcon_lowMem_preO() {
-        // Run tests as a low-end device.
-        CommandLine.init(new String[] {"testcommand", IS_LOW_END_DEVICE_SWITCH});
-
         mTabHolder.simulateMediaSessionStateChanged(true, false);
         mTabHolder.simulateFaviconUpdated(mFavicon, mFaviconUrl);
         assertEquals(mFavicon, getDisplayedIcon());
@@ -112,10 +101,8 @@
 
     // TODO(crbug.com/729029): Specify O-SDK.
     @Test
+    @CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
     public void testSetNotificationIcon_lowMem_O() {
-        // Run tests as a low-end device.
-        CommandLine.init(new String[] {"testcommand", IS_LOW_END_DEVICE_SWITCH});
-
         mTabHolder.simulateMediaSessionStateChanged(true, false);
         mTabHolder.simulateFaviconUpdated(mFavicon, mFaviconUrl);
         assertEquals(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? null : mFavicon,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java
index eff5157..18fa82f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java
@@ -33,10 +33,10 @@
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.BaseSwitches;
 import org.chromium.base.Callback;
-import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.SysUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.device.DeviceConditions;
 import org.chromium.chrome.browser.device.ShadowDeviceConditions;
@@ -54,6 +54,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {ShadowDeviceConditions.class})
+@CommandLineFlags.Add({BaseSwitches.ENABLE_LOW_END_DEVICE_MODE})
 public class OfflineBackgroundTaskTest {
     private static final boolean REQUIRE_POWER = true;
     private static final boolean REQUIRE_UNMETERED = true;
@@ -62,9 +63,6 @@
     private static final boolean METERED = true;
     private static final boolean SCREEN_ON_AND_UNLOCKED = true;
     private static final int MINIMUM_BATTERY_LEVEL = 33;
-    private static final String IS_LOW_END_DEVICE_SWITCH =
-            "--" + BaseSwitches.ENABLE_LOW_END_DEVICE_MODE;
-
 
     private Bundle mTaskExtras;
     private long mTestTime;
@@ -105,9 +103,6 @@
         TaskExtrasPacker.packTimeInBundle(mTaskExtras);
         TaskExtrasPacker.packTriggerConditionsInBundle(mTaskExtras, mTriggerConditions);
 
-        // Run tests as a low-end device.
-        CommandLine.init(new String[] {"testcommand", IS_LOW_END_DEVICE_SWITCH});
-
         // Set up single, stopped Activity.
         mTestActivity = new Activity();
         ApplicationStatus.onStateChangeForTesting(mTestActivity, ActivityState.CREATED);
@@ -117,7 +112,6 @@
     @After
     public void tearDown() {
         // Clean up static state for subsequent Robolectric tests.
-        CommandLine.reset();
         SysUtils.resetForTesting();
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
index b52f749..2aeb3bf9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
@@ -25,14 +25,20 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
 import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.services.SigninManager;
 import org.chromium.chrome.browser.signin.services.SigninPreferencesManager;
 import org.chromium.chrome.browser.sync.SyncService;
@@ -85,13 +91,25 @@
     @Rule
     public final JniMocker mocker = new JniMocker();
 
-    private final SigninManagerImpl.Natives mNativeMock = mock(SigninManagerImpl.Natives.class);
-    private final IdentityManager.Natives mIdentityManagerNativeMock =
-            mock(IdentityManager.Natives.class);
-    private final AccountTrackerService mAccountTrackerService = mock(AccountTrackerService.class);
-    private final IdentityMutator mIdentityMutator = mock(IdentityMutator.class);
-    private final ExternalAuthUtils mExternalAuthUtils = mock(ExternalAuthUtils.class);
-    private final SyncService mSyncService = mock(SyncService.class);
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.LENIENT);
+
+    @Mock
+    private SigninManagerImpl.Natives mNativeMock;
+    @Mock
+    private IdentityManager.Natives mIdentityManagerNativeMock;
+    @Mock
+    private AccountTrackerService mAccountTrackerService;
+    @Mock
+    private IdentityMutator mIdentityMutator;
+    @Mock
+    private ExternalAuthUtils mExternalAuthUtils;
+    @Mock
+    private SyncService mSyncService;
+    @Mock
+    private Profile mProfile;
+    @Mock
+    private SigninManager.SignInStateObserver mSignInStateObserver;
 
     private final IdentityManager mIdentityManager =
             IdentityManager.create(NATIVE_IDENTITY_MANAGER, null /* OAuth2TokenService */);
@@ -105,10 +123,11 @@
         mocker.mock(IdentityManagerJni.TEST_HOOKS, mIdentityManagerNativeMock);
         SyncService.overrideForTests(mSyncService);
         ExternalAuthUtils.setInstanceForTesting(mExternalAuthUtils);
+        Profile.setLastUsedProfileForTesting(mProfile);
         when(mNativeMock.isSigninAllowedByPolicy(NATIVE_SIGNIN_MANAGER)).thenReturn(true);
         // Pretend Google Play services are available as it is required for the sign-in
         when(mExternalAuthUtils.isGooglePlayServicesMissing(any())).thenReturn(false);
-        // Suppose that the accounts are already seeded
+        when(mProfile.isChild()).thenReturn(false);
         doAnswer(invocation -> {
             Runnable runnable = invocation.getArgument(0);
             runnable.run();
@@ -116,6 +135,7 @@
         })
                 .when(mAccountTrackerService)
                 .seedAccountsIfNeeded(any(Runnable.class));
+        // Suppose that the accounts are already seeded
         when(mIdentityManagerNativeMock.findExtendedAccountInfoByEmailAddress(
                      NATIVE_IDENTITY_MANAGER, ACCOUNT_INFO.getEmail()))
                 .thenReturn(ACCOUNT_INFO);
@@ -124,10 +144,12 @@
 
         mSigninManager = (SigninManagerImpl) SigninManagerImpl.create(
                 NATIVE_SIGNIN_MANAGER, mAccountTrackerService, mIdentityManager, mIdentityMutator);
+        mSigninManager.addSignInStateObserver(mSignInStateObserver);
     }
 
     @After
     public void tearDown() {
+        mSigninManager.removeSignInStateObserver(mSignInStateObserver);
         mSigninManager.destroy();
         AccountInfoServiceProvider.resetForTests();
     }
@@ -138,9 +160,11 @@
                 .thenReturn(PrimaryAccountError.NO_ERROR);
         when(mSyncService.getSelectedTypes()).thenReturn(Set.of(UserSelectableType.BOOKMARKS));
 
-        // There is no signed in account.  Sign in is allowed.
+        // There is no signed in account. Sign in is allowed.
         assertTrue(mSigninManager.isSigninAllowed());
         assertTrue(mSigninManager.isSyncOptInAllowed());
+        // Sign out is not allowed.
+        assertFalse(mSigninManager.isSignOutAllowed());
 
         SigninManager.SignInCallback callback = mock(SigninManager.SignInCallback.class);
         mSigninManager.signinAndEnableSync(SigninAccessPoint.START_PAGE,
@@ -148,9 +172,10 @@
 
         verify(mNativeMock)
                 .fetchAndApplyCloudPolicy(eq(NATIVE_SIGNIN_MANAGER), eq(ACCOUNT_INFO), any());
-        // A sign in operation is in progress, so we do not allow a new one to be started.
+        // A sign in operation is in progress, so we do not allow a new sign in/out operation.
         assertFalse(mSigninManager.isSigninAllowed());
         assertFalse(mSigninManager.isSyncOptInAllowed());
+        assertFalse(mSigninManager.isSignOutAllowed());
 
         mSigninManager.finishSignInAfterPolicyEnforced();
         verify(mIdentityMutator).setPrimaryAccount(ACCOUNT_INFO.getId(), ConsentLevel.SYNC);
@@ -166,6 +191,8 @@
                 .thenReturn(ACCOUNT_INFO);
         assertFalse(mSigninManager.isSigninAllowed());
         assertFalse(mSigninManager.isSyncOptInAllowed());
+        // Signing out is allowed.
+        assertTrue(mSigninManager.isSignOutAllowed());
     }
 
     @Test
@@ -564,4 +591,53 @@
         mSigninManager.signinAndEnableSync(SigninAccessPoint.UNKNOWN,
                 AccountUtils.createAccountFromName(ACCOUNT_INFO.getEmail()), null);
     }
+
+    @Test
+    public void signInStateObserverCallOnSignIn() {
+        final Answer<Integer> setPrimaryAccountAnswer = invocation -> {
+            // From now on getPrimaryAccountInfo should return account.
+            when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
+                         eq(NATIVE_IDENTITY_MANAGER), anyInt()))
+                    .thenReturn(ACCOUNT_INFO);
+            return PrimaryAccountError.NO_ERROR;
+        };
+        doAnswer(setPrimaryAccountAnswer)
+                .when(mIdentityMutator)
+                .setPrimaryAccount(ACCOUNT_INFO.getId(), ConsentLevel.SYNC);
+
+        mSigninManager.signinAndEnableSync(SigninAccessPoint.START_PAGE,
+                AccountUtils.createAccountFromName(ACCOUNT_INFO.getEmail()), null);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        verify(mSignInStateObserver).onSignInAllowedChanged();
+
+        mSigninManager.finishSignInAfterPolicyEnforced();
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        verify(mSignInStateObserver).onSignOutAllowedChanged();
+        assertFalse(mSigninManager.isSigninAllowed());
+        assertTrue(mSigninManager.isSignOutAllowed());
+    }
+
+    @Test
+    @DisableFeatures(ChromeFeatureList.SYNC_ANDROID_LIMIT_NTP_PROMO_IMPRESSIONS)
+    public void signInStateObserverCallOnSignOut() {
+        when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
+                     eq(NATIVE_IDENTITY_MANAGER), anyInt()))
+                .thenReturn(ACCOUNT_INFO);
+        assertTrue(mSigninManager.isSignOutAllowed());
+
+        mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
+        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+        verify(mSignInStateObserver).onSignOutAllowedChanged();
+        assertFalse(mSigninManager.isSignOutAllowed());
+    }
+
+    @Test
+    public void signOutNotAllowedForChildAccounts() {
+        when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
+                     eq(NATIVE_IDENTITY_MANAGER), anyInt()))
+                .thenReturn(ACCOUNT_INFO);
+        when(mProfile.isChild()).thenReturn(true);
+
+        assertFalse(mSigninManager.isSignOutAllowed());
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerFlowTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerFlowTest.java
index 626a433..ef8412df 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerFlowTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerFlowTest.java
@@ -23,7 +23,6 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
@@ -156,8 +155,6 @@
     public MockitoRule mRule = MockitoJUnit.rule();
     @Rule
     public JniMocker mocker = new JniMocker();
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
 
     @Mock
     TabModelSelector mMockModelSelector;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
index fee5092..e359168 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
@@ -29,7 +29,6 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-import org.chromium.base.CommandLine;
 import org.chromium.base.IntentUtils;
 import org.chromium.base.SysUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -131,7 +130,6 @@
 
     @After
     public void tearDown() {
-        CommandLine.reset();
         SysUtils.resetForTesting();
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
index 693c82c..9ee324b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerActivityTest.java
@@ -76,8 +76,6 @@
 public class OptionalNewTabButtonControllerActivityTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
 
     /**
      * Shadow of {@link OptionalNewTabButtonController.Delegate}. Injects testing values into every
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java
index 2131b6f4..6c0171ca3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java
@@ -48,7 +48,6 @@
 import org.chromium.base.metrics.UmaRecorderHolder;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -78,8 +77,6 @@
     public JniMocker mJniMocker = new JniMocker();
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
 
     @Mock
     private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java
index 31fe759..70876d7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java
@@ -14,9 +14,7 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
@@ -38,9 +36,6 @@
     private static final String WEBAPK_PACKAGE_NAME = "org.chromium.webapk.test_package";
     private static final String START_URL = "https://www.google.com/scope/a_is_for_apple";
 
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Before
     public void setUp() {
         WebApkValidator.setDisableValidationForTesting(true);
diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp
index 7de06a2..36c28c7 100644
--- a/chrome/app/extensions_strings.grdp
+++ b/chrome/app/extensions_strings.grdp
@@ -85,9 +85,12 @@
   <message name="IDS_EXTENSIONS_ERROR_PAGE_HEADING" desc="The heading of the page displaying an extension's errors.">
     Errors
   </message>
-  <message name="IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_ALLOW_ALL_EXTENSIONS" desc="The label for the dialog option to always allow extension to run on a site.">
+  <message name="IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_ALLOW_ALL_EXTENSIONS" desc="The label for the dialog option to always allow extensions to run on a site.">
     Allow all extensions to read and change <ph name="PERMITTED_SITE">$1</ph>
   </message>
+  <message name="IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_CUSTOMIZE_PER_EXTENSION" desc="The label for the dialog option to customize site access settings per extension.">
+    Customize for each extension
+  </message>
   <message name="IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_RESTRICT_EXTENSIONS" desc="The label for the dialog option to prevent extensions from running on a site.">
     Don't allow any extensions on <ph name="RESTRICTED_SITE">$1</ph>
   </message>
@@ -409,6 +412,12 @@
   <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_ALL_SITES_EXTENSION_COUNT" desc="The subtext displayed for sites in the all sites subpage showing the number of extensions that can run for that site.">
     <ph name="NUM_EXTENSIONS">$1</ph> extensions
   </message>
+  <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_ALL_SITES" desc="The option shown for an extension that can access the site and all of its requested sites in the edit permissions dialog.">
+    Always on all sites
+  </message>
+  <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_THIS_SITE" desc="The option shown for an extension that can automatically access the site in the edit permissions dialog.">
+    Always on this site
+  </message>
   <message name="IDS_EXTENSIONS_PERMITTED_SITES" desc="The label above the list of sites that extensions are always permitted to run in.">
     All extensions allowed
   </message>
@@ -433,6 +442,9 @@
   <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_EDIT_PERMISSIONS" desc="The label for the option used to allow a user to edit a site's permissions. Used in the site permissions page.">
     Edit site permissions
   </message>
+  <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_ON_CLICK" desc="The option shown for an extension that can only access the site when clicked in the edit permissions dialog.">
+    On click for this site
+  </message>
   <message name="IDS_EXTENSIONS_SITE_PERMISSIONS_DIALOG_INPUT_ERROR" desc="The error message shown to the user when they entered an invalid site address into the input field.">
     Not a valid web address
   </message>
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_CUSTOMIZE_PER_EXTENSION.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_CUSTOMIZE_PER_EXTENSION.png.sha1
new file mode 100644
index 0000000..f3c1a96
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_CUSTOMIZE_PER_EXTENSION.png.sha1
@@ -0,0 +1 @@
+aba5e42ba90654492f2b89ead3662754b8007905
\ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_ALL_SITES.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_ALL_SITES.png.sha1
new file mode 100644
index 0000000..f3c1a96
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_ALL_SITES.png.sha1
@@ -0,0 +1 @@
+aba5e42ba90654492f2b89ead3662754b8007905
\ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_THIS_SITE.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_THIS_SITE.png.sha1
new file mode 100644
index 0000000..f3c1a96
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_THIS_SITE.png.sha1
@@ -0,0 +1 @@
+aba5e42ba90654492f2b89ead3662754b8007905
\ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ON_CLICK.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ON_CLICK.png.sha1
new file mode 100644
index 0000000..f3c1a96
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_SITE_PERMISSIONS_ON_CLICK.png.sha1
@@ -0,0 +1 @@
+aba5e42ba90654492f2b89ead3662754b8007905
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 1aa32a8..71a82a0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8693,6 +8693,12 @@
      flag_descriptions::kExtensionsMenuAccessControlName,
      flag_descriptions::kExtensionsMenuAccessControlDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(extensions_features::kExtensionsMenuAccessControl)},
+
+    {"extensions-fsp-in-service-workers",
+     flag_descriptions::kExtensionsFSPInServiceWorkersName,
+     flag_descriptions::kExtensionsFSPInServiceWorkersDescription,
+     kOsCrOS | kOsLacros,
+     FEATURE_VALUE_TYPE(extensions_features::kExtensionsFSPInServiceWorkers)},
 #endif
 
     {"persistent-quota-is-temporary-quota",
diff --git a/chrome/browser/apps/app_preload_service/app_preload_server_connector.cc b/chrome/browser/apps/app_preload_service/app_preload_server_connector.cc
index bcac1dae..a05a523 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_server_connector.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_server_connector.cc
@@ -5,7 +5,64 @@
 #include "chrome/browser/apps/app_preload_service/app_preload_server_connector.h"
 
 #include "base/callback.h"
+#include "base/json/json_writer.h"
+#include "base/values.h"
 #include "chrome/browser/apps/app_preload_service/device_info_manager.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/simple_url_loader.h"
+
+namespace {
+
+// TODO(b/249427934): Temporary test data.
+static constexpr char kServerUrl[] =
+    "http://localhost:9876/v1/app_provisioning/apps";
+
+// TODO(b/244500232): Temporary placeholder value. To be updated once server
+// design is completed. Maximum accepted size of an APS Response. 1MB.
+constexpr int kMaxResponseSizeInBytes = 1024 * 1024;
+
+constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation =
+    net::DefineNetworkTrafficAnnotation("app_preload_service", R"(
+      semantics {
+        sender: "App Preload Service"
+        description:
+          "Sends a request to a Google server to determine a list of apps to "
+          "be installed on the device."
+        trigger:
+          "A request can be sent when a device is being set up, or after a "
+          "device update."
+        data: "Device technical specifications (e.g. model)."
+        destination: GOOGLE_OWNED_SERVICE
+      }
+      policy {
+        cookies_allowed: NO
+        setting: "This feature cannot be disabled by settings."
+        policy_exception_justification:
+          "This feature is required to deliver core user experiences and "
+          "cannot be disabled by policy."
+      }
+    )");
+
+std::string BuildGetAppsForFirstLoginRequestBody(const apps::DeviceInfo& info) {
+  base::Value::Dict request;
+  request.Set("board", info.board);
+  request.Set("model", info.model);
+
+  // TODO(b/249427934): Temporary test data.
+  request.Set("language", "en-US");
+  request.Set("sku_id", "temporary");
+
+  base::Value::Dict versions;
+  versions.Set("ash_chrome", info.version_info.ash_chrome);
+  versions.Set("platform", info.version_info.platform);
+  request.Set("chrome_os_version", std::move(versions));
+
+  std::string request_body;
+  base::JSONWriter::Write(request, &request_body);
+  return request_body;
+}
+
+}  // namespace
 
 namespace apps {
 
@@ -14,8 +71,34 @@
 AppPreloadServerConnector::~AppPreloadServerConnector() = default;
 
 void AppPreloadServerConnector::GetAppsForFirstLogin(
-    const DeviceInfo device_info,
+    const DeviceInfo& device_info,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     GetInitialAppsCallback callback) {
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+
+  resource_request->url = GURL(kServerUrl);
+  DCHECK(resource_request->url.is_valid());
+
+  // A POST request is sent with an override to GET due to server requirements.
+  resource_request->method = "POST";
+  resource_request->headers.SetHeader("X-HTTP-Method-Override", "GET");
+
+  resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+
+  loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
+                                             kTrafficAnnotation);
+  loader_->AttachStringForUpload(
+      BuildGetAppsForFirstLoginRequestBody(device_info), "application/json");
+  loader_->DownloadToString(
+      url_loader_factory.get(),
+      base::BindOnce(&AppPreloadServerConnector::OnGetAppsForFirstLoginResponse,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
+      kMaxResponseSizeInBytes);
+}
+
+void AppPreloadServerConnector::OnGetAppsForFirstLoginResponse(
+    GetInitialAppsCallback callback,
+    std::unique_ptr<std::string> response_body) {
   std::move(callback).Run();
 }
 
diff --git a/chrome/browser/apps/app_preload_service/app_preload_server_connector.h b/chrome/browser/apps/app_preload_service/app_preload_server_connector.h
index 7838650..43a07c80 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_server_connector.h
+++ b/chrome/browser/apps/app_preload_service/app_preload_server_connector.h
@@ -5,7 +5,16 @@
 #ifndef CHROME_BROWSER_APPS_APP_PRELOAD_SERVICE_APP_PRELOAD_SERVER_CONNECTOR_H_
 #define CHROME_BROWSER_APPS_APP_PRELOAD_SERVICE_APP_PRELOAD_SERVER_CONNECTOR_H_
 
+#include <memory>
+
 #include "base/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+
+namespace network {
+class SimpleURLLoader;
+}  // namespace network
 
 namespace apps {
 
@@ -24,8 +33,20 @@
       delete;
   ~AppPreloadServerConnector();
 
-  void GetAppsForFirstLogin(const DeviceInfo device_info,
-                            GetInitialAppsCallback callback);
+  void GetAppsForFirstLogin(
+      const DeviceInfo& device_info,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      GetInitialAppsCallback callback);
+
+ private:
+  void OnGetAppsForFirstLoginResponse(
+      GetInitialAppsCallback callback,
+      std::unique_ptr<std::string> response_body);
+
+  std::unique_ptr<network::SimpleURLLoader> loader_;
+
+  // Weak Factory should go last.
+  base::WeakPtrFactory<AppPreloadServerConnector> weak_ptr_factory_{this};
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_preload_service/app_preload_server_connector_unittest.cc b/chrome/browser/apps/app_preload_service/app_preload_server_connector_unittest.cc
new file mode 100644
index 0000000..f1ba4ba
--- /dev/null
+++ b/chrome/browser/apps/app_preload_service/app_preload_server_connector_unittest.cc
@@ -0,0 +1,76 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/apps/app_preload_service/app_preload_server_connector.h"
+
+#include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/test/bind.h"
+#include "chrome/browser/apps/app_preload_service/device_info_manager.h"
+#include "content/public/test/browser_task_environment.h"
+#include "net/http/http_request_headers.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
+#include "services/network/test/test_utils.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace apps {
+
+class AppPreloadServerConnectorTest : public testing::Test {
+ public:
+  AppPreloadServerConnectorTest()
+      : test_shared_loader_factory_(
+            base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+                &url_loader_factory_)) {}
+
+ protected:
+  network::TestURLLoaderFactory url_loader_factory_;
+  scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
+
+  AppPreloadServerConnector server_connector_;
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+};
+
+TEST_F(AppPreloadServerConnectorTest, GetAppsForFirstLogin) {
+  DeviceInfo device_info;
+  device_info.board = "brya";
+  device_info.model = "taniks";
+  device_info.user_type = "unmanaged";
+  device_info.version_info.ash_chrome = "10.10.10";
+  device_info.version_info.platform = "12345.0.0";
+
+  std::string method;
+  std::string method_override_header;
+  std::string content_type;
+  std::string body;
+
+  url_loader_factory_.SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        request.headers.GetHeader(net::HttpRequestHeaders::kContentType,
+                                  &content_type);
+        request.headers.GetHeader("X-HTTP-Method-Override",
+                                  &method_override_header);
+        method = request.method;
+        body = network::GetUploadData(request);
+      }));
+
+  server_connector_.GetAppsForFirstLogin(
+      device_info, test_shared_loader_factory_, base::OnceCallback<void()>());
+
+  EXPECT_EQ(method, "POST");
+  EXPECT_EQ(method_override_header, "GET");
+  EXPECT_EQ(content_type, "application/json");
+  EXPECT_EQ(body,
+            "{\"board\":\"brya\",\"chrome_os_version\":{\"ash_chrome\":\"10.10."
+            "10\",\"platform\":\"12345.0.0\"},\"language\":\"en-US\",\"model\":"
+            "\"taniks\",\"sku_id\":\"temporary\"}");
+}
+
+}  // namespace apps
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service.cc b/chrome/browser/apps/app_preload_service/app_preload_service.cc
index 8f9238c8..3e22de2d 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service.cc
@@ -69,7 +69,7 @@
 void AppPreloadService::StartAppInstallationForFirstLogin(
     DeviceInfo device_info) {
   server_connector_->GetAppsForFirstLogin(
-      std::move(device_info),
+      device_info, profile_->GetURLLoaderFactory(),
       base::BindOnce(&AppPreloadService::OnGetAppsForFirstLoginCompleted,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
index 7bec798..5cec1a0c 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
@@ -3,11 +3,13 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/apps/app_preload_service/app_preload_service.h"
+
 #include <algorithm>
 #include <memory>
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/apps/app_preload_service/app_preload_service_factory.h"
@@ -15,6 +17,8 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/browser_task_environment.h"
+#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -26,6 +30,9 @@
 static constexpr char kApsStateManager[] =
     "apps.app_preload_service.state_manager";
 
+static constexpr char kServerUrl[] =
+    "http://localhost:9876/v1/app_provisioning/apps";
+
 const base::Value::Dict& GetStateManager(Profile* profile) {
   return profile->GetPrefs()->GetDict(kApsStateManager);
 }
@@ -55,11 +62,17 @@
   void SetUp() override {
     testing::Test::SetUp();
 
-    profile_ = std::make_unique<TestingProfile>();
+    TestingProfile::Builder profile_builder;
+    profile_builder.SetSharedURLLoaderFactory(
+        base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
+            &url_loader_factory_));
+    profile_ = profile_builder.Build();
   }
 
   Profile* GetProfile() { return profile_.get(); }
 
+  network::TestURLLoaderFactory url_loader_factory_;
+
  private:
   content::BrowserTaskEnvironment task_environment_;
   base::test::ScopedFeatureList scoped_feature_list_;
@@ -98,6 +111,9 @@
 }
 
 TEST_F(AppPreloadServiceTest, FirstLoginPrefSet) {
+  // TODO: flesh out the response as response processing code is added.
+  url_loader_factory_.AddResponse(kServerUrl, "empty content");
+
   auto flow_completed =
       GetStateManager(GetProfile()).FindBool(kFirstLoginFlowCompletedKey);
   // Since we're creating a new profile with no saved state, we expect the
diff --git a/chrome/browser/apps/app_service/app_launch_params.cc b/chrome/browser/apps/app_service/app_launch_params.cc
index 90bc06d4..46bbf25a 100644
--- a/chrome/browser/apps/app_service/app_launch_params.cc
+++ b/chrome/browser/apps/app_service/app_launch_params.cc
@@ -36,6 +36,24 @@
       launch_files(files),
       intent(intentPtr ? intentPtr->Clone() : nullptr) {}
 
+AppLaunchParams::AppLaunchParams(const std::string& app_id,
+                                 LaunchContainer container,
+                                 WindowOpenDisposition disposition,
+                                 const GURL& override_url,
+                                 apps::LaunchSource launch_source,
+                                 int64_t display_id,
+                                 const std::vector<base::FilePath>& files,
+                                 const IntentPtr& intentPtr)
+    : app_id(app_id),
+      container(container),
+      disposition(disposition),
+      override_url(override_url),
+      command_line(base::CommandLine::NO_PROGRAM),
+      launch_source(launch_source),
+      display_id(display_id),
+      launch_files(files),
+      intent(intentPtr ? intentPtr->Clone() : nullptr) {}
+
 AppLaunchParams::AppLaunchParams(AppLaunchParams&&) = default;
 AppLaunchParams& AppLaunchParams::operator=(AppLaunchParams&&) = default;
 
diff --git a/chrome/browser/apps/app_service/app_launch_params.h b/chrome/browser/apps/app_service/app_launch_params.h
index 91031f6..9223b16 100644
--- a/chrome/browser/apps/app_service/app_launch_params.h
+++ b/chrome/browser/apps/app_service/app_launch_params.h
@@ -36,6 +36,15 @@
                   const std::vector<base::FilePath>& files,
                   const IntentPtr& intentPtr);
 
+  AppLaunchParams(const std::string& app_id,
+                  LaunchContainer container,
+                  WindowOpenDisposition disposition,
+                  const GURL& override_url,
+                  apps::LaunchSource launch_source,
+                  int64_t display_id,
+                  const std::vector<base::FilePath>& files,
+                  const IntentPtr& intentPtr);
+
   AppLaunchParams(const AppLaunchParams&) = delete;
   AppLaunchParams& operator=(const AppLaunchParams&) = delete;
   AppLaunchParams(AppLaunchParams&&);
diff --git a/chrome/browser/apps/app_service/publishers/borealis_apps.cc b/chrome/browser/apps/app_service/publishers/borealis_apps.cc
index 7d70816..c88d463 100644
--- a/chrome/browser/apps/app_service/publishers/borealis_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/borealis_apps.cc
@@ -417,9 +417,12 @@
                                 base::OnceCallback<void(MenuItems)> callback) {
   MenuItems menu_items;
 
+  // Apps should only be uninstallable if we can run the VM, but the vm itself
+  // should always be uninstallable.
   if (borealis::BorealisService::GetForProfile(profile_)
           ->Features()
-          .IsEnabled()) {
+          .IsEnabled() ||
+      app_id == borealis::kClientAppId) {
     AddCommandItem(ash::UNINSTALL, IDS_APP_LIST_UNINSTALL_ITEM, menu_items);
   }
 
diff --git a/chrome/browser/ash/app_restore/app_launch_handler.cc b/chrome/browser/ash/app_restore/app_launch_handler.cc
index 026d845..7218316a 100644
--- a/chrome/browser/ash/app_restore/app_launch_handler.cc
+++ b/chrome/browser/ash/app_restore/app_launch_handler.cc
@@ -230,6 +230,7 @@
         app_id,
         static_cast<apps::LaunchContainer>(it.second->container.value()),
         static_cast<WindowOpenDisposition>(it.second->disposition.value()),
+        it.second->override_url.value_or(GURL()),
         apps::LaunchSource::kFromFullRestore, it.second->display_id.value(),
         it.second->file_paths.has_value() ? it.second->file_paths.value()
                                           : std::vector<base::FilePath>{},
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
index 904beb8..5fec380 100644
--- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
+++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -38,6 +38,7 @@
 #include "chrome/browser/ash/crosapi/browser_util.h"
 #include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/ash/system_web_apps/test_support/system_web_app_integration_test.h"
+#include "chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
@@ -54,6 +55,7 @@
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
@@ -2718,8 +2720,13 @@
 class FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest
     : public SystemWebAppIntegrationTest {
  public:
-  FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest() = default;
-  ~FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest() override = default;
+  FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest() {
+    OsUrlHandlerSystemWebAppDelegate::EnableDelegateForTesting(true);
+  }
+
+  ~FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest() override {
+    OsUrlHandlerSystemWebAppDelegate::EnableDelegateForTesting(false);
+  }
 
   Browser* LaunchSystemWebApp(const GURL& gurl,
                               ash::SystemWebAppType system_app_type,
@@ -2741,6 +2748,25 @@
     return BrowserList::GetInstance()->GetLastActive();
   }
 
+  Browser* LaunchSystemWebAppWithOverrideURL(
+      ash::SystemWebAppType system_app_type,
+      const GURL& override_url) {
+    WaitForTestSystemAppInstall();
+
+    auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile());
+    content::TestNavigationObserver navigation_observer(override_url);
+    navigation_observer.StartWatchingNewWebContents();
+
+    proxy->LaunchAppWithUrl(
+        *GetManager().GetAppIdForSystemApp(system_app_type), ui::EF_NONE,
+        override_url, apps::LaunchSource::kFromChromeInternal,
+        std::make_unique<apps::WindowInfo>(display::kDefaultDisplayId));
+
+    navigation_observer.Wait();
+
+    return BrowserList::GetInstance()->GetLastActive();
+  }
+
   Browser* LaunchSystemWebApp(apps::LaunchSource launch_source =
                                   apps::LaunchSource::kFromChromeInternal) {
     return LaunchSystemWebApp(GURL("chrome://help-app/"),
@@ -2843,6 +2869,57 @@
   EXPECT_EQ(window_id, restore_window_id);
 }
 
+// Ensure that Full Restore respects the override URL specified in a SWA's
+// AppLaunchParams if configured to do so.
+IN_PROC_BROWSER_TEST_P(FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest,
+                       LaunchSWAWithRestoreOverrideURL) {
+  const auto swa_type = SystemWebAppType::OS_URL_HANDLER;
+  const auto override_url = GURL(chrome::kChromeUIVersionURL);
+
+  Browser* app_browser =
+      LaunchSystemWebAppWithOverrideURL(swa_type, override_url);
+  ASSERT_TRUE(app_browser);
+  ASSERT_NE(browser(), app_browser);
+
+  // Get the window id.
+  aura::Window* window = app_browser->window()->GetNativeWindow();
+  int32_t window_id = window->GetProperty(::app_restore::kWindowIdKey);
+
+  WaitForAppLaunchInfoSaved();
+
+  // Create FullRestoreAppLaunchHandler.
+  auto app_launch_handler =
+      std::make_unique<FullRestoreAppLaunchHandler>(profile());
+
+  // Close app_browser so that the SWA can be relaunched.
+  web_app::CloseAndWait(app_browser);
+
+  ASSERT_FALSE(HasWindowInfo(window_id));
+
+  content::TestNavigationObserver navigation_observer(override_url);
+  navigation_observer.StartWatchingNewWebContents();
+  SetShouldRestore(app_launch_handler.get());
+  navigation_observer.Wait();
+
+  ASSERT_TRUE(HasWindowInfo(window_id));
+
+  // Get the restored browser for the system web app.
+  Browser* restore_app_browser = GetBrowserForWindowId(window_id);
+  ASSERT_TRUE(restore_app_browser);
+  ASSERT_NE(browser(), restore_app_browser);
+
+  // Get the restore window id.
+  window = restore_app_browser->window()->GetNativeWindow();
+  int32_t restore_window_id =
+      window->GetProperty(::app_restore::kRestoreWindowIdKey);
+
+  EXPECT_EQ(window_id, restore_window_id);
+
+  EXPECT_EQ(override_url, restore_app_browser->tab_strip_model()
+                              ->GetActiveWebContents()
+                              ->GetLastCommittedURL());
+}
+
 // Verify that when the full restore doesn't start, the browser window of the
 // SWA doesn't have the restore info.
 IN_PROC_BROWSER_TEST_P(FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest,
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util.h b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
index 5072d590..f21b590 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util.h
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
@@ -180,7 +180,8 @@
     "Top Sites",
     "Visited Links",
     "Web Applications",
-    "Web Data"};
+    "Web Data",
+    "WebStorage"};
 
 // The base names of files/dirs that are required by both ash and lacros and
 // thus should be copied to lacros while keeping the original files/dirs in ash
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 7baccd8..bdd698f 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -1735,7 +1735,8 @@
         TestCase("trashCantRestoreWhenParentDoesntExist").EnableTrash(),
         TestCase(
             "trashPressingEnterOnFileInTrashRootShowsDialogWithRestoreButton")
-            .EnableTrash()));
+            .EnableTrash(),
+        TestCase("trashCantRenameFilesInTrashRoot").EnableTrash()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     AndroidPhotos, /* android_photos.js */
diff --git a/chrome/browser/ash/file_manager/file_manager_string_util.cc b/chrome/browser/ash/file_manager/file_manager_string_util.cc
index f630727..fcd35fc3 100644
--- a/chrome/browser/ash/file_manager/file_manager_string_util.cc
+++ b/chrome/browser/ash/file_manager/file_manager_string_util.cc
@@ -279,7 +279,7 @@
 
 void AddStringsForHoldingSpace(base::Value::Dict* dict) {
   const std::u16string pin_command =
-      ash::features::IsHoldingSpaceRebrandEnabled()
+      ash::features::IsHoldingSpaceRefreshEnabled()
           ? l10n_util::GetStringUTF16(
                 IDS_FILE_BROWSER_HOLDING_SPACE_PIN_COMMAND_LABEL)
           : l10n_util::GetStringUTF16(
@@ -287,7 +287,7 @@
   dict->Set("HOLDING_SPACE_PIN_COMMAND_LABEL", pin_command);
   SET_STRING(
       "HOLDING_SPACE_UNPIN_COMMAND_LABEL",
-      ash::features::IsHoldingSpaceRebrandEnabled()
+      ash::features::IsHoldingSpaceRefreshEnabled()
           ? IDS_FILE_BROWSER_HOLDING_SPACE_UNPIN_COMMAND_LABEL
           : IDS_FILE_BROWSER_HOLDING_SPACE_UNPIN_FROM_SHELF_COMMAND_LABEL);
   SET_STRING("HOLDING_SPACE_WELCOME_DISMISS",
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path.cc b/chrome/browser/ash/guest_os/guest_os_share_path.cc
index 2771c30..6699837 100644
--- a/chrome/browser/ash/guest_os/guest_os_share_path.cc
+++ b/chrome/browser/ash/guest_os/guest_os_share_path.cc
@@ -478,9 +478,7 @@
     storage::FileSystemURL url = mount_points->CreateCrackedFileSystemURL(
         blink::StorageKey(), storage::kFileSystemTypeExternal, virtual_path);
     result = file_manager::util::ConvertFileSystemURLToPathInsideVM(
-        profile_, url, dummy_vm_mount,
-        /*map_crostini_home=*/vm_name == crostini::kCrostiniDefaultVmName,
-        &inside);
+        profile_, url, dummy_vm_mount, /*map_crostini_home=*/false, &inside);
   }
   base::FilePath unshare_path;
   if (!result || !dummy_vm_mount.AppendRelativePath(inside, &unshare_path)) {
diff --git a/chrome/browser/ash/input_method/emoji_suggester.cc b/chrome/browser/ash/input_method/emoji_suggester.cc
index d00b357..ed10a864 100644
--- a/chrome/browser/ash/input_method/emoji_suggester.cc
+++ b/chrome/browser/ash/input_method/emoji_suggester.cc
@@ -360,11 +360,11 @@
 }
 
 int EmojiSuggester::GetPrefValue(const std::string& pref_name) {
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  auto value = update->FindIntKey(pref_name);
+  auto value = update->FindInt(pref_name);
   if (!value.has_value()) {
-    update->SetIntKey(pref_name, 0);
+    update->Set(pref_name, 0);
     return 0;
   }
   return *value;
@@ -374,9 +374,9 @@
                                                  int max_value) {
   int value = GetPrefValue(pref_name);
   if (value < max_value) {
-    DictionaryPrefUpdate update(profile_->GetPrefs(),
+    ScopedDictPrefUpdate update(profile_->GetPrefs(),
                                 prefs::kAssistiveInputFeatureSettings);
-    update->SetIntKey(pref_name, value + 1);
+    update->Set(pref_name, value + 1);
   }
 }
 
diff --git a/chrome/browser/ash/input_method/multi_word_suggester.cc b/chrome/browser/ash/input_method/multi_word_suggester.cc
index 969f466..f2a1740 100644
--- a/chrome/browser/ash/input_method/multi_word_suggester.cc
+++ b/chrome/browser/ash/input_method/multi_word_suggester.cc
@@ -105,20 +105,19 @@
 }
 
 absl::optional<int> GetTimeFirstAcceptedSuggestion(Profile* profile) {
-  DictionaryPrefUpdate update(profile->GetPrefs(),
+  ScopedDictPrefUpdate update(profile->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  auto value = update->FindIntKey(kMultiWordFirstAcceptTimeDays);
+  auto value = update->FindInt(kMultiWordFirstAcceptTimeDays);
   if (value.has_value())
     return value.value();
   return absl::nullopt;
 }
 
 void SetTimeFirstAcceptedSuggestion(Profile* profile) {
-  DictionaryPrefUpdate update(profile->GetPrefs(),
+  ScopedDictPrefUpdate update(profile->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
   auto time_since_epoch = base::Time::Now() - base::Time::UnixEpoch();
-  update->SetIntKey(kMultiWordFirstAcceptTimeDays,
-                    time_since_epoch.InDaysFloored());
+  update->Set(kMultiWordFirstAcceptTimeDays, time_since_epoch.InDaysFloored());
 }
 
 bool ShouldShowTabGuide(Profile* profile) {
diff --git a/chrome/browser/ash/input_method/multi_word_suggester_unittest.cc b/chrome/browser/ash/input_method/multi_word_suggester_unittest.cc
index 416fa01..2e892dc 100644
--- a/chrome/browser/ash/input_method/multi_word_suggester_unittest.cc
+++ b/chrome/browser/ash/input_method/multi_word_suggester_unittest.cc
@@ -37,20 +37,17 @@
 }
 
 void SetFirstAcceptTimeTo(Profile* profile, int days_ago) {
-  DictionaryPrefUpdate update(profile->GetPrefs(),
+  ScopedDictPrefUpdate update(profile->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
   base::TimeDelta since_epoch = base::Time::Now() - base::Time::UnixEpoch();
-  update->SetIntKey("multi_word_first_accept",
-                    since_epoch.InDaysFloored() - days_ago);
+  update->Set("multi_word_first_accept",
+              since_epoch.InDaysFloored() - days_ago);
 }
 
 absl::optional<int> GetFirstAcceptTime(Profile* profile) {
-  DictionaryPrefUpdate update(profile->GetPrefs(),
+  ScopedDictPrefUpdate update(profile->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  auto value = update->FindIntKey("multi_word_first_accept");
-  if (value.has_value())
-    return value.value();
-  return absl::nullopt;
+  return update->FindInt("multi_word_first_accept");
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/input_method/native_input_method_engine_observer.cc b/chrome/browser/ash/input_method/native_input_method_engine_observer.cc
index 659d09dc0..593b26b 100644
--- a/chrome/browser/ash/input_method/native_input_method_engine_observer.cc
+++ b/chrome/browser/ash/input_method/native_input_method_engine_observer.cc
@@ -522,9 +522,9 @@
       all_input_method_pref.FindDict(engine_id == "zh-t-i0-pinyin" ? "pinyin"
                                                                    : "zhuyin");
   if (existing_pref_or_null) {
-    DictionaryPrefUpdate update(prefs,
+    ScopedDictPrefUpdate update(prefs,
                                 ::prefs::kLanguageInputMethodSpecificSettings);
-    update->SetPath(engine_id, base::Value(existing_pref_or_null->Clone()));
+    update->SetByDottedPath(engine_id, existing_pref_or_null->Clone());
   }
 }
 
diff --git a/chrome/browser/ash/input_method/personal_info_suggester.cc b/chrome/browser/ash/input_method/personal_info_suggester.cc
index 0a3e427f7..4f973a4 100644
--- a/chrome/browser/ash/input_method/personal_info_suggester.cc
+++ b/chrome/browser/ash/input_method/personal_info_suggester.cc
@@ -401,11 +401,11 @@
 }
 
 int PersonalInfoSuggester::GetPrefValue(const std::string& pref_name) {
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  auto value = update->FindIntKey(pref_name);
+  auto value = update->FindInt(pref_name);
   if (!value.has_value()) {
-    update->SetIntKey(pref_name, 0);
+    update->Set(pref_name, 0);
     return 0;
   }
   return *value;
@@ -416,9 +416,9 @@
     int max_value) {
   int value = GetPrefValue(pref_name);
   if (value < max_value) {
-    DictionaryPrefUpdate update(profile_->GetPrefs(),
+    ScopedDictPrefUpdate update(profile_->GetPrefs(),
                                 prefs::kAssistiveInputFeatureSettings);
-    update->SetIntKey(pref_name, value + 1);
+    update->Set(pref_name, value + 1);
   }
 }
 
diff --git a/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc b/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
index ebe510e..c15cfea 100644
--- a/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
+++ b/chrome/browser/ash/input_method/personal_info_suggester_unittest.cc
@@ -615,9 +615,9 @@
       /*enabled_features=*/{features::kAssistPersonalInfoEmail},
       /*disabled_features=*/{});
 
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  update->SetIntKey(kPersonalInfoSuggesterAcceptanceCount, 1);
+  update->Set(kPersonalInfoSuggesterAcceptanceCount, 1);
   suggester_->OnFocus(context_id_);
   profile_->set_profile_name(base::UTF16ToUTF8(email_));
 
@@ -730,10 +730,10 @@
       /*disabled_features=*/{});
   suggester_->OnFocus(context_id_);
 
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
-  update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
+  update->Remove(kPersonalInfoSuggesterShowSettingCount);
+  update->Remove(kPersonalInfoSuggesterAcceptanceCount);
   for (int i = 0; i < kMaxShowSettingCount; i++) {
     suggester_->TrySuggestWithSurroundingText(u"my email is ", 12, 12);
     // Dismiss suggestion.
@@ -753,9 +753,9 @@
       /*disabled_features=*/{});
   suggester_->OnFocus(context_id_);
 
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  update->SetIntKey(kPersonalInfoSuggesterShowSettingCount, 0);
+  update->Set(kPersonalInfoSuggesterShowSettingCount, 0);
 
   suggester_->TrySuggestWithSurroundingText(u"my email is ", 12, 12);
   EXPECT_TRUE(
@@ -774,10 +774,10 @@
       /*enabled_features=*/{features::kAssistPersonalInfoEmail},
       /*disabled_features=*/{});
 
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
-  update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
+  update->Remove(kPersonalInfoSuggesterShowSettingCount);
+  update->Remove(kPersonalInfoSuggesterAcceptanceCount);
   suggester_->OnFocus(context_id_);
   profile_->set_profile_name(base::UTF16ToUTF8(email_));
 
@@ -796,10 +796,10 @@
       /*enabled_features=*/{features::kAssistPersonalInfoEmail},
       /*disabled_features=*/{});
 
-  DictionaryPrefUpdate update(profile_->GetPrefs(),
+  ScopedDictPrefUpdate update(profile_->GetPrefs(),
                               prefs::kAssistiveInputFeatureSettings);
-  update->RemoveKey(kPersonalInfoSuggesterShowSettingCount);
-  update->RemoveKey(kPersonalInfoSuggesterAcceptanceCount);
+  update->Remove(kPersonalInfoSuggesterShowSettingCount);
+  update->Remove(kPersonalInfoSuggesterAcceptanceCount);
   suggester_->OnFocus(context_id_);
   profile_->set_profile_name(base::UTF16ToUTF8(email_));
 
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc
index a17ce60..58c1a106 100644
--- a/chrome/browser/ash/login/wizard_controller.cc
+++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -1875,7 +1875,19 @@
     return;
   }
 
-  ShowPackagedLicenseScreen();
+  // No previous screen found. Most likely the device is owned,
+  // in which case the login screen is the default.
+  if (ash::InstallAttributes::Get()->IsDeviceLocked()) {
+    ShowLoginScreen();
+    return;
+  }
+
+  LOG(WARNING) << "No previous screen on unowned device";
+  if (prescribed_enrollment_config_.should_enroll()) {
+    ShowPackagedLicenseScreen();
+  } else {
+    ShowLoginScreen();
+  }
 }
 
 void WizardController::OnManagementTransitionScreenExit() {
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
index 66938d2..8f636ee9 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
@@ -201,6 +201,7 @@
     feedback_data->AddLog(kExtraDiagnosticsKey,
                           feedback_context->extra_diagnostics.value());
   }
+  feedback_data->set_trace_id(report->feedback_context->trace_id);
   if (feedback_context->category_tag.has_value()) {
     feedback_data->set_category_tag(feedback_context->category_tag.value());
   }
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
index 639e32b1..2a2f887 100644
--- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
+++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
@@ -80,6 +80,7 @@
 constexpr char kFeedbackUserConsentDeniedValue[] = "false";
 constexpr char kFeedbackCategoryTag[] = "BluetoothReportWithLogs";
 const std::u16string kDescription = u"This is a fake description";
+constexpr int kPerformanceTraceId = 1;
 
 constexpr char kFakeKey[] = "fake key";
 constexpr char kFakeValue[] = "fake value";
@@ -343,6 +344,7 @@
 // - sentBluetoothLog flag is set true.
 // - category_tag is set to "BluetoothReportWithLogs".
 // - User is logged in with internal google account.
+// - Performance trace id is present.
 IN_PROC_BROWSER_TEST_F(ChromeOsFeedbackDelegateTest,
                        FeedbackDataPopulatedIncludeSysLogsAndScreenshot) {
   ReportPtr report = Report::New();
@@ -355,6 +357,7 @@
   report->feedback_context->category_tag = kFeedbackCategoryTag;
   report->include_system_logs_and_histograms = true;
   report->feedback_context->is_internal_account = true;
+  report->feedback_context->trace_id = kPerformanceTraceId;
   const FeedbackParams expected_params{/*is_internal_email=*/true,
                                        /*load_system_info=*/true,
                                        /*send_tab_titles=*/false,
@@ -381,6 +384,7 @@
   EXPECT_EQ(kFakeExtraDiagnosticsValue, extra_diagnostics->second);
   // Verify category_tag is marked as BluetoothReportWithLogs in the report.
   EXPECT_EQ(kFeedbackCategoryTag, feedback_data->category_tag());
+  EXPECT_EQ(kPerformanceTraceId, feedback_data->trace_id());
 }
 
 // Test that feedback params and data are populated with correct data before
@@ -392,6 +396,7 @@
 // - sentBluetoothLog flag is set false.
 // - category_tag is set to a fake value.
 // - User is logged in with internal google account.
+// - Performance trace id is present.
 IN_PROC_BROWSER_TEST_F(
     ChromeOsFeedbackDelegateTest,
     FeedbackDataPopulatedIncludeSysLogsAndScreenshotAndFakeCategoryTag) {
@@ -405,6 +410,7 @@
   report->feedback_context->category_tag = kFakeCategoryTag;
   report->include_system_logs_and_histograms = true;
   report->feedback_context->is_internal_account = true;
+  report->feedback_context->trace_id = kPerformanceTraceId;
   const FeedbackParams expected_params{/*is_internal_email=*/true,
                                        /*load_system_info=*/true,
                                        /*send_tab_titles=*/false,
@@ -431,6 +437,7 @@
   EXPECT_EQ(kFakeExtraDiagnosticsValue, extra_diagnostics->second);
   // Verify category_tag is marked as a fake category tag in the report.
   EXPECT_EQ(kFakeCategoryTag, feedback_data->category_tag());
+  EXPECT_EQ(kPerformanceTraceId, feedback_data->trace_id());
 }
 
 // Test that feedback params and data are populated with correct data before
@@ -442,6 +449,7 @@
 // - category_tag is not set to "BluetoothReportWithLogs".
 // - Empty string Extra Diagnostics provided.
 // - User is not logged in with an internal google account.
+// - Performance trace id is absent (set to zero).
 IN_PROC_BROWSER_TEST_F(ChromeOsFeedbackDelegateTest,
                        FeedbackDataPopulatedNotIncludeSysLogsOrScreenshot) {
   ReportPtr report = Report::New();
@@ -455,6 +463,7 @@
   report->send_bluetooth_logs = false;
   report->feedback_context->is_internal_account = false;
   report->include_system_logs_and_histograms = false;
+  report->feedback_context->trace_id = 0;
   const FeedbackParams expected_params{/*is_internal_email=*/false,
                                        /*load_system_info=*/false,
                                        /*send_tab_titles=*/false,
@@ -480,6 +489,7 @@
   EXPECT_EQ(feedback_data->sys_info()->end(), extra_diagnostics);
   // Verify category_tag is not marked as BluetoothReportWithLogs.
   EXPECT_NE(kFeedbackCategoryTag, feedback_data->category_tag());
+  EXPECT_EQ(0, feedback_data->trace_id());
 }
 
 // Test GetScreenshot returns correct data when there is a screenshot.
diff --git a/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc b/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
index ece97b9..a2e4cb31 100644
--- a/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
+++ b/chrome/browser/ash/power/auto_screen_brightness/adapter_unittest.cc
@@ -10,7 +10,6 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
-#include "base/files/scoped_temp_dir.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -191,10 +190,8 @@
           ash::prefs::kPowerBatteryScreenBrightnessPercent, 10);
     }
 
-    CHECK(temp_dir_.CreateUniqueTempDir());
     TestingProfile::Builder profile_builder;
     profile_builder.SetProfileName("testuser@gmail.com");
-    profile_builder.SetPath(temp_dir_.GetPath().AppendASCII("TestProfile"));
     profile_builder.SetPrefService(base::WrapUnique(regular_prefs));
 
     profile_ = profile_builder.Build();
@@ -285,7 +282,6 @@
   }
 
  protected:
-  base::ScopedTempDir temp_dir_;
   content::BrowserTaskEnvironment task_environment_;
 
   TestObserver test_observer_;
diff --git a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.cc b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.cc
index 9689730..df1726d 100644
--- a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.cc
+++ b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.cc
@@ -126,6 +126,10 @@
   return true;
 }
 
+bool SystemWebAppDelegate::ShouldRestoreOverrideUrl() const {
+  return false;
+}
+
 bool SystemWebAppDelegate::IsUrlInSystemAppScope(const GURL& url) const {
   return false;
 }
diff --git a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.h b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.h
index 77920d09..a70ec68 100644
--- a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.h
+++ b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate.h
@@ -164,6 +164,11 @@
   // Returns whether the specified Tab Context Menu shortcut should be shown.
   virtual bool ShouldShowTabContextMenuShortcut(Profile* profile,
                                                 int command_id) const;
+
+  // Returns whether the override URL specified in AppLaunchParams should be
+  // used when performing a full restore.
+  virtual bool ShouldRestoreOverrideUrl() const;
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Control the launch of an SWA. The default takes into account single vs.
   // multiple windows, make sure multiple windows don't open directly above
diff --git a/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc
index 786edf44..7225788 100644
--- a/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc
@@ -6,6 +6,8 @@
 #include "ash/shell.h"
 #include "ash/webui/os_feedback_ui/url_constants.h"
 #include "ash/webui/sample_system_web_app_ui/url_constants.h"
+#include "base/strings/escape.h"
+#include "base/strings/strcat.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
@@ -116,6 +118,12 @@
   WaitForTestSystemAppInstall();
   GURL old_url = FindActiveUrl(browser());
 
+  WaitForTestSystemAppInstall();
+
+  feedback_url_ = GURL(base::StrCat(
+      {ash::kChromeUIOSFeedbackUrl, "/?page_url=",
+       base::EscapeQueryParamValue(old_url.spec(), /*use_plus=*/false)}));
+
   content::TestNavigationObserver navigation_observer(feedback_url_);
   navigation_observer.StartWatchingNewWebContents();
   // Try to press keyboard shortcut to open Feedback app.
@@ -123,6 +131,8 @@
   navigation_observer.Wait();
 
   ExpectFeedbackAppLaunched(old_url);
+
+  feedback_url_ = GURL(ash::kChromeUIOSFeedbackUrl);
 }
 
 // This test verifies that the Feedback app is not opened when
diff --git a/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.cc b/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.cc
index 04e3998c..78366a1 100644
--- a/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.cc
@@ -90,6 +90,10 @@
   return false;
 }
 
+bool OsUrlHandlerSystemWebAppDelegate::ShouldRestoreOverrideUrl() const {
+  return true;
+}
+
 bool OsUrlHandlerSystemWebAppDelegate::IsUrlInSystemAppScope(
     const GURL& url) const {
   if (!IsAppEnabled())
diff --git a/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.h b/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.h
index e0e163c..69aa26d5 100644
--- a/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.h
+++ b/chrome/browser/ash/web_applications/os_url_handler_system_web_app_info.h
@@ -32,6 +32,7 @@
   bool ShouldShowInLauncher() const override;
   bool ShouldShowInSearch() const override;
   bool ShouldReuseExistingWindow() const override;
+  bool ShouldRestoreOverrideUrl() const override;
   bool IsUrlInSystemAppScope(const GURL& url) const override;
 
   // Can be called by a test to enforce the app to be enabled.
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 25b73b1..9364e4fa 100644
--- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -570,6 +570,7 @@
   EXPECT_FALSE(SendCommandSync(
       "Memory.prepareForLeakDetection"));        // Implemented in content
   EXPECT_FALSE(SendCommandSync("Cast.enable"));  // Implemented in content
+  EXPECT_FALSE(SendCommandSync("Storage.getCookies"));
 }
 
 class ExtensionProtocolTest : public DevToolsProtocolTest {
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDialogBridgeUnitTest.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDialogBridgeUnitTest.java
index 88cb8f6..087f88719 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDialogBridgeUnitTest.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDialogBridgeUnitTest.java
@@ -28,7 +28,6 @@
 import org.robolectric.shadows.ShadowLog;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.download.dialogs.DownloadLocationDialogCoordinator;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -66,9 +65,6 @@
     @Rule
     public TestRule mFeaturesProcessor = new Features.JUnitProcessor();
 
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Mock
     private DownloadDialogBridge.Natives mNativeMock;
 
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 1ef92adb..64136818 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -2468,7 +2468,9 @@
   URLPatternSet site_pattern({parsed_site});
   std::unique_ptr<ExtensionSet> all_extensions =
       ExtensionRegistry::Get(browser_context())
-          ->GenerateInstalledExtensionsSet();
+          ->GenerateInstalledExtensionsSet(
+              ExtensionRegistry::ENABLED | ExtensionRegistry::DISABLED |
+              ExtensionRegistry::TERMINATED | ExtensionRegistry::BLOCKLISTED);
   for (const auto& extension : *all_extensions) {
     const URLPatternSet& extension_withheld_sites =
         extension->permissions_data()->withheld_permissions().effective_hosts();
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index 9d419c2c..a46eef5 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -24,7 +24,6 @@
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "build/chromeos_buildflags.h"
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h"
 #include "chrome/browser/extensions/api/identity/identity_api.h"
 #include "chrome/browser/extensions/api/identity/identity_constants.h"
@@ -54,6 +53,9 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/crx_file/id_util.h"
 #include "components/guest_view/browser/guest_view_base.h"
+#include "components/guest_view/browser/guest_view_manager_delegate.h"
+#include "components/guest_view/browser/guest_view_manager_factory.h"
+#include "components/guest_view/browser/test_guest_view_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/core/browser/account_reconcilor.h"
 #include "components/signin/public/base/list_accounts_test_utils.h"
@@ -62,11 +64,10 @@
 #include "components/signin/public/identity_manager/accounts_mutator.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
+#include "extensions/browser/api/extensions_api_client.h"
 #include "extensions/browser/api_test_utils.h"
 #include "extensions/common/api/oauth2.h"
 #include "extensions/common/extension_builder.h"
@@ -99,7 +100,11 @@
 #include "chromeos/startup/browser_init_params.h"
 #endif
 
+using extensions::ExtensionsAPIClient;
 using guest_view::GuestViewBase;
+using guest_view::GuestViewManager;
+using guest_view::TestGuestViewManager;
+using guest_view::TestGuestViewManagerFactory;
 using testing::_;
 using testing::Return;
 
@@ -288,52 +293,6 @@
   raw_ptr<OAuth2MintTokenFlow::Delegate> delegate_;
 };
 
-// Waits for a specific GURL to generate a NOTIFICATION_LOAD_STOP event and
-// saves a pointer to the window embedding the WebContents, which can be later
-// closed.
-class WaitForGURLAndCloseWindow : public content::WindowedNotificationObserver {
- public:
-  explicit WaitForGURLAndCloseWindow(GURL url)
-      : WindowedNotificationObserver(
-            content::NOTIFICATION_LOAD_STOP,
-            content::NotificationService::AllSources()),
-        url_(std::move(url)),
-        embedder_web_contents_(nullptr) {}
-
-  // NotificationObserver:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override {
-    content::NavigationController* web_auth_flow_controller =
-        content::Source<content::NavigationController>(source).ptr();
-    content::WebContents* web_contents =
-        web_auth_flow_controller->DeprecatedGetWebContents();
-
-    if (web_contents->GetLastCommittedURL() == url_) {
-      // It is safe to keep the pointer here, because we know in a test, that
-      // the WebContents won't go away before CloseEmbedderWebContents is
-      // called. Don't copy this code to production.
-      GuestViewBase* guest = GuestViewBase::FromWebContents(web_contents);
-      embedder_web_contents_ = guest->embedder_web_contents();
-      // Condtionally invoke parent class so that Wait will not exit
-      // until the target URL arrives.
-      content::WindowedNotificationObserver::Observe(type, source, details);
-    }
-  }
-
-  // Closes the window embedding the WebContents. The action is separated from
-  // the Observe method to make sure the list of observers is not deleted,
-  // while some event is already being processed. (That causes ASAN failures.)
-  void CloseEmbedderWebContents() {
-    if (embedder_web_contents_)
-      embedder_web_contents_->Close();
-  }
-
- private:
-  GURL url_;
-  raw_ptr<content::WebContents> embedder_web_contents_;
-};
-
 }  // namespace
 
 class FakeGetAuthTokenFunction : public IdentityGetAuthTokenFunction {
@@ -3271,11 +3230,39 @@
 
 class LaunchWebAuthFlowFunctionTest : public AsyncExtensionBrowserTest {
  public:
+  void SetUp() override {
+    GuestViewManager::set_factory_for_testing(&factory_);
+    AsyncExtensionBrowserTest::SetUp();
+  }
+
+  void TearDown() override {
+    AsyncExtensionBrowserTest::TearDown();
+    GuestViewManager::set_factory_for_testing(nullptr);
+  }
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     AsyncExtensionBrowserTest::SetUpCommandLine(command_line);
     // Reduce performance test variance by disabling background networking.
     command_line->AppendSwitch(switches::kDisableBackgroundNetworking);
   }
+
+  TestGuestViewManager* GetGuestViewManager() {
+    TestGuestViewManager* manager = static_cast<TestGuestViewManager*>(
+        TestGuestViewManager::FromBrowserContext(browser()->profile()));
+    // Test code may access the TestGuestViewManager before it would be created
+    // during creation of the first guest.
+    if (!manager) {
+      manager = static_cast<TestGuestViewManager*>(
+          GuestViewManager::CreateWithDelegate(
+              browser()->profile(),
+              ExtensionsAPIClient::Get()->CreateGuestViewManagerDelegate(
+                  browser()->profile())));
+    }
+    return manager;
+  }
+
+ private:
+  TestGuestViewManagerFactory factory_;
 };
 
 IN_PROC_BROWSER_TEST_F(LaunchWebAuthFlowFunctionTest, UserCloseWindow) {
@@ -3291,14 +3278,19 @@
       ExtensionBuilder("Test").Build());
   function->set_extension(empty_extension.get());
 
-  WaitForGURLAndCloseWindow popup_observer(auth_url);
-
   std::string args =
       "[{\"interactive\": true, \"url\": \"" + auth_url.spec() + "\"}]";
   RunFunctionAsync(function.get(), args);
 
-  popup_observer.Wait();
-  popup_observer.CloseEmbedderWebContents();
+  TestGuestViewManager* guest_view_manager = GetGuestViewManager();
+  auto* guest_view = guest_view_manager->WaitForSingleGuestViewCreated();
+  ASSERT_TRUE(guest_view);
+
+  guest_view_manager->WaitUntilAttached(guest_view);
+
+  auto* embedder_web_contents = guest_view->embedder_web_contents();
+  ASSERT_TRUE(embedder_web_contents);
+  embedder_web_contents->Close();
 
   EXPECT_EQ(std::string(errors::kUserRejected), WaitForError(function.get()));
 }
diff --git a/chrome/browser/extensions/chrome_extension_frame_host.cc b/chrome/browser/extensions/chrome_extension_frame_host.cc
index 31b93861..b36577c 100644
--- a/chrome/browser/extensions/chrome_extension_frame_host.cc
+++ b/chrome/browser/extensions/chrome_extension_frame_host.cc
@@ -4,11 +4,17 @@
 
 #include "chrome/browser/extensions/chrome_extension_frame_host.h"
 
+#include "chrome/browser/extensions/error_console/error_console.h"
 #include "chrome/browser/extensions/extension_action_runner.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/common/extensions/extension_constants.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/common/extension_set.h"
+#include "extensions/common/extension_urls.h"
+#include "third_party/blink/public/common/logging/logging_utils.h"
 #include "url/gurl.h"
 
 namespace extensions {
@@ -25,7 +31,7 @@
     mojom::RunLocation run_location,
     RequestScriptInjectionPermissionCallback callback) {
   ExtensionActionRunner* runner =
-      ExtensionActionRunner::GetForWebContents(web_contents());
+      ExtensionActionRunner::GetForWebContents(web_contents_);
   if (!runner) {
     std::move(callback).Run(false);
     return;
@@ -38,7 +44,7 @@
     const GURL& requestor_url,
     GetAppInstallStateCallback callback) {
   ExtensionRegistry* registry =
-      ExtensionRegistry::Get(web_contents()->GetBrowserContext());
+      ExtensionRegistry::Get(web_contents_->GetBrowserContext());
   const ExtensionSet& extensions = registry->enabled_extensions();
   const ExtensionSet& disabled_extensions = registry->disabled_extensions();
 
@@ -55,10 +61,34 @@
 
 void ChromeExtensionFrameHost::WatchedPageChange(
     const std::vector<std::string>& css_selectors) {
-  TabHelper* tab_helper = TabHelper::FromWebContents(web_contents());
+  TabHelper* tab_helper = TabHelper::FromWebContents(web_contents_);
   if (!tab_helper)
     return;
   tab_helper->OnWatchedPageChanged(css_selectors);
 }
 
+void ChromeExtensionFrameHost::DetailedConsoleMessageAdded(
+    const std::u16string& message,
+    const std::u16string& source,
+    const StackTrace& stack_trace,
+    blink::mojom::ConsoleMessageLevel level) {
+  if (!IsSourceFromAnExtension(source))
+    return;
+
+  content::RenderFrameHost* render_frame_host =
+      receivers_.GetCurrentTargetFrame();
+  std::string extension_id = util::GetExtensionIdFromFrame(render_frame_host);
+  if (extension_id.empty())
+    extension_id = GURL(source).host();
+
+  content::BrowserContext* browser_context = web_contents_->GetBrowserContext();
+  ErrorConsole::Get(browser_context)
+      ->ReportError(std::unique_ptr<ExtensionError>(new RuntimeError(
+          extension_id, browser_context->IsOffTheRecord(), source, message,
+          stack_trace, web_contents_->GetLastCommittedURL(),
+          blink::ConsoleMessageLevelToLogSeverity(level),
+          render_frame_host->GetRoutingID(),
+          render_frame_host->GetProcess()->GetID())));
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extension_frame_host.h b/chrome/browser/extensions/chrome_extension_frame_host.h
index c11d0f26..9ed0403 100644
--- a/chrome/browser/extensions/chrome_extension_frame_host.h
+++ b/chrome/browser/extensions/chrome_extension_frame_host.h
@@ -35,6 +35,11 @@
                           GetAppInstallStateCallback callback) override;
   void WatchedPageChange(
       const std::vector<std::string>& css_selectors) override;
+  void DetailedConsoleMessageAdded(
+      const std::u16string& message,
+      const std::u16string& source,
+      const StackTrace& stack_trace,
+      blink::mojom::ConsoleMessageLevel level) override;
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extension_web_contents_observer.cc b/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
index a1e7bb82..9ef7b01 100644
--- a/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
+++ b/chrome/browser/extensions/chrome_extension_web_contents_observer.cc
@@ -11,7 +11,6 @@
 #include "base/metrics/field_trial.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/chrome_extension_frame_host.h"
-#include "chrome/browser/extensions/error_console/error_console.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/window_controller.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
@@ -24,9 +23,9 @@
 #include "content/public/common/content_switches.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension_messages.h"
-#include "extensions/common/extension_urls.h"
 #include "extensions/common/switches.h"
 #include "third_party/blink/public/common/chrome_debug_urls.h"
 
@@ -97,48 +96,6 @@
   }
 }
 
-bool ChromeExtensionWebContentsObserver::OnMessageReceived(
-    const IPC::Message& message,
-    content::RenderFrameHost* render_frame_host) {
-  DCHECK(initialized());
-  if (ExtensionWebContentsObserver::OnMessageReceived(message,
-                                                      render_frame_host)) {
-    return true;
-  }
-
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(ChromeExtensionWebContentsObserver, message,
-                                   render_frame_host)
-    IPC_MESSAGE_HANDLER(ExtensionHostMsg_DetailedConsoleMessageAdded,
-                        OnDetailedConsoleMessageAdded)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
-void ChromeExtensionWebContentsObserver::OnDetailedConsoleMessageAdded(
-    content::RenderFrameHost* render_frame_host,
-    const std::u16string& message,
-    const std::u16string& source,
-    const StackTrace& stack_trace,
-    int32_t severity_level) {
-  DCHECK(initialized());
-  if (!IsSourceFromAnExtension(source))
-    return;
-
-  std::string extension_id = GetExtensionIdFromFrame(render_frame_host);
-  if (extension_id.empty())
-    extension_id = GURL(source).host();
-
-  ErrorConsole::Get(browser_context())
-      ->ReportError(std::unique_ptr<ExtensionError>(new RuntimeError(
-          extension_id, browser_context()->IsOffTheRecord(), source, message,
-          stack_trace, web_contents()->GetLastCommittedURL(),
-          static_cast<logging::LogSeverity>(severity_level),
-          render_frame_host->GetRoutingID(),
-          render_frame_host->GetProcess()->GetID())));
-}
-
 void ChromeExtensionWebContentsObserver::InitializeRenderFrame(
     content::RenderFrameHost* render_frame_host) {
   DCHECK(initialized());
@@ -153,7 +110,7 @@
 void ChromeExtensionWebContentsObserver::ReloadIfTerminated(
     content::RenderFrameHost* render_frame_host) {
   DCHECK(initialized());
-  std::string extension_id = GetExtensionIdFromFrame(render_frame_host);
+  std::string extension_id = util::GetExtensionIdFromFrame(render_frame_host);
   if (extension_id.empty())
     return;
 
diff --git a/chrome/browser/extensions/chrome_extension_web_contents_observer.h b/chrome/browser/extensions/chrome_extension_web_contents_observer.h
index 62cc319..4128d08 100644
--- a/chrome/browser/extensions/chrome_extension_web_contents_observer.h
+++ b/chrome/browser/extensions/chrome_extension_web_contents_observer.h
@@ -52,18 +52,6 @@
   // content::WebContentsObserver overrides.
   void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
 
-  // Silence a warning about hiding a virtual function.
-  bool OnMessageReceived(const IPC::Message& message,
-                         content::RenderFrameHost* render_frame_host) override;
-
-  // Adds a message to the extensions ErrorConsole.
-  void OnDetailedConsoleMessageAdded(
-      content::RenderFrameHost* render_frame_host,
-      const std::u16string& message,
-      const std::u16string& source,
-      const StackTrace& stack_trace,
-      int32_t severity_level);
-
   // Reloads an extension if it is on the terminated list.
   void ReloadIfTerminated(content::RenderFrameHost* render_frame_host);
 
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.cc b/chrome/browser/extensions/extension_keeplist_chromeos.cc
index 3c6abc7b..9e4588cc 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.cc
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.cc
@@ -75,7 +75,6 @@
 #endif
 
         extension_misc::kGoogleKeepAppId, extension_misc::kCalculatorAppId,
-        extension_misc::kTextEditorAppId,
         extension_misc::kInAppPaymentsSupportAppId,
         extension_misc::kIdentityApiUiAppId
   });
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc
index e7d8fffe..fc8a19ec 100644
--- a/chrome/browser/feedback/show_feedback_page.cc
+++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -51,6 +51,7 @@
 constexpr char kExtraDiagnosticsQueryParam[] = "extra_diagnostics";
 constexpr char kDescriptionTemplateQueryParam[] = "description_template";
 constexpr char kCategoryTagParam[] = "category_tag";
+constexpr char kPageURLParam[] = "page_url";
 constexpr char kQueryParamSeparator[] = "&";
 constexpr char kQueryParamKeyValueSeparator[] = "=";
 
@@ -64,7 +65,8 @@
 // Returns URL for OS Feedback with additional data passed as query parameters.
 GURL BuildFeedbackUrl(const std::string extra_diagnostics,
                       const std::string description_template,
-                      const std::string category_tag) {
+                      const std::string category_tag,
+                      const GURL page_url) {
   std::vector<std::string> query_params;
 
   if (!extra_diagnostics.empty()) {
@@ -82,6 +84,10 @@
         StrCatQueryParam(kCategoryTagParam, category_tag));
   }
 
+  if (!page_url.is_empty()) {
+    query_params.emplace_back(StrCatQueryParam(kPageURLParam, page_url.spec()));
+  }
+
   // Use default URL if no extra parameters to be added.
   if (query_params.empty()) {
     return GURL(ash::kChromeUIOSFeedbackUrl);
@@ -165,8 +171,8 @@
   }
   if (base::FeatureList::IsEnabled(ash::features::kOsFeedback)) {
     ash::SystemAppLaunchParams params{};
-    params.url =
-        BuildFeedbackUrl(extra_diagnostics, description_template, category_tag);
+    params.url = BuildFeedbackUrl(extra_diagnostics, description_template,
+                                  category_tag, page_url);
     ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::OS_FEEDBACK,
                                  std::move(params));
     return;
diff --git a/chrome/browser/feedback/show_feedback_page_browsertest.cc b/chrome/browser/feedback/show_feedback_page_browsertest.cc
index 3744d7a..bed9fa6 100644
--- a/chrome/browser/feedback/show_feedback_page_browsertest.cc
+++ b/chrome/browser/feedback/show_feedback_page_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
+#include "chrome/browser/feedback/feedback_dialog_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -66,8 +67,11 @@
 
   base::HistogramTester histogram_tester;
   EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
-
-  const GURL expected_url(ash::kChromeUIOSFeedbackUrl);
+  const GURL page_url = chrome::GetTargetTabUrl(
+      browser()->session_id(), browser()->tab_strip_model()->active_index());
+  const GURL expected_url(base::StrCat(
+      {ash::kChromeUIOSFeedbackUrl, "/?page_url=",
+       base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false)}));
   content::TestNavigationObserver navigation_observer(expected_url);
   navigation_observer.StartWatchingNewWebContents();
 
@@ -87,7 +91,7 @@
                                ->tab_strip_model()
                                ->GetActiveWebContents()
                                ->GetVisibleURL();
-  EXPECT_FALSE(visible_url.has_query());
+  EXPECT_TRUE(visible_url.has_query());
   EXPECT_EQ(expected_url, visible_url);
 }
 
@@ -95,11 +99,14 @@
 // - `extra_diagnostics` string.
 // - `description_template` string.
 // - `category_tag` string.
+// - `page_url` GURL.
 IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
                        OsFeedbackAdditionalContextAddedToUrl) {
   ash::SystemWebAppManager::GetForTest(browser()->profile())
       ->InstallSystemAppsForTesting();
   std::string unused;
+  const GURL page_url = chrome::GetTargetTabUrl(
+      browser()->session_id(), browser()->tab_strip_model()->active_index());
   const std::string extra_diagnostics = "extra diagnostics param";
   const std::string description_template = "Q1: Question one?";
   const std::string category_tag = "category tag param";
@@ -109,7 +116,9 @@
        "&description_template=",
        base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
        "&category_tag=",
-       base::EscapeQueryParamValue(category_tag, /*use_plus=*/false)}));
+       base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
+       "&page_url=",
+       base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false)}));
   content::TestNavigationObserver navigation_observer(expected_url);
   navigation_observer.StartWatchingNewWebContents();
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 252253e..6251b5d 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -3455,6 +3455,11 @@
     "expiry_milestone": 110
   },
   {
+    "name": "extensions-fsp-in-service-workers",
+    "owners": [ "alexbn", "petermarshall" ],
+    "expiry_milestone": 120
+  },
+  {
     "name": "extensions-menu-access-control",
     "owners": [ "emiliapaz" ],
     "expiry_milestone":  112
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 806f29a9f2..6ad528a 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1471,6 +1471,11 @@
 const char kExtensionsMenuAccessControlDescription[] =
     "Enables a redesigned extensions menu that allows the user to control "
     "extensions site access.";
+
+const char kExtensionsFSPInServiceWorkersName[] =
+    "fileSystemProvider API in Service Workers";
+const char kExtensionsFSPInServiceWorkersDescription[] =
+    "Enables fileSystemProvider extension API in service workers.";
 #endif
 
 const char kExtensionsOnChromeUrlsName[] = "Extensions on chrome:// URLs";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 49417cd..9635346 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -815,6 +815,9 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 extern const char kExtensionsMenuAccessControlName[];
 extern const char kExtensionsMenuAccessControlDescription[];
+
+extern const char kExtensionsFSPInServiceWorkersName[];
+extern const char kExtensionsFSPInServiceWorkersDescription[];
 #endif
 
 extern const char kExtensionsOnChromeUrlsName[];
diff --git a/chrome/browser/lifetime/application_lifetime_desktop.cc b/chrome/browser/lifetime/application_lifetime_desktop.cc
new file mode 100644
index 0000000..56a6836
--- /dev/null
+++ b/chrome/browser/lifetime/application_lifetime_desktop.cc
@@ -0,0 +1,496 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/lifetime/application_lifetime_desktop.h"
+
+#include <memory>
+#include <set>
+#include <string>
+
+#include "base/bind.h"
+#include "base/callback_list.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/process/process.h"
+#include "base/process/process_handle.h"
+#include "base/threading/hang_watcher.h"
+#include "base/time/time.h"
+#include "base/trace_event/trace_event.h"
+#include "base/types/strong_alias.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/download/download_core_service.h"
+#include "chrome/browser/lifetime/browser_close_manager.h"
+#include "chrome/browser/lifetime/browser_shutdown.h"
+#include "chrome/browser/metrics/shutdown_watcher_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/buildflags.h"
+#include "chrome/common/pref_names.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/language/core/browser/pref_names.h"
+#include "components/language/core/common/locale_util.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_details.h"
+#include "content/public/browser/notification_service.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/lifetime/termination_notification.h"
+#include "chrome/browser/sessions/exit_type_service.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/browser_window.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/boot_times_recorder.h"
+#include "chrome/browser/ash/settings/cros_settings.h"
+#include "chrome/browser/lifetime/application_lifetime_chromeos.h"
+#include "chromeos/dbus/power/power_policy_controller.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+#include "ui/aura/env.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/crosapi/mojom/crosapi.mojom.h"
+#include "chromeos/lacros/lacros_service.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ui/profile_picker.h"
+#endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_WIN)
+#include "base/win/win_util.h"
+#endif  // BUILDFLAG(IS_WIN)
+
+#if BUILDFLAG(ENABLE_SESSION_SERVICE)
+#include "chrome/browser/sessions/session_data_service.h"
+#include "chrome/browser/sessions/session_data_service_factory.h"
+#endif  // BUILDFLAG(ENABLE_SESSION_SERVICE)
+
+namespace chrome {
+
+namespace {
+
+#if !BUILDFLAG(IS_ANDROID)
+// Returns true if all browsers can be closed without user interaction.
+// This currently checks if there is pending download, or if it needs to
+// handle unload handler.
+bool AreAllBrowsersCloseable() {
+  if (BrowserList::GetInstance()->empty())
+    return true;
+
+  // If there are any downloads active, all browsers are not closeable.
+  // However, this does not block for malicious downloads.
+  if (DownloadCoreService::NonMaliciousDownloadCountAllProfiles() > 0)
+    return false;
+
+  // Check TabsNeedBeforeUnloadFired().
+  for (auto* browser : *BrowserList::GetInstance()) {
+    if (browser->TabsNeedBeforeUnloadFired())
+      return false;
+  }
+  return true;
+}
+
+base::RepeatingCallbackList<void(bool)>& GetClosingAllBrowsersCallbackList() {
+  static base::NoDestructor<base::RepeatingCallbackList<void(bool)>>
+      callback_list;
+  return *callback_list;
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Sets kApplicationLocale in |local_state| for the login screen on the next
+// application start, if it is forced to a specific value due to enterprise
+// policy or the owner's locale.  Returns true if any pref has been modified.
+bool SetLocaleForNextStart(PrefService* local_state) {
+  // If a policy mandates the login screen locale, use it.
+  ash::CrosSettings* cros_settings = ash::CrosSettings::Get();
+  const base::Value::List* login_screen_locales = nullptr;
+  if (cros_settings->GetList(ash::kDeviceLoginScreenLocales,
+                             &login_screen_locales) &&
+      !login_screen_locales->empty() &&
+      login_screen_locales->front().is_string()) {
+    std::string login_screen_locale = login_screen_locales->front().GetString();
+    local_state->SetString(language::prefs::kApplicationLocale,
+                           login_screen_locale);
+    return true;
+  }
+
+  // Login screen should show up in owner's locale.
+  std::string owner_locale = local_state->GetString(prefs::kOwnerLocale);
+  std::string pref_locale =
+      local_state->GetString(language::prefs::kApplicationLocale);
+  language::ConvertToActualUILocale(&pref_locale);
+  if (!owner_locale.empty() && pref_locale != owner_locale &&
+      !local_state->IsManagedPreference(language::prefs::kApplicationLocale)) {
+    local_state->SetString(language::prefs::kApplicationLocale, owner_locale);
+    return true;
+  }
+
+  return false;
+}
+
+// Whether chrome should send stop request to a session manager.
+bool g_send_stop_request_to_session_manager = false;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if !BUILDFLAG(IS_ANDROID)
+using IgnoreUnloadHandlers =
+    base::StrongAlias<class IgnoreUnloadHandlersTag, bool>;
+
+void AttemptRestartInternal(IgnoreUnloadHandlers ignore_unload_handlers) {
+  // TODO(beng): Can this use ProfileManager::GetLoadedProfiles instead?
+  // TODO(crbug.com/1205798): Unset SaveSessionState if the restart fails.
+  for (auto* browser : *BrowserList::GetInstance()) {
+    browser->profile()->SaveSessionState();
+#if BUILDFLAG(ENABLE_SESSION_SERVICE)
+    auto* session_data_service =
+        SessionDataServiceFactory::GetForProfile(browser->profile());
+    if (session_data_service)
+      session_data_service->SetForceKeepSessionState();
+#endif  // BUILDFLAG(ENABLE_SESSION_SERVICE)
+  }
+
+  PrefService* pref_service = g_browser_process->local_state();
+  pref_service->SetBoolean(prefs::kWasRestarted, true);
+  KeepAliveRegistry::GetInstance()->SetRestarting();
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  ash::BootTimesRecorder::Get()->set_restart_requested();
+
+  DCHECK(!g_send_stop_request_to_session_manager);
+  // Make sure we don't send stop request to the session manager.
+  g_send_stop_request_to_session_manager = false;
+
+  // If an update is pending NotifyAndTerminate() will trigger a system reboot,
+  // which in turn will send SIGTERM to Chrome, and that ends up processing
+  // unload handlers.
+  if (UpdatePending()) {
+    browser_shutdown::NotifyAndTerminate(true);
+    return;
+  }
+
+  // Run exit process in clean stack.
+  content::GetUIThreadTaskRunner({})->PostTask(
+      FROM_HERE, base::BindOnce(&ExitIgnoreUnloadHandlers));
+#else  // !BUILDFLAG(IS_CHROMEOS_ASH).
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  // Request ash-chrome to relaunch Lacros on its process termination.
+  // Do not set kRestartLastSessionOnShutdown for Lacros, because it tries to
+  // respawn another Chrome process from the current Chrome process, which
+  // does not work on Lacros.
+  auto* lacros_service = chromeos::LacrosService::Get();
+  if (lacros_service->IsAvailable<crosapi::mojom::BrowserServiceHost>() &&
+      lacros_service->GetInterfaceVersion(
+          crosapi::mojom::BrowserServiceHost::Uuid_) >=
+          static_cast<int>(
+              crosapi::mojom::BrowserServiceHost::kRequestRelaunchMinVersion)) {
+    lacros_service->GetRemote<crosapi::mojom::BrowserServiceHost>()
+        ->RequestRelaunch();
+  }
+#else   // !BUILDFLAG(IS_CHROMEOS_LACROS)
+  // Set the flag to restore state after the restart.
+  pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, true);
+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (ignore_unload_handlers)
+    ExitIgnoreUnloadHandlers();
+  else
+    AttemptExit();
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+}
+
+void MarkAsCleanShutdown() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Tracks profiles that have pending write of the exit type.
+  std::set<Profile*> pending_profiles;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+  for (auto* browser : *BrowserList::GetInstance()) {
+    if (ExitTypeService* exit_type_service =
+            ExitTypeService::GetInstanceForProfile(browser->profile())) {
+      exit_type_service->SetCurrentSessionExitType(ExitType::kClean);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+      // Explicitly schedule pending writes on ChromeOS so that even if the
+      // UI thread is hosed (e.g. taking a long time to close all tabs because
+      // of page faults/swap-in), the clean shutdown flag still gets a chance
+      // to be persisted. See https://crbug.com/1294764
+      Profile* profile = browser->profile();
+      if (pending_profiles.insert(profile).second) {
+        profile->GetPrefs()->CommitPendingWrite();
+      }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+    }
+  }
+}
+
+void ShutdownIfNoBrowsers() {
+  if (GetTotalBrowserCount() > 0)
+    return;
+
+  // Tell everyone that we are shutting down.
+  browser_shutdown::SetTryingToQuit(true);
+
+#if BUILDFLAG(ENABLE_SESSION_SERVICE)
+  // If ShuttingDownWithoutClosingBrowsers() returns true, the session
+  // services may not get a chance to shut down normally, so explicitly shut
+  // them down here to ensure they have a chance to persist their data.
+  ProfileManager::ShutdownSessionServices();
+#endif  // BUILDFLAG(ENABLE_SESSION_SERVICE)
+
+  browser_shutdown::NotifyAndTerminate(true /* fast_path */);
+  OnAppExiting();
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+void AttemptExitInternal(bool try_to_quit_application) {
+  // On Mac, the platform-specific part handles setting this.
+#if !BUILDFLAG(IS_MAC)
+  if (try_to_quit_application)
+    browser_shutdown::SetTryingToQuit(true);
+#endif  // !BUILDFLAG(IS_MAC)
+
+#if !BUILDFLAG(IS_ANDROID)
+  OnClosingAllBrowsers(true);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+  g_browser_process->platform_part()->AttemptExit(try_to_quit_application);
+}
+
+}  // namespace
+
+#if !BUILDFLAG(IS_ANDROID)
+void CloseAllBrowsersAndQuit() {
+  browser_shutdown::SetTryingToQuit(true);
+  CloseAllBrowsers();
+}
+
+void CloseAllBrowsers() {
+  // If there are no browsers and closing the last browser would quit the
+  // application, send the APP_TERMINATING action here. Otherwise, it will be
+  // sent by RemoveBrowser() when the last browser has closed.
+  if (GetTotalBrowserCount() == 0 &&
+      (browser_shutdown::IsTryingToQuit() ||
+       !KeepAliveRegistry::GetInstance()->IsKeepingAlive())) {
+    ShutdownIfNoBrowsers();
+    return;
+  }
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  ash::BootTimesRecorder::Get()->AddLogoutTimeMarker("StartedClosingWindows",
+                                                     false);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  scoped_refptr<BrowserCloseManager> browser_close_manager =
+      new BrowserCloseManager;
+  browser_close_manager->StartClosingBrowsers();
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+void AttemptUserExit() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  VLOG(1) << "AttemptUserExit";
+  ash::BootTimesRecorder::Get()->AddLogoutTimeMarker("LogoutStarted", false);
+
+  PrefService* state = g_browser_process->local_state();
+  if (state) {
+    ash::BootTimesRecorder::Get()->OnLogoutStarted(state);
+
+    if (SetLocaleForNextStart(state)) {
+      TRACE_EVENT0("shutdown", "CommitPendingWrite");
+      state->CommitPendingWrite();
+    }
+  }
+  g_send_stop_request_to_session_manager = true;
+  // On ChromeOS, always terminate the browser, regardless of the result of
+  // AreAllBrowsersCloseable(). See crbug.com/123107.
+  browser_shutdown::NotifyAndTerminate(true /* fast_path */);
+#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+  // Reset the restart bit that might have been set in cancelled restart
+  // request.
+#if !BUILDFLAG(IS_ANDROID)
+  ProfilePicker::Hide();
+#endif  // !BUILDFLAG(IS_ANDROID)
+  PrefService* pref_service = g_browser_process->local_state();
+  pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, false);
+  AttemptExitInternal(false);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+}
+
+// The Android implementation is in application_lifetime_android.cc
+#if !BUILDFLAG(IS_ANDROID)
+void AttemptRestart() {
+  AttemptRestartInternal(IgnoreUnloadHandlers(false));
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+// The ChromeOS implementation is in application_lifetime_chromeos.cc
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+void AttemptRelaunch() {
+  AttemptRestart();
+}
+
+#if !BUILDFLAG(IS_ANDROID)
+void RelaunchIgnoreUnloadHandlers() {
+  AttemptRestartInternal(IgnoreUnloadHandlers(true));
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+
+void AttemptExit() {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // On ChromeOS, user exit and system exits are the same.
+  AttemptUserExit();
+#else  // !BUILDFLAG(IS_CHROMEOS_ASH)
+  // If we know that all browsers can be closed without blocking,
+  // don't notify users of crashes beyond this point.
+  // Note that MarkAsCleanShutdown() does not set UMA's exit cleanly bit
+  // so crashes during shutdown are still reported in UMA.
+#if !BUILDFLAG(IS_ANDROID)
+  // Android doesn't use Browser.
+  if (AreAllBrowsersCloseable())
+    MarkAsCleanShutdown();
+#endif  // !BUILDFLAG(IS_ANDROID)
+  AttemptExitInternal(true);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+}
+
+void ExitIgnoreUnloadHandlers() {
+  VLOG(1) << "ExitIgnoreUnloadHandlers";
+#if !BUILDFLAG(IS_ANDROID)
+  // We always mark exit cleanly.
+  MarkAsCleanShutdown();
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Disable window occlusion tracking on exit before closing all browser
+  // windows to make shutdown faster. Note that the occlusion tracking is
+  // paused indefinitely. It is okay do so on Chrome OS because there is
+  // no way to abort shutdown and go back to user sessions at this point.
+  DCHECK(aura::Env::HasInstance());
+  aura::Env::GetInstance()->PauseWindowOcclusionTracking();
+
+  // On ChromeOS ExitIgnoreUnloadHandlers() is used to handle SIGTERM.
+  // In this case, AreAllBrowsersCloseable()
+  // can be false in following cases. a) power-off b) signout from
+  // screen locker.
+  browser_shutdown::OnShutdownStarting(
+      AreAllBrowsersCloseable() ? browser_shutdown::ShutdownType::kBrowserExit
+                                : browser_shutdown::ShutdownType::kEndSession);
+#else   // !BUILDFLAG(IS_CHROMEOS_ASH)
+  // For desktop browsers, always perform a silent exit.
+  browser_shutdown::OnShutdownStarting(
+      browser_shutdown::ShutdownType::kSilentExit);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_ANDROID)
+  AttemptExitInternal(true);
+}
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+bool IsAttemptingShutdown() {
+  return g_send_stop_request_to_session_manager;
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if !BUILDFLAG(IS_ANDROID)
+void SessionEnding() {
+  // This is a time-limited shutdown where we need to write as much to
+  // disk as we can as soon as we can, and where we must kill the
+  // process within a hang timeout to avoid user prompts.
+
+  // EndSession is invoked once per frame. Only do something the first time.
+  static bool already_ended = false;
+  // We may get called in the middle of shutdown, e.g. https://crbug.com/70852
+  // and https://crbug.com/1187418.  In this case, do nothing.
+  if (already_ended || !content::NotificationService::current() ||
+      !g_browser_process) {
+    return;
+  }
+  already_ended = true;
+
+  // ~ShutdownWatcherHelper uses IO (it joins a thread). We'll only trigger that
+  // if Terminate() fails, which leaves us in a weird state, or the OS is going
+  // to kill us soon. Either way we don't care about that here.
+  base::ThreadRestrictions::ScopedAllowIO allow_io;
+
+  // Two different types of hang detection cannot attempt to upload crashes at
+  // the same time or they would interfere with each other.
+  absl::optional<ShutdownWatcherHelper> shutdown_watcher;
+  absl::optional<base::WatchHangsInScope> watch_hangs_scope;
+  if (base::HangWatcher::IsCrashReportingEnabled()) {
+    // TODO(crbug.com/1327000): Migrate away from ShutdownWatcher and its old
+    // timing.
+    constexpr base::TimeDelta kShutdownHangDelay{base::Seconds(30)};
+    watch_hangs_scope.emplace(kShutdownHangDelay);
+  } else {
+    // Start watching for hang during shutdown, and crash it if takes too long.
+    // We disarm when |shutdown_watcher| object is destroyed, which is when we
+    // exit this function.
+    constexpr base::TimeDelta kShutdownHangDelay{base::Seconds(90)};
+    shutdown_watcher.emplace();
+    shutdown_watcher->Arm(kShutdownHangDelay);
+  }
+
+  browser_shutdown::OnShutdownStarting(
+      browser_shutdown::ShutdownType::kEndSession);
+
+  // In a clean shutdown, browser_shutdown::OnShutdownStarting sets
+  // g_shutdown_type, and browser_shutdown::ShutdownPreThreadsStop calls
+  // RecordShutdownInfoPrefs to update the pref with the value. However, here
+  // the process is going to exit without calling ShutdownPreThreadsStop.
+  // Instead, here we call RecordShutdownInfoPrefs to record the shutdown info.
+  browser_shutdown::RecordShutdownInfoPrefs();
+
+  OnClosingAllBrowsers(true);
+
+  // Write important data first.
+  g_browser_process->EndSession();
+
+#if BUILDFLAG(IS_WIN)
+  base::win::SetShouldCrashOnProcessDetach(false);
+#endif  // BUILDFLAG(IS_WIN)
+
+  // On Windows 7 and later, the system will consider the process ripe for
+  // termination as soon as it hides or destroys its windows. Since any
+  // execution past that point will be non-deterministically cut short, we
+  // might as well put ourselves out of that misery deterministically.
+  base::Process::TerminateCurrentProcessImmediately(0);
+}
+
+void ShutdownIfNeeded() {
+  if (browser_shutdown::IsTryingToQuit())
+    return;
+
+  ShutdownIfNoBrowsers();
+}
+
+void OnAppExiting() {
+  static bool notified = false;
+  if (notified)
+    return;
+  notified = true;
+  HandleAppExitingForPlatform();
+}
+
+void OnClosingAllBrowsers(bool closing) {
+  GetClosingAllBrowsersCallbackList().Notify(closing);
+}
+
+base::CallbackListSubscription AddClosingAllBrowsersCallback(
+    base::RepeatingCallback<void(bool)> closing_all_browsers_callback) {
+  return GetClosingAllBrowsersCallbackList().Add(
+      std::move(closing_all_browsers_callback));
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+}  // namespace chrome
diff --git a/chrome/browser/lifetime/application_lifetime_desktop.h b/chrome/browser/lifetime/application_lifetime_desktop.h
new file mode 100644
index 0000000..85e35ca
--- /dev/null
+++ b/chrome/browser/lifetime/application_lifetime_desktop.h
@@ -0,0 +1,102 @@
+// 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_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_
+#define CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_
+
+#include "base/callback.h"
+#include "base/callback_list.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
+
+class Browser;
+
+namespace chrome {
+
+// Starts a user initiated exit process. Called from Browser::Exit.
+// On platforms other than ChromeOS, this is equivalent to
+// CloseAllBrowsers() On ChromeOS, this tells session manager
+// that chrome is signing out, which lets session manager send
+// SIGTERM to start actual exit process.
+void AttemptUserExit();
+
+// Starts a user initiated restart process. On platforms other than
+// chromeos, this sets a restart bit in the preference so that
+// chrome will be restarted at the end of shutdown process. On
+// ChromeOS, this simply exits the chrome, which lets sesssion
+// manager re-launch the browser with restore last session flag.
+void AttemptRestart();
+
+// Starts a user initiated relaunch process. On platforms other than Chrome OS,
+// this is equivalent to AttemptRestart. On Chrome OS, this relaunches the
+// entire OS, instead of just relaunching the browser.
+void AttemptRelaunch();
+
+#if !BUILDFLAG(IS_ANDROID)
+// Starts an administrator-initiated relaunch process. On platforms other than
+// Chrome OS, this relaunches the browser and restores the user's session. On
+// Chrome OS, this restarts the entire OS. This differs from AttemptRelaunch in
+// that all user prompts (e.g., beforeunload handlers and confirmation to abort
+// in-progress downloads) are bypassed.
+void RelaunchIgnoreUnloadHandlers();
+#endif
+
+// Attempt to exit by closing all browsers.  This is equivalent to
+// CloseAllBrowsers() on platforms where the application exits
+// when no more windows are remaining. On other platforms (the Mac),
+// this will additionally exit the application if all browsers are
+// successfully closed.
+//  Note that the exit process may be interrupted by download or
+// unload handler, and the browser may or may not exit.
+void AttemptExit();
+
+// Shutdown chrome cleanly without blocking. This always sets
+// exit-cleanly bit and exits the browser, even if there is
+// ongoing downloads or a page with onbeforeunload handler.
+//
+// If you need to exit or restart in your code on ChromeOS,
+// use AttemptExit or AttemptRestart respectively.
+void ExitIgnoreUnloadHandlers();
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Returns true if any of the above Attempt calls have been called.
+bool IsAttemptingShutdown();
+#endif
+
+#if !BUILDFLAG(IS_ANDROID)
+// Closes all browsers and if successful, quits.
+void CloseAllBrowsersAndQuit();
+
+// Closes all browsers. If the session is ending the windows are closed
+// directly. Otherwise the windows are closed by way of posting a WM_CLOSE
+// message. This will quit the application if there is nothing other than
+// browser windows keeping it alive or the application is quitting.
+void CloseAllBrowsers();
+
+// If there are no browsers open and we aren't already shutting down,
+// initiate a shutdown.
+void ShutdownIfNeeded();
+
+// Begins shutdown of the application when the desktop session is ending.
+void SessionEnding();
+
+// Called once the application is exiting.
+void OnAppExiting();
+
+// Called once the application is exiting to do any platform specific
+// processing required.
+void HandleAppExitingForPlatform();
+
+// Called when the process of closing all browsers starts or is cancelled.
+void OnClosingAllBrowsers(bool closing);
+
+// Registers a callback that will be invoked with true when all browsers start
+// closing, and false if and when that process is cancelled.
+base::CallbackListSubscription AddClosingAllBrowsersCallback(
+    base::RepeatingCallback<void(bool)> closing_all_browsers_callback);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+}  // namespace chrome
+
+#endif  // CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_DESKTOP_H_
diff --git a/chrome/browser/media/webrtc/region_capture_browsertest.cc b/chrome/browser/media/webrtc/region_capture_browsertest.cc
index 0252ebf2..ab609c90 100644
--- a/chrome/browser/media/webrtc/region_capture_browsertest.cc
+++ b/chrome/browser/media/webrtc/region_capture_browsertest.cc
@@ -502,16 +502,8 @@
   EXPECT_TRUE(tab.CropTo("undefined", Frame::kTopLevelDocument));
 }
 
-// TODO(crbug.com/1360552): Flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_CropToForUncroppingAllowedOnUncroppedTracks \
-  DISABLED_CropToForUncroppingAllowedOnUncroppedTracks
-#else
-#define MAYBE_CropToForUncroppingAllowedOnUncroppedTracks \
-  CropToForUncroppingAllowedOnUncroppedTracks
-#endif
 IN_PROC_BROWSER_TEST_F(RegionCaptureBrowserTest,
-                       MAYBE_CropToForUncroppingAllowedOnUncroppedTracks) {
+                       CropToForUncroppingAllowedOnUncroppedTracks) {
   SetUpTest(Frame::kTopLevelDocument, /*self_capture=*/true);
   TabInfo& tab = tabs_[kMainTab];
 
@@ -528,16 +520,8 @@
 // be issued with an earlier crop version. That an actual frame be issued
 // at all, let alone with the new crop version, is not actually required,
 // or else these promises could languish unfulfilled indefinitely.
-// TODO(crbug.com/1361257): Test is flaky on Mac.
-#if BUILDFLAG(IS_MAC)
-#define MAYBE_CropToOfInvisibleElementResolvesInTimelyFashion \
-  DISABLED_CropToOfInvisibleElementResolvesInTimelyFashion
-#else
-#define MAYBE_CropToOfInvisibleElementResolvesInTimelyFashion \
-  CropToOfInvisibleElementResolvesInTimelyFashion
-#endif
 IN_PROC_BROWSER_TEST_F(RegionCaptureBrowserTest,
-                       MAYBE_CropToOfInvisibleElementResolvesInTimelyFashion) {
+                       CropToOfInvisibleElementResolvesInTimelyFashion) {
   SetUpTest(Frame::kTopLevelDocument, /*self_capture=*/true);
   TabInfo& tab = tabs_[kMainTab];
 
diff --git a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
index 2b62106..d14c5cc 100644
--- a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
@@ -43,7 +43,7 @@
               IsPartOfManagedFirstPartySet,
               (const net::SchemefulSite& site),
               (override, const));
-  MOCK_METHOD(bool, IsFirstPartySetsDataAccessManaged, (), (override));
+  MOCK_METHOD(bool, IsFirstPartySetsDataAccessManaged, (), (override, const));
 };
 
 std::unique_ptr<KeyedService> BuildMockPrivacySandboxService(
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
index 0b2a27c6..d9a8a43 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
@@ -312,7 +312,7 @@
   return pref_service_->GetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled);
 }
 
-bool PrivacySandboxService::IsFirstPartySetsDataAccessManaged() {
+bool PrivacySandboxService::IsFirstPartySetsDataAccessManaged() const {
   return pref_service_->IsManagedPreference(
       prefs::kPrivacySandboxFirstPartySetsEnabled);
 }
@@ -665,11 +665,12 @@
 bool PrivacySandboxService::IsPartOfManagedFirstPartySet(
     const net::SchemefulSite& site) const {
   if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) {
-    return GetFirstPartySets()[site] ==
-           net::SchemefulSite(GURL("https://chromium.org"));
+    return IsFirstPartySetsDataAccessManaged() ||
+           GetFirstPartySets()[site] ==
+               net::SchemefulSite(GURL("https://chromium.org"));
   }
   // TODO(crbug.com/1332513): Retrieve set information from FPS delegate.
-  return false;
+  return IsFirstPartySetsDataAccessManaged();
 }
 
 /*static*/ PrivacySandboxService::PromptType
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index 1f4afd2c..677bada 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -172,7 +172,7 @@
   bool IsFirstPartySetsDataAccessEnabled();
 
   // Returns whether the FirstPartySets preference is managed.
-  virtual bool IsFirstPartySetsDataAccessManaged();
+  virtual bool IsFirstPartySetsDataAccessManaged() const;
 
   // Toggles the FirstPartySets preference.
   void SetFirstPartySetsDataAccessEnabled(bool enabled);
@@ -233,8 +233,8 @@
   virtual absl::optional<std::u16string> GetFirstPartySetOwnerForDisplay(
       const GURL& site_url) const;
 
-  // Returns true if `site`'s membership in an FPS is being managed by policy.
-  // Virtual for mocking in tests.
+  // Returns true if `site`'s membership in an FPS is being managed by policy or
+  // if FirstPartySets preference is managed. Virtual for mocking in tests.
   virtual bool IsPartOfManagedFirstPartySet(
       const net::SchemefulSite& site) const;
 
diff --git a/chrome/browser/resources/extensions/manager.html b/chrome/browser/resources/extensions/manager.html
index ec2594bf..8945c4ae 100644
--- a/chrome/browser/resources/extensions/manager.html
+++ b/chrome/browser/resources/extensions/manager.html
@@ -75,13 +75,15 @@
   <cr-lazy-render id="site-permissions">
     <template>
       <extensions-site-permissions delegate="[[delegate]]" slot="view"
+          extensions="[[extensions_]]"
           enable-enhanced-site-controls="[[enableEnhancedSiteControls]]">
       </extensions-site-permissions>
     </template>
   </cr-lazy-render>
   <cr-lazy-render id="site-permissions-by-site">
     <template>
-      <extensions-site-permissions-by-site delegate="[[delegate]]" slot="view">
+      <extensions-site-permissions-by-site delegate="[[delegate]]" slot="view"
+          extensions="[[extensions_]]">
       </extensions-site-permissions-by-site>
     </template>
   </cr-lazy-render>
diff --git a/chrome/browser/resources/extensions/service.ts b/chrome/browser/resources/extensions/service.ts
index b717eb7d..2b1ea32 100644
--- a/chrome/browser/resources/extensions/service.ts
+++ b/chrome/browser/resources/extensions/service.ts
@@ -500,6 +500,11 @@
     });
   }
 
+  getMatchingExtensionsForSite(site: string):
+      Promise<chrome.developerPrivate.MatchingExtensionInfo[]> {
+    return chrome.developerPrivate.getMatchingExtensionsForSite(site);
+  }
+
   getUserSiteSettingsChangedTarget() {
     return chrome.developerPrivate.onUserSiteSettingsChanged;
   }
diff --git a/chrome/browser/resources/extensions/site_permissions.html b/chrome/browser/resources/extensions/site_permissions.html
index fd29573..afa8d0f2 100644
--- a/chrome/browser/resources/extensions/site_permissions.html
+++ b/chrome/browser/resources/extensions/site_permissions.html
@@ -33,11 +33,13 @@
     <div id="site-lists">
       <site-permissions-list
           delegate="[[delegate]]"
+          extensions="[[extensions]]"
           header="$i18n{permittedSites}"
           site-set="[[siteSetEnum_.USER_PERMITTED]]"
           sites="[[permittedSites]]"></site-permissions-list>
       <site-permissions-list
           delegate="[[delegate]]"
+          extensions="[[extensions]]"
           header="$i18n{restrictedSites}"
           site-set="[[siteSetEnum_.USER_RESTRICTED]]"
           sites="[[restrictedSites]]"></site-permissions-list>
diff --git a/chrome/browser/resources/extensions/site_permissions.ts b/chrome/browser/resources/extensions/site_permissions.ts
index b218fed8..477a6fa6 100644
--- a/chrome/browser/resources/extensions/site_permissions.ts
+++ b/chrome/browser/resources/extensions/site_permissions.ts
@@ -37,6 +37,8 @@
 
   static get properties() {
     return {
+      extensions: Array,
+
       siteSetEnum_: {
         type: Object,
         value: chrome.developerPrivate.SiteSet,
@@ -44,6 +46,8 @@
     };
   }
 
+  extensions: chrome.developerPrivate.ExtensionInfo[];
+
   private onAllSitesLinkClick_() {
     navigation.navigateTo({page: Page.SITE_PERMISSIONS_ALL_SITES});
   }
diff --git a/chrome/browser/resources/extensions/site_permissions_by_site.html b/chrome/browser/resources/extensions/site_permissions_by_site.html
index deed7ad..47a8426 100644
--- a/chrome/browser/resources/extensions/site_permissions_by_site.html
+++ b/chrome/browser/resources/extensions/site_permissions_by_site.html
@@ -22,6 +22,7 @@
     <div id="site-groups">
       <template is="dom-repeat" items="[[siteGroups_]]">
         <site-permissions-site-group data="[[item]]" delegate="[[delegate]]"
+            extensions="[[extensions]]"
             list-index="[[index]]">
         </site-permissions-site-group>
       </template>
diff --git a/chrome/browser/resources/extensions/site_permissions_by_site.ts b/chrome/browser/resources/extensions/site_permissions_by_site.ts
index 0b98111..4d96a66 100644
--- a/chrome/browser/resources/extensions/site_permissions_by_site.ts
+++ b/chrome/browser/resources/extensions/site_permissions_by_site.ts
@@ -34,6 +34,7 @@
   static get properties() {
     return {
       delegate: Object,
+      extensions: Array,
 
       siteGroups_: {
         type: Array,
@@ -43,6 +44,7 @@
   }
 
   delegate: ItemDelegate&SiteSettingsDelegate;
+  extensions: chrome.developerPrivate.ExtensionInfo[];
   private siteGroups_: chrome.developerPrivate.SiteGroup[];
 
   override ready() {
diff --git a/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html b/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html
index 4ce6d863..4abbbb0 100644
--- a/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html
+++ b/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html
@@ -1,21 +1,98 @@
-<style include="cr-shared-style">
+<style include="cr-shared-style md-select">
+  :host {
+    --radio-group-height: 132px;
+    --dialog-height: 360px;
+  }
+
   cr-radio-group {
-    width: 100%;
+    height: var(--radio-group-height);
+    padding-inline: 8px;
+  }
+
+  .site-access-list {
+    max-height: var(--dialog-height);
+  }
+
+  .indented-site-access-list {
+    margin-inline-start: 36px;
+    max-height: calc(var(--dialog-height) - var(--radio-group-height));
+  }
+
+  .extension-row {
+    --md-select-width: 180px;
+    align-items: center;
+    border-top: var(--cr-separator-line);
+    display: flex;
+    height: 32px;
+    padding: 12px 0;
+  }
+
+  .extension-row:first-child {
+    border-top: none;
+  }
+
+  .extension-icon {
+    height: 24px;
+    margin-inline-end: 12px;
+    width: 24px;
+  }
+
+  .extension-name {
+    flex-grow: 1;
+    margin-inline-end: 12px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
   }
 </style>
 <cr-dialog id="dialog" show-on-attach>
   <div slot="title">[[computeDialogTitle_(site)]]</div>
+  <div slot="header">
+    <!-- The cr-radio-group is in the header instead of the body slot so it is
+         fixed in place while the list of extensions in the body slot can scroll
+         if the dialog's contents exceed the max height. -->
+    <template is="dom-if" if="[[!matchesSubdomains_(site)]]">
+      <cr-radio-group selected="{{siteSet_}}">
+        <cr-radio-button
+            name="[[siteSetEnum_.USER_PERMITTED]]"
+            label="[[getPermittedSiteLabel_(site)]]">
+        </cr-radio-button>
+        <cr-radio-button
+            name="[[siteSetEnum_.USER_RESTRICTED]]"
+            label="[[getRestrictedSiteLabel_(site)]]">
+        </cr-radio-button>
+        <cr-radio-button
+            name="[[siteSetEnum_.EXTENSION_SPECIFIED]]"
+            label="$i18n{editSitePermissionsCustomizePerExtension}">
+        </cr-radio-button>
+      </cr-radio-group>
+    </template>
+  </div>
   <div slot="body">
-    <cr-radio-group selected="{{siteSet_}}">
-      <cr-radio-button
-          name="[[siteSetEnum_.USER_PERMITTED]]"
-          label="[[getPermittedSiteLabel_(site)]]">
-      </cr-radio-button>
-      <cr-radio-button
-          name="[[siteSetEnum_.USER_RESTRICTED]]"
-          label="[[getRestrictedSiteLabel_(site)]]">
-      </cr-radio-button>
-    </cr-radio-group>
+    <template is="dom-if" if="[[showExtensionSiteAccessData_(siteSet_)]]">
+      <div class$="[[getDialogBodyContainerClass_(site)]]">
+        <template is="dom-repeat" items="[[extensionSiteAccessData_]]">
+          <div class="extension-row">
+            <img class="extension-icon" src="[[item.iconUrl]]" alt="">
+            <span class="extension-name">[[item.name]]</span>
+            <!-- TODO(crbug.com/1253673): Enable these after implementing an API
+                method to edit site access for multiple extensions. -->
+            <select class="extension-host-access md-select"
+                value="[[item.siteAccess]]" disabled>
+              <option value="[[hostAccessEnum_.ON_CLICK]]">
+                $i18n{sitePermissionsOnClick}
+              </option>
+              <option value="[[hostAccessEnum_.ON_SPECIFIC_SITES]]">
+                $i18n{sitePermissionsAlwaysOnThisSite}
+              </option>
+              <option value="[[hostAccessEnum_.ON_ALL_SITES]]">
+                $i18n{sitePermissionsAlwaysOnAllSites}
+              </option>
+            </select>
+          </div>
+        </template>
+      </div>
+    </template>
   </div>
   <div slot="button-container">
     <cr-button class="cancel-button" on-click="onCancelClick_">
diff --git a/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts b/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts
index 7011c59..4975b8c 100644
--- a/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts
+++ b/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts
@@ -7,16 +7,25 @@
 import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
+import 'chrome://resources/cr_elements/md_select.css.js';
 import './strings.m.js';
 
 import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './site_permissions_edit_permissions_dialog.html.js';
 import {SiteSettingsDelegate} from './site_settings_mixin.js';
 
+interface ExtensionSiteAccessInfo {
+  id: string;
+  name: string;
+  iconUrl: string;
+  siteAccess: string;
+}
+
 export interface SitePermissionsEditPermissionsDialogElement {
   $: {
     dialog: CrDialogElement,
@@ -24,6 +33,26 @@
   };
 }
 
+const EXTENSION_SPECIFIED = chrome.developerPrivate.SiteSet.EXTENSION_SPECIFIED;
+
+// A list of possible schemes that can be specified by extension host
+// permissions. This is derived from URLPattern::SchemeMasks.
+const VALID_SCHEMES = [
+  '*',
+  'http',
+  'https',
+  'file',
+  'ftp',
+  'chrome',
+  'chrome-extension',
+  'filesystem',
+  'ftp',
+  'ws',
+  'wss',
+  'data',
+  'uuid-in-package',
+];
+
 const SitePermissionsEditPermissionsDialogElementBase =
     I18nMixin(PolymerElement);
 
@@ -40,10 +69,16 @@
   static get properties() {
     return {
       delegate: Object,
+      extensions: {
+        type: Array,
+        value: () => [],
+        observer: 'onExtensionsUpdated_',
+      },
 
       /**
        * The current siteSet for `site`, as stored in the backend. Specifies
-       * whether `site` is a user specified permitted or restricted site.
+       * whether `site` is a user specified permitted or restricted site, or is
+       * a pattern specified by an extension's host permissions..
        */
       originalSiteSet: String,
 
@@ -56,23 +91,97 @@
        * The temporary siteSet for `site` as displayed in the dialog. Will be
        * saved to the backend when the dialog is submitted.
        */
-      siteSet_: String,
+      siteSet_: {
+        type: String,
+        observer: 'onSiteSetUpdated_',
+      },
 
       siteSetEnum_: {
         type: Object,
         value: chrome.developerPrivate.SiteSet,
       },
+
+      extensionSiteAccessData_: {
+        type: Array,
+        value: () => [],
+      },
+
+      /**
+       * Proxying the enum to be used easily by the html template.
+       */
+      hostAccessEnum_: {
+        type: Object,
+        value: chrome.developerPrivate.HostAccess,
+      },
     };
   }
 
   delegate: SiteSettingsDelegate;
+  extensions: chrome.developerPrivate.ExtensionInfo[];
   originalSiteSet: chrome.developerPrivate.SiteSet;
   site: string;
   private siteSet_: chrome.developerPrivate.SiteSet;
+  private extensionsIdToInfo_:
+      Map<string, chrome.developerPrivate.ExtensionInfo>;
+  private extensionSiteAccessData_: ExtensionSiteAccessInfo[];
 
-  override connectedCallback() {
-    super.connectedCallback();
+  override ready() {
+    super.ready();
     this.siteSet_ = this.originalSiteSet;
+
+    // If `this.site` matches subdomains, then it should not be a user specified
+    // site.
+    assert(
+        !this.matchesSubdomains_() ||
+        this.originalSiteSet === EXTENSION_SPECIFIED);
+
+    this.updateExtensionSiteAccessData_(this.siteSet_);
+  }
+
+  private onExtensionsUpdated_(extensions:
+                                   chrome.developerPrivate.ExtensionInfo[]) {
+    this.extensionsIdToInfo_ = new Map();
+    for (const extension of extensions) {
+      this.extensionsIdToInfo_.set(extension.id, extension);
+    }
+    this.updateExtensionSiteAccessData_(this.siteSet_);
+  }
+
+  private onSiteSetUpdated_(siteSet: chrome.developerPrivate.SiteSet) {
+    this.updateExtensionSiteAccessData_(siteSet);
+  }
+
+  // Returns true if this.site is a just a host by checking whether or not it
+  // starts with a valid scheme. If not, assume the site is a full URL.
+  // Different components that use this dialog may supply either a URL or just a
+  // host.
+  private isSiteHostOnly_(): boolean {
+    return !VALID_SCHEMES.some(scheme => this.site.startsWith(`${scheme}://`));
+  }
+
+  // Fetches all extensions that have requested access to `this.site` along with
+  // their access status. This information is joined with some fields in
+  // `this.extensions` to update `this.extensionSiteAccessData_`.
+  private async updateExtensionSiteAccessData_(
+      siteSet: chrome.developerPrivate.SiteSet) {
+    // Avoid fetching the list of matching extensions if they will not be
+    // displayed.
+    if (siteSet !== EXTENSION_SPECIFIED) {
+      return;
+    }
+
+    const siteToCheck =
+        this.isSiteHostOnly_() ? `*://${this.site}/` : this.site;
+    const matchingExtensionsInfo =
+        await this.delegate.getMatchingExtensionsForSite(siteToCheck);
+    const extensionSiteAccessData: ExtensionSiteAccessInfo[] = [];
+    matchingExtensionsInfo.forEach(({id, siteAccess}) => {
+      assert(this.extensionsIdToInfo_.has(id));
+      const {name, iconUrl} = this.extensionsIdToInfo_.get(id)!;
+      extensionSiteAccessData.push({id, name, iconUrl, siteAccess});
+    });
+
+    this.extensionSiteAccessData_ = extensionSiteAccessData;
   }
 
   private onCancelClick_() {
@@ -85,9 +194,24 @@
       return;
     }
 
-    this.delegate.addUserSpecifiedSites(this.siteSet_, [this.site]).then(() => {
-      this.$.dialog.close();
-    });
+    // If `this.site` has a scheme (and can be considered a full url), use it
+    // as is. Otherwise if `this.site` is just a host, append the http and https
+    // schemes to it.
+    const sitesToChange = this.isSiteHostOnly_() ?
+        [`http://${this.site}`, `https://${this.site}`] :
+        [this.site];
+    if (this.siteSet_ === EXTENSION_SPECIFIED) {
+      this.delegate
+          .removeUserSpecifiedSites(this.originalSiteSet, sitesToChange)
+          .then(() => {
+            this.$.dialog.close();
+          });
+    } else {
+      this.delegate.addUserSpecifiedSites(this.siteSet_, sitesToChange)
+          .then(() => {
+            this.$.dialog.close();
+          });
+    }
   }
 
   private computeDialogTitle_(): string {
@@ -101,6 +225,23 @@
   private getRestrictedSiteLabel_(): string {
     return this.i18n('editSitePermissionsRestrictExtensions', this.site);
   }
+
+  private matchesSubdomains_(): boolean {
+    // Sites that match all subdomains for a given host will specify "*.<host>".
+    // Given how sites are specified as origins for user specified sites and how
+    // extension host permissions are specified, it should be safe to assume
+    // that "*." will only be used to match subdomains.
+    return this.site.includes('*.');
+  }
+
+  private showExtensionSiteAccessData_(): boolean {
+    return this.siteSet_ === EXTENSION_SPECIFIED;
+  }
+
+  private getDialogBodyContainerClass_(): string {
+    return this.matchesSubdomains_() ? 'site-access-list' :
+                                       'indented-site-access-list';
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/extensions/site_permissions_list.html b/chrome/browser/resources/extensions/site_permissions_list.html
index d3eb25f6..fafdb2e 100644
--- a/chrome/browser/resources/extensions/site_permissions_list.html
+++ b/chrome/browser/resources/extensions/site_permissions_list.html
@@ -77,6 +77,7 @@
 <template is="dom-if" if="[[showEditSitePermissionsDialog_]]" restamp>
   <site-permissions-edit-permissions-dialog
       delegate="[[delegate]]"
+      extensions="[[extensions]]"
       site="[[siteToEdit_]]"
       original-site-set="[[siteSet]]"
       on-close="onEditSitePermissionsDialogClose_">
diff --git a/chrome/browser/resources/extensions/site_permissions_list.ts b/chrome/browser/resources/extensions/site_permissions_list.ts
index d8e2314..8d966b5 100644
--- a/chrome/browser/resources/extensions/site_permissions_list.ts
+++ b/chrome/browser/resources/extensions/site_permissions_list.ts
@@ -42,6 +42,7 @@
   static get properties() {
     return {
       delegate: Object,
+      extensions: Array,
       header: String,
       siteSet: String,
       sites: Array,
@@ -68,6 +69,7 @@
   }
 
   delegate: SiteSettingsDelegate;
+  extensions: chrome.developerPrivate.ExtensionInfo[];
   header: string;
   siteSet: chrome.developerPrivate.SiteSet;
   sites: string[];
diff --git a/chrome/browser/resources/extensions/site_permissions_site_group.html b/chrome/browser/resources/extensions/site_permissions_site_group.html
index 14e10cfb..97be162 100644
--- a/chrome/browser/resources/extensions/site_permissions_site_group.html
+++ b/chrome/browser/resources/extensions/site_permissions_site_group.html
@@ -60,10 +60,7 @@
         expanded="{{expanded_}}">
     </cr-expand-button>
   </template>
-  <!-- TODO(crbug.com/1253673): Always show this once the option to edit
-       extension permissions for a site is added for the dialog. -->
-  <template is="dom-if"
-      if="[[showEditSitePermissionsDialogButton_(data)]]">
+  <template is="dom-if" if="[[!isExpandable_]]">
     <cr-icon-button class="subpage-arrow" id="edit-one-site-button"
         on-click="onEditSiteClick_">
     </cr-icon-button>
@@ -78,12 +75,8 @@
         <span class="site">[[item.site]]</span>
         <span class="site-subtext">[[getSiteSubtext_(item)]]</span>
       </div>
-      <!-- TODO(crbug.com/1253673): Always show this once the option to edit
-           extension permissions for a site is added for the dialog. -->
-      <template is="dom-if" if="[[isUserSpecifiedSite_(item.siteSet)]]">
-        <cr-icon-button class="subpage-arrow" on-click="onEditSiteInListClick_">
-        </cr-icon-button>
-      </template>
+      <cr-icon-button class="subpage-arrow" on-click="onEditSiteInListClick_">
+      </cr-icon-button>
     </div>
   </template>
 </div>
@@ -91,6 +84,7 @@
 <template is="dom-if" if="[[showEditSitePermissionsDialog_]]" restamp>
   <site-permissions-edit-permissions-dialog
       delegate="[[delegate]]"
+      extensions="[[extensions]]"
       site="[[siteToEdit_.site]]"
       original-site-set="[[siteToEdit_.siteSet]]"
       on-close="onEditSitePermissionsDialogClose_">
diff --git a/chrome/browser/resources/extensions/site_permissions_site_group.ts b/chrome/browser/resources/extensions/site_permissions_site_group.ts
index 0a29fec..8b2ab8d 100644
--- a/chrome/browser/resources/extensions/site_permissions_site_group.ts
+++ b/chrome/browser/resources/extensions/site_permissions_site_group.ts
@@ -39,6 +39,7 @@
     return {
       data: Object,
       delegate: Object,
+      extensions: Array,
 
       listIndex: {
         type: Number,
@@ -69,6 +70,7 @@
 
   data: chrome.developerPrivate.SiteGroup;
   delegate: SiteSettingsDelegate;
+  extensions: chrome.developerPrivate.ExtensionInfo[];
   listIndex: number;
   private expanded_: boolean;
   private isExpandable_: boolean;
@@ -129,10 +131,6 @@
             'restrictedSites');
   }
 
-  private showEditSitePermissionsDialogButton_(): boolean {
-    return !this.isExpandable_ && !!this.data.sites[0].siteSet;
-  }
-
   private onEditSiteClick_() {
     this.siteToEdit_ = this.data.sites[0];
     this.showEditSitePermissionsDialog_ = true;
diff --git a/chrome/browser/resources/extensions/site_settings_mixin.ts b/chrome/browser/resources/extensions/site_settings_mixin.ts
index 66dd970b..3159942 100644
--- a/chrome/browser/resources/extensions/site_settings_mixin.ts
+++ b/chrome/browser/resources/extensions/site_settings_mixin.ts
@@ -23,6 +23,8 @@
       siteSet: chrome.developerPrivate.SiteSet, hosts: string[]): Promise<void>;
   getUserAndExtensionSitesByEtld():
       Promise<chrome.developerPrivate.SiteGroup[]>;
+  getMatchingExtensionsForSite(site: string):
+      Promise<chrome.developerPrivate.MatchingExtensionInfo[]>;
   getUserSiteSettingsChangedTarget():
       ChromeEvent<(settings: chrome.developerPrivate.UserSiteSettings) => void>;
 }
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
index 2427c407..39a37cd0 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
@@ -79,7 +79,7 @@
             </template>
             <template is="dom-if" if="[[isLink_(dependant.uiType)]]">
               <cr-icon-button class="icon-external"
-                  on-click="onExternalLinkClick_"
+                  on-click="navigateToOtherPageInSettings_"
                   aria-label="[[dependant.label]]">
               </cr-icon-button>
             </template>
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
index 9319ab87..fb811ca 100644
--- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc
+++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -15,6 +15,7 @@
 #include "components/segmentation_platform/embedder/default_model/feed_user_segment.h"
 #include "components/segmentation_platform/embedder/default_model/low_user_engagement_model.h"
 #include "components/segmentation_platform/embedder/default_model/resume_heavy_user_model.h"
+#include "components/segmentation_platform/embedder/default_model/search_user_model.h"
 #include "components/segmentation_platform/embedder/default_model/shopping_user_model.h"
 #include "components/segmentation_platform/internal/config_parser.h"
 #include "components/segmentation_platform/public/config.h"
@@ -57,6 +58,9 @@
 constexpr int kFeedUserSegmentSelectionTTLDays = 14;
 constexpr int kFeedUserSegmentUnknownSelectionTTLDays = 14;
 
+constexpr int kSearchUserSegmentSelectionTTLDays = 7;
+constexpr int kSearchUserSegmentUnknownSelectionTTLDays = 7;
+
 constexpr int kShoppingUserDefaultSelectionTTLDays = 7;
 constexpr int kShoppingUserDefaultUnknownSelectionTTLDays = 7;
 
@@ -318,6 +322,38 @@
   return config;
 }
 
+bool IsSearchUserModelEnabled() {
+  return base::FeatureList::IsEnabled(
+      features::kSegmentationPlatformSearchUser);
+}
+
+std::unique_ptr<ModelProvider> GetSearchUserDefaultModel() {
+  if (!base::GetFieldTrialParamByFeatureAsBool(
+          features::kSegmentationPlatformSearchUser, kDefaultModelEnabledParam,
+          true)) {
+    return nullptr;
+  }
+  return std::make_unique<SearchUserModel>();
+}
+
+std::unique_ptr<Config> GetConfigForSearchUserModel() {
+  auto config = std::make_unique<Config>();
+  config->segmentation_key = kSearchUserKey;
+  config->segmentation_uma_name = kSearchUserUmaName;
+  config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER,
+                       GetSearchUserDefaultModel());
+  config->segment_selection_ttl =
+      base::Days(base::GetFieldTrialParamByFeatureAsInt(
+          features::kSegmentationPlatformSearchUser,
+          "segment_selection_ttl_days", kSearchUserSegmentSelectionTTLDays));
+  config->unknown_selection_ttl =
+      base::Days(base::GetFieldTrialParamByFeatureAsInt(
+          features::kSegmentationPlatformSearchUser,
+          "unknown_selection_ttl_days",
+          kSearchUserSegmentUnknownSelectionTTLDays));
+  return config;
+}
+
 std::unique_ptr<ModelProvider> GetShoppingUserDefaultModel() {
   if (!base::GetFieldTrialParamByFeatureAsBool(
           features::kShoppingUserSegmentFeature, kDefaultModelEnabledParam,
@@ -393,6 +429,9 @@
     configs.emplace_back(GetConfigForPowerUser());
   }
 #endif
+  if (IsSearchUserModelEnabled()) {
+    configs.emplace_back(GetConfigForSearchUserModel());
+  }
   if (IsLowEngagementFeatureEnabled()) {
     configs.emplace_back(GetConfigForChromeLowUserEngagement());
   }
@@ -478,6 +517,9 @@
   if (segment_id == SegmentId::CROSS_DEVICE_USER_SEGMENT) {
     group_name = CrossDeviceUserSegment::GetSubsegmentName(subsegment_rank);
   }
+  if (segment_id == SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER) {
+    group_name = SearchUserModel::GetSubsegmentName(subsegment_rank);
+  }
 
   if (!group_name) {
     return;
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
index d9b2812..324ec44 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninManager.java
@@ -44,6 +44,9 @@
          * Invoked once all startup checks are done and signing-in becomes allowed, or disallowed.
          */
         default void onSignInAllowedChanged() {}
+
+        /** Notifies observers when {@link #isSignOutAllowed()} value changes. */
+        default void onSignOutAllowedChanged() {}
     }
 
     /**
@@ -176,7 +179,6 @@
 
     /**
      * Returns true if sign out can be started now.
-     * TODO(https://crbug.com/1334918): Add onSignOutAllowedChanged() in SignInStateObserver
      */
     boolean isSignOutAllowed();
 
diff --git a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutDetailScreenViewTest.java b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutDetailScreenViewTest.java
index 06af3306..9f63825e 100644
--- a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutDetailScreenViewTest.java
+++ b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutDetailScreenViewTest.java
@@ -34,7 +34,6 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
@@ -68,8 +67,6 @@
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-    @Rule
     public ActivityScenarioRule<TestActivity> mActivityScenarioRule =
             new ActivityScenarioRule<>(TestActivity.class);
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java
index d5fd419..8d139def 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java
@@ -83,9 +83,6 @@
     public final AccountManagerTestRule mAccountManagerTestRule =
             new AccountManagerTestRule(mFakeAccountManagerFacade);
 
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Mock
     GSAState mGsaState;
     @Mock
diff --git a/chrome/browser/ui/app_list/search/files/drive_file_suggestion_provider.cc b/chrome/browser/ui/app_list/search/files/drive_file_suggestion_provider.cc
index 551301e..de0a126 100644
--- a/chrome/browser/ui/app_list/search/files/drive_file_suggestion_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/drive_file_suggestion_provider.cc
@@ -8,6 +8,7 @@
 #include "ash/constants/ash_pref_names.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -209,10 +210,14 @@
     if (!path_or_error->is_path())
       continue;
 
+    absl::optional<std::u16string> reason;
+    if (raw_suggest_results[index].prediction_reason)
+      reason = base::UTF8ToUTF16(
+          raw_suggest_results[index].prediction_reason.value());
     suggest_results.emplace_back(
         FileSuggestionType::kDriveFile,
-        ReparentToDriveMount(path_or_error->get_path(), drive_service_),
-        raw_suggest_results[index].prediction_reason);
+        ReparentToDriveMount(path_or_error->get_path(), drive_service_), reason,
+        /*score=*/absl::nullopt);
   }
 
   // Validation fails on each file, so return early.
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
index 0d8070f..b1c2337 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.cc
@@ -98,10 +98,10 @@
 }
 
 bool FileSuggestKeyedService::HasPendingSuggestionFetchForTest() const {
-  // TODO(https://crbug.com/1352516): modify this code when local file
-  // suggestions are supported.
   return drive_file_suggestion_provider_
-      ->HasPendingDriveSuggestionFetchForTest();
+             ->HasPendingDriveSuggestionFetchForTest() ||
+         local_file_suggestion_provider_
+             ->HasPendingLocalSuggestionFetchForTest();
 }
 
 void FileSuggestKeyedService::OnSuggestionProviderUpdated(
@@ -111,9 +111,8 @@
 }
 
 bool FileSuggestKeyedService::IsReadyForTest() const {
-  // TODO(https://crbug.com/1352515): check whether local file suggestions are
-  // ready when local file suggestions are supported by the service.
-  return proto_.initialized();
+  return local_file_suggestion_provider_->IsInitializedForTest() &&
+         proto_.initialized();
 }
 
 void FileSuggestKeyedService::FilterRemovedSuggestions(
@@ -142,7 +141,7 @@
     ReadStatus read_status) {
   OnSuggestionProviderUpdated(FileSuggestionType::kDriveFile);
 
-  // TODO(https://crbug.com/1352515): check whether local file suggestions are
+  // TODO(https://crbug.com/1369418): check whether local file suggestions are
   // ready when local file suggestions are supported by the service.
   OnSuggestionProviderUpdated(FileSuggestionType::kLocalFile);
 }
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
index b919efbf0..0d1f763 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h
@@ -87,6 +87,10 @@
     return drive_file_suggestion_provider_.get();
   }
 
+  LocalFileSuggestionProvider* local_file_suggestion_provider_for_test() {
+    return local_file_suggestion_provider_.get();
+  }
+
  protected:
   // Called whenever a suggestion provider updates.
   void OnSuggestionProviderUpdated(FileSuggestionType type);
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_browsertest.cc b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_browsertest.cc
index 2d280f6..f0ead22 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_browsertest.cc
@@ -158,7 +158,7 @@
     EXPECT_TRUE(fetched_data.has_value());
     EXPECT_EQ(1u, fetched_data->size());
     EXPECT_EQ(absolute_file_path1, fetched_data->at(0).file_path);
-    EXPECT_EQ("prediction reason 1", *fetched_data->at(0).prediction_reason);
+    EXPECT_EQ(u"prediction reason 1", *fetched_data->at(0).prediction_reason);
     tester.ExpectBucketCount("Ash.Search.DriveFileSuggestDataValidation.Status",
                              /*sample=*/DriveSuggestValidationStatus::kOk,
                              /*expected_count=*/1);
@@ -187,9 +187,9 @@
     EXPECT_TRUE(fetched_data.has_value());
     EXPECT_EQ(2u, fetched_data->size());
     EXPECT_EQ(absolute_file_path1, fetched_data->at(0).file_path);
-    EXPECT_EQ("prediction reason 1", *fetched_data->at(0).prediction_reason);
+    EXPECT_EQ(u"prediction reason 1", *fetched_data->at(0).prediction_reason);
     EXPECT_EQ(absolute_file_path2, fetched_data->at(1).file_path);
-    EXPECT_EQ("prediction reason 2", *fetched_data->at(1).prediction_reason);
+    EXPECT_EQ(u"prediction reason 2", *fetched_data->at(1).prediction_reason);
   }
 }
 
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.cc b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.cc
index df12d73..2a54201 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h"
 
 #include "chrome/browser/ash/drive/drive_integration_service.h"
+#include "chrome/browser/ash/file_manager/file_tasks_notifier_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h"
 #include "chrome/browser/ui/app_list/search/ranking/util.h"
@@ -23,6 +24,7 @@
           "FileSuggestKeyedService",
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(drive::DriveIntegrationServiceFactory::GetInstance());
+  DependsOn(file_manager::file_tasks::FileTasksNotifierFactory::GetInstance());
 }
 
 FileSuggestKeyedServiceFactory::~FileSuggestKeyedServiceFactory() = default;
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_unittest.cc b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_unittest.cc
index a36790d..496558a 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_unittest.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_unittest.cc
@@ -105,9 +105,11 @@
   file_suggest_service_->SetSuggestionsForType(
       /*type=*/FileSuggestionType::kDriveFile,
       /*suggestions=*/{{FileSuggestionType::kDriveFile, path1,
-                        /*new_prediction_reason=*/absl::nullopt},
+                        /*new_prediction_reason=*/absl::nullopt,
+                        /*new_score=*/absl::nullopt},
                        {FileSuggestionType::kDriveFile, path2,
-                        /*new_prediction_reason=*/absl::nullopt}});
+                        /*new_prediction_reason=*/absl::nullopt,
+                        /*new_score=*/absl::nullopt}});
 
   absl::optional<std::vector<FileSuggestData>> suggestions =
       GetSuggestionsForType(FileSuggestionType::kDriveFile);
@@ -131,9 +133,11 @@
   file_suggest_service_->SetSuggestionsForType(
       /*type=*/FileSuggestionType::kLocalFile,
       /*suggestions=*/{{FileSuggestionType::kLocalFile, path3,
-                        /*new_prediction_reason=*/absl::nullopt},
+                        /*new_prediction_reason=*/absl::nullopt,
+                        /*new_score=*/absl::nullopt},
                        {FileSuggestionType::kLocalFile, path4,
-                        /*new_prediction_reason=*/absl::nullopt}});
+                        /*new_prediction_reason=*/absl::nullopt,
+                        /*new_score=*/absl::nullopt}});
   suggestions = GetSuggestionsForType(FileSuggestionType::kLocalFile);
   EXPECT_EQ(2u, suggestions->size());
   EXPECT_EQ("file3", suggestions->at(0).file_path.value());
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_util.cc b/chrome/browser/ui/app_list/search/files/file_suggest_util.cc
index d59bc7c8..a586fd1 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_util.cc
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_util.cc
@@ -30,11 +30,13 @@
 FileSuggestData::FileSuggestData(
     FileSuggestionType new_type,
     const base::FilePath& new_file_path,
-    const absl::optional<std::string>& new_prediction_reason)
+    const absl::optional<std::u16string>& new_prediction_reason,
+    absl::optional<float> new_score)
     : type(new_type),
       file_path(new_file_path),
       id(GetPrefixFromSuggestionType(type) + file_path.value()),
-      prediction_reason(new_prediction_reason) {}
+      prediction_reason(new_prediction_reason),
+      score(new_score) {}
 
 FileSuggestData::FileSuggestData(FileSuggestData&&) = default;
 
diff --git a/chrome/browser/ui/app_list/search/files/file_suggest_util.h b/chrome/browser/ui/app_list/search/files/file_suggest_util.h
index f7f36329..a79360d8 100644
--- a/chrome/browser/ui/app_list/search/files/file_suggest_util.h
+++ b/chrome/browser/ui/app_list/search/files/file_suggest_util.h
@@ -41,7 +41,8 @@
 struct FileSuggestData {
   FileSuggestData(FileSuggestionType new_type,
                   const base::FilePath& new_file_path,
-                  const absl::optional<std::string>& new_prediction_reason);
+                  const absl::optional<std::u16string>& new_prediction_reason,
+                  absl::optional<float> new_score);
   FileSuggestData(FileSuggestData&&);
   FileSuggestData(const FileSuggestData&);
   FileSuggestData& operator=(const FileSuggestData&);
@@ -57,7 +58,10 @@
   std::string id;
 
   // The reason why the file is suggested.
-  absl::optional<std::string> prediction_reason;
+  absl::optional<std::u16string> prediction_reason;
+
+  // Only has a value when `type` == `FileSuggestionType::kLocalFile`.
+  absl::optional<float> score;
 };
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.cc b/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.cc
index 2b0c924..86b8c02ee 100644
--- a/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.cc
@@ -3,32 +3,195 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h"
-#include "base/notreached.h"
+
+#include <vector>
+
+#include "ash/constants/ash_features.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/functional/bind.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/time/time.h"
+#include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggest_util.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggestion_provider.h"
+#include "chrome/browser/ui/app_list/search/files/justifications.h"
+#include "chrome/browser/ui/app_list/search/ranking/util.h"
+#include "chrome/browser/ui/app_list/search/util/mrfu_cache.h"
 
 namespace app_list {
 
+namespace {
+constexpr base::TimeDelta kSaveDelay = base::Seconds(3);
+constexpr base::TimeDelta kSuggestionNotificationDebounce =
+    base::Milliseconds(100);
+
+// Given the output of MrfuCache::GetAll, partition files into valid and invalid
+// files. Valid files are files that:
+// - Exist on-disk
+// - Have been modified in the last |max_last_modified_time| days
+std::pair<std::vector<LocalFileSuggestionProvider::LocalFileData>,
+          std::vector<base::FilePath>>
+ValidateFiles(const std::vector<std::pair<std::string, float>>& ranker_results,
+              const base::TimeDelta& max_last_modified_time,
+              const base::FilePath& downloads_path) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::MAY_BLOCK);
+
+  std::vector<LocalFileSuggestionProvider::LocalFileData> valid_results;
+  std::vector<base::FilePath> invalid_results;
+  const base::Time now = base::Time::Now();
+  for (const auto& path_score : ranker_results) {
+    // We use FilePath::FromUTF8Unsafe to decode the filepath string. As per its
+    // documentation, this is a safe use of the function because
+    // LocalFileSuggestionProvider is only used on ChromeOS, for which filepaths
+    // are UTF8.
+    const auto& path = base::FilePath::FromUTF8Unsafe(path_score.first);
+    base::File::Info info;
+    if (base::PathExists(path) && base::GetFileInfo(path, &info) &&
+        (now - info.last_modified <= max_last_modified_time)) {
+      valid_results.emplace_back(LocalFileSuggestionProvider::LocalFileData{
+          path_score.second, path, info});
+    } else {
+      invalid_results.emplace_back(path);
+    }
+  }
+  return {valid_results, invalid_results};
+}
+
+}  // anonymous namespace
+
 LocalFileSuggestionProvider::LocalFileSuggestionProvider(
     Profile* profile,
     base::RepeatingCallback<void(FileSuggestionType)> notify_update_callback)
-    : FileSuggestionProvider(notify_update_callback) {}
+    : FileSuggestionProvider(notify_update_callback),
+      profile_(profile),
+      max_last_modified_time_(base::Days(base::GetFieldTrialParamByFeatureAsInt(
+          ash::features::kProductivityLauncher,
+          "max_last_modified_time",
+          8))),
+      downloads_path_(
+          file_manager::util::GetDownloadsFolderForProfile(profile)) {
+  task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
+      {base::TaskPriority::USER_BLOCKING, base::MayBlock(),
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
+
+  auto* notifier =
+      file_manager::file_tasks::FileTasksNotifier::GetForProfile(profile);
+
+  if (notifier) {
+    file_tasks_observer_.Observe(notifier);
+
+    MrfuCache::Params params;
+    // 5 consecutive clicks to get a new file to a score of 0.8, and 10 clicks
+    // on other files to reduce its score by half.
+    params.half_life = 10.0f;
+    params.boost_factor = 5.0f;
+    MrfuCache::Proto proto(
+        RankerStateDirectory(profile).AppendASCII("zero_state_local_files.pb"),
+        kSaveDelay);
+    proto.RegisterOnRead(
+        base::BindOnce(&LocalFileSuggestionProvider::OnProtoInitialized,
+                       base::Unretained(this)));
+    files_ranker_ = std::make_unique<MrfuCache>(std::move(proto), params);
+  }
+}
 
 LocalFileSuggestionProvider::~LocalFileSuggestionProvider() = default;
 
 void LocalFileSuggestionProvider::GetSuggestFileData(
     GetSuggestFileDataCallback callback) {
-  // TODO(): Add the callback to a CallbackList to be called when validation is
-  // complete, and fire off validation if it's not already in progress. This
-  // approach makes sure we won't have issues if multiple clients request data
-  // in rapid succession.
-  std::move(callback).Run(absl::nullopt);
+  if (!files_ranker_ || !files_ranker_->initialized()) {
+    std::move(callback).Run(absl::nullopt);
+    return;
+  }
+
+  if (!on_validation_complete_callback_list_.empty()) {
+    on_validation_complete_callback_list_.AddUnsafe(std::move(callback));
+    return;
+  }
+
+  on_validation_complete_callback_list_.AddUnsafe(std::move(callback));
+
+  task_runner_->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(&ValidateFiles, files_ranker_->GetAll(),
+                     max_last_modified_time_, downloads_path_),
+      base::BindOnce(&LocalFileSuggestionProvider::OnValidationComplete,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void LocalFileSuggestionProvider::OnFilesOpened(
     const std::vector<FileOpenEvent>& file_opens) {
-  // TODO: Add all applicable files to `files_ranker_`, then call
-  // `NotifySuggestionsUpdate`, limited by a debounce timer to prevent
-  // issues with multiple files being opened at once.
-  NOTIMPLEMENTED();
+  if (!files_ranker_)
+    return;
+
+  const auto& profile_path = profile_->GetPath();
+  for (const auto& file_open : file_opens) {
+    // Filter out file opens if:
+    // 1. The open event is not a kLaunch or a kOpen.
+    if (file_open.open_type != FileTasksObserver::OpenType::kLaunch &&
+        file_open.open_type != FileTasksObserver::OpenType::kOpen) {
+      continue;
+    }
+
+    // 2. The open relates to a Drive file, which is handled by another
+    // provider. Filter this out by checking if the file resides in the user's
+    // cryptohome.
+    if (!profile_path.AppendRelativePath(file_open.path, nullptr))
+      continue;
+
+    files_ranker_->Use(file_open.path.value());
+  }
+
+  if (!queued_notification_.IsRunning()) {
+    queued_notification_.Start(
+        FROM_HERE, kSuggestionNotificationDebounce,
+        base::BindOnce(&LocalFileSuggestionProvider::NotifySuggestionUpdate,
+                       weak_factory_.GetWeakPtr(),
+                       FileSuggestionType::kLocalFile));
+  }
+}
+
+bool LocalFileSuggestionProvider::HasPendingLocalSuggestionFetchForTest()
+    const {
+  return !on_validation_complete_callback_list_.empty();
+}
+
+bool LocalFileSuggestionProvider::IsInitializedForTest() const {
+  return files_ranker_ && files_ranker_->initialized();
+}
+
+void LocalFileSuggestionProvider::OnProtoInitialized(ReadStatus status) {
+  NotifySuggestionUpdate(FileSuggestionType::kLocalFile);
+}
+
+void LocalFileSuggestionProvider::OnValidationComplete(
+    std::pair<std::vector<LocalFileData>, std::vector<base::FilePath>>
+        results) {
+  // Delete invalid results from the ranker.
+  for (const base::FilePath& path : results.second)
+    files_ranker_->Delete(path.value());
+
+  std::vector<FileSuggestData> final_results;
+  for (auto& result : results.first) {
+    final_results.emplace_back(
+        FileSuggestionType::kLocalFile, result.path,
+        GetJustificationString(result.info.last_accessed,
+                               result.info.last_modified),
+        result.score);
+  }
+
+  // Sort valid results high-to-low by score.
+  std::sort(final_results.begin(), final_results.end(),
+            [](const auto& a, const auto& b) {
+              return a.score.value() > b.score.value();
+            });
+
+  on_validation_complete_callback_list_.Notify(final_results);
+  DCHECK(on_validation_complete_callback_list_.empty());
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h b/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h
index 1767d50d..70288ee0 100644
--- a/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h
+++ b/chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_APP_LIST_SEARCH_FILES_LOCAL_FILE_SUGGESTION_PROVIDER_H_
 
 #include "base/callback_list.h"
+#include "base/files/file_path.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "base/time/time.h"
@@ -25,6 +26,12 @@
     : public FileSuggestionProvider,
       public file_manager::file_tasks::FileTasksObserver {
  public:
+  struct LocalFileData {
+    float score;
+    base::FilePath path;
+    base::File::Info info;
+  };
+
   LocalFileSuggestionProvider(
       Profile* profile,
       base::RepeatingCallback<void(FileSuggestionType)> notify_update_callback);
@@ -38,6 +45,46 @@
 
   // file_manager::file_tasks::FileTaskObserver:
   void OnFilesOpened(const std::vector<FileOpenEvent>& file_opens) override;
+
+  // Returns true if there is pending fetch on file suggestions.
+  bool HasPendingLocalSuggestionFetchForTest() const;
+
+  // Returns true if the MrfuCache is initialized.
+  bool IsInitializedForTest() const;
+
+ private:
+  void OnProtoInitialized(ReadStatus status);
+  void OnValidationComplete(std::pair<std::vector<LocalFileData>,
+                                      std::vector<base::FilePath>> results);
+
+  const Profile* profile_;
+
+  // Any file not modified at least as recently as `max_last_modified_time_` ago
+  // will be filtered out of results.
+  const base::TimeDelta max_last_modified_time_;
+
+  const base::FilePath downloads_path_;
+
+  std::unique_ptr<MrfuCache> files_ranker_;
+
+  // After a file is opened, if this timer is not running, we set it to run for
+  // a brief delay and then call `NotifySuggestionUpdate()`. This debounces file
+  // open events to prevent us from calling it many times instantly when many
+  // files are opened at once.
+  base::OneShotTimer queued_notification_;
+
+  // Callbacks awaiting validation completion. This prevents issues in the event
+  // that multiple clients request results simultaneously.
+  base::OnceCallbackList<GetSuggestFileDataCallback::RunType>
+      on_validation_complete_callback_list_;
+
+  base::ScopedObservation<file_manager::file_tasks::FileTasksNotifier,
+                          file_manager::file_tasks::FileTasksObserver>
+      file_tasks_observer_{this};
+
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+
+  base::WeakPtrFactory<LocalFileSuggestionProvider> weak_factory_{this};
 };
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
index 864b2e5..0efed09 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
@@ -213,11 +213,11 @@
 std::unique_ptr<FileResult> ZeroStateDriveProvider::MakeListResult(
     const std::string& result_id,
     const base::FilePath& filepath,
-    const absl::optional<std::string>& prediction_reason,
+    const absl::optional<std::u16string>& prediction_reason,
     const float relevance) {
   absl::optional<std::u16string> details;
   if (prediction_reason && ash::features::IsProductivityLauncherEnabled())
-    details = base::UTF8ToUTF16(prediction_reason.value());
+    details = prediction_reason.value();
 
   auto result = std::make_unique<FileResult>(
       result_id, filepath, details,
@@ -234,10 +234,8 @@
 }
 
 void ZeroStateDriveProvider::OnFileSuggestionUpdated(FileSuggestionType type) {
-  if (type != FileSuggestionType::kDriveFile)
-    return;
-
-  StartZeroState();
+  if (type == FileSuggestionType::kDriveFile)
+    StartZeroState();
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
index 4feede4..6f455d7 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
+++ b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
@@ -74,7 +74,7 @@
   std::unique_ptr<FileResult> MakeListResult(
       const std::string& result_id,
       const base::FilePath& filepath,
-      const absl::optional<std::string>& prediction_reason,
+      const absl::optional<std::u16string>& prediction_reason,
       const float relevance);
 
   // Requests an update from the ItemSuggestCache, but only if the call is long
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
index 00df358..d62f223 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
@@ -17,19 +17,16 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/task_runner_util.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/time/time.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
-#include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/search/files/file_result.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggest_util.h"
 #include "chrome/browser/ui/app_list/search/files/justifications.h"
-#include "chrome/browser/ui/app_list/search/ranking/util.h"
-#include "chrome/browser/ui/app_list/search/util/persistent_proto.h"
 #include "components/drive/drive_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -41,7 +38,6 @@
 
 constexpr char kSchema[] = "zero_state_file://";
 constexpr size_t kMaxLocalFiles = 10u;
-constexpr base::TimeDelta kSaveDelay = base::Seconds(3);
 
 // Screenshots are identified as files that match ScreenshotXXX.png in the
 // Downloads folder.
@@ -51,40 +47,6 @@
          path.BaseName().value().rfind("Screenshot", 0) == 0;
 }
 
-// Given the output of MrfuCache::GetAll, partition files into valid and invalid
-// files. Valid files are files that:
-// - Exist on-disk
-// - Have been modified in the last |max_last_modified_time| days
-// - Are not screenshots.
-ZeroStateFileProvider::ValidAndInvalidResults ValidateFiles(
-    const std::vector<std::pair<std::string, float>>& ranker_results,
-    const base::TimeDelta& max_last_modified_time,
-    const base::FilePath& downloads_path) {
-  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
-                                                base::BlockingType::MAY_BLOCK);
-
-  std::vector<ZeroStateFileProvider::FileInfo> valid_results;
-  std::vector<base::FilePath> invalid_results;
-  const base::Time now = base::Time::Now();
-  for (const auto& path_score : ranker_results) {
-    // We use FilePath::FromUTF8Unsafe to decode the filepath string. As per its
-    // documentation, this is a safe use of the function because
-    // ZeroStateFileProvider is only used on ChromeOS, for which filepaths are
-    // UTF8.
-    const auto& path = base::FilePath::FromUTF8Unsafe(path_score.first);
-    base::File::Info info;
-    if (base::PathExists(path) && base::GetFileInfo(path, &info) &&
-        (now - info.last_modified <= max_last_modified_time) &&
-        !IsScreenshot(path, downloads_path)) {
-      valid_results.emplace_back(path, path_score.second, info.last_accessed,
-                                 info.last_modified);
-    } else {
-      invalid_results.emplace_back(path);
-    }
-  }
-  return {valid_results, invalid_results};
-}
-
 // TODO(crbug.com/1258415): This exists to reroute results depending on which
 // launcher is enabled, and should be removed after the new launcher launch.
 ash::SearchResultDisplayType GetDisplayType() {
@@ -99,58 +61,15 @@
 
 }  // namespace
 
-ZeroStateFileProvider::FileInfo::FileInfo(const base::FilePath& path,
-                                          float score,
-                                          const base::Time& last_accessed,
-                                          const base::Time& last_modified)
-    : path(path),
-      score(score),
-      last_accessed(last_accessed),
-      last_modified(last_modified) {}
-
-ZeroStateFileProvider::FileInfo::~FileInfo() = default;
-
 ZeroStateFileProvider::ZeroStateFileProvider(Profile* profile)
     : profile_(profile),
       thumbnail_loader_(profile),
-      max_last_modified_time_(base::Days(base::GetFieldTrialParamByFeatureAsInt(
-          ash::features::kProductivityLauncher,
-          "max_last_modified_time",
-          8))),
+      file_suggest_service_(
+          FileSuggestKeyedServiceFactory::GetInstance()->GetService(profile)),
       downloads_path_(
           file_manager::util::GetDownloadsFolderForProfile(profile)) {
   DCHECK(profile_);
-  task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
-      {base::TaskPriority::USER_BLOCKING, base::MayBlock(),
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
-
-  auto* notifier =
-      file_manager::file_tasks::FileTasksNotifier::GetForProfile(profile_);
-
-  if (notifier) {
-    file_tasks_observer_.Observe(notifier);
-
-    MrfuCache::Params params;
-    // 5 consecutive clicks to get a new file to a score of 0.8, and 10 clicks
-    // on other files to reduce its score by half.
-    params.half_life = 10.0f;
-    params.boost_factor = 5.0f;
-    MrfuCache::Proto proto(
-        RankerStateDirectory(profile).AppendASCII("zero_state_local_files.pb"),
-        kSaveDelay);
-    proto.RegisterOnRead(base::BindOnce(
-        &ZeroStateFileProvider::OnProtoInitialized, base::Unretained(this)));
-    files_ranker_ = std::make_unique<MrfuCache>(std::move(proto), params);
-  }
-}
-
-void ZeroStateFileProvider::OnProtoInitialized(ReadStatus status) {
-  base::PostTaskAndReplyWithResult(
-      task_runner_.get(), FROM_HERE,
-      base::BindOnce(&ValidateFiles, files_ranker_->GetAll(),
-                     max_last_modified_time_, downloads_path_),
-      base::BindOnce(&ZeroStateFileProvider::SetSearchResults,
-                     weak_factory_.GetWeakPtr()));
+  file_suggest_service_observation_.Observe(file_suggest_service_);
 }
 
 ZeroStateFileProvider::~ZeroStateFileProvider() = default;
@@ -173,46 +92,44 @@
 
   // Despite this being for zero-state _local_ files only, we disable all
   // results in the Continue section if Drive is disabled.
-  if (!files_ranker_ || IsDriveDisabled(profile_)) {
+  if (IsDriveDisabled(profile_)) {
     return;
   }
 
-  base::PostTaskAndReplyWithResult(
-      task_runner_.get(), FROM_HERE,
-      base::BindOnce(&ValidateFiles, files_ranker_->GetAll(),
-                     max_last_modified_time_, downloads_path_),
-      base::BindOnce(&ZeroStateFileProvider::SetSearchResults,
+  file_suggest_service_->GetSuggestFileData(
+      FileSuggestionType::kLocalFile,
+      base::BindOnce(&ZeroStateFileProvider::OnSuggestFileDataFetched,
                      weak_factory_.GetWeakPtr()));
 }
 
-void ZeroStateFileProvider::SetSearchResults(ValidAndInvalidResults results) {
-  // Delete invalid results from the ranker.
-  for (const base::FilePath& path : results.second)
-    files_ranker_->Delete(path.value());
+void ZeroStateFileProvider::OnSuggestFileDataFetched(
+    const absl::optional<std::vector<FileSuggestData>>& suggest_results) {
+  if (suggest_results)
+    SetSearchResults(*suggest_results);
+}
 
-  // Sort valid results high-to-low by score.
-  auto& valid_results = results.first;
-  std::sort(valid_results.begin(), valid_results.end(),
-            [](const auto& a, const auto& b) { return a.score > b.score; });
-
+void ZeroStateFileProvider::SetSearchResults(
+    const std::vector<FileSuggestData>& results) {
   // Use valid results for search results.
   SearchProvider::Results new_results;
-  for (size_t i = 0; i < std::min(valid_results.size(), kMaxLocalFiles); ++i) {
-    const auto& filepath = valid_results[i].path;
-    const double score = valid_results[i].score;
-    const absl::optional<std::u16string> details = GetJustificationString(
-        valid_results[i].last_accessed, valid_results[i].last_modified);
-    auto result = std::make_unique<FileResult>(
-        /*id=*/kSchema + filepath.value(), filepath, details,
-        ash::AppListSearchResultType::kZeroStateFile, GetDisplayType(), score,
-        std::u16string(), FileResult::Type::kFile, profile_);
-    // TODO(crbug.com/1258415): Only generate thumbnails if the old launcher is
-    // enabled. We should implement new thumbnail logic for Continue results if
-    // necessary.
-    if (result->display_type() == ash::SearchResultDisplayType::kList) {
-      result->RequestThumbnail(&thumbnail_loader_);
+  for (size_t i = 0; i < std::min(results.size(), kMaxLocalFiles); ++i) {
+    const auto& filepath = results[i].file_path;
+    if (!IsScreenshot(filepath, downloads_path_)) {
+      DCHECK(results[i].score.has_value());
+      auto result = std::make_unique<FileResult>(
+          /*id=*/kSchema + filepath.value(), filepath,
+          results[i].prediction_reason,
+          ash::AppListSearchResultType::kZeroStateFile, GetDisplayType(),
+          results[i].score.value(), std::u16string(), FileResult::Type::kFile,
+          profile_);
+      // TODO(crbug.com/1258415): Only generate thumbnails if the old launcher
+      // is enabled. We should implement new thumbnail logic for Continue
+      // results if necessary.
+      if (result->display_type() == ash::SearchResultDisplayType::kList) {
+        result->RequestThumbnail(&thumbnail_loader_);
+      }
+      new_results.push_back(std::move(result));
     }
-    new_results.push_back(std::move(result));
   }
 
   if (app_list_features::IsForceShowContinueSectionEnabled())
@@ -223,31 +140,6 @@
   SwapResults(&new_results);
 }
 
-void ZeroStateFileProvider::OnFilesOpened(
-    const std::vector<FileOpenEvent>& file_opens) {
-  if (!files_ranker_)
-    return;
-
-  const auto& profile_path = profile_->GetPath();
-  for (const auto& file_open : file_opens) {
-    // Filter out file opens if:
-    // 1. The open event is not a kLaunch or a kOpen.
-    if (file_open.open_type != FileTasksObserver::OpenType::kLaunch &&
-        file_open.open_type != FileTasksObserver::OpenType::kOpen) {
-      continue;
-    }
-
-    // 2. The open relates to a Drive file, which is handled by another
-    // provider. Filter this out by checking if the file resides in the user's
-    // cryptohome.
-    if (!profile_path.AppendRelativePath(file_open.path, nullptr)) {
-      continue;
-    }
-
-    files_ranker_->Use(file_open.path.value());
-  }
-}
-
 void ZeroStateFileProvider::AppendFakeSearchResults(Results* results) {
   constexpr int kTotalFakeFiles = 3;
   for (int i = 0; i < kTotalFakeFiles; ++i) {
@@ -261,4 +153,9 @@
   }
 }
 
+void ZeroStateFileProvider::OnFileSuggestionUpdated(FileSuggestionType type) {
+  if (type == FileSuggestionType::kLocalFile)
+    StartZeroState();
+}
+
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
index f88abe7..83c7b57 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
@@ -18,11 +18,9 @@
 #include "base/time/time.h"
 #include "chrome/browser/ash/file_manager/file_tasks_notifier.h"
 #include "chrome/browser/ash/file_manager/file_tasks_observer.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service.h"
 #include "chrome/browser/ui/app_list/search/search_provider.h"
-#include "chrome/browser/ui/app_list/search/util/mrfu_cache.h"
-#include "chrome/browser/ui/app_list/search/util/persistent_proto.h"
 #include "chrome/browser/ui/ash/thumbnail_loader.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 
 class Profile;
 
@@ -31,23 +29,8 @@
 // ZeroStateFileProvider recommends local files from a cache. Files are added to
 // the cache whenever they are opened.
 class ZeroStateFileProvider : public SearchProvider,
-                              file_manager::file_tasks::FileTasksObserver {
+                              FileSuggestKeyedService::Observer {
  public:
-  struct FileInfo {
-    base::FilePath path;
-    float score;
-    base::Time last_accessed;
-    base::Time last_modified;
-
-    FileInfo(const base::FilePath& path,
-             float score,
-             const base::Time& last_accessed,
-             const base::Time& last_modified);
-    ~FileInfo();
-  };
-  using ValidAndInvalidResults =
-      std::pair<std::vector<FileInfo>, std::vector<base::FilePath>>;
-
   explicit ZeroStateFileProvider(Profile* profile);
 
   ZeroStateFileProvider(const ZeroStateFileProvider&) = delete;
@@ -61,44 +44,37 @@
   ash::AppListSearchResultType ResultType() const override;
   bool ShouldBlockZeroState() const override;
 
-  // file_manager::file_tasks::FileTaskObserver:
-  void OnFilesOpened(const std::vector<FileOpenEvent>& file_opens) override;
-
  private:
-  // Takes a pair of vectors: <valid paths, invalid paths>, converts the valid
-  // paths to FileResults and sets them as this provider's results. The invalid
-  // paths are removed from the model.
-  void SetSearchResults(ValidAndInvalidResults results);
+  // Called when file suggestion data are fetched from the service.
+  void OnSuggestFileDataFetched(
+      const absl::optional<std::vector<FileSuggestData>>& suggest_results);
+
+  // Builds the search results from file suggestions then publishes the results.
+  void SetSearchResults(const std::vector<FileSuggestData>& suggest_results);
 
   // TODO(crbug.com/1349618): Remove this once the Continue tast test does not
   // rely on it.
   void AppendFakeSearchResults(Results* results);
 
-  void OnProtoInitialized(ReadStatus status);
+  // FileSuggestKeyedService::Observer:
+  void OnFileSuggestionUpdated(FileSuggestionType type) override;
 
   // The reference to profile to get ZeroStateFileProvider service.
   Profile* const profile_;
 
   ash::ThumbnailLoader thumbnail_loader_;
 
-  // The ranking model used to produce local file results for searches with an
-  // empty query.
-  std::unique_ptr<MrfuCache> files_ranker_;
+  const base::raw_ptr<FileSuggestKeyedService> file_suggest_service_;
 
   base::TimeTicks query_start_time_;
 
-  // A file needs to have been modified more recently than this to be considered
-  // valid.
-  const base::TimeDelta max_last_modified_time_;
-
   // Path to the downloads folder for this profile.
   const base::FilePath downloads_path_;
 
-  base::ScopedObservation<file_manager::file_tasks::FileTasksNotifier,
-                          file_manager::file_tasks::FileTasksObserver>
-      file_tasks_observer_{this};
+  base::ScopedObservation<FileSuggestKeyedService,
+                          FileSuggestKeyedService::Observer>
+      file_suggest_service_observation_{this};
 
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
   base::WeakPtrFactory<ZeroStateFileProvider> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc b/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
index 1b205f1..e86c03ed 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
@@ -15,8 +15,12 @@
 #include "chrome/browser/ash/file_manager/path_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
+#include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h"
+#include "chrome/browser/ui/app_list/search/files/local_file_suggestion_provider.h"
 #include "chrome/browser/ui/app_list/search/test/test_search_controller.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 "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -42,20 +46,23 @@
     app_list_color_provider_ =
         std::make_unique<ash::TestAppListColorProvider>();
 
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    profile_ = std::make_unique<TestingProfile>(temp_dir_.GetPath());
+    testing_profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    EXPECT_TRUE(testing_profile_manager_->SetUp());
+    profile_ = testing_profile_manager_->CreateTestingProfile(
+        "primary_profile@test", {});
 
     // The downloads directory depends on whether it is inside or outside
     // chromeos. So this needs to be in scope before |provider_| and
     // |downloads_folder_|.
     base::test::ScopedRunningOnChromeOS running_on_chromeos;
 
-    auto provider = std::make_unique<ZeroStateFileProvider>(profile_.get());
+    auto provider = std::make_unique<ZeroStateFileProvider>(profile_);
     provider_ = provider.get();
     search_controller_.AddProvider(0, std::move(provider));
 
     downloads_folder_ =
-        file_manager::util::GetDownloadsFolderForProfile(profile_.get());
+        file_manager::util::GetDownloadsFolderForProfile(profile_);
     ASSERT_TRUE(base::CreateDirectory(downloads_folder_));
 
     Wait();
@@ -100,7 +107,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
 
-  std::unique_ptr<Profile> profile_;
+  std::unique_ptr<TestingProfileManager> testing_profile_manager_;
+  TestingProfile* profile_ = nullptr;
   base::ScopedTempDir temp_dir_;
   base::FilePath downloads_folder_;
 
@@ -121,9 +129,12 @@
   WriteFile(Path("exists_3.pdf"));
 
   // Results are only added if they have been opened at least once.
-  provider_->OnFilesOpened({OpenEvent(Path("exists_1.txt")),
-                            OpenEvent(Path("exists_2.png")),
-                            OpenEvent(Path("nonexistent.txt"))});
+
+  auto* keyed_service =
+      FileSuggestKeyedServiceFactory::GetInstance()->GetService(profile_);
+  keyed_service->local_file_suggestion_provider_for_test()->OnFilesOpened(
+      {OpenEvent(Path("exists_1.txt")), OpenEvent(Path("exists_2.png")),
+       OpenEvent(Path("nonexistent.txt"))});
 
   StartZeroStateSearch();
   Wait();
@@ -138,7 +149,9 @@
   auto now = base::Time::Now();
   base::TouchFile(Path("old.png"), now, now - base::Days(8));
 
-  provider_->OnFilesOpened(
+  auto* keyed_service =
+      FileSuggestKeyedServiceFactory::GetInstance()->GetService(profile_);
+  keyed_service->local_file_suggestion_provider_for_test()->OnFilesOpened(
       {OpenEvent(Path("new.txt")), OpenEvent(Path("old.png"))});
 
   StartZeroStateSearch();
@@ -153,10 +166,13 @@
   WriteFile(DownloadsPath("NotScreenshot.png"));
   WriteFile(DownloadsPath("Screenshot123.png"));
 
-  provider_->OnFilesOpened({OpenEvent(Path("ScreenshotNonDownload.png")),
-                            OpenEvent(DownloadsPath("ScreenshotNonPng.jpg")),
-                            OpenEvent(DownloadsPath("NotScreenshot.png")),
-                            OpenEvent(DownloadsPath("Screenshot123.png"))});
+  auto* keyed_service =
+      FileSuggestKeyedServiceFactory::GetInstance()->GetService(profile_);
+  keyed_service->local_file_suggestion_provider_for_test()->OnFilesOpened(
+      {OpenEvent(Path("ScreenshotNonDownload.png")),
+       OpenEvent(DownloadsPath("ScreenshotNonPng.jpg")),
+       OpenEvent(DownloadsPath("NotScreenshot.png")),
+       OpenEvent(DownloadsPath("Screenshot123.png"))});
 
   StartZeroStateSearch();
   Wait();
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
index 2d27da1..4215273 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -2989,7 +2989,8 @@
   GetFileSuggestKeyedService()->SetSuggestionsForType(
       app_list::FileSuggestionType::kDriveFile,
       /*suggestions=*/{{app_list::FileSuggestionType::kDriveFile, file_path_1,
-                        /*new_prediction_reason=*/absl::nullopt}});
+                        /*new_prediction_reason=*/absl::nullopt,
+                        /*new_score=*/absl::nullopt}});
   task_environment()->FastForwardBy(base::Seconds(1));
 
   const bool suggestion_feature_enabled =
@@ -3008,36 +3009,24 @@
   EXPECT_EQ(expected,
             GetSuggestionsInModel(*HoldingSpaceController::Get()->model()));
 
+  // TODO(https://crbug.com/1369418): Add local file suggestions to this
+  // test.
+
   const base::FilePath file_path_2 = mount_point()->CreateArbitraryFile();
 
-  // Update local file suggestions then check the model.
-  GetFileSuggestKeyedService()->SetSuggestionsForType(
-      app_list::FileSuggestionType::kLocalFile,
-      /*suggestions=*/{{app_list::FileSuggestionType::kLocalFile, file_path_2,
-                        /*new_prediction_reason=*/absl::nullopt}});
-  task_environment()->FastForwardBy(base::Seconds(1));
-  if (suggestion_feature_enabled) {
-    expected = std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>>(
-        {{HoldingSpaceItem::Type::kLocalSuggestion, file_path_2},
-         {HoldingSpaceItem::Type::kDriveSuggestion, file_path_1}});
-  }
-  EXPECT_EQ(expected,
-            GetSuggestionsInModel(*HoldingSpaceController::Get()->model()));
-
-  const base::FilePath file_path_3 = mount_point()->CreateArbitraryFile();
-
   // Update drive file suggestions again then check the model.
   GetFileSuggestKeyedService()->SetSuggestionsForType(
       app_list::FileSuggestionType::kDriveFile,
       {{app_list::FileSuggestionType::kDriveFile, file_path_1,
-        /*new_prediction_reason=*/absl::nullopt},
-       {app_list::FileSuggestionType::kDriveFile, file_path_3,
-        /*new_prediction_reason=*/absl::nullopt}});
+        /*new_prediction_reason=*/absl::nullopt,
+        /*new_score=*/absl::nullopt},
+       {app_list::FileSuggestionType::kDriveFile, file_path_2,
+        /*new_prediction_reason=*/absl::nullopt,
+        /*new_score=*/absl::nullopt}});
   task_environment()->FastForwardBy(base::Seconds(1));
   if (suggestion_feature_enabled) {
     expected = std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>>(
-        {{HoldingSpaceItem::Type::kLocalSuggestion, file_path_2},
-         {HoldingSpaceItem::Type::kDriveSuggestion, file_path_3},
+        {{HoldingSpaceItem::Type::kDriveSuggestion, file_path_2},
          {HoldingSpaceItem::Type::kDriveSuggestion, file_path_1}});
   }
   EXPECT_EQ(expected,
@@ -3051,22 +3040,12 @@
   // Drive file suggestions should be removed from the model if the feature is
   // enabled.
   if (suggestion_feature_enabled) {
-    expected = std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>>(
-        {{HoldingSpaceItem::Type::kLocalSuggestion, file_path_2}});
+    expected =
+        std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>>({});
   }
 
   EXPECT_EQ(expected,
             GetSuggestionsInModel(*HoldingSpaceController::Get()->model()));
-
-  // Update local file suggestions with an empty array.
-  GetFileSuggestKeyedService()->SetSuggestionsForType(
-      app_list::FileSuggestionType::kLocalFile, /*suggestions=*/{});
-  task_environment()->FastForwardBy(base::Seconds(1));
-
-  // There should not be any suggestion in the model.
-  expected.clear();
-  EXPECT_EQ(expected,
-            GetSuggestionsInModel(*HoldingSpaceController::Get()->model()));
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
index 4b7028fe6..57abb96 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
@@ -37,14 +37,17 @@
       app_list::FileSuggestKeyedServiceFactory::GetInstance()->GetService(
           profile()));
 
-  // TODO(https://crbug.com/1352515): also refresh local file suggestion items
+  // TODO(https://crbug.com/1369418): also refresh local file suggestion items
   // when local file suggestions are supported by the service.
   MaybeFetchSuggestions(app_list::FileSuggestionType::kDriveFile);
 }
 
 void HoldingSpaceSuggestionsDelegate::OnFileSuggestionUpdated(
     app_list::FileSuggestionType type) {
-  MaybeFetchSuggestions(type);
+  // TODO(https://crbug.com/1369418): Fix local file suggestions behavior and
+  // remove this if.
+  if (type == app_list::FileSuggestionType::kDriveFile)
+    MaybeFetchSuggestions(type);
 }
 
 void HoldingSpaceSuggestionsDelegate::MaybeFetchSuggestions(
diff --git a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
index e2701e9..72cb6d6 100644
--- a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
+++ b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
@@ -163,6 +163,10 @@
   Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
   DCHECK(browser);
 
+  if (!browser || !browser->window()) {
+    return;
+  }
+
   browser->window()->UpdatePageActionIcon(PageActionIconType::kPriceTracking);
 }
 
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index eda112b..ed0b1e37 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -4778,6 +4778,16 @@
   ReparentTopContainerForEndOfImmersive();
   InvalidateLayout();
   GetWidget()->GetRootView()->Layout();
+
+#if BUILDFLAG(IS_CHROMEOS)
+  // Ensure that entering/exiting tablet mode on ChromeOS also updates Window
+  // Controls Overlay (WCO). This forces a re-check of the immersive mode flag.
+  // Tablet mode implies immersive mode, so if tablet mode is enabled, this will
+  // automatically disable WCO, and vice versa.
+  if (AppUsesWindowControlsOverlay()) {
+    UpdateWindowControlsOverlayEnabled();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }
 
 void BrowserView::OnImmersiveFullscreenExited() {
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 4c40926..e69a09b 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -301,15 +301,15 @@
     // first so that they appear on the left side of the icon container.
     // TODO(crbug.com/1318890): Improve the ordering heuristics for page action
     // icons and determine a way to handle simultaneous icon animations.
-    // TODO(crbug.com/1346612): Confirm the ordering for |kPriceTracking| and
-    // |kSideSearch| with UX.
-    if (base::FeatureList::IsEnabled(commerce::kShoppingList)) {
-      params.types_enabled.push_back(PageActionIconType::kPriceTracking);
-    }
     if (side_search::IsDSESupportEnabled(profile_) &&
         side_search::IsEnabledForBrowser(browser_)) {
       params.types_enabled.push_back(PageActionIconType::kSideSearch);
     }
+    // TODO(crbug.com/1368796): We decided to show the icon only for now.
+    // Confirm the ordering for |kPriceTracking| and |kSideSearch| with UX.
+    if (base::FeatureList::IsEnabled(commerce::kShoppingList)) {
+      params.types_enabled.push_back(PageActionIconType::kPriceTracking);
+    }
     params.types_enabled.push_back(PageActionIconType::kSendTabToSelf);
     params.types_enabled.push_back(PageActionIconType::kClickToCall);
     params.types_enabled.push_back(PageActionIconType::kQRCodeGenerator);
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc
index 80af47db..ec5e941 100644
--- a/chrome/browser/ui/webui/extensions/extensions_ui.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -113,6 +113,8 @@
     {"dropToInstall", IDS_EXTENSIONS_INSTALL_DROP_TARGET},
     {"editSitePermissionsAllowAllExtensions",
      IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_ALLOW_ALL_EXTENSIONS},
+    {"editSitePermissionsCustomizePerExtension",
+     IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_CUSTOMIZE_PER_EXTENSION},
     {"editSitePermissionsRestrictExtensions",
      IDS_EXTENSIONS_EDIT_SITE_PERMISSIONS_RESTRICT_EXTENSIONS},
     {"errorsPageHeading", IDS_EXTENSIONS_ERROR_PAGE_HEADING},
@@ -266,6 +268,10 @@
      IDS_EXTENSIONS_SITE_PERMISSIONS_ALL_SITES_PAGE_TITLE},
     {"sitePermissionsAllSitesExtensionCount",
      IDS_EXTENSIONS_SITE_PERMISSIONS_ALL_SITES_EXTENSION_COUNT},
+    {"sitePermissionsAlwaysOnAllSites",
+     IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_ALL_SITES},
+    {"sitePermissionsAlwaysOnThisSite",
+     IDS_EXTENSIONS_SITE_PERMISSIONS_ALWAYS_ON_THIS_SITE},
     {"sitePermissionsPageTitle", IDS_EXTENSIONS_SITE_PERMISSIONS_PAGE_TITLE},
     {"sitePermissionsAddSiteDialogTitle",
      IDS_EXTENSIONS_SITE_PERMISSIONS_ADD_SITE_DIALOG_TITLE},
@@ -280,6 +286,7 @@
     {"sitePermissionsEditPermissionsDialogTitle",
      IDS_EXTENSIONS_SITE_PERMISSIONS_EDIT_PERMISSIONS_DIALOG_TITLE},
     {"sitePermissionsEditUrl", IDS_EXTENSIONS_SITE_PERMISSIONS_EDIT_URL},
+    {"sitePermissionsOnClick", IDS_EXTENSIONS_SITE_PERMISSIONS_ON_CLICK},
     {"sitePermissionsViewAllSites",
      IDS_EXTENSIONS_SITE_PERMISSIONS_VIEW_ALL_SITES},
     {"permittedSites", IDS_EXTENSIONS_PERMITTED_SITES},
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index e32fcd69..6cdc45a 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -1102,8 +1102,9 @@
   }
 
   apps::AppLaunchParams params_for_restore(
-      params.app_id, params.container, params.disposition, params.launch_source,
-      params.display_id, params.launch_files, params.intent);
+      params.app_id, params.container, params.disposition, params.override_url,
+      params.launch_source, params.display_id, params.launch_files,
+      params.intent);
 
   // Create the FullRestoreSaveHandler instance before launching the app to
   // observe the browser window.
@@ -1128,6 +1129,19 @@
               params_for_restore.display_id,
               std::move(params_for_restore.launch_files),
               std::move(params_for_restore.intent));
+
+      // TODO(crbug.com/1368285): Determine whether override URL can be restored
+      // for all SWAs.
+      DCHECK(swa_manager_);
+      auto system_app_type =
+          swa_manager_->GetSystemAppTypeForAppId(params_for_restore.app_id);
+      if (system_app_type.has_value()) {
+        auto* system_app = swa_manager_->GetSystemApp(*system_app_type);
+        DCHECK(system_app);
+        if (system_app->ShouldRestoreOverrideUrl())
+          launch_info->override_url = params_for_restore.override_url;
+      }
+
       full_restore::SaveAppLaunchInfo(profile()->GetPath(),
                                       std::move(launch_info));
     }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 51c3aa7..0a44259 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1664473960-42a285de473f4d223e16c12699adb6a0dca1760d.profdata
+chrome-linux-main-1664517420-b6985a3b983078e765b5b3201ccb0b2cbc3d6bec.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index d00f113..b772e56 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1664473960-1d93a640a53c99e7dfe6332b48b5d4346d815b12.profdata
+chrome-mac-arm-main-1664517420-6024a0dfca99d964ca1b8107d4cd6d23a056c4d4.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index eb7bfd24..aef829e 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1664473960-8c092bec2a45b4f40c446feb03738f97977a2a1b.profdata
+chrome-mac-main-1664517420-cf0cb2b8c1b08254ea3eaad2d4d46f917f1a6016.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 4a04966..63134d3 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1664473960-b0b2705a4ced8d6d3dfdf0a46c9ade9bb0013193.profdata
+chrome-win32-main-1664506745-89c95bacd2400b3dcdb737f6a640bfde6dbb1f78.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index a72b473..0c9c745 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1664485198-ad11075be36d911722ab3ce28551a930f77b15f1.profdata
+chrome-win64-main-1664506745-d9a3e04de3c036a8ebf86dc7afa6fb44a44bea37.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index f33e013..f74213c 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -7208,6 +7208,7 @@
       "../browser/apps/app_discovery_service/app_discovery_service_unittest.cc",
       "../browser/apps/app_discovery_service/game_fetcher_unittest.cc",
       "../browser/apps/app_discovery_service/recommended_arc_app_fetcher_unittest.cc",
+      "../browser/apps/app_preload_service/app_preload_server_connector_unittest.cc",
       "../browser/apps/app_preload_service/app_preload_service_unittest.cc",
       "../browser/apps/app_preload_service/device_info_manager_unittest.cc",
       "../browser/apps/app_service/file_utils_unittest.cc",
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
index 1e8ae07..9297f6da 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
@@ -471,7 +471,7 @@
     assertEquals(1, feedbackServiceProvider.getFeedbackContextCallCount());
   });
 
-  // Test that the extra diagnostics and category tag get set
+  // Test that the extra diagnostics, category tag and page_url get set
   // when query parameter is non-empty.
   test(
       'AdditionalContextParametersProvidedInUrl_FeedbackContext_Matches',
@@ -486,6 +486,8 @@
             description_template);
         const category_tag = 'some%20category%20tag';
         queryParams.set(AdditionalContextQueryParam.CATEGORY_TAG, category_tag);
+        const page_url = 'some%20page%20url';
+        queryParams.set(AdditionalContextQueryParam.PAGE_URL, page_url);
         // Replace current querystring with the new one.
         window.history.replaceState(null, '', '?' + queryParams.toString());
         await initializePage();
@@ -493,7 +495,7 @@
         const descriptionElement = getSearchPage().$['descriptionText'];
 
         const feedbackContext = getFeedbackContext_();
-        assertEquals(fakeFeedbackContext.pageUrl, feedbackContext.pageUrl);
+        assertEquals(page_url, feedbackContext.pageUrl.url);
         assertEquals(fakeFeedbackContext.email, feedbackContext.email);
         assertEquals(
             decodeURIComponent(extra_diagnostics),
@@ -502,9 +504,14 @@
             decodeURIComponent(description_template), descriptionElement.value);
         assertEquals(
             decodeURIComponent(category_tag), feedbackContext.categoryTag);
+
+        // Set the pageUrl in fake feedback context back to its origin value
+        // because it's overwritten by the page_url passed from the app.
+        fakeFeedbackContext.pageUrl = {url: 'chrome://tab/'};
       });
 
-  // Test that the extra diagnostics gets set when query parameter is empty.
+  // Test that the extra diagnostics gets set, and pageUrl uses the one passed
+  // from the feedbackContext when query parameter is empty.
   test(
       'AdditionalContextParametersNotProvidedInUrl_FeedbackContext_UsesDefault',
       async () => {
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
index 5b356053..4d1e1b3 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
@@ -393,6 +393,36 @@
     assertFalse(request.includeScreenshot);
   });
 
+  /**
+   * Test that when the send button is clicked, an on-continue is fired.
+   * Case 5: Send performance trace id.
+   */
+  test('SendPerformanceTraceId', async () => {
+    await initializePage();
+    page.feedbackContext = fakeFeedbackContext;
+
+    getElement('#performanceTraceCheckbox').checked = true;
+
+    const report = (await clickSendAndWait(page)).report;
+
+    assertEquals(fakeFeedbackContext.traceId, report.feedbackContext.traceId);
+  });
+
+  /**
+   * Test that when the send button is clicked, an on-continue is fired.
+   * Case 6: Don't send performance trace id.
+   */
+  test('DontSendPerformanceTraceId', async () => {
+    await initializePage();
+    page.feedbackContext = fakeFeedbackContext;
+
+    getElement('#performanceTraceCheckbox').checked = false;
+
+    const report = (await clickSendAndWait(page)).report;
+
+    assertEquals(0, report.feedbackContext.traceId);
+  });
+
   // Test that the send button will be disabled once clicked.
   test('DisableSendButtonAfterClick', async () => {
     await initializePage();
@@ -725,6 +755,34 @@
   });
 
   /**
+   * Test that clicking the #assistantLogsLink will open the dialog and set the
+   * focus on the close dialog icon button.
+   */
+  test('openAssistantLogsDialog', async () => {
+    await initializePage();
+    page.feedbackContext = fakeFeedbackContext;
+
+    // The assistant dialog is not visible as default.
+    const closeDialogButton = getElement('#assistantDialogDoneButton');
+    assertFalse(isVisible(closeDialogButton));
+
+    // After clicking the #bluetoothLogsLink, the dialog pops up.
+    getElement('#assistantLogsLink').click();
+    assertTrue(isVisible(closeDialogButton));
+
+    // The preview dialog's close icon button is focused.
+    assertEquals(closeDialogButton, getDeepActiveElement());
+
+    // Press enter should close the preview dialog.
+    closeDialogButton.dispatchEvent(
+        new KeyboardEvent('keydown', {key: 'Enter'}));
+    await flushTasks();
+
+    // The preview dialog's close icon button is not visible now.
+    assertFalse(isVisible(closeDialogButton));
+  });
+
+  /**
    * Test that sendBluetoothLogs flag is true and categoryTag is marked as
    * 'BluetoothReportWithLogs' when bluetooth logs checkbox is checked.
    */
diff --git a/chrome/test/data/webui/extensions/site_permissions_by_site_test.ts b/chrome/test/data/webui/extensions/site_permissions_by_site_test.ts
index 30725c4..04f141a 100644
--- a/chrome/test/data/webui/extensions/site_permissions_by_site_test.ts
+++ b/chrome/test/data/webui/extensions/site_permissions_by_site_test.ts
@@ -25,12 +25,12 @@
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
           numExtensions: 0,
-          site: 'https://images.google.ca',
+          site: 'images.google.ca',
         },
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_RESTRICTED,
           numExtensions: 0,
-          site: 'http://google.ca',
+          site: 'google.ca',
         },
       ],
     },
@@ -40,7 +40,7 @@
       sites: [{
         siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
         numExtensions: 0,
-        site: 'http://example.com',
+        site: 'example.com',
       }],
     },
   ];
@@ -103,12 +103,12 @@
           sites: [{
             siteSet: chrome.developerPrivate.SiteSet.USER_RESTRICTED,
             numExtensions: 0,
-            site: 'http://www.random.com',
+            site: 'www.random.com',
           }],
         }];
 
         delegate.userSiteSettingsChangedTarget.callListeners(
-            {permittedSites: [], restrictedSites: ['http://www.random.com']});
+            {permittedSites: [], restrictedSites: ['www.random.com']});
         await delegate.whenCalled('getUserAndExtensionSitesByEtld');
         flush();
 
@@ -130,7 +130,7 @@
           sites: [{
             siteSet: chrome.developerPrivate.SiteSet.EXTENSION_SPECIFIED,
             numExtensions: 1,
-            site: 'http://www.random.com',
+            site: 'www.random.com',
           }],
         }];
 
diff --git a/chrome/test/data/webui/extensions/site_permissions_edit_permissions_dialog_test.ts b/chrome/test/data/webui/extensions/site_permissions_edit_permissions_dialog_test.ts
index c6f37d6..78d59698 100644
--- a/chrome/test/data/webui/extensions/site_permissions_edit_permissions_dialog_test.ts
+++ b/chrome/test/data/webui/extensions/site_permissions_edit_permissions_dialog_test.ts
@@ -11,30 +11,59 @@
 import {SitePermissionsEditPermissionsDialogElement} from 'chrome://extensions/extensions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
-import {eventToPromise} from 'chrome://webui-test/test_util.js';
+import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
 
 import {TestService} from './test_service.js';
+import {createExtensionInfo} from './test_util.js';
 
 suite('SitePermissionsEditPermissionsDialog', function() {
   let element: SitePermissionsEditPermissionsDialogElement;
   let delegate: TestService;
   const SiteSet = chrome.developerPrivate.SiteSet;
+  const HostAccess = chrome.developerPrivate.HostAccess;
+
+  const extensions = [
+    createExtensionInfo({
+      id: 'test_1',
+      name: 'test_1',
+      iconUrl: 'icon_url',
+    }),
+    createExtensionInfo({
+      id: 'test_2',
+      name: 'test_2',
+      iconUrl: 'icon_url',
+    }),
+    createExtensionInfo({
+      id: 'test_3',
+      name: 'test_3',
+      iconUrl: 'icon_url',
+    }),
+  ];
+
+  const matchingExtensionsInfo = [
+    {id: 'test_1', siteAccess: HostAccess.ON_CLICK},
+    {id: 'test_2', siteAccess: HostAccess.ON_SPECIFIC_SITES},
+  ];
 
   setup(function() {
     delegate = new TestService();
+    delegate.matchingExtensionsInfo = matchingExtensionsInfo;
 
     document.body.innerHTML = '';
     element =
         document.createElement('site-permissions-edit-permissions-dialog');
     element.delegate = delegate;
+    element.extensions = extensions;
     element.site = 'http://example.com';
     element.originalSiteSet = SiteSet.USER_PERMITTED;
     document.body.appendChild(element);
   });
 
   test('editing current site set', async function() {
+    flush();
     const siteSetRadioGroup =
         element.shadowRoot!.querySelector('cr-radio-group');
+
     assertTrue(!!siteSetRadioGroup);
     assertEquals(SiteSet.USER_PERMITTED, siteSetRadioGroup.selected);
 
@@ -48,8 +77,7 @@
     assertEquals(SiteSet.USER_RESTRICTED, siteSetRadioGroup.selected);
 
     const whenClosed = eventToPromise('close', element);
-    const submit = element.$.submit;
-    submit.click();
+    element.$.submit.click();
 
     const [siteSet, sites] = await delegate.whenCalled('addUserSpecifiedSites');
     assertEquals(SiteSet.USER_RESTRICTED, siteSet);
@@ -58,4 +86,126 @@
     await whenClosed;
     assertFalse(element.$.dialog.open);
   });
+
+  test(
+      'list of matching extensions shown when changing options',
+      async function() {
+        element.site = 'example.com';
+        flush();
+        const siteSetRadioGroup =
+            element.shadowRoot!.querySelector('cr-radio-group');
+        assertTrue(!!siteSetRadioGroup);
+
+        let extensionSiteAccessRows =
+            element!.shadowRoot!.querySelectorAll<HTMLElement>(
+                '.extension-row');
+        assertEquals(0, extensionSiteAccessRows.length);
+
+        const extensionSpecifiedRadioButton =
+            element.shadowRoot!.querySelector<HTMLElement>(
+                `cr-radio-button[name=${SiteSet.EXTENSION_SPECIFIED}]`);
+        assertTrue(!!extensionSpecifiedRadioButton);
+        extensionSpecifiedRadioButton.click();
+
+        const site = await delegate.whenCalled('getMatchingExtensionsForSite');
+        assertEquals('*://example.com/', site);
+        flush();
+
+        assertEquals(SiteSet.EXTENSION_SPECIFIED, siteSetRadioGroup.selected);
+        extensionSiteAccessRows =
+            element!.shadowRoot!.querySelectorAll<HTMLElement>(
+                '.extension-row');
+        assertEquals(2, extensionSiteAccessRows.length);
+
+        const whenClosed = eventToPromise('close', element);
+        const submit = element.$.submit;
+
+        submit.click();
+        const [siteSet, sites] =
+            await delegate.whenCalled('removeUserSpecifiedSites');
+        assertEquals(SiteSet.USER_PERMITTED, siteSet);
+
+        // Since the site being edited is just a host, remove both the http and
+        // https url for the host.
+        assertDeepEquals(
+            [`http://${element.site}`, `https://${element.site}`], sites);
+
+        await whenClosed;
+        assertFalse(element.$.dialog.open);
+      });
+
+  test(
+      'radio buttons not shown for site matching subdomains', async function() {
+        flush();
+        const extensionSpecifiedRadioButton =
+            element.shadowRoot!.querySelector<HTMLElement>(
+                `cr-radio-button[name=${SiteSet.EXTENSION_SPECIFIED}]`);
+        assertTrue(!!extensionSpecifiedRadioButton);
+        extensionSpecifiedRadioButton.click();
+        const site = await delegate.whenCalled('getMatchingExtensionsForSite');
+        assertEquals('http://example.com', site);
+
+        flush();
+        assertTrue(
+            isVisible(element.shadowRoot!.querySelector('cr-radio-group')));
+
+        element.site = '*.etld.com';
+        flush();
+
+        assertFalse(
+            isVisible(element.shadowRoot!.querySelector('cr-radio-group')));
+      });
+
+  test(
+      'list of extensions changes in response to extensions updating',
+      async function() {
+        flush();
+        const extensionSpecifiedRadioButton =
+            element.shadowRoot!.querySelector<HTMLElement>(
+                `cr-radio-button[name=${SiteSet.EXTENSION_SPECIFIED}]`);
+        assertTrue(!!extensionSpecifiedRadioButton);
+        extensionSpecifiedRadioButton.click();
+        let site = await delegate.whenCalled('getMatchingExtensionsForSite');
+        assertEquals('http://example.com', site);
+
+        flush();
+
+        let extensionSiteAccessSelects =
+            element.shadowRoot!.querySelectorAll('select');
+        assertEquals(2, extensionSiteAccessSelects.length);
+        assertEquals(HostAccess.ON_CLICK, extensionSiteAccessSelects[0]!.value);
+
+        delegate.matchingExtensionsInfo = [
+          {id: 'test_1', siteAccess: HostAccess.ON_ALL_SITES},
+          {id: 'test_2', siteAccess: HostAccess.ON_SPECIFIC_SITES},
+        ];
+
+        element.extensions = [
+          createExtensionInfo({
+            id: 'test_1',
+            name: 'test_1',
+            iconUrl: 'icon_url',
+          }),
+          createExtensionInfo({
+            id: 'test_2',
+            name: 'test_2',
+            iconUrl: 'icon_url',
+          }),
+        ];
+
+        // Test that changing `element.extensions` causes a call to
+        // getMatchingExtensionsForSite.
+        site = await delegate.whenCalled('getMatchingExtensionsForSite');
+        assertEquals('http://example.com', site);
+        flush();
+
+        extensionSiteAccessSelects =
+            element.shadowRoot!.querySelectorAll('select');
+        assertEquals(2, extensionSiteAccessSelects.length);
+
+        // Test that the value displayed for the first extension matches the
+        // updated matchingExtensionsInfo.
+        assertEquals(
+            HostAccess.ON_ALL_SITES, extensionSiteAccessSelects[0]!.value);
+      });
 });
diff --git a/chrome/test/data/webui/extensions/site_permissions_site_group_test.ts b/chrome/test/data/webui/extensions/site_permissions_site_group_test.ts
index e22b623..7fc9d83 100644
--- a/chrome/test/data/webui/extensions/site_permissions_site_group_test.ts
+++ b/chrome/test/data/webui/extensions/site_permissions_site_group_test.ts
@@ -31,12 +31,12 @@
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
           numExtensions: 0,
-          site: 'https://images.google.ca',
+          site: 'images.google.ca',
         },
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
           numExtensions: 0,
-          site: 'http://google.ca',
+          site: 'google.ca',
         },
       ],
     };
@@ -55,8 +55,8 @@
     const expandedSites =
         element.shadowRoot!.querySelectorAll<HTMLElement>('.site');
 
-    assertEquals('https://images.google.ca', expandedSites[0]!.innerText);
-    assertEquals('http://google.ca', expandedSites[1]!.innerText);
+    assertEquals('images.google.ca', expandedSites[0]!.innerText);
+    assertEquals('google.ca', expandedSites[1]!.innerText);
   });
 
   test('no subtext shown for sites from different sets', async function() {
@@ -67,12 +67,12 @@
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
           numExtensions: 0,
-          site: 'https://images.google.ca',
+          site: 'images.google.ca',
         },
         {
           siteSet: chrome.developerPrivate.SiteSet.USER_RESTRICTED,
           numExtensions: 0,
-          site: 'http://google.ca',
+          site: 'google.ca',
         },
       ],
     };
@@ -101,12 +101,12 @@
       sites: [{
         siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
         numExtensions: 0,
-        site: 'https://a.example.com',
+        site: 'a.example.com',
       }],
     };
     flush();
 
-    assertEquals('https://a.example.com', element.$.etldOrSite.innerText);
+    assertEquals('a.example.com', element.$.etldOrSite.innerText);
     assertEquals(PERMITTED_TEXT, element.$.etldOrSiteSubtext.innerText);
 
     assertFalse(isVisible(
@@ -122,7 +122,7 @@
           sites: [{
             siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
             numExtensions: 0,
-            site: 'https://a.example.com',
+            site: 'a.example.com',
           }],
         };
         flush();
@@ -138,7 +138,7 @@
             'site-permissions-edit-permissions-dialog');
         assertTrue(!!dialog);
         assertTrue(dialog.$.dialog.open);
-        assertEquals('https://a.example.com', dialog.site);
+        assertEquals('a.example.com', dialog.site);
         assertEquals(
             chrome.developerPrivate.SiteSet.USER_PERMITTED,
             dialog.originalSiteSet);
@@ -154,12 +154,12 @@
             {
               siteSet: chrome.developerPrivate.SiteSet.USER_PERMITTED,
               numExtensions: 0,
-              site: 'https://images.google.ca',
+              site: 'images.google.ca',
             },
             {
               siteSet: chrome.developerPrivate.SiteSet.USER_RESTRICTED,
               numExtensions: 0,
-              site: 'http://google.ca',
+              site: 'google.ca',
             },
           ],
         };
@@ -180,7 +180,7 @@
             'site-permissions-edit-permissions-dialog');
         assertTrue(!!dialog);
         assertTrue(dialog.$.dialog.open);
-        assertEquals('http://google.ca', dialog.site);
+        assertEquals('google.ca', dialog.site);
         assertEquals(
             chrome.developerPrivate.SiteSet.USER_RESTRICTED,
             dialog.originalSiteSet);
diff --git a/chrome/test/data/webui/extensions/test_service.ts b/chrome/test/data/webui/extensions/test_service.ts
index f082a0b..0d3e352 100644
--- a/chrome/test/data/webui/extensions/test_service.ts
+++ b/chrome/test/data/webui/extensions/test_service.ts
@@ -16,6 +16,7 @@
   testActivities?: chrome.activityLogPrivate.ActivityResultSet;
   userSiteSettings?: chrome.developerPrivate.UserSiteSettings;
   siteGroups?: chrome.developerPrivate.SiteGroup[];
+  matchingExtensionsInfo?: chrome.developerPrivate.MatchingExtensionInfo[];
 
   private retryLoadUnpackedError_?: chrome.developerPrivate.LoadError;
   private forceReloadItemError_: boolean = false;
@@ -36,6 +37,7 @@
       'getExtensionsInfo',
       'getExtensionSize',
       'getFilteredExtensionActivityLog',
+      'getMatchingExtensionsForSite',
       'getProfileConfiguration',
       'getUserAndExtensionSitesByEtld',
       'getUserSiteSettings',
@@ -349,4 +351,9 @@
   setShowAccessRequestsInToolbar(id: string, showRequests: boolean) {
     this.methodCalled('setShowAccessRequestsInToolbar', id, showRequests);
   }
+
+  getMatchingExtensionsForSite(site: string) {
+    this.methodCalled('getMatchingExtensionsForSite', site);
+    return Promise.resolve(this.matchingExtensionsInfo!);
+  }
 }
diff --git a/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js b/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
index 8d8c8ef..8e181984 100644
--- a/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
@@ -101,7 +101,7 @@
     createOptionsPage(FIRST_PARTY_INPUT_METHOD_ID_PREFIX + 'xkb:us::eng');
     const options = optionsPage.shadowRoot.querySelectorAll('.list-item');
     assertTrue(!!options);
-    assertEquals(options.length, 8);
+    assertEquals(options.length, 9);
     assertEquals(
         options[0].querySelector('.start').textContent.trim(),
         'Auto-correction');
@@ -115,14 +115,27 @@
             .value['xkb:us::eng']['physicalKeyboardAutoCorrectionLevel'],
         1);
 
+    assertTrue(options[1].querySelector('.start').textContent.includes(
+        'Show accent marks and special characters'));
+    const diacriticsToggleButton = options[1].querySelector('cr-toggle');
+    assertEquals(diacriticsToggleButton.checked, true);
+    diacriticsToggleButton.click();
+    await waitAfterNextRender(diacriticsToggleButton);
+    assertEquals(diacriticsToggleButton.checked, false);
     assertEquals(
-        options[1].querySelector('.start').textContent.trim(),
+        optionsPage.getPref(PREFS_KEY)
+            .value['xkb:us::eng']
+                  ['physicalKeyboardEnableDiacriticsOnLongpress'],
+        false);
+
+    assertEquals(
+        options[2].querySelector('.start').textContent.trim(),
         'Sound on keypress');
-    const toggleButton = options[1].querySelector('cr-toggle');
-    assertEquals(toggleButton.checked, false);
-    toggleButton.click();
-    await waitAfterNextRender(toggleButton);
-    assertEquals(toggleButton.checked, true);
+    const soundToggleButton = options[2].querySelector('cr-toggle');
+    assertEquals(soundToggleButton.checked, false);
+    soundToggleButton.click();
+    await waitAfterNextRender(soundToggleButton);
+    assertEquals(soundToggleButton.checked, true);
     assertEquals(
         optionsPage.getPref(PREFS_KEY)
             .value['xkb:us::eng']['enableSoundOnKeypress'],
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index fffd6b7..1fb008f 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -28,6 +28,9 @@
     return {
       enabled: [
         'chromeos::features::kEnableHostnameSetting',
+        // TODO(b/217560706): Remove this explicit enabled flag when rollout
+        // completed.
+        'chromeos::features::kDiacriticsOnPhysicalKeyboardLongpress',
       ],
     };
   }
diff --git a/chromeos/ash/components/audio/audio_device.h b/chromeos/ash/components/audio/audio_device.h
index d9a1e6d9..b6abdb384 100644
--- a/chromeos/ash/components/audio/audio_device.h
+++ b/chromeos/ash/components/audio/audio_device.h
@@ -37,6 +37,11 @@
   kOther,
 };
 
+// Default value of user priority preference.
+const uint32_t kUserPriorityNone = 0;
+// Min value of user priority preference.
+const uint32_t kUserPriorityMin = 1;
+
 struct COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_AUDIO) AudioDevice {
   AudioDevice();
   explicit AudioDevice(const AudioNode& node);
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler.h b/chromeos/ash/components/audio/audio_devices_pref_handler.h
index d32bc383..6d8e86e 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler.h
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler.h
@@ -56,6 +56,19 @@
                                bool* active,
                                bool* activate_by_user) = 0;
 
+  // Sets the user priority of `target` to be one level higher
+  // than `base`.
+  // Given the user priorities ranking as: [.., target, ..., base, A, B]
+  // After applying this function, the new ranking of user
+  // priorities will be [.., base, target, A, B].
+  // If both target and base have kUserPriorityNone,
+  // set the target's user priority to kUserPriorityMin.
+  // Do nothing if target already has a higher user priority.
+  virtual void SetUserPriorityHigherThan(const AudioDevice& target,
+                                         const AudioDevice& base) = 0;
+  // Reads the user priority from prefs.
+  virtual int32_t GetUserPriority(const AudioDevice& device) = 0;
+
   // Reads the audio output allowed value from prefs.
   virtual bool GetAudioOutputAllowedValue() const = 0;
 
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc
index e4f0958..67e95115 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc
@@ -229,6 +229,58 @@
   return true;
 }
 
+void AudioDevicesPrefHandlerImpl::SetUserPriorityHigherThan(
+    const AudioDevice& target,
+    const AudioDevice& base) {
+  int t = GetUserPriority(target);
+  int b = GetUserPriority(base);
+
+  // Don't need to update the user priority of `target` if it's already has
+  // higher priority than base.
+  if (t > b)
+    return;
+
+  auto target_id = GetDeviceIdString(target);
+  base::Value::Dict& priority_prefs =
+      target.is_input ? input_device_user_priority_settings_
+                      : output_device_user_priority_settings_;
+
+  if (t != kUserPriorityNone) {
+    for (auto it = priority_prefs.begin(); it != priority_prefs.end(); ++it) {
+      if (it->second.GetInt() > t && it->second.GetInt() <= b)
+        it->second = base::Value(it->second.GetInt() - 1);
+    }
+    priority_prefs.Set(target_id, b);
+  } else {
+    for (auto it = priority_prefs.begin(); it != priority_prefs.end(); ++it) {
+      if (it->second.GetInt() > b)
+        it->second = base::Value(it->second.GetInt() + 1);
+    }
+    priority_prefs.Set(target_id, b + 1);
+  }
+
+  if (target.is_input) {
+    SaveInputDevicesUserPriorityPref();
+  } else {
+    SaveOutputDevicesUserPriorityPref();
+  }
+}
+
+int32_t AudioDevicesPrefHandlerImpl::GetUserPriority(
+    const AudioDevice& device) {
+  if (device.is_input) {
+    return input_device_user_priority_settings_
+        .FindInt(GetDeviceIdString(device))
+        .value_or(kUserPriorityNone);
+    ;
+  } else {
+    return output_device_user_priority_settings_
+        .FindInt(GetDeviceIdString(device))
+        .value_or(kUserPriorityNone);
+    ;
+  }
+}
+
 bool AudioDevicesPrefHandlerImpl::GetAudioOutputAllowedValue() const {
   return local_state_->GetBoolean(prefs::kAudioOutputAllowed);
 }
@@ -288,6 +340,8 @@
   LoadDevicesVolumePref();
   LoadDevicesGainPref();
   LoadDevicesStatePref();
+  LoadInputDevicesUserPriorityPref();
+  LoadOutputDevicesUserPriorityPref();
 }
 
 AudioDevicesPrefHandlerImpl::~AudioDevicesPrefHandlerImpl() = default;
@@ -346,6 +400,30 @@
   dict_update->GetDict() = device_state_settings_.Clone();
 }
 
+void AudioDevicesPrefHandlerImpl::LoadInputDevicesUserPriorityPref() {
+  const base::Value::Dict& priority_prefs =
+      local_state_->GetDict(prefs::kAudioInputDevicesUserPriority);
+  input_device_user_priority_settings_ = priority_prefs.Clone();
+}
+
+void AudioDevicesPrefHandlerImpl::SaveInputDevicesUserPriorityPref() {
+  DictionaryPrefUpdate dict_update(local_state_,
+                                   prefs::kAudioInputDevicesUserPriority);
+  dict_update->GetDict() = input_device_user_priority_settings_.Clone();
+}
+
+void AudioDevicesPrefHandlerImpl::LoadOutputDevicesUserPriorityPref() {
+  const base::Value::Dict& priority_prefs =
+      local_state_->GetDict(prefs::kAudioOutputDevicesUserPriority);
+  output_device_user_priority_settings_ = priority_prefs.Clone();
+}
+
+void AudioDevicesPrefHandlerImpl::SaveOutputDevicesUserPriorityPref() {
+  DictionaryPrefUpdate dict_update(local_state_,
+                                   prefs::kAudioOutputDevicesUserPriority);
+  dict_update->GetDict() = output_device_user_priority_settings_.Clone();
+}
+
 bool AudioDevicesPrefHandlerImpl::MigrateDevicesStatePref(
     const std::string& device_key,
     const AudioDevice& device) {
@@ -405,6 +483,10 @@
   registry->RegisterDoublePref(prefs::kAudioVolumePercent,
                                kDefaultOutputVolumePercent);
   registry->RegisterIntegerPref(prefs::kAudioMute, kPrefMuteOff);
+
+  registry->RegisterDictionaryPref(prefs::kAudioInputDevicesUserPriority);
+
+  registry->RegisterDictionaryPref(prefs::kAudioOutputDevicesUserPriority);
 }
 
 }  // namespace ash
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h
index d3911a8..8ada10b 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h
@@ -46,6 +46,10 @@
                        bool* active,
                        bool* activate_by_user) override;
 
+  void SetUserPriorityHigherThan(const AudioDevice& target,
+                                 const AudioDevice& base) override;
+  int32_t GetUserPriority(const AudioDevice& device) override;
+
   bool GetNoiseCancellationState() override;
   void SetNoiseCancellationState(bool noise_cancellation_state) override;
 
@@ -80,6 +84,14 @@
   void LoadDevicesStatePref();
   void SaveDevicesStatePref();
 
+  // Load and save methods for the user priority for all input devices.
+  void LoadInputDevicesUserPriorityPref();
+  void SaveInputDevicesUserPriorityPref();
+
+  // Load and save methods for the user priority for all output devices.
+  void LoadOutputDevicesUserPriorityPref();
+  void SaveOutputDevicesUserPriorityPref();
+
   double GetOutputVolumePrefValue(const AudioDevice& device);
   double GetInputGainPrefValue(const AudioDevice& device);
   double GetDeviceDefaultOutputVolume(const AudioDevice& device);
@@ -118,6 +130,8 @@
   base::Value::Dict device_volume_settings_;
   base::Value::Dict device_gain_settings_;
   base::Value::Dict device_state_settings_;
+  base::Value::Dict input_device_user_priority_settings_;
+  base::Value::Dict output_device_user_priority_settings_;
 
   PrefService* local_state_;  // not owned
 
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc
index aefa847..ab9850d 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc
@@ -179,6 +179,10 @@
                          : audio_pref_handler_->GetOutputVolumeValue(&device);
   }
 
+  double GetUserPriority(const AudioDevice& device) {
+    return audio_pref_handler_->GetUserPriority(device);
+  }
+
   void SetSoundLevelValue(const AudioDevice& device, double value) {
     return audio_pref_handler_->SetVolumeGainValue(device, value);
   }
@@ -243,6 +247,9 @@
 
   EXPECT_FALSE(GetMute(device));
   EXPECT_FALSE(GetMute(secondary_device));
+
+  EXPECT_EQ(0, GetUserPriority(device));
+  EXPECT_EQ(0, GetUserPriority(secondary_device));
 }
 
 TEST_P(AudioDevicesPrefHandlerTest, TestDefaultValuesV2) {
@@ -259,6 +266,9 @@
 
   EXPECT_FALSE(GetMute(device));
   EXPECT_FALSE(GetMute(secondary_device));
+
+  EXPECT_EQ(0, GetUserPriority(device));
+  EXPECT_EQ(0, GetUserPriority(secondary_device));
 }
 
 TEST_P(AudioDevicesPrefHandlerTest, PrefsRegistered) {
@@ -269,6 +279,10 @@
   EXPECT_TRUE(pref_service_->FindPreference(prefs::kAudioVolumePercent));
   EXPECT_TRUE(pref_service_->FindPreference(prefs::kAudioMute));
   EXPECT_TRUE(pref_service_->FindPreference(prefs::kAudioDevicesState));
+  EXPECT_TRUE(
+      pref_service_->FindPreference(prefs::kAudioInputDevicesUserPriority));
+  EXPECT_TRUE(
+      pref_service_->FindPreference(prefs::kAudioOutputDevicesUserPriority));
 }
 
 TEST_P(AudioDevicesPrefHandlerTest, SoundLevel) {
@@ -463,4 +477,35 @@
   EXPECT_TRUE(audio_pref_handler_->GetNoiseCancellationState());
 }
 
+TEST_P(AudioDevicesPrefHandlerTest, UserPriority) {
+  AudioDevice device = GetDeviceWithVersion(2);
+  EXPECT_EQ(kUserPriorityNone, GetUserPriority(device));
+
+  AudioDevice device2 = GetSecondaryDeviceWithVersion(2);
+  audio_pref_handler_->SetUserPriorityHigherThan(device2, device);
+  EXPECT_EQ(kUserPriorityNone, GetUserPriority(device));
+  EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2));
+
+  audio_pref_handler_->SetUserPriorityHigherThan(device, device2);
+  EXPECT_EQ(2, GetUserPriority(device));
+  EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2));
+
+  AudioDevice device3 = GetDeviceWithSpecialCharactersWithVersion(2);
+
+  audio_pref_handler_->SetUserPriorityHigherThan(device3, device2);
+  EXPECT_EQ(2, GetUserPriority(device3));
+  EXPECT_EQ(3, GetUserPriority(device));
+  EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2));
+
+  audio_pref_handler_->SetUserPriorityHigherThan(device, device3);
+  EXPECT_EQ(2, GetUserPriority(device3));
+  EXPECT_EQ(3, GetUserPriority(device));
+  EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2));
+
+  audio_pref_handler_->SetUserPriorityHigherThan(device3, device);
+  EXPECT_EQ(3, GetUserPriority(device3));
+  EXPECT_EQ(2, GetUserPriority(device));
+  EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2));
+}
+
 }  // namespace ash
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc
index 830711c6..e139b3a7 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc
@@ -70,6 +70,40 @@
       audio_device_state_map_[device.stable_device_id].activate_by_user;
   return true;
 }
+
+void AudioDevicesPrefHandlerStub::SetUserPriorityHigherThan(
+    const AudioDevice& target,
+    const AudioDevice& base) {
+  int t = user_priority_map_[target.stable_device_id];
+  int b = user_priority_map_[base.stable_device_id];
+
+  // Don't need to update the user priority of `target` if it's already has
+  // higher priority than base.
+  if (t > b)
+    return;
+  if (t != kUserPriorityNone) {
+    for (auto& it : user_priority_map_) {
+      if (it.second > t && it.second <= b)
+        user_priority_map_[it.first] -= 1;
+    }
+    user_priority_map_[target.stable_device_id] = b;
+  } else {
+    for (auto& it : user_priority_map_) {
+      if (it.second > b)
+        user_priority_map_[it.first] += 1;
+    }
+    user_priority_map_[target.stable_device_id] = b + 1;
+  }
+}
+
+int32_t AudioDevicesPrefHandlerStub::GetUserPriority(
+    const AudioDevice& device) {
+  if (user_priority_map_.find(device.stable_device_id) ==
+      user_priority_map_.end())
+    return kUserPriorityNone;
+  return user_priority_map_[device.stable_device_id];
+}
+
 bool AudioDevicesPrefHandlerStub::GetNoiseCancellationState() {
   return noise_cancellation_state_;
 }
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h
index 502915bd..1a4ac2d8 100644
--- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h
+++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h
@@ -27,6 +27,7 @@
   using AudioDeviceMute = std::map<uint64_t, bool>;
   using AudioDeviceVolumeGain = std::map<uint64_t, int>;
   using AudioDeviceStateMap = std::map<uint64_t, DeviceState>;
+  using AudioDeviceUserPriority = std::map<uint64_t, int>;
 
   AudioDevicesPrefHandlerStub();
 
@@ -46,6 +47,9 @@
   bool GetDeviceActive(const AudioDevice& device,
                        bool* active,
                        bool* activate_by_user) override;
+  void SetUserPriorityHigherThan(const AudioDevice& target,
+                                 const AudioDevice& base) override;
+  int32_t GetUserPriority(const AudioDevice& device) override;
   bool GetAudioOutputAllowedValue() const override;
   void AddAudioPrefObserver(AudioPrefObserver* observer) override;
   void RemoveAudioPrefObserver(AudioPrefObserver* observer) override;
@@ -62,6 +66,7 @@
   AudioDeviceMute audio_device_mute_map_;
   AudioDeviceVolumeGain audio_device_volume_gain_map_;
   AudioDeviceStateMap audio_device_state_map_;
+  AudioDeviceUserPriority user_priority_map_;
 
   base::ObserverList<AudioPrefObserver>::Unchecked observers_;
 
diff --git a/chromeos/ash/components/drivefs/BUILD.gn b/chromeos/ash/components/drivefs/BUILD.gn
index 8ee91249..bb12524b 100644
--- a/chromeos/ash/components/drivefs/BUILD.gn
+++ b/chromeos/ash/components/drivefs/BUILD.gn
@@ -85,6 +85,7 @@
   deps = [
     ":drivefs",
     ":test_support",
+    "//ash/constants",
     "//base",
     "//base/test:test_support",
     "//chromeos/ash/components/disks:test_support",
diff --git a/chromeos/ash/components/drivefs/drivefs_host.cc b/chromeos/ash/components/drivefs/drivefs_host.cc
index d25a852..2ea8f70 100644
--- a/chromeos/ash/components/drivefs/drivefs_host.cc
+++ b/chromeos/ash/components/drivefs/drivefs_host.cc
@@ -51,7 +51,8 @@
                        host->delegate_->GetMyFilesPath(),
                        host->GetDefaultMountDirName(),
                        host->mount_observer_),
-        host_(host) {
+        host_(host),
+        sync_status_tracker_(std::make_unique<SyncStatusTracker>()) {
     token_fetch_attempted_ =
         bool{host->account_token_delegate_->GetCachedAccessToken()};
     search_ = std::make_unique<DriveFsSearch>(
@@ -102,6 +103,15 @@
     return search_->PerformSearch(std::move(query), std::move(callback));
   }
 
+  SyncStatus GetSyncStatusForPath(const base::FilePath& drive_path) {
+    base::FilePath absolutePath = host_->GetMountPath();
+    if (!base::FilePath("/").AppendRelativePath(drive_path, &absolutePath)) {
+      LOG(ERROR) << "Failed to make path relative to drive root";
+      return SyncStatus::kNotFound;
+    }
+    return sync_status_tracker_->GetSyncStatusForPath(absolutePath);
+  }
+
  private:
   // mojom::DriveFsDelegate:
   void GetAccessToken(const std::string& client_id,
@@ -115,6 +125,35 @@
   }
 
   void OnSyncingStatusUpdate(mojom::SyncingStatusPtr status) override {
+    if (base::FeatureList::IsEnabled(ash::features::kFilesInlineSyncStatus)) {
+      // Keep track of the syncing paths.
+      for (const mojom::ItemEventPtr& event : status->item_events) {
+        base::FilePath path = host_->GetMountPath();
+        if (!base::FilePath("/").AppendRelativePath(base::FilePath(event->path),
+                                                    &path)) {
+          LOG(ERROR) << "Failed to make path relative to drive root";
+          continue;
+        }
+        switch (event->state) {
+          case mojom::ItemEvent::State::kQueued:
+          case mojom::ItemEvent::State::kInProgress:
+            sync_status_tracker_->AddSyncStatusForPath(path,
+                                                       SyncStatus::kInProgress);
+            break;
+          case mojom::ItemEvent::State::kFailed:
+            sync_status_tracker_->AddSyncStatusForPath(path,
+                                                       SyncStatus::kError);
+            break;
+          case mojom::ItemEvent::State::kCompleted:
+            // TODO(msalomao): Post a delayed task to remove the path.
+            sync_status_tracker_->RemovePath(path);
+            break;
+          default:
+            break;
+        }
+      }
+    }
+
     for (auto& observer : host_->observers_) {
       observer.OnSyncingStatusUpdate(*status);
     }
@@ -239,6 +278,7 @@
 
   std::unique_ptr<DriveFsSearch> search_;
   std::unique_ptr<DriveFsHttpClient> http_client_;
+  std::unique_ptr<SyncStatusTracker> sync_status_tracker_ = nullptr;
 
   bool token_fetch_attempted_ = false;
   bool team_drives_fetched_ = false;
@@ -320,6 +360,14 @@
   return mount_state_->drivefs_interface();
 }
 
+SyncStatus DriveFsHost::GetSyncStatusForPath(
+    const base::FilePath& drive_path) const {
+  if (!mount_state_) {
+    return SyncStatus::kNotFound;
+  }
+  return mount_state_->GetSyncStatusForPath(drive_path);
+}
+
 mojom::QueryParameters::QuerySource DriveFsHost::PerformSearch(
     mojom::QueryParametersPtr query,
     mojom::SearchQuery::GetNextPageCallback callback) {
diff --git a/chromeos/ash/components/drivefs/drivefs_host.h b/chromeos/ash/components/drivefs/drivefs_host.h
index 2fb7352..b286b90 100644
--- a/chromeos/ash/components/drivefs/drivefs_host.h
+++ b/chromeos/ash/components/drivefs/drivefs_host.h
@@ -19,6 +19,7 @@
 #include "chromeos/ash/components/drivefs/drivefs_auth.h"
 #include "chromeos/ash/components/drivefs/drivefs_session.h"
 #include "chromeos/ash/components/drivefs/mojom/drivefs.mojom.h"
+#include "chromeos/ash/components/drivefs/sync_status_tracker.h"
 #include "components/account_id/account_id.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -108,6 +109,8 @@
 
   mojom::DriveFs* GetDriveFsInterface() const;
 
+  SyncStatus GetSyncStatusForPath(const base::FilePath& drive_path) const;
+
   // Starts DriveFs search query and returns whether it will be
   // performed localy or remotely. Assumes DriveFS to be mounted.
   mojom::QueryParameters::QuerySource PerformSearch(
diff --git a/chromeos/ash/components/drivefs/drivefs_host_unittest.cc b/chromeos/ash/components/drivefs/drivefs_host_unittest.cc
index 4e91a088..b3b657d 100644
--- a/chromeos/ash/components/drivefs/drivefs_host_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_host_unittest.cc
@@ -8,6 +8,7 @@
 #include <type_traits>
 #include <utility>
 
+#include "ash/constants/ash_features.h"
 #include "base/bind.h"
 #include "base/check.h"
 #include "base/notreached.h"
@@ -18,6 +19,7 @@
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/gmock_move_support.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "base/test/task_environment.h"
 #include "base/timer/mock_timer.h"
@@ -880,5 +882,62 @@
   EXPECT_EQ(status, observed_status);
 }
 
+TEST_F(DriveFsHostTest, OnSyncingStatusUpdate_SyncStatusTracksStatus) {
+  base::test::ScopedFeatureList scoped_feature_list(
+      chromeos::features::kFilesInlineSyncStatus);
+
+  ASSERT_NO_FATAL_FAILURE(DoMount());
+  auto first_status = mojom::SyncingStatus::New();
+  first_status->item_events.emplace_back(
+      absl::in_place, 12, 34, "/foo/bar/filename.txt",
+      mojom::ItemEvent::State::kInProgress, 123, 456,
+      mojom::ItemEventReason::kTransfer);
+  delegate_->OnSyncingStatusUpdate(std::move(first_status));
+  delegate_.FlushForTesting();
+  EXPECT_EQ(
+      host_->GetSyncStatusForPath(base::FilePath("/foo/bar/filename.txt")),
+      SyncStatus::kInProgress);
+
+  auto second_status = mojom::SyncingStatus::New();
+  second_status->item_events.emplace_back(
+      absl::in_place, 12, 34, "/foo/bar/filename_error.txt",
+      mojom::ItemEvent::State::kFailed, 123, 456,
+      mojom::ItemEventReason::kTransfer);
+  delegate_->OnSyncingStatusUpdate(std::move(second_status));
+  delegate_.FlushForTesting();
+  EXPECT_EQ(host_->GetSyncStatusForPath(
+                base::FilePath("/foo/bar/filename_error.txt")),
+            SyncStatus::kError);
+  EXPECT_EQ(
+      host_->GetSyncStatusForPath(base::FilePath("/foo/bar/filename.txt")),
+      SyncStatus::kInProgress);
+  EXPECT_EQ(host_->GetSyncStatusForPath(base::FilePath("/foo/bar")),
+            SyncStatus::kError);
+
+  auto third_status = mojom::SyncingStatus::New();
+  third_status->item_events.emplace_back(
+      absl::in_place, 12, 34, "/foo/bar/filename_error.txt",
+      mojom::ItemEvent::State::kCompleted, 123, 456,
+      mojom::ItemEventReason::kTransfer);
+  delegate_->OnSyncingStatusUpdate(std::move(third_status));
+  delegate_.FlushForTesting();
+  EXPECT_EQ(host_->GetSyncStatusForPath(
+                base::FilePath("/foo/bar/filename_error.txt")),
+            SyncStatus::kNotFound);
+  EXPECT_EQ(host_->GetSyncStatusForPath(base::FilePath("/foo/bar")),
+            SyncStatus::kInProgress);
+
+  auto fourth_status = mojom::SyncingStatus::New();
+  fourth_status->item_events.emplace_back(
+      absl::in_place, 12, 34, "relative/path.txt",
+      mojom::ItemEvent::State::kInProgress, 123, 456,
+      mojom::ItemEventReason::kTransfer);
+  delegate_->OnSyncingStatusUpdate(std::move(fourth_status));
+  delegate_.FlushForTesting();
+
+  EXPECT_EQ(host_->GetSyncStatusForPath(base::FilePath("relative/path.txt")),
+            SyncStatus::kNotFound);
+}
+
 }  // namespace
 }  // namespace drivefs
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index b1dcfcf..3ce35ad 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -3507,6 +3507,9 @@
       <message name="IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_CHECKBOX" translateable="false" desc="Checkbox for Google internal account to attach assistant logs from the current session.">
         Include recent Assistant history via Sherlog. This may include your identify, location and debug info. <ph name="BEGIN_LINK1">&lt;a id="assistantLogsLink"&gt;</ph>Learn more<ph name="END_LINK1">&lt;/a&gt;</ph>
       </message>
+      <message name="IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE" translateable="false" desc="Message shown after user clicks on the assistant logs hyperlink">
+        This information helps us better understand your Assistant issue. It's stored for up to 90 days and access is restricted to appropriate engineering and feedback teams.
+      </message>
       <message name="IDS_FEEDBACK_TOOL_PRIVACY_NOTE" desc="Text for the privacy note included in the feedback app">
         Go to the <ph name="BEGIN_LINK1">&lt;a id="legalHelpPageUrl"&gt;</ph>Legal Help page<ph name="END_LINK1">&lt;/a&gt;</ph> to request content changes for legal reasons. Some account and system information may be sent to Google. We will use the information you give us to help address technical issues and to improve our services, subject to our <ph name="BEGIN_LINK2">&lt;a id="privacyPolicyUrl"&gt;</ph>Privacy Policy<ph name="END_LINK2">&lt;/a&gt;</ph> and <ph name="BEGIN_LINK3">&lt;a id="termsOfServiceUrl"&gt;</ph>Terms of Service<ph name="END_LINK3">&lt;/a&gt;</ph>.
       </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE.png.sha1
new file mode 100644
index 0000000..92a9f0a5
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_ASSISTANT_LOGS_MESSAGE.png.sha1
@@ -0,0 +1 @@
+6d8270a5b9848c65b8397a73a8eb7f5460b360ed
\ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 58f160cb..e84ac04 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -278,8 +278,14 @@
   "peripherals.LaunchAppFromSettings.diagnostics",
   "peripherals.LaunchAppFromSettings.print_management",
 
+  # b/249879125
+  "launcher.SearchBuiltInApps.tablet_mode",
+
   # https://crbug.com/1368315
   "lockscreen.CloseLid",
+
+  # https://crbug.com/1362413
+  "terminal.Crosh",
 ]
 
 # To create filters to be used on specific builders add them like this:
diff --git a/components/app_restore/app_launch_info.h b/components/app_restore/app_launch_info.h
index 9862f48..f4f91ffc 100644
--- a/components/app_restore/app_launch_info.h
+++ b/components/app_restore/app_launch_info.h
@@ -64,6 +64,7 @@
   absl::optional<int32_t> event_flag;
   absl::optional<int32_t> container;
   absl::optional<int32_t> disposition;
+  absl::optional<GURL> override_url;
   absl::optional<int32_t> arc_session_id;
   absl::optional<int64_t> display_id;
   absl::optional<std::string> handler_id;
diff --git a/components/app_restore/app_restore_data.cc b/components/app_restore/app_restore_data.cc
index a9575d8..543d7978 100644
--- a/components/app_restore/app_restore_data.cc
+++ b/components/app_restore/app_restore_data.cc
@@ -19,6 +19,7 @@
 constexpr char kEventFlagKey[] = "event_flag";
 constexpr char kContainerKey[] = "container";
 constexpr char kDispositionKey[] = "disposition";
+constexpr char kOverrideUrlKey[] = "override_url";
 constexpr char kDisplayIdKey[] = "display_id";
 constexpr char kHandlerIdKey[] = "handler_id";
 constexpr char kUrlsKey[] = "urls";
@@ -96,6 +97,12 @@
   return value ? absl::optional<std::string>(*value) : absl::nullopt;
 }
 
+absl::optional<GURL> GetUrlValueFromDict(const base::Value::Dict& dict,
+                                         const std::string& key_name) {
+  const std::string* value = dict.FindString(key_name);
+  return value ? absl::optional<GURL>(*value) : absl::nullopt;
+}
+
 absl::optional<std::u16string> GetU16StringValueFromDict(
     const base::Value::Dict& dict,
     const std::string& key_name) {
@@ -226,6 +233,7 @@
   event_flag = GetIntValueFromDict(*data_dict, kEventFlagKey);
   container = GetIntValueFromDict(*data_dict, kContainerKey);
   disposition = GetIntValueFromDict(*data_dict, kDispositionKey);
+  override_url = GetUrlValueFromDict(*data_dict, kOverrideUrlKey);
   display_id = GetDisplayIdFromDict(*data_dict);
   handler_id = GetStringValueFromDict(*data_dict, kHandlerIdKey);
   urls = GetUrlsFromDict(*data_dict);
@@ -262,6 +270,7 @@
   event_flag = std::move(app_launch_info->event_flag);
   container = std::move(app_launch_info->container);
   disposition = std::move(app_launch_info->disposition);
+  override_url = std::move(app_launch_info->override_url);
   display_id = std::move(app_launch_info->display_id);
   handler_id = std::move(app_launch_info->handler_id);
   urls = std::move(app_launch_info->urls);
@@ -289,6 +298,9 @@
   if (disposition.has_value())
     data->disposition = disposition.value();
 
+  if (override_url.has_value())
+    data->override_url = override_url.value();
+
   if (display_id.has_value())
     data->display_id = display_id.value();
 
@@ -370,6 +382,9 @@
   if (disposition.has_value())
     launch_info_dict.SetIntKey(kDispositionKey, disposition.value());
 
+  if (override_url.has_value())
+    launch_info_dict.SetStringKey(kOverrideUrlKey, override_url.value().spec());
+
   if (display_id.has_value()) {
     launch_info_dict.SetStringKey(kDisplayIdKey,
                                   base::NumberToString(display_id.value()));
diff --git a/components/app_restore/app_restore_data.h b/components/app_restore/app_restore_data.h
index fa24679..f014c77 100644
--- a/components/app_restore/app_restore_data.h
+++ b/components/app_restore/app_restore_data.h
@@ -87,6 +87,7 @@
   absl::optional<int32_t> event_flag;
   absl::optional<int32_t> container;
   absl::optional<int32_t> disposition;
+  absl::optional<GURL> override_url;
   absl::optional<int64_t> display_id;
   absl::optional<std::string> handler_id;
   absl::optional<std::vector<GURL>> urls;
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 51e6f78..a4b8af29 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -2179,7 +2179,6 @@
     if (!cached_field->IsFocusable() && result.fields[i].is_autofilled)
       AutofillMetrics::LogHiddenOrPresentationalSelectFieldsFilled();
   }
-  LOG_AF(buffer) << CTag{"table"};
 
   autofilled_form_signatures_.push_front(form_structure->FormSignatureAsStr());
   // Only remember the last few forms that we've seen, both to avoid false
@@ -2187,10 +2186,6 @@
   if (autofilled_form_signatures_.size() > kMaxRecentFormSignaturesToRemember)
     autofilled_form_signatures_.pop_back();
 
-  LOG_AF(log_manager()) << LoggingScope::kFilling
-                        << LogMessage::kSendFillingData << Br{}
-                        << std::move(buffer);
-
   auto field_types = base::MakeFlatMap<FieldGlobalId, ServerFieldType>(
       *form_structure, {}, [](const auto& field) {
         return std::make_pair(field->global_id(),
@@ -2199,6 +2194,28 @@
   std::vector<FieldGlobalId> safe_fields = driver()->FillOrPreviewForm(
       query_id, action, result, field.origin, field_types);
 
+  // Report the fields that were not filled due to the iframe security policy.
+  for (FieldGlobalId field_global_id : newly_filled_fields) {
+    if (base::Contains(safe_fields, field_global_id)) {
+      // A safe field was filled.
+      continue;
+    }
+    // Find and report index of fields that were not filled.
+    auto it = base::ranges::find(result.fields, field_global_id,
+                                 &FormFieldData::global_id);
+    if (it != result.fields.end()) {
+      size_t index = it - result.fields.begin();
+      std::string field_number = base::StringPrintf("Field %zu", index);
+      LOG_AF(buffer) << Tr{} << field_number
+                     << "Actually did not fill field because of the iframe "
+                        "security policy.";
+    }
+  }
+  LOG_AF(buffer) << CTag{"table"};
+  LOG_AF(log_manager()) << LoggingScope::kFilling
+                        << LogMessage::kSendFillingData << Br{}
+                        << std::move(buffer);
+
   // Call OnDidFillSuggestion() to log the metrics.
   if (action == mojom::RendererFormDataAction::kFill && !is_refill) {
     if (is_credit_card) {
diff --git a/components/exo/wayland/fuzzer/harness_unittest.cc b/components/exo/wayland/fuzzer/harness_unittest.cc
index 56157fb8..b808f38 100644
--- a/components/exo/wayland/fuzzer/harness_unittest.cc
+++ b/components/exo/wayland/fuzzer/harness_unittest.cc
@@ -9,27 +9,17 @@
 #include "base/time/time.h"
 #include "build/chromeos_buildflags.h"
 #include "components/exo/display.h"
+#include "components/exo/test/exo_test_base.h"
 #include "components/exo/test/exo_test_base_views.h"
 #include "components/exo/wayland/fuzzer/actions.pb.h"
 #include "components/exo/wayland/server.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "components/exo/test/exo_test_base.h"
-#endif
-
 namespace exo {
 namespace wayland_fuzzer {
 namespace {
 
-// Use ExoTestBase on Chrome OS because Server starts to depends on ash::Shell,
-// which is unavailable on other platforms so then ExoTestBaseViews instead.
-using TestBase =
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    test::ExoTestBase
-#else
-    test::ExoTestBaseViews
-#endif
-    ;
+// Use ExoTestBase because Server starts to depends on ash::Shell.
+using TestBase = test::ExoTestBase;
 
 class WaylandFuzzerTest : public TestBase {
  protected:
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index 00071994..499a5c40 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -11,6 +11,7 @@
 #include <extended-drag-unstable-v1-server-protocol.h>
 #include <gaming-input-unstable-v2-server-protocol.h>
 #include <grp.h>
+#include <idle-inhibit-unstable-v1-server-protocol.h>
 #include <input-timestamps-unstable-v1-server-protocol.h>
 #include <keyboard-configuration-unstable-v1-server-protocol.h>
 #include <keyboard-extension-unstable-v1-server-protocol.h>
@@ -45,49 +46,38 @@
 #include <string>
 #include <utility>
 
+#include "ash/constants/ash_features.h"
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/stringprintf.h"
+#include "base/system/sys_info.h"
 #include "base/task/thread_pool.h"
 #include "build/chromeos_buildflags.h"
 #include "components/exo/buildflags.h"
 #include "components/exo/display.h"
 #include "components/exo/security_delegate.h"
+#include "components/exo/wayland/content_type.h"
 #include "components/exo/wayland/overlay_prioritizer.h"
 #include "components/exo/wayland/serial_tracker.h"
 #include "components/exo/wayland/server_util.h"
 #include "components/exo/wayland/surface_augmenter.h"
 #include "components/exo/wayland/wayland_display_output.h"
 #include "components/exo/wayland/wayland_watcher.h"
+#include "components/exo/wayland/weston_test.h"
 #include "components/exo/wayland/wl_compositor.h"
 #include "components/exo/wayland/wl_data_device_manager.h"
 #include "components/exo/wayland/wl_output.h"
 #include "components/exo/wayland/wl_seat.h"
+#include "components/exo/wayland/wl_shell.h"
 #include "components/exo/wayland/wl_shm.h"
 #include "components/exo/wayland/wl_subcompositor.h"
 #include "components/exo/wayland/wp_presentation.h"
 #include "components/exo/wayland/wp_viewporter.h"
+#include "components/exo/wayland/xdg_shell.h"
 #include "components/exo/wayland/zaura_shell.h"
 #include "components/exo/wayland/zcr_alpha_compositing.h"
-#include "components/exo/wayland/zcr_secure_output.h"
-#include "components/exo/wayland/zcr_stylus.h"
-#include "components/exo/wayland/zcr_vsync_feedback.h"
-#include "components/exo/wayland/zwp_linux_dmabuf.h"
-#include "components/exo/wayland/zwp_linux_explicit_synchronization.h"
-#include "ui/display/display.h"
-#include "ui/display/screen.h"
-#include "ui/ozone/public/ozone_platform.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include <idle-inhibit-unstable-v1-server-protocol.h>
-#include "ash/constants/ash_features.h"
-#include "base/system/sys_info.h"
-#include "components/exo/wayland/content_type.h"
-#include "components/exo/wayland/weston_test.h"
-#include "components/exo/wayland/wl_shell.h"
-#include "components/exo/wayland/xdg_shell.h"
 #include "components/exo/wayland/zcr_cursor_shapes.h"
 #include "components/exo/wayland/zcr_extended_drag.h"
 #include "components/exo/wayland/zcr_gaming_input.h"
@@ -96,11 +86,16 @@
 #include "components/exo/wayland/zcr_notification_shell.h"
 #include "components/exo/wayland/zcr_remote_shell.h"
 #include "components/exo/wayland/zcr_remote_shell_v2.h"
+#include "components/exo/wayland/zcr_secure_output.h"
+#include "components/exo/wayland/zcr_stylus.h"
 #include "components/exo/wayland/zcr_stylus_tools.h"
 #include "components/exo/wayland/zcr_touchpad_haptics.h"
+#include "components/exo/wayland/zcr_vsync_feedback.h"
 #include "components/exo/wayland/zwp_idle_inhibit_manager.h"
 #include "components/exo/wayland/zwp_input_timestamps_manager.h"
 #include "components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h"
+#include "components/exo/wayland/zwp_linux_dmabuf.h"
+#include "components/exo/wayland/zwp_linux_explicit_synchronization.h"
 #include "components/exo/wayland/zwp_pointer_constraints.h"
 #include "components/exo/wayland/zwp_pointer_gestures.h"
 #include "components/exo/wayland/zwp_relative_pointer_manager.h"
@@ -108,19 +103,15 @@
 #include "components/exo/wayland/zxdg_decoration_manager.h"
 #include "components/exo/wayland/zxdg_output_manager.h"
 #include "components/exo/wayland/zxdg_shell.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+#include "ui/ozone/public/ozone_platform.h"
 
 #if BUILDFLAG(ENABLE_COLOR_MANAGER)
 #include <chrome-color-management-server-protocol.h>
 #include "components/exo/wayland/zcr_color_manager.h"
 #endif
 
-#endif
-
-#if defined(USE_FULLSCREEN_SHELL)
-#include <fullscreen-shell-unstable-v1-server-protocol.h>
-#include "components/exo/wayland/zwp_fullscreen_shell.h"
-#endif
-
 namespace exo {
 namespace wayland {
 namespace switches {
@@ -230,7 +221,7 @@
                << socket_path_;
     return false;
   }
-#if BUILDFLAG(IS_CHROMEOS_ASH)
+
   // On debugging chromeos-chrome on linux platform,
   // try to ensure the directory if missing.
   if (!base::SysInfo::IsRunningOnChromeOS()) {
@@ -239,7 +230,6 @@
           base::CreateDirectory(runtime_dir))
         << "Failed to create " << runtime_dir;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   if (!AddSocket(socket_path_.MaybeAsASCII().c_str())) {
     LOG(ERROR) << "Failed to add socket: " << socket_path_;
@@ -334,7 +324,6 @@
   }
   wl_global_create(wl_display_.get(), &zaura_shell_interface,
                    kZAuraShellVersion, display_, bind_aura_shell);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   wl_global_create(wl_display_.get(), &wl_shell_interface, 1, display_,
                    bind_shell);
   wl_global_create(wl_display_.get(), &wp_content_type_manager_v1_interface, 1,
@@ -419,12 +408,6 @@
 
   wl_global_create(wl_display_.get(), &zcr_touchpad_haptics_v1_interface, 1,
                    display_, bind_touchpad_haptics);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if defined(USE_FULLSCREEN_SHELL)
-  wl_global_create(wl_display_.get(), &zwp_fullscreen_shell_v1_interface, 1,
-                   display_, bind_fullscreen_shell);
-#endif
 }
 
 void Server::Finalize(StartCallback callback, bool success) {
diff --git a/components/exo/wayland/server.h b/components/exo/wayland/server.h
index 34509a87..0ee5d5e 100644
--- a/components/exo/wayland/server.h
+++ b/components/exo/wayland/server.h
@@ -130,7 +130,6 @@
   std::unique_ptr<wayland::WaylandWatcher> wayland_watcher_;
   base::FilePath socket_path_;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   std::unique_ptr<WaylandKeyboardExtension> zcr_keyboard_extension_data_;
   std::unique_ptr<WaylandTextInputManager> zwp_text_manager_data_;
   std::unique_ptr<WaylandTextInputExtension> zcr_text_input_extension_data_;
@@ -138,7 +137,6 @@
   std::unique_ptr<WaylandXdgShell> xdg_shell_data_;
   std::unique_ptr<WaylandRemoteShellData> remote_shell_data_;
   std::unique_ptr<WestonTest> weston_test_holder_;
-#endif
 };
 
 }  // namespace wayland
diff --git a/components/exo/wayland/test/wayland_server_test_base.h b/components/exo/wayland/test/wayland_server_test_base.h
index 2a61cb5..961e0a4 100644
--- a/components/exo/wayland/test/wayland_server_test_base.h
+++ b/components/exo/wayland/test/wayland_server_test_base.h
@@ -11,12 +11,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/threading/thread.h"
 #include "build/chromeos_buildflags.h"
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "components/exo/test/exo_test_base.h"
-#else
-#include "components/exo/test/exo_test_base_views.h"
-#endif
 
 namespace exo {
 class SecurityDelegate;
@@ -27,15 +22,8 @@
 
 namespace test {
 
-// Use ExoTestBase on Chrome OS because Server starts to depends on ash::Shell,
-// which is unavailable on other platforms so then ExoTestBaseViews instead.
-using TestBase =
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    exo::test::ExoTestBase
-#else
-    exo::test::ExoTestBaseViews
-#endif
-    ;
+// Use ExoTestBase because Server starts to depends on ash::Shell.
+using TestBase = exo::test::ExoTestBase;
 
 // Base class for tests that create an exo's wayland server.
 class WaylandServerTestBase : public TestBase {
diff --git a/components/exo/wayland/wl_compositor.cc b/components/exo/wayland/wl_compositor.cc
index 02ae451..bb28152 100644
--- a/components/exo/wayland/wl_compositor.cc
+++ b/components/exo/wayland/wl_compositor.cc
@@ -15,13 +15,10 @@
 #include "components/exo/surface.h"
 #include "components/exo/wayland/server.h"
 #include "components/exo/wayland/server_util.h"
+#include "components/exo/wayland/zwp_linux_explicit_synchronization.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/display/types/display_constants.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "components/exo/wayland/zwp_linux_explicit_synchronization.h"
-#endif
-
 namespace exo {
 class Server;
 namespace wayland {
@@ -133,10 +130,8 @@
 void surface_commit(wl_client* client, wl_resource* resource) {
   Surface* surface = GetUserDataAs<Surface>(resource);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   if (!linux_surface_synchronization_validate_commit(surface))
     return;
-#endif
 
   surface->Commit();
 }
diff --git a/components/exo/wayland/wl_seat.cc b/components/exo/wayland/wl_seat.cc
index c7f731b..24e79224 100644
--- a/components/exo/wayland/wl_seat.cc
+++ b/components/exo/wayland/wl_seat.cc
@@ -8,19 +8,16 @@
 #include <wayland-server-protocol-core.h>
 
 #include "build/chromeos_buildflags.h"
+#include "components/exo/keyboard.h"
 #include "components/exo/pointer.h"
 #include "components/exo/touch.h"
 #include "components/exo/wayland/serial_tracker.h"
 #include "components/exo/wayland/server_util.h"
+#include "components/exo/wayland/wayland_keyboard_delegate.h"
 #include "components/exo/wayland/wayland_pointer_delegate.h"
 #include "components/exo/wayland/wayland_touch_delegate.h"
 #include "ui/base/buildflags.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "components/exo/keyboard.h"
-#include "components/exo/wayland/wayland_keyboard_delegate.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 namespace exo {
 namespace wayland {
 
@@ -47,7 +44,6 @@
 const struct wl_pointer_interface pointer_implementation = {pointer_set_cursor,
                                                             pointer_release};
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 ////////////////////////////////////////////////////////////////////////////////
 // wl_keyboard_interface:
 
@@ -60,7 +56,6 @@
 const struct wl_keyboard_interface keyboard_implementation = {keyboard_release};
 
 #endif  // BUILDFLAG(USE_XKBCOMMON)
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 ////////////////////////////////////////////////////////////////////////////////
 // wl_touch_interface:
 
@@ -87,7 +82,7 @@
 }
 
 void seat_get_keyboard(wl_client* client, wl_resource* resource, uint32_t id) {
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(USE_XKBCOMMON)
+#if BUILDFLAG(USE_XKBCOMMON)
   auto* data = GetUserDataAs<WaylandSeat>(resource);
 
   uint32_t version = wl_resource_get_version(resource);
@@ -102,7 +97,7 @@
                     std::move(keyboard));
 #else
   NOTIMPLEMENTED();
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(USE_XKBCOMMON)
+#endif  // BUILDFLAG(USE_XKBCOMMON)
 }
 
 void seat_get_touch(wl_client* client, wl_resource* resource, uint32_t id) {
@@ -137,9 +132,9 @@
     wl_seat_send_name(resource, "default");
   uint32_t capabilities = WL_SEAT_CAPABILITY_POINTER | WL_SEAT_CAPABILITY_TOUCH;
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(USE_XKBCOMMON)
+#if BUILDFLAG(USE_XKBCOMMON)
   capabilities |= WL_SEAT_CAPABILITY_KEYBOARD;
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(USE_XKBCOMMON)
+#endif  // BUILDFLAG(USE_XKBCOMMON)
   wl_seat_send_capabilities(resource, capabilities);
 }
 
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc
index 1900e93..72b0700 100644
--- a/components/exo/wayland/zaura_shell.cc
+++ b/components/exo/wayland/zaura_shell.cc
@@ -14,11 +14,19 @@
 #include <utility>
 #include <vector>
 
+#include "ash/display/display_util.h"
+#include "ash/display/screen_orientation_controller.h"
+#include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/public/cpp/window_properties.h"
+#include "ash/session/session_controller_impl.h"
+#include "ash/shell.h"
+#include "ash/wm/desks/desk.h"
+#include "ash/wm/desks/desks_controller.h"
 #include "ash/wm/window_state.h"
 #include "base/logging.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
 #include "build/chromeos_buildflags.h"
 #include "chromeos/ui/base/window_properties.h"
 #include "chromeos/ui/base/window_state_type.h"
@@ -32,7 +40,10 @@
 #include "components/exo/wayland/wayland_display_observer.h"
 #include "components/exo/wayland/wayland_display_util.h"
 #include "components/exo/wayland/wl_output.h"
+#include "components/exo/wayland/xdg_shell.h"
 #include "components/exo/wm_helper.h"
+#include "components/exo/wm_helper_chromeos.h"
+#include "ui/aura/client/aura_constants.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window_occlusion_tracker.h"
 #include "ui/compositor/layer.h"
@@ -44,20 +55,6 @@
 #include "ui/wm/core/coordinate_conversion.h"
 #include "ui/wm/public/activation_client.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/display/display_util.h"
-#include "ash/display/screen_orientation_controller.h"
-#include "ash/public/cpp/tablet_mode_observer.h"
-#include "ash/session/session_controller_impl.h"
-#include "ash/shell.h"
-#include "ash/wm/desks/desk.h"
-#include "ash/wm/desks/desks_controller.h"
-#include "base/strings/utf_string_conversions.h"
-#include "components/exo/wayland/xdg_shell.h"
-#include "components/exo/wm_helper_chromeos.h"
-#include "ui/aura/client/aura_constants.h"
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 namespace exo {
 namespace wayland {
 
@@ -540,14 +537,12 @@
     const SkRegion& occluded_region) {
   SendOcclusionState(occlusion_state);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   // Should re-write in locked case - we don't want to trigger PIP upon
   // locking the screen.
   if (ash::Shell::Get()->session_controller()->IsScreenLocked()) {
     SendOcclusionFraction(0.0f);
     return;
   }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
   // Send the occlusion fraction.
   auto* window = surface_->window();
@@ -634,8 +629,6 @@
   surface_->Unpin();
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
 chromeos::OrientationType OrientationLock(uint32_t orientation_lock) {
   switch (orientation_lock) {
     case ZAURA_TOPLEVEL_ORIENTATION_LOCK_NONE:
@@ -848,8 +841,6 @@
   shell_surface_->SetMenu();
 }
 
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 namespace {
 
 void aura_output_release(wl_client* client, wl_resource* resource) {
@@ -971,8 +962,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 // aura_shell_interface:
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-
 // IDs of bugs that have been fixed in the exo implementation. These are
 // propagated to clients on aura_shell bind and can be used to gate client
 // logic on the presence of certain fixes.
@@ -1370,22 +1359,6 @@
                     std::make_unique<AuraPopup>(shell_surface));
 }
 
-#else
-void aura_shell_get_aura_toplevel(wl_client* client,
-                                  wl_resource* resource,
-                                  uint32_t id,
-                                  wl_resource* surface_resource) {
-  NOTREACHED();
-}
-
-void aura_shell_get_aura_popup(wl_client* client,
-                               wl_resource* resource,
-                               uint32_t id,
-                               wl_resource* surface_resource) {
-  NOTREACHED();
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH))
-
 void aura_shell_get_aura_surface(wl_client* client,
                                  wl_resource* resource,
                                  uint32_t id,
@@ -1450,14 +1423,9 @@
       wl_resource_create(client, &zaura_shell_interface,
                          std::min(version, kZAuraShellVersion), id);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   Display* display = static_cast<Display*>(data);
   SetImplementation(resource, &aura_shell_implementation,
                     std::make_unique<WaylandAuraShell>(resource, display));
-#else
-  wl_resource_set_implementation(resource, &aura_shell_implementation, nullptr,
-                                 nullptr);
-#endif
 }
 
 }  // namespace wayland
diff --git a/components/exo/wayland/zcr_color_manager.cc b/components/exo/wayland/zcr_color_manager.cc
index 76a3c1c4..78f79c9 100644
--- a/components/exo/wayland/zcr_color_manager.cc
+++ b/components/exo/wayland/zcr_color_manager.cc
@@ -183,15 +183,11 @@
   }
 
   gfx::ColorSpace GetColorSpace() const {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
     // Snapshot ColorSpace is only valid for ScreenAsh.
     return ash::Shell::Get()
         ->display_manager()
         ->GetDisplayInfo(wayland_display_handler_->id())
         .GetSnapshotColorSpace();
-#else
-    return gfx::ColorSpace::CreateSRGB();
-#endif
   }
 
   WaylandDisplayHandler* wayland_display_handler() {
diff --git a/components/exo/wayland/zcr_touchpad_haptics.cc b/components/exo/wayland/zcr_touchpad_haptics.cc
index 3ac1cb2..6c18c53 100644
--- a/components/exo/wayland/zcr_touchpad_haptics.cc
+++ b/components/exo/wayland/zcr_touchpad_haptics.cc
@@ -8,6 +8,7 @@
 #include <wayland-server-core.h>
 #include <wayland-server-protocol-core.h>
 
+#include "ash/constants/ash_features.h"
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "build/chromeos_buildflags.h"
@@ -17,10 +18,6 @@
 #include "ui/ozone/public/input_controller.h"
 #include "ui/ozone/public/ozone_platform.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "ash/constants/ash_features.h"
-#endif
-
 namespace exo {
 namespace wayland {
 namespace {
@@ -32,11 +29,9 @@
   ~WaylandTouchpadHapticsDelegate() = default;
 
   void UpdateTouchpadHapticsState() {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
     if (!base::FeatureList::IsEnabled(
             chromeos::features::kExoHapticFeedbackSupport))
       return;
-#endif
 
     ui::InputController* controller =
         ui::OzonePlatform::GetInstance()->GetInputController();
@@ -81,11 +76,9 @@
                            wl_resource* resource,
                            uint32_t effect,
                            int32_t strength) {
-#if BUILDFLAG(IS_CHROMEOS_ASH)
   if (!base::FeatureList::IsEnabled(
           chromeos::features::kExoHapticFeedbackSupport))
     return;
-#endif
   GetUserDataAs<WaylandTouchpadHapticsDelegate>(resource)->Play(effect,
                                                                 strength);
 }
diff --git a/components/guest_view/browser/test_guest_view_manager.cc b/components/guest_view/browser/test_guest_view_manager.cc
index 7476780..dcef8e8 100644
--- a/components/guest_view/browser/test_guest_view_manager.cc
+++ b/components/guest_view/browser/test_guest_view_manager.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/test/test_timeouts.h"
 #include "components/guest_view/browser/guest_view_base.h"
 #include "components/guest_view/browser/guest_view_manager_delegate.h"
 #include "content/public/browser/render_frame_host.h"
@@ -144,6 +145,16 @@
 
   attached_run_loop_ = std::make_unique<base::RunLoop>();
   attached_run_loop_->Run();
+
+  // Completion of the attachment process may be delayed despite AttachGuest
+  // having been called. We need to wait until the attachment is no longer
+  // considered in progress.
+  while (!guest_view->attached()) {
+    base::RunLoop run_loop;
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
+    run_loop.Run();
+  }
 }
 
 void TestGuestViewManager::WaitForViewGarbageCollected() {
diff --git a/components/optimization_guide/core/model_util.cc b/components/optimization_guide/core/model_util.cc
index f44c0645..295e215a 100644
--- a/components/optimization_guide/core/model_util.cc
+++ b/components/optimization_guide/core/model_util.cc
@@ -79,6 +79,8 @@
       return "GeolocationPermissions";
     case proto::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2:
       return "SegmentationChromeStartAndroidV2";
+    case proto::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER:
+      return "SegmentationSearchUser";
       // Whenever a new value is added, make sure to add it to the OptTarget
       // variant list in
       // //tools/metrics/histograms/metadata/optimization/histograms.xml.
diff --git a/components/optimization_guide/proto/models.proto b/components/optimization_guide/proto/models.proto
index 5cabdbc..bd4472e 100644
--- a/components/optimization_guide/proto/models.proto
+++ b/components/optimization_guide/proto/models.proto
@@ -164,6 +164,8 @@
   OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER = 21;
   // Target for segmentation: Chrome Android Start user V2.
   OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2 = 22;
+  // Target for segmentation: Determine users who use search.
+  OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER = 23;
 }
 
 // The model engine versions that can be used to do model inference.
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter
index 73870c9f..c96fdad2 100644
--- a/components/segmentation_platform/components_unittests.filter
+++ b/components/segmentation_platform/components_unittests.filter
@@ -24,6 +24,7 @@
 PriceTrackingInputDelegateTest.*
 QueryTilesModelTest.*
 ResumeHeavyUserModelTest.*
+SearchUserModelTest.*
 SegmentationModelExecutorTest.*
 SegmentationPlatformDummyUkmManagerTest.*
 SegmentationPlatformServiceImplEmptyConfigTest.*
diff --git a/components/segmentation_platform/embedder/default_model/BUILD.gn b/components/segmentation_platform/embedder/default_model/BUILD.gn
index 65276b7..6abf07c 100644
--- a/components/segmentation_platform/embedder/default_model/BUILD.gn
+++ b/components/segmentation_platform/embedder/default_model/BUILD.gn
@@ -20,6 +20,8 @@
     "query_tiles_model.h",
     "resume_heavy_user_model.cc",
     "resume_heavy_user_model.h",
+    "search_user_model.cc",
+    "search_user_model.h",
     "shopping_user_model.cc",
     "shopping_user_model.h",
   ]
@@ -46,6 +48,7 @@
     "price_tracking_action_model_unittest.cc",
     "query_tiles_model_unittest.cc",
     "resume_heavy_user_model_unittest.cc",
+    "search_user_model_unittest.cc",
     "shopping_user_model_unittest.cc",
   ]
 
@@ -55,6 +58,7 @@
     "//base/test:test_support",
     "//components/segmentation_platform/internal",
     "//components/segmentation_platform/internal/proto",
+    "//components/segmentation_platform/public/proto",
     "//testing/gtest",
   ]
 }
diff --git a/components/segmentation_platform/embedder/default_model/search_user_model.cc b/components/segmentation_platform/embedder/default_model/search_user_model.cc
new file mode 100644
index 0000000..7e747d8
--- /dev/null
+++ b/components/segmentation_platform/embedder/default_model/search_user_model.cc
@@ -0,0 +1,138 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/segmentation_platform/embedder/default_model/search_user_model.h"
+
+#include <array>
+
+#include "base/strings/strcat.h"
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "components/segmentation_platform/internal/metadata/metadata_writer.h"
+#include "components/segmentation_platform/public/constants.h"
+#include "components/segmentation_platform/public/model_provider.h"
+#include "components/segmentation_platform/public/proto/model_metadata.pb.h"
+
+namespace segmentation_platform {
+
+namespace {
+using proto::SegmentId;
+
+// Default parameters for search user model.
+constexpr uint64_t kSearchUserModelVersion = 1;
+constexpr SegmentId kSearchUserSubsegmentId =
+    SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER;
+constexpr int64_t kSearchUserSignalStorageLength = 28;
+constexpr int64_t kSearchUserMinSignalCollectionLength = 7;
+
+// List of sub-segments for Search User segment.
+enum class SearchUserSubsegment {
+  kUnknown = 0,
+  kNone = 1,
+  kLow = 2,
+  kMedium = 3,
+  kHigh = 4,
+  kMaxValue = kHigh
+};
+
+#define RANK(x) static_cast<int>(x)
+
+// Discrete mapping parameters.
+constexpr char kSearchUserDiscreteMappingKey[] = "search_user";
+
+// Reference to the UMA ClientSummarizedResultType enum for Search.
+constexpr std::array<int32_t, 1> kOnlySearch{1};
+
+// InputFeatures.
+constexpr std::array<MetadataWriter::UMAFeature, 1> kSearchUserUMAFeatures = {
+    MetadataWriter::UMAFeature::FromEnumHistogram(
+        "Omnibox.SuggestionUsed.ClientSummarizedResultType",
+        28,
+        kOnlySearch.data(),
+        kOnlySearch.size()),
+};
+
+// Any updates to these strings need to also update the field trials allowlist
+// in go/segmentation-field-trials-map.
+std::string SearchUserSubsegmentToString(SearchUserSubsegment subsegment) {
+  switch (subsegment) {
+    case SearchUserSubsegment::kUnknown:
+      return "Unknown";
+    case SearchUserSubsegment::kNone:
+      return "None";
+    case SearchUserSubsegment::kLow:
+      return "Low";
+    case SearchUserSubsegment::kMedium:
+      return "Medium";
+    case SearchUserSubsegment::kHigh:
+      return "High";
+  }
+}
+
+}  // namespace
+
+SearchUserModel::SearchUserModel() : ModelProvider(kSearchUserSubsegmentId) {}
+
+absl::optional<std::string> SearchUserModel::GetSubsegmentName(
+    int subsegment_rank) {
+  DCHECK(RANK(SearchUserSubsegment::kUnknown) <= subsegment_rank &&
+         subsegment_rank <= RANK(SearchUserSubsegment::kMaxValue));
+  SearchUserSubsegment subgroup =
+      static_cast<SearchUserSubsegment>(subsegment_rank);
+  return SearchUserSubsegmentToString(subgroup);
+}
+
+void SearchUserModel::InitAndFetchModel(
+    const ModelUpdatedCallback& model_updated_callback) {
+  proto::SegmentationModelMetadata search_user_metadata;
+  MetadataWriter writer(&search_user_metadata);
+  writer.SetDefaultSegmentationMetadataConfig(
+      kSearchUserMinSignalCollectionLength, kSearchUserSignalStorageLength);
+
+  // Set discrete mapping.
+  writer.AddBooleanSegmentDiscreteMappingWithSubsegments(
+      kSearchUserDiscreteMappingKey, RANK(SearchUserSubsegment::kMedium),
+      RANK(SearchUserSubsegment::kMaxValue));
+
+  // Set features.
+  writer.AddUmaFeatures(kSearchUserUMAFeatures.data(),
+                        kSearchUserUMAFeatures.size());
+
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindRepeating(
+                     model_updated_callback, kSearchUserSubsegmentId,
+                     std::move(search_user_metadata), kSearchUserModelVersion));
+}
+
+void SearchUserModel::ExecuteModelWithInput(const std::vector<float>& inputs,
+                                            ExecutionCallback callback) {
+  // Invalid inputs.
+  if (inputs.size() != kSearchUserUMAFeatures.size()) {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), absl::nullopt));
+    return;
+  }
+
+  float searches = inputs[0];
+
+  SearchUserSubsegment segment;
+  if (searches >= 22) {
+    segment = SearchUserSubsegment::kHigh;
+  } else if (searches >= 5) {
+    segment = SearchUserSubsegment::kMedium;
+  } else if (searches >= 1) {
+    segment = SearchUserSubsegment::kLow;
+  } else {
+    segment = SearchUserSubsegment::kNone;
+  }
+
+  float result = RANK(segment);
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), result));
+}
+
+bool SearchUserModel::ModelAvailable() {
+  return true;
+}
+
+}  // namespace segmentation_platform
diff --git a/components/segmentation_platform/embedder/default_model/search_user_model.h b/components/segmentation_platform/embedder/default_model/search_user_model.h
new file mode 100644
index 0000000..d56f1ba
--- /dev/null
+++ b/components/segmentation_platform/embedder/default_model/search_user_model.h
@@ -0,0 +1,39 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_SEARCH_USER_MODEL_H_
+#define COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_SEARCH_USER_MODEL_H_
+
+#include "components/segmentation_platform/public/model_provider.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace segmentation_platform {
+
+// Segmentation search user model provider. Provides a default model and
+// metadata for the search user optimization target.
+class SearchUserModel : public ModelProvider {
+ public:
+  SearchUserModel();
+  ~SearchUserModel() override = default;
+
+  // Disallow copy/assign.
+  SearchUserModel(SearchUserModel&) = delete;
+  SearchUserModel& operator=(SearchUserModel&) = delete;
+
+  // Returns the name of the subsegment for the given segment and the
+  // `subsegment_rank`. The `subsegment_rank` should be computed based on the
+  // subsegment discrete mapping in the model metadata.
+  static absl::optional<std::string> GetSubsegmentName(int subsegment_rank);
+
+  // ModelProvider implementation.
+  void InitAndFetchModel(
+      const ModelUpdatedCallback& model_updated_callback) override;
+  void ExecuteModelWithInput(const std::vector<float>& inputs,
+                             ExecutionCallback callback) override;
+  bool ModelAvailable() override;
+};
+
+}  // namespace segmentation_platform
+
+#endif  // COMPONENTS_SEGMENTATION_PLATFORM_EMBEDDER_DEFAULT_MODEL_SEARCH_USER_MODEL_H_
diff --git a/components/segmentation_platform/embedder/default_model/search_user_model_unittest.cc b/components/segmentation_platform/embedder/default_model/search_user_model_unittest.cc
new file mode 100644
index 0000000..09f31bf2
--- /dev/null
+++ b/components/segmentation_platform/embedder/default_model/search_user_model_unittest.cc
@@ -0,0 +1,136 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/segmentation_platform/embedder/default_model/search_user_model.h"
+
+#include "base/run_loop.h"
+#include "base/test/task_environment.h"
+#include "components/segmentation_platform/internal/metadata/metadata_utils.h"
+#include "components/segmentation_platform/public/proto/model_metadata.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace segmentation_platform {
+
+class SearchUserModelTest : public testing::Test {
+ public:
+  SearchUserModelTest() = default;
+  ~SearchUserModelTest() override = default;
+
+  void SetUp() override {
+    search_user_model_ = std::make_unique<SearchUserModel>();
+  }
+
+  void TearDown() override { search_user_model_.reset(); }
+
+  void ExpectInitAndFetchModel() {
+    base::RunLoop loop;
+    search_user_model_->InitAndFetchModel(
+        base::BindRepeating(&SearchUserModelTest::OnInitFinishedCallback,
+                            base::Unretained(this), loop.QuitClosure()));
+    loop.Run();
+  }
+
+  void OnInitFinishedCallback(base::RepeatingClosure closure,
+                              proto::SegmentId target,
+                              proto::SegmentationModelMetadata metadata,
+                              int64_t) {
+    EXPECT_EQ(metadata_utils::ValidateMetadataAndFeatures(metadata),
+              metadata_utils::ValidationResult::kValidationSuccess);
+    fetched_metadata_ = metadata;
+    std::move(closure).Run();
+  }
+
+  absl::optional<float> ExpectExecutionWithInput(
+      const std::vector<float>& inputs) {
+    absl::optional<float> result;
+    base::RunLoop loop;
+    search_user_model_->ExecuteModelWithInput(
+        inputs,
+        base::BindOnce(&SearchUserModelTest::OnExecutionFinishedCallback,
+                       base::Unretained(this), loop.QuitClosure(), &result));
+    loop.Run();
+    return result;
+  }
+
+  void OnExecutionFinishedCallback(base::RepeatingClosure closure,
+                                   absl::optional<float>* output,
+                                   const absl::optional<float>& result) {
+    *output = result;
+    std::move(closure).Run();
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<SearchUserModel> search_user_model_;
+  absl::optional<proto::SegmentationModelMetadata> fetched_metadata_;
+};
+
+TEST_F(SearchUserModelTest, InitAndFetchModel) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+}
+
+TEST_F(SearchUserModelTest, VerifyMetadata) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+
+  ASSERT_EQ(1, fetched_metadata_.value().input_features_size());
+  const proto::UMAFeature feature =
+      fetched_metadata_.value().input_features(0).uma_feature();
+
+  EXPECT_EQ(proto::SignalType::HISTOGRAM_ENUM, feature.type());
+  EXPECT_EQ("Omnibox.SuggestionUsed.ClientSummarizedResultType",
+            feature.name());
+  EXPECT_EQ(proto::Aggregation::COUNT, feature.aggregation());
+  EXPECT_EQ(1u, feature.tensor_length());
+  ASSERT_EQ(1, feature.enum_ids_size());
+  // This must match the `Search` entry in `ClientSummaryResultGroup` in
+  // //tools/metrics/histograms/enums.xml.
+  EXPECT_EQ(1, feature.enum_ids(0));
+}
+
+TEST_F(SearchUserModelTest, ExecuteModelWithInput) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+
+  EXPECT_FALSE(ExpectExecutionWithInput({}));
+
+  std::vector<float> input = {0};
+  absl::optional<float> result = ExpectExecutionWithInput(input);
+  ASSERT_TRUE(result);
+  EXPECT_EQ(1, result.value());
+  EXPECT_EQ(
+      "None",
+      SearchUserModel::GetSubsegmentName(metadata_utils::ConvertToDiscreteScore(
+          "search_user_subsegment", *result, *fetched_metadata_)));
+
+  input[0] = 1;
+  result = ExpectExecutionWithInput(input);
+  ASSERT_TRUE(result);
+  EXPECT_EQ(2, result.value());
+  EXPECT_EQ(
+      "Low",
+      SearchUserModel::GetSubsegmentName(metadata_utils::ConvertToDiscreteScore(
+          "search_user_subsegment", *result, *fetched_metadata_)));
+
+  input[0] = 5;
+  result = ExpectExecutionWithInput(input);
+  ASSERT_TRUE(result);
+  EXPECT_EQ(3, result.value());
+  EXPECT_EQ(
+      "Medium",
+      SearchUserModel::GetSubsegmentName(metadata_utils::ConvertToDiscreteScore(
+          "search_user_subsegment", *result, *fetched_metadata_)));
+
+  input[0] = 22;
+  result = ExpectExecutionWithInput(input);
+  ASSERT_TRUE(result);
+  EXPECT_EQ(4, result.value());
+  EXPECT_EQ(
+      "High",
+      SearchUserModel::GetSubsegmentName(metadata_utils::ConvertToDiscreteScore(
+          "search_user_subsegment", *result, *fetched_metadata_)));
+}
+
+}  // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/stats.cc b/components/segmentation_platform/internal/stats.cc
index 3928bf46..45cf0c67 100644
--- a/components/segmentation_platform/internal/stats.cc
+++ b/components/segmentation_platform/internal/stats.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/notreached.h"
+#include "base/numerics/clamped_math.h"
 #include "base/strings/strcat.h"
 #include "components/segmentation_platform/public/constants.h"
 #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
@@ -43,7 +44,8 @@
   kFeedUserSegment = 17,
   kContextualPageActionPriceTracking = 18,
   kChromeStartAndroidV2 = 22,
-  kMaxValue = kChromeStartAndroidV2,
+  kSearchUserSegment = 23,
+  kMaxValue = kSearchUserSegment,
 };
 
 AdaptiveToolbarButtonVariant OptimizationTargetToAdaptiveToolbarButtonVariant(
@@ -76,7 +78,8 @@
          segmentation_key == kCrossDeviceUserKey ||
          segmentation_key == kFrequentFeatureUserKey ||
          segmentation_key == kIntentionalUserKey ||
-         segmentation_key == kResumeHeavyUserKey;
+         segmentation_key == kResumeHeavyUserKey ||
+         segmentation_key == kSearchUserKey;
 }
 
 BooleanSegmentSwitch GetBooleanSegmentSwitch(SegmentId new_selection,
@@ -175,6 +178,8 @@
       return SegmentationModel::kContextualPageActionPriceTracking;
     case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2:
       return SegmentationModel::kChromeStartAndroidV2;
+    case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER:
+      return SegmentationModel::kSearchUserSegment;
     default:
       return SegmentationModel::kUnknown;
   }
@@ -258,12 +263,17 @@
     case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT:
     case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER:
     case SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING:
-      // Assumes all models return score between 0 and 1. This is true for all
-      // the models we have currently.
+      // This block assumes all models return score between 0 and 1.
       base::UmaHistogramPercentage("SegmentationPlatform.ModelScore." +
                                        SegmentIdToHistogramVariant(segment_id),
                                    score * 100);
       break;
+    case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER:
+      // This block assumes all models return score between 0 and 100.
+      base::UmaHistogramPercentage("SegmentationPlatform.ModelScore." +
+                                       SegmentIdToHistogramVariant(segment_id),
+                                   base::ClampRound(score));
+      break;
     default:
       break;
   }
diff --git a/components/segmentation_platform/internal/stats_unittest.cc b/components/segmentation_platform/internal/stats_unittest.cc
index db2b7aa6..a2d41a5 100644
--- a/components/segmentation_platform/internal/stats_unittest.cc
+++ b/components/segmentation_platform/internal/stats_unittest.cc
@@ -168,5 +168,31 @@
                 "SegmentationPlatform.TrainingDataCollectionEvents.Share", 0));
 }
 
+TEST(StatsTest, RecordModelScore) {
+  base::HistogramTester tester;
+  // Test Adaptive Toolbar special case which records both using a unique
+  // histogram name, and the default histogram name. Both results are multiplied
+  // by 100.
+  stats::RecordModelScore(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE,
+                          0.13);
+  EXPECT_EQ(1,
+            tester.GetBucketCount(
+                "SegmentationPlatform.AdaptiveToolbar.ModelScore.Voice", 13));
+  EXPECT_EQ(1,
+            tester.GetBucketCount("SegmentationPlatform.ModelScore.Voice", 13));
+
+  // Test default case of multiplying result by 100.
+  stats::RecordModelScore(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES, 0.19);
+  EXPECT_EQ(1, tester.GetBucketCount(
+                   "SegmentationPlatform.ModelScore.QueryTiles", 19));
+
+  // Test segments that uses rank as scores, which should be recorded as-is.
+  stats::RecordModelScore(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER, 75);
+  EXPECT_EQ(1, tester.GetBucketCount(
+                   "SegmentationPlatform.ModelScore.SearchUserSegment", 75));
+}
+
 }  // namespace stats
 }  // namespace segmentation_platform
diff --git a/components/segmentation_platform/public/constants.cc b/components/segmentation_platform/public/constants.cc
index 46d228a..9e6b308 100644
--- a/components/segmentation_platform/public/constants.cc
+++ b/components/segmentation_platform/public/constants.cc
@@ -30,6 +30,8 @@
     return kShoppingUserUmaName;
   } else if (segmentation_key == kContextualPageActionsKey) {
     return kContextualPageActionsUmaName;
+  } else if (segmentation_key == kSearchUserKey) {
+    return kSearchUserUmaName;
   } else if (segmentation_key == kPowerUserKey) {
     return kPowerUserUmaName;
   } else if (segmentation_key == kCrossDeviceUserKey) {
@@ -76,6 +78,8 @@
     case proto::SegmentId::
         OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING:
       return "ContextualPageActionPriceTracking";
+    case proto::SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER:
+      return "SearchUserSegment";
     case proto::SegmentId::POWER_USER_SEGMENT:
       return "PowerUserSegment";
     case proto::SegmentId::CROSS_DEVICE_USER_SEGMENT:
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h
index ee16cce..c871345 100644
--- a/components/segmentation_platform/public/constants.h
+++ b/components/segmentation_platform/public/constants.h
@@ -48,6 +48,10 @@
 const char kContextualPageActionsKey[] = "contextual_page_actions";
 const char kContextualPageActionsUmaName[] = "ContextualPageActions";
 
+// Determine search users of the browser app.
+const char kSearchUserKey[] = "search_user";
+const char kSearchUserUmaName[] = "SearchUser";
+
 // Determine power users of the browser app.
 const char kPowerUserKey[] = "power_user";
 const char kPowerUserUmaName[] = "PowerUser";
diff --git a/components/segmentation_platform/public/features.cc b/components/segmentation_platform/public/features.cc
index c25cc9c0..ee933e6 100644
--- a/components/segmentation_platform/public/features.cc
+++ b/components/segmentation_platform/public/features.cc
@@ -28,6 +28,10 @@
              "ShoppingUserSegmentFeature",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kSegmentationPlatformSearchUser,
+             "SegmentationPlatformSearchUser",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 BASE_FEATURE(kSegmentationPlatformFeedSegmentFeature,
              "SegmentationPlatformFeedSegmentFeature",
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
diff --git a/components/segmentation_platform/public/features.h b/components/segmentation_platform/public/features.h
index 8065596..207fbfd 100644
--- a/components/segmentation_platform/public/features.h
+++ b/components/segmentation_platform/public/features.h
@@ -35,6 +35,9 @@
 // least one action is enabled.
 BASE_DECLARE_FEATURE(kContextualPageActions);
 
+// Feature flag for enabling search user segment.
+extern const base::Feature kSegmentationPlatformSearchUser;
+
 // Feature flag for enabling price tracking action feature.
 BASE_DECLARE_FEATURE(kContextualPageActionPriceTracking);
 
diff --git a/components/segmentation_platform/public/proto/segmentation_platform.proto b/components/segmentation_platform/public/proto/segmentation_platform.proto
index 5603f76f0..a087f2b 100644
--- a/components/segmentation_platform/public/proto/segmentation_platform.proto
+++ b/components/segmentation_platform/public/proto/segmentation_platform.proto
@@ -61,6 +61,8 @@
   OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER = 21;
   // Target for segmentation: Chrome Android Start user V2.
   OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2 = 22;
+  // Target for segmentation: Determine users who frequently search.
+  OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER = 23;
   // Add new entries to OptimizationTarget proto.
 
   // New entries should start from a 1000 if OptimizationTarget does not
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/AndroidStylusWritingHandler.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/AndroidStylusWritingHandler.java
index 078ac948..94b8c03 100644
--- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/AndroidStylusWritingHandler.java
+++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/AndroidStylusWritingHandler.java
@@ -25,7 +25,6 @@
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Allows stylus handwriting using the Android stylus writing APIs introduced in Android T.
@@ -56,13 +55,10 @@
         for (InputMethodInfo inputMethod : inputMethods) {
             if (!inputMethod.getComponent().flattenToString().equals(defaultImePackage)) continue;
 
-            // We can't create a boolean here and set it in a lambda, so use AtomicBoolean instead.
-            AtomicBoolean result = new AtomicBoolean();
+            boolean result = inputMethod.supportsStylusHandwriting();
 
-            inputMethod.supportsStylusHandwriting();
-
-            Log.d(TAG, "Stylus feature supported by IME: %s", result.get());
-            return result.get();
+            Log.d(TAG, "Stylus feature supported by IME: %s", result);
+            return result;
         }
 
         Log.d(TAG, "Couldn't find IME");
diff --git a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
index 5798bd17..d9270d88 100644
--- a/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
+++ b/components/variations/android/junit/src/org/chromium/components/variations/firstrun/VariationsSeedFetcherTest.java
@@ -26,9 +26,7 @@
 
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
@@ -68,9 +66,6 @@
     private static final String sMilestone = "64";
     private static final String sChannel = "dev";
 
-    @Rule
-    public TestRule mCommandLineFlagsRule = CommandLineFlags.getTestRule();
-
     @Before
     public void setUp() throws IOException {
         // Pretend we are not on the UI thread, since the class we are testing is supposed to run
diff --git a/components/variations/processed_study.cc b/components/variations/processed_study.cc
index 838c7a5..141105d5e 100644
--- a/components/variations/processed_study.cc
+++ b/components/variations/processed_study.cc
@@ -8,6 +8,7 @@
 #include <set>
 #include <string>
 
+#include "base/containers/contains.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/version.h"
@@ -62,40 +63,53 @@
     return false;
   }
 
-  const std::string& default_group_name = study.default_experiment_name();
+  // Validate experiment names
+  {
+    std::set<std::string> experiment_names;
+    for (const auto& experiment : study.experiment()) {
+      if (experiment.name().empty()) {
+        LogInvalidReason(InvalidStudyReason::kMissingExperimentName);
+        DVLOG(1) << study.name() << " is missing an experiment name";
+        return false;
+      }
+      if (!experiment_names.insert(experiment.name()).second) {
+        LogInvalidReason(InvalidStudyReason::kRepeatedExperimentName);
+        DVLOG(1) << study.name() << " has a repeated experiment name "
+                 << experiment.name();
+        return false;
+      }
+    }
+
+    // Specifying a default experiment is optional, so finding it in the
+    // experiment list is only required when it is specified.
+    if (!study.default_experiment_name().empty() &&
+        !base::Contains(experiment_names, study.default_experiment_name())) {
+      LogInvalidReason(InvalidStudyReason::kMissingDefaultExperimentInList);
+      DVLOG(1) << study.name() << " is missing default experiment ("
+               << study.default_experiment_name() << ") in its experiment list";
+      // The default group was not found in the list of groups. This study is
+      // not valid.
+      return false;
+    }
+  }
+
   base::FieldTrial::Probability divisor = 0;
-
   bool multiple_assigned_groups = false;
-  bool found_default_group = false;
 
-  std::set<std::string> experiment_names;
   std::set<std::string> features_to_associate;
 
-  for (int i = 0; i < study.experiment_size(); ++i) {
-    const Study_Experiment& experiment = study.experiment(i);
-    if (experiment.name().empty()) {
-      LogInvalidReason(InvalidStudyReason::kMissingExperimentName);
-      DVLOG(1) << study.name() << " is missing experiment " << i << " name";
-      return false;
-    }
-    if (!experiment_names.insert(experiment.name()).second) {
-      LogInvalidReason(InvalidStudyReason::kRepeatedExperimentName);
-      DVLOG(1) << study.name() << " has a repeated experiment name "
-               << study.experiment(i).name();
-      return false;
-    }
-
+  for (const auto& experiment : study.experiment()) {
     // Note: This checks for ACTIVATE_ON_QUERY, since there is no reason to
     // have this association with ACTIVATE_ON_STARTUP (where the trial starts
     // active), as well as allowing flexibility to disable this behavior in the
     // future from the server by introducing a new activation type.
     if (study.activation_type() == Study_ActivationType_ACTIVATE_ON_QUERY) {
       const auto& features = experiment.feature_association();
-      for (int j = 0; j < features.enable_feature_size(); ++j) {
-        features_to_associate.insert(features.enable_feature(j));
+      for (const auto& feature : features.enable_feature()) {
+        features_to_associate.insert(feature);
       }
-      for (int j = 0; j < features.disable_feature_size(); ++j) {
-        features_to_associate.insert(features.disable_feature(j));
+      for (const auto& feature : features.disable_feature()) {
+        features_to_associate.insert(feature);
       }
     }
 
@@ -132,19 +146,6 @@
       }
       divisor += experiment.probability_weight();
     }
-    if (study.experiment(i).name() == default_group_name)
-      found_default_group = true;
-  }
-
-  // Specifying a default experiment is optional, so finding it in the
-  // experiment list is only required when it is specified.
-  if (!study.default_experiment_name().empty() && !found_default_group) {
-    LogInvalidReason(InvalidStudyReason::kMissingDefaultExperimentInList);
-    DVLOG(1) << study.name() << " is missing default experiment ("
-             << study.default_experiment_name() << ") in its experiment list";
-    // The default group was not found in the list of groups. This study is not
-    // valid.
-    return false;
   }
 
   // Ensure that groups that don't explicitly enable/disable any features get
diff --git a/components/variations/variations_seed_processor.cc b/components/variations/variations_seed_processor.cc
index 25fa594..eb2a1a1 100644
--- a/components/variations/variations_seed_processor.cc
+++ b/components/variations/variations_seed_processor.cc
@@ -363,15 +363,12 @@
 
   const auto& entropy_provider =
       SelectEntropyProviderForStudy(processed_study, entropy_providers);
-  uint32_t randomization_seed = ShouldSessionRandomizeStudy(processed_study)
-                                    ? 0
-                                    : study.randomization_seed();
 
   scoped_refptr<base::FieldTrial> trial(
       base::FieldTrialList::FactoryGetFieldTrial(
           study.name(), processed_study.total_probability(),
           processed_study.GetDefaultExperimentName(), entropy_provider,
-          randomization_seed));
+          study.randomization_seed()));
 
   bool has_overrides = false;
   bool enables_or_disables_features = false;
diff --git a/content/browser/devtools/browser_devtools_agent_host.cc b/content/browser/devtools/browser_devtools_agent_host.cc
index d134f97..9d9666c 100644
--- a/content/browser/devtools/browser_devtools_agent_host.cc
+++ b/content/browser/devtools/browser_devtools_agent_host.cc
@@ -198,7 +198,8 @@
       base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); }));
   session->CreateAndAddHandler<protocol::MemoryHandler>();
   session->CreateAndAddHandler<protocol::SecurityHandler>();
-  session->CreateAndAddHandler<protocol::StorageHandler>();
+  session->CreateAndAddHandler<protocol::StorageHandler>(
+      session->GetClient()->IsTrusted());
   session->CreateAndAddHandler<protocol::SystemInfoHandler>();
   if (tethering_task_runner_) {
     session->CreateAndAddHandler<protocol::TetheringHandler>(
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc
index 09c08e36..98042f21 100644
--- a/content/browser/devtools/protocol/storage_handler.cc
+++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -269,8 +269,9 @@
   mojo::Receiver<storage::mojom::IndexedDBObserver> receiver_;
 };
 
-StorageHandler::StorageHandler()
-    : DevToolsDomainHandler(Storage::Metainfo::domainName) {}
+StorageHandler::StorageHandler(bool client_is_trusted)
+    : DevToolsDomainHandler(Storage::Metainfo::domainName),
+      client_is_trusted_(client_is_trusted) {}
 
 StorageHandler::~StorageHandler() {
   DCHECK(!cache_storage_observer_);
@@ -299,6 +300,8 @@
 
 void StorageHandler::GetCookies(Maybe<std::string> browser_context_id,
                                 std::unique_ptr<GetCookiesCallback> callback) {
+  if (!client_is_trusted_)
+    callback->sendFailure(Response::ServerError("Permission denied"));
   StoragePartition* storage_partition = nullptr;
   Response response = StorageHandler::FindStoragePartition(browser_context_id,
                                                            &storage_partition);
diff --git a/content/browser/devtools/protocol/storage_handler.h b/content/browser/devtools/protocol/storage_handler.h
index 2fc434e..e064a23 100644
--- a/content/browser/devtools/protocol/storage_handler.h
+++ b/content/browser/devtools/protocol/storage_handler.h
@@ -29,7 +29,7 @@
                        private content::InterestGroupManagerImpl::
                            InterestGroupObserverInterface {
  public:
-  StorageHandler();
+  explicit StorageHandler(bool client_is_trusted);
 
   StorageHandler(const StorageHandler&) = delete;
   StorageHandler& operator=(const StorageHandler&) = delete;
@@ -138,6 +138,7 @@
 
   // Exposes the API for managing storage quota overrides.
   std::unique_ptr<storage::QuotaOverrideHandle> quota_override_handle_;
+  bool client_is_trusted_;
 
   base::WeakPtrFactory<StorageHandler> weak_ptr_factory_{this};
 };
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index 3587cdc..2441cbcc 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -345,7 +345,8 @@
   const bool may_attach_to_brower = session->GetClient()->IsTrusted();
   session->CreateAndAddHandler<protocol::ServiceWorkerHandler>(
       /* allow_inspect_worker= */ may_attach_to_brower);
-  session->CreateAndAddHandler<protocol::StorageHandler>();
+  session->CreateAndAddHandler<protocol::StorageHandler>(
+      session->GetClient()->IsTrusted());
   auto* target_handler = session->CreateAndAddHandler<protocol::TargetHandler>(
       may_attach_to_brower
           ? protocol::TargetHandler::AccessMode::kRegular
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index 4ed37731..7fc22246 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -244,6 +244,10 @@
     prerender_helper_->AddPrerenderAsync(prerendering_url);
   }
 
+  void AddMultiplePrerenderAsync(const std::vector<GURL>& prerendering_urls) {
+    prerender_helper_->AddMultiplePrerenderAsync(prerendering_urls);
+  }
+
   bool AddTestUtilJS(RenderFrameHost* host) {
     bool success = false;
     std::string js = R"(
@@ -3833,20 +3837,7 @@
   SequentialPrerenderObserver observer(*web_contents(), prerender_urls[2]);
 
   // Insert 3 URLs into the speculation rules at the same time.
-  ASSERT_TRUE(
-      ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-             JsReplace(
-                 R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2, $3]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                 prerender_urls[0], prerender_urls[1], prerender_urls[2])));
+  AddMultiplePrerenderAsync(prerender_urls);
 
   // Wait for DidFinishNavigation on the last URL.
   observer.WaitForTargetNavigationFinished();
@@ -3907,19 +3898,7 @@
 
   // Insert 3 URLs into the speculation rules at the same time. The first
   // prerender should start immediately, and the other two requests enqueued.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2, $3]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         kPrerender1, kPrerender2, kPrerender3)));
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2, kPrerender3});
 
   registry_observer.WaitForTrigger(kPrerender3);
   test::PrerenderHostObserver prerender3_observer(*web_contents(),
@@ -3984,19 +3963,7 @@
 
   // Insert 3 URLs into the speculation rules at the same time. The first
   // prerender should start immediately.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2, $3]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         kPrerender1, kPrerender2, kPrerender3)));
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2, kPrerender3});
 
   // Stop the second prerendering initial navigation.
   response2.WaitForRequest();
@@ -4041,19 +4008,7 @@
   test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
 
   // Insert 2 URLs into the speculation rules at the same time.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         kPrerender1, kPrerender2)));
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2});
 
   registry_observer.WaitForTrigger(kPrerender2);
   test::PrerenderHostObserver prerender2_observer(*web_contents(),
@@ -4101,20 +4056,7 @@
   test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
 
   // Insert 4 URLs into the speculation rules at the same time.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2, $3, $4]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         prerender_urls[0], prerender_urls[1],
-                         prerender_urls[2], prerender_urls[3])));
+  AddMultiplePrerenderAsync(prerender_urls);
 
   // Stop the first prerendering initial navigation.
   response.WaitForRequest();
@@ -4147,19 +4089,7 @@
   ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
 
   // Insert 2 URLs into the speculation rules at the same time.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         kPrerender1, kPrerender2)));
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2});
 
   // Stop the first prerender's initial navigation.
   prerender1_response.WaitForRequest();
@@ -4226,19 +4156,7 @@
   test::PrerenderHostRegistryObserver registry_observer(*web_contents_impl());
 
   // Insert 2 URLs into the speculation rules at the same time.
-  ASSERT_TRUE(ExecJs(web_contents_impl()->GetPrimaryMainFrame(),
-                     JsReplace(
-                         R"(
-                  const sc = document.createElement('script');
-                  sc.type = 'speculationrules';
-                  sc.textContent = JSON.stringify({
-                    prerender: [
-                      {source: "list", urls: [$1, $2]}
-                    ]
-                  });
-                  document.head.appendChild(sc);
-                  )",
-                         kPrerender1, kPrerender2)));
+  AddMultiplePrerenderAsync({kPrerender1, kPrerender2});
 
   registry_observer.WaitForTrigger(kPrerender2);
   test::PrerenderHostObserver prerender2_observer(*web_contents(),
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 1538cdb..43509802 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -3230,7 +3230,8 @@
 
   // If this was the current pending or speculative RFH dying, cancel and
   // destroy it.
-  frame_tree_node_->render_manager()->CancelPendingIfNecessary(this);
+  frame_tree_node_->render_manager()->CleanupIfSpeculativeForRenderProcessGone(
+      this);
 
   // Note: don't add any more code at this point in the function because
   // |this| may be deleted. Any additional cleanup should happen before
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index 326015c00..56f7cbc 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1525,7 +1525,7 @@
       dest_url_info(dest_url_info),
       relation(relation_to_current) {}
 
-void RenderFrameHostManager::CancelPendingIfNecessary(
+void RenderFrameHostManager::CleanupIfSpeculativeForRenderProcessGone(
     RenderFrameHostImpl* render_frame_host) {
   if (render_frame_host == speculative_render_frame_host_.get()) {
     // TODO(nasko, clamy): This should just clean up the speculative RFH
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h
index 16e6a65..a63d43f 100644
--- a/content/browser/renderer_host/render_frame_host_manager.h
+++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -464,9 +464,12 @@
     return render_frame_host_->browsing_context_state()->proxy_hosts();
   }
 
-  // Cancels and destroys the pending or speculative RenderFrameHost if they
-  // match the provided |render_frame_host|.
-  void CancelPendingIfNecessary(RenderFrameHostImpl* render_frame_host);
+  // Called when the render process is gone for `render_frame_host`. If
+  // `render_frame_host` is the speculative frame host, cancels the navigation
+  // and cleans up the RenderFrameHost because there is no longer a render
+  // process for the navigation to commit into.
+  void CleanupIfSpeculativeForRenderProcessGone(
+      RenderFrameHostImpl* render_frame_host);
 
   // Updates the user activation state in all proxies of this frame.  For
   // more details, see the comment on FrameTreeNode::user_activation_state_.
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h
index 158c3764..0af40eb 100644
--- a/content/public/renderer/render_frame_observer.h
+++ b/content/public/renderer/render_frame_observer.h
@@ -23,6 +23,7 @@
 #include "third_party/blink/public/common/responsiveness_metrics/user_interaction_latency.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/common/use_counter/use_counter_feature.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom-shared.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/blink/public/web/web_meaningful_layout.h"
@@ -175,11 +176,12 @@
   // internal), and |stack_trace| is the stack trace of the error in a
   // human-readable format (each frame is formatted as
   // "\n    at function_name (source:line_number:column_number)").
-  virtual void DetailedConsoleMessageAdded(const std::u16string& message,
-                                           const std::u16string& source,
-                                           const std::u16string& stack_trace,
-                                           uint32_t line_number,
-                                           int32_t severity_level) {}
+  virtual void DetailedConsoleMessageAdded(
+      const std::u16string& message,
+      const std::u16string& source,
+      const std::u16string& stack_trace,
+      uint32_t line_number,
+      blink::mojom::ConsoleMessageLevel level) {}
 
   // Called when an interesting (from document lifecycle perspective),
   // compositor-driven layout had happened. This is a reasonable hook to use
diff --git a/content/public/test/prerender_test_util.cc b/content/public/test/prerender_test_util.cc
index cc7b3436..a1f78ce 100644
--- a/content/public/test/prerender_test_util.cc
+++ b/content/public/test/prerender_test_util.cc
@@ -7,6 +7,7 @@
 #include <tuple>
 
 #include "base/callback_helpers.h"
+#include "base/strings/string_util.h"
 #include "base/trace_event/typed_macros.h"
 #include "content/browser/preloading/prerender/prerender_host_registry.h"
 #include "content/browser/renderer_host/frame_tree.h"
@@ -324,6 +325,30 @@
       base::UTF8ToUTF16(script), base::NullCallback());
 }
 
+void PrerenderTestHelper::AddMultiplePrerenderAsync(
+    const std::vector<GURL>& prerendering_urls) {
+  TRACE_EVENT("test", "PrerenderTestHelper::AddMultiplePrerenderAsync",
+              "prerendering_urls", prerendering_urls);
+  EXPECT_TRUE(content::BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  // Concatenate the given URLs with a comma separator.
+  std::string urls_str;
+  for (size_t i = 0; i < prerendering_urls.size(); i++) {
+    // Wrap the url with double quotes.
+    urls_str +=
+        base::StringPrintf(R"("%s")", prerendering_urls[i].spec().c_str());
+    if (i + 1 < prerendering_urls.size()) {
+      urls_str += ", ";
+    }
+  }
+
+  std::string script = base::ReplaceStringPlaceholders(
+      kAddSpeculationRuleScript, {urls_str}, nullptr);
+
+  GetWebContents()->GetPrimaryMainFrame()->ExecuteJavaScriptForTests(
+      base::UTF8ToUTF16(script), base::NullCallback());
+}
+
 std::unique_ptr<PrerenderHandle>
 PrerenderTestHelper::AddEmbedderTriggeredPrerenderAsync(
     const GURL& prerendering_url,
diff --git a/content/public/test/prerender_test_util.h b/content/public/test/prerender_test_util.h
index 78a7cc6..34203ebd 100644
--- a/content/public/test/prerender_test_util.h
+++ b/content/public/test/prerender_test_util.h
@@ -130,6 +130,10 @@
   int AddPrerender(const GURL& prerendering_url);
   void AddPrerenderAsync(const GURL& prerendering_url);
 
+  // Adds multiple URLs to the speculation rules at the same time. This function
+  // doesn't wait for the completion of prerendering.
+  void AddMultiplePrerenderAsync(const std::vector<GURL>& prerendering_urls);
+
   // Starts prerendering and returns a PrerenderHandle that should be kept alive
   // until prerender activation. Note that it returns before the completion of
   // the prerendering navigation.
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 64d106a..a1e3671 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -145,7 +145,6 @@
 #include "third_party/blink/public/common/loader/record_load_histograms.h"
 #include "third_party/blink/public/common/loader/resource_type_util.h"
 #include "third_party/blink/public/common/loader/url_loader_throttle.h"
-#include "third_party/blink/public/common/logging/logging_utils.h"
 #include "third_party/blink/public/common/navigation/impression.h"
 #include "third_party/blink/public/common/navigation/navigation_params_mojom_traits.h"
 #include "third_party/blink/public/common/navigation/navigation_policy.h"
@@ -3595,7 +3594,7 @@
     for (auto& observer : observers_) {
       observer.DetailedConsoleMessageAdded(
           message.text.Utf16(), source_name.Utf16(), stack_trace.Utf16(),
-          source_line, blink::ConsoleMessageLevelToLogSeverity(message.level));
+          source_line, message.level);
     }
   }
 }
diff --git a/extensions/browser/extension_frame_host.cc b/extensions/browser/extension_frame_host.cc
index b9847b63..bc51ea4 100644
--- a/extensions/browser/extension_frame_host.cc
+++ b/extensions/browser/extension_frame_host.cc
@@ -49,4 +49,10 @@
 void ExtensionFrameHost::WatchedPageChange(
     const std::vector<std::string>& css_selectors) {}
 
+void ExtensionFrameHost::DetailedConsoleMessageAdded(
+    const std::u16string& message,
+    const std::u16string& source,
+    const StackTrace& stack_trace,
+    blink::mojom::ConsoleMessageLevel level) {}
+
 }  // namespace extensions
diff --git a/extensions/browser/extension_frame_host.h b/extensions/browser/extension_frame_host.h
index 355e34f..dd4284c 100644
--- a/extensions/browser/extension_frame_host.h
+++ b/extensions/browser/extension_frame_host.h
@@ -48,11 +48,13 @@
                RequestCallback callback) override;
   void WatchedPageChange(
       const std::vector<std::string>& css_selectors) override;
+  void DetailedConsoleMessageAdded(
+      const std::u16string& message,
+      const std::u16string& source,
+      const StackTrace& stack_trace,
+      blink::mojom::ConsoleMessageLevel level) override;
 
  protected:
-  content::WebContents* web_contents() { return web_contents_; }
-
- private:
   // This raw pointer is safe to use because ExtensionWebContentsObserver whose
   // lifetime is tied to the WebContents owns this instance.
   raw_ptr<content::WebContents> web_contents_;
diff --git a/extensions/browser/extension_util.cc b/extensions/browser/extension_util.cc
index 9399156..e56f6bc3 100644
--- a/extensions/browser/extension_util.cc
+++ b/extensions/browser/extension_util.cc
@@ -11,6 +11,7 @@
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/child_process_security_policy.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/storage_partition_config.h"
 #include "content/public/common/url_constants.h"
@@ -277,6 +278,15 @@
   return maybe_extension_id;
 }
 
+std::string GetExtensionIdFromFrame(
+    content::RenderFrameHost* render_frame_host) {
+  const GURL& site = render_frame_host->GetSiteInstance()->GetSiteURL();
+  if (!site.SchemeIs(kExtensionScheme))
+    return std::string();
+
+  return site.host();
+}
+
 bool CanRendererHostExtensionOrigin(int render_process_id,
                                     const ExtensionId& extension_id) {
   url::Origin extension_origin =
diff --git a/extensions/browser/extension_util.h b/extensions/browser/extension_util.h
index dd88945..734df0f 100644
--- a/extensions/browser/extension_util.h
+++ b/extensions/browser/extension_util.h
@@ -21,7 +21,8 @@
 class SiteInstance;
 class StoragePartition;
 class StoragePartitionConfig;
-}
+class RenderFrameHost;
+}  // namespace content
 
 namespace extensions {
 class Extension;
@@ -98,6 +99,11 @@
 // string is returned when `site_instance` is not associated with an extension.
 ExtensionId GetExtensionIdForSiteInstance(content::SiteInstance& site_instance);
 
+// Returns the extension id associated with the given `render_frame_host`, or
+// the empty string if there is none.
+std::string GetExtensionIdFromFrame(
+    content::RenderFrameHost* render_frame_host);
+
 // Returns true if the process corresponding to `render_process_id` can host an
 // extension with `extension_id`.  (It doesn't necessarily mean that the process
 // *does* host this specific extension at this point in time.)
diff --git a/extensions/browser/extension_web_contents_observer.cc b/extensions/browser/extension_web_contents_observer.cc
index 296390ee..db6b7ed 100644
--- a/extensions/browser/extension_web_contents_observer.cc
+++ b/extensions/browser/extension_web_contents_observer.cc
@@ -10,7 +10,6 @@
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
-#include "content/public/browser/site_instance.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/url_constants.h"
 #include "extensions/browser/content_script_tracker.h"
@@ -319,21 +318,11 @@
   }
 }
 
-std::string ExtensionWebContentsObserver::GetExtensionIdFromFrame(
-    content::RenderFrameHost* render_frame_host) const {
-  DCHECK(initialized_);
-  const GURL& site = render_frame_host->GetSiteInstance()->GetSiteURL();
-  if (!site.SchemeIs(kExtensionScheme))
-    return std::string();
-
-  return site.host();
-}
-
 const Extension* ExtensionWebContentsObserver::GetExtensionFromFrame(
     content::RenderFrameHost* render_frame_host,
     bool verify_url) const {
   DCHECK(initialized_);
-  std::string extension_id = GetExtensionIdFromFrame(render_frame_host);
+  std::string extension_id = util::GetExtensionIdFromFrame(render_frame_host);
   if (extension_id.empty())
     return nullptr;
 
diff --git a/extensions/browser/extension_web_contents_observer.h b/extensions/browser/extension_web_contents_observer.h
index 04b9530a..85f8dc8 100644
--- a/extensions/browser/extension_web_contents_observer.h
+++ b/extensions/browser/extension_web_contents_observer.h
@@ -140,11 +140,6 @@
   void PepperInstanceCreated() override;
   void PepperInstanceDeleted() override;
 
-  // Returns the extension id associated with the given |render_frame_host|, or
-  // the empty string if there is none.
-  std::string GetExtensionIdFromFrame(
-      content::RenderFrameHost* render_frame_host) const;
-
  private:
   using PassKey = base::PassKey<ExtensionWebContentsObserver>;
 
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index 2124856a..fbf59b9f 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -90,6 +90,7 @@
     "mojom/permission_set.mojom",
     "mojom/renderer.mojom",
     "mojom/run_location.mojom",
+    "mojom/stack_frame.mojom",
     "mojom/url_pattern_set.mojom",
     "mojom/view_type.mojom",
   ]
@@ -175,6 +176,18 @@
       traits_sources =
           [ "//extensions/common/mojom/activation_sequence_mojom_traits.cc" ]
     },
+    {
+      types = [
+        {
+          mojom = "extensions.mojom.StackFrame"
+          cpp = "::extensions::StackFrame"
+        },
+      ]
+      traits_headers =
+          [ "//extensions/common/mojom/stack_frame_mojom_traits.h" ]
+      traits_sources =
+          [ "//extensions/common/mojom/stack_frame_mojom_traits.cc" ]
+    },
   ]
   overridden_deps = [ "//content/public/common:interfaces" ]
 
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index dbe69f0..c2bcc317 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -130,4 +130,10 @@
              "ExtensionSidePanelIntegration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enable fileSystemProvider and fileSystemProviderInternal APIs in service
+// workers.
+BASE_FEATURE(kExtensionsFSPInServiceWorkers,
+             "ExtensionsFSPInServiceWorkers",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace extensions_features
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index 07a00f3..c9fac05f 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -46,6 +46,8 @@
 
 BASE_DECLARE_FEATURE(kExtensionSidePanelIntegration);
 
+BASE_DECLARE_FEATURE(kExtensionsFSPInServiceWorkers);
+
 }  // namespace extensions_features
 
 #endif  // EXTENSIONS_COMMON_EXTENSION_FEATURES_H_
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h
index 407b5be..269ccf3d 100644
--- a/extensions/common/extension_messages.h
+++ b/extensions/common/extension_messages.h
@@ -43,7 +43,6 @@
 #include "extensions/common/mojom/run_location.mojom-shared.h"
 #include "extensions/common/permissions/socket_permission_data.h"
 #include "extensions/common/permissions/usb_device_permission_data.h"
-#include "extensions/common/stack_frame.h"
 #include "extensions/common/user_script.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_message_start.h"
@@ -231,13 +230,6 @@
   IPC_STRUCT_TRAITS_MEMBER(entry())
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_TRAITS_BEGIN(extensions::StackFrame)
-  IPC_STRUCT_TRAITS_MEMBER(line_number)
-  IPC_STRUCT_TRAITS_MEMBER(column_number)
-  IPC_STRUCT_TRAITS_MEMBER(source)
-  IPC_STRUCT_TRAITS_MEMBER(function)
-IPC_STRUCT_TRAITS_END()
-
 IPC_STRUCT_TRAITS_BEGIN(extensions::UsbDevicePermissionData)
   IPC_STRUCT_TRAITS_MEMBER(vendor_id())
   IPC_STRUCT_TRAITS_MEMBER(product_id())
@@ -421,14 +413,6 @@
                      int /* request_id */,
                      std::string /* extension_id */)
 
-// Tells listeners that a detailed message was reported to the console by
-// WebKit.
-IPC_MESSAGE_ROUTED4(ExtensionHostMsg_DetailedConsoleMessageAdded,
-                    std::u16string /* message */,
-                    std::u16string /* source */,
-                    extensions::StackTrace /* stack trace */,
-                    int32_t /* severity level */)
-
 // Messages related to Extension Service Worker.
 #undef IPC_MESSAGE_START
 #define IPC_MESSAGE_START ExtensionWorkerMsgStart
diff --git a/extensions/common/features/simple_feature.cc b/extensions/common/features/simple_feature.cc
index 5e77cd3..60af313 100644
--- a/extensions/common/features/simple_feature.cc
+++ b/extensions/common/features/simple_feature.cc
@@ -589,6 +589,17 @@
   session_types_ = types;
 }
 
+void SimpleFeature::set_disallow_for_service_workers(bool disallow) {
+  if (base::FeatureList::IsEnabled(
+          extensions_features::kExtensionsFSPInServiceWorkers) &&
+      disallow &&
+      (name() == "fileSystemProvider" ||
+       name() == "fileSystemProviderInternal")) {
+    return;
+  }
+  disallow_for_service_workers_ = disallow;
+}
+
 void SimpleFeature::set_matches(
     std::initializer_list<const char* const> matches) {
   matches_.ClearPatterns();
diff --git a/extensions/common/features/simple_feature.h b/extensions/common/features/simple_feature.h
index cb5c5a1..8fc354f 100644
--- a/extensions/common/features/simple_feature.h
+++ b/extensions/common/features/simple_feature.h
@@ -131,9 +131,7 @@
   void set_developer_mode_only(bool is_developer_mode_only) {
     developer_mode_only_ = is_developer_mode_only;
   }
-  void set_disallow_for_service_workers(bool disallow) {
-    disallow_for_service_workers_ = disallow;
-  }
+  void set_disallow_for_service_workers(bool disallow);
   void set_location(Location location) { location_ = location; }
   // set_matches() is an exception to pass-by-value since we construct an
   // URLPatternSet from the vector of strings.
diff --git a/extensions/common/mojom/frame.mojom b/extensions/common/mojom/frame.mojom
index bf92dd33..1a26e78 100644
--- a/extensions/common/mojom/frame.mojom
+++ b/extensions/common/mojom/frame.mojom
@@ -9,9 +9,12 @@
 import "extensions/common/mojom/host_id.mojom";
 import "extensions/common/mojom/injection_type.mojom";
 import "extensions/common/mojom/run_location.mojom";
+import "extensions/common/mojom/stack_frame.mojom";
 import "extensions/common/mojom/view_type.mojom";
+import "mojo/public/mojom/base/string16.mojom";
 import "mojo/public/mojom/base/values.mojom";
 import "url/mojom/url.mojom";
+import "third_party/blink/public/mojom/devtools/console_message.mojom";
 
 // Allows an extension to execute code in a tab.
 struct ExecuteCodeParams {
@@ -144,4 +147,10 @@
   // * Something changed on an existing frame causing the set of matching
   //   searches to change.
   WatchedPageChange(array<string> css_selectors);
+
+  // Tells listeners that a detailed message was reported to the console.
+  DetailedConsoleMessageAdded(mojo_base.mojom.String16 message,
+                              mojo_base.mojom.String16 source,
+                              array<StackFrame> stack_trace,
+                              blink.mojom.ConsoleMessageLevel level);
 };
diff --git a/extensions/common/mojom/stack_frame.mojom b/extensions/common/mojom/stack_frame.mojom
new file mode 100644
index 0000000..84324e0
--- /dev/null
+++ b/extensions/common/mojom/stack_frame.mojom
@@ -0,0 +1,15 @@
+// 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.
+
+module extensions.mojom;
+
+import "mojo/public/mojom/base/string16.mojom";
+
+// Corresponds to `extensions::StackFrame` in extensions/common/stack_frame.h
+struct StackFrame {
+  uint32 line_number;
+  uint32 column_number;
+  mojo_base.mojom.String16 source;
+  mojo_base.mojom.String16 function;
+};
diff --git a/extensions/common/mojom/stack_frame_mojom_traits.cc b/extensions/common/mojom/stack_frame_mojom_traits.cc
new file mode 100644
index 0000000..59ffccc
--- /dev/null
+++ b/extensions/common/mojom/stack_frame_mojom_traits.cc
@@ -0,0 +1,19 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/common/mojom/stack_frame_mojom_traits.h"
+#include "mojo/public/cpp/base/string16_mojom_traits.h"
+
+namespace mojo {
+
+bool StructTraits<
+    extensions::mojom::StackFrameDataView,
+    extensions::StackFrame>::Read(extensions::mojom::StackFrameDataView data,
+                                  extensions::StackFrame* out) {
+  out->line_number = data.line_number();
+  out->column_number = data.column_number();
+  return data.ReadSource(&out->source) && data.ReadFunction(&out->function);
+}
+
+}  // namespace mojo
diff --git a/extensions/common/mojom/stack_frame_mojom_traits.h b/extensions/common/mojom/stack_frame_mojom_traits.h
new file mode 100644
index 0000000..cc444c68
--- /dev/null
+++ b/extensions/common/mojom/stack_frame_mojom_traits.h
@@ -0,0 +1,41 @@
+// 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 EXTENSIONS_COMMON_MOJOM_STACK_FRAME_MOJOM_TRAITS_H_
+#define EXTENSIONS_COMMON_MOJOM_STACK_FRAME_MOJOM_TRAITS_H_
+
+#include <string>
+
+#include "extensions/common/mojom/stack_frame.mojom-shared.h"
+#include "extensions/common/stack_frame.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<extensions::mojom::StackFrameDataView,
+                    extensions::StackFrame> {
+  static uint32_t line_number(const extensions::StackFrame& frame) {
+    return frame.line_number;
+  }
+
+  static uint32_t column_number(const extensions::StackFrame& frame) {
+    return frame.column_number;
+  }
+
+  static const std::u16string& source(const extensions::StackFrame& frame) {
+    return frame.source;
+  }
+
+  static const std::u16string& function(const extensions::StackFrame& frame) {
+    return frame.function;
+  }
+
+  static bool Read(extensions::mojom::StackFrameDataView data,
+                   extensions::StackFrame* out);
+};
+
+}  // namespace mojo
+
+#endif  // EXTENSIONS_COMMON_MOJOM_STACK_FRAME_MOJOM_TRAITS_H_
diff --git a/extensions/renderer/DEPS b/extensions/renderer/DEPS
index d5e5e180..50d4b6a8 100644
--- a/extensions/renderer/DEPS
+++ b/extensions/renderer/DEPS
@@ -11,6 +11,7 @@
 
   "+third_party/blink/public/common/associated_interfaces/associated_interface_provider.h",
   "+third_party/blink/public/common/associated_interfaces/associated_interface_registry.h",
+  "+third_party/blink/public/common/logging/logging_utils.h",
   "+third_party/blink/public/common/tokens/tokens.h",
   "+third_party/blink/public/mojom/devtools/console_message.mojom.h",
   "+third_party/blink/public/mojom/loader/transferrable_url_loader.mojom.h",
diff --git a/extensions/renderer/extensions_render_frame_observer.cc b/extensions/renderer/extensions_render_frame_observer.cc
index d4e4fad..5353579 100644
--- a/extensions/renderer/extensions_render_frame_observer.cc
+++ b/extensions/renderer/extensions_render_frame_observer.cc
@@ -14,9 +14,10 @@
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
 #include "content/public/renderer/render_frame.h"
-#include "extensions/common/extension_messages.h"
 #include "extensions/common/logging_constants.h"
 #include "extensions/common/stack_frame.h"
+#include "extensions/renderer/extension_frame_helper.h"
+#include "third_party/blink/public/common/logging/logging_utils.h"
 #include "third_party/blink/public/web/web_frame_widget.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 
@@ -116,8 +117,8 @@
     const std::u16string& source,
     const std::u16string& stack_trace_string,
     uint32_t line_number,
-    int32_t severity_level) {
-  if (severity_level <
+    blink::mojom::ConsoleMessageLevel level) {
+  if (blink::ConsoleMessageLevelToLogSeverity(level) <
       static_cast<int32_t>(extension_misc::kMinimumSeverityToReportError)) {
     // We don't report certain low-severity errors.
     return;
@@ -129,8 +130,10 @@
       source,
       stack_trace_string,
       line_number);
-  Send(new ExtensionHostMsg_DetailedConsoleMessageAdded(
-      routing_id(), trimmed_message, source, stack_trace, severity_level));
+  ExtensionFrameHelper::Get(render_frame())
+      ->GetLocalFrameHost()
+      ->DetailedConsoleMessageAdded(trimmed_message, source, stack_trace,
+                                    level);
 }
 
 void ExtensionsRenderFrameObserver::OnDestruct() {
diff --git a/extensions/renderer/extensions_render_frame_observer.h b/extensions/renderer/extensions_render_frame_observer.h
index fe91ffc3..a991d579 100644
--- a/extensions/renderer/extensions_render_frame_observer.h
+++ b/extensions/renderer/extensions_render_frame_observer.h
@@ -35,11 +35,12 @@
   void SetVisuallyDeemphasized(bool deemphasized) override;
 
   // RenderFrameObserver implementation.
-  void DetailedConsoleMessageAdded(const std::u16string& message,
-                                   const std::u16string& source,
-                                   const std::u16string& stack_trace,
-                                   uint32_t line_number,
-                                   int32_t severity_level) override;
+  void DetailedConsoleMessageAdded(
+      const std::u16string& message,
+      const std::u16string& source,
+      const std::u16string& stack_trace,
+      uint32_t line_number,
+      blink::mojom::ConsoleMessageLevel level) override;
   void OnDestruct() override;
 
   // true if webview is overlayed with grey color.
diff --git "a/infra/config/generated/builders/ci/Linux Builder \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Linux Builder \050py2 less\051/properties.json"
deleted file mode 100644
index 2aa77090..0000000
--- "a/infra/config/generated/builders/ci/Linux Builder \050py2 less\051/properties.json"
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Builder (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage",
-                  "enable_reclient"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "Linux Builder (py2 less)",
-          "project": "chromium"
-        }
-      ]
-    }
-  },
-  "$build/reclient": {
-    "instance": "rbe-chromium-trusted",
-    "metrics_project": "chromium-reclient-metrics"
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.fyi",
-  "recipe": "chromium"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Linux Builder/properties.json b/infra/config/generated/builders/ci/Linux Builder/properties.json
index a55eedab..a8d944db 100644
--- a/infra/config/generated/builders/ci/Linux Builder/properties.json
+++ b/infra/config/generated/builders/ci/Linux Builder/properties.json
@@ -60,37 +60,6 @@
                 "project": "chromium"
               }
             }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Linux Builder",
-                "project": "chromium"
-              }
-            }
           }
         ]
       },
@@ -106,11 +75,6 @@
           "bucket": "ci",
           "builder": "Linux Tests",
           "project": "chromium"
-        },
-        {
-          "bucket": "ci",
-          "builder": "Linux Tests (py2 less)",
-          "project": "chromium"
         }
       ],
       "mirroring_builder_group_and_names": [
diff --git "a/infra/config/generated/builders/ci/Linux Tests \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Linux Tests \050py2 less\051/properties.json"
deleted file mode 100644
index 4b70f5bb..0000000
--- "a/infra/config/generated/builders/ci/Linux Tests \050py2 less\051/properties.json"
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Builder",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-linux-archive",
-              "builder_group": "chromium.linux",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage",
-                  "enable_reclient"
-                ],
-                "config": "chromium"
-              }
-            }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Linux Builder",
-                "project": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "Linux Tests (py2 less)",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "linux-1mbu-compile-fyi-rel",
-          "group": "tryserver.chromium.linux"
-        },
-        {
-          "builder": "linux_chromium_compile_rel_ng",
-          "group": "tryserver.chromium.linux"
-        }
-      ]
-    }
-  },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.fyi",
-  "recipe": "chromium"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac Builder/properties.json b/infra/config/generated/builders/ci/Mac Builder/properties.json
index ab528de6..e638ef0 100644
--- a/infra/config/generated/builders/ci/Mac Builder/properties.json
+++ b/infra/config/generated/builders/ci/Mac Builder/properties.json
@@ -181,36 +181,6 @@
                 "project": "chromium"
               }
             }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Mac12 Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb",
-                  "goma_use_local"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "mac"
-              },
-              "legacy_gclient_config": {
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Mac Builder",
-                "project": "chromium"
-              }
-            }
           }
         ]
       },
@@ -246,11 +216,6 @@
           "bucket": "ci",
           "builder": "Mac12 Tests",
           "project": "chromium"
-        },
-        {
-          "bucket": "ci",
-          "builder": "Mac12 Tests (py2 less)",
-          "project": "chromium"
         }
       ],
       "mirroring_builder_group_and_names": [
diff --git "a/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json"
deleted file mode 100644
index ab64da1..0000000
--- "a/infra/config/generated/builders/ci/Mac12 Tests \050py2 less\051/properties.json"
+++ /dev/null
@@ -1,95 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Mac Builder",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-mac-archive",
-              "builder_group": "chromium.mac",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb",
-                  "goma_use_local"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "mac"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              }
-            }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Mac12 Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb",
-                  "goma_use_local"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "mac"
-              },
-              "legacy_gclient_config": {
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Mac Builder",
-                "project": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "Mac12 Tests (py2 less)",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "mac_chromium_compile_rel_ng",
-          "group": "tryserver.chromium.mac"
-        }
-      ]
-    }
-  },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.fyi",
-  "recipe": "chromium"
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win x64 Builder \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Win x64 Builder \050py2 less\051/properties.json"
deleted file mode 100644
index 9358617..0000000
--- "a/infra/config/generated/builders/ci/Win x64 Builder \050py2 less\051/properties.json"
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Win x64 Builder (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "win"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "Win x64 Builder (py2 less)",
-          "project": "chromium"
-        }
-      ]
-    }
-  },
-  "$build/reclient": {
-    "instance": "rbe-chromium-trusted",
-    "metrics_project": "chromium-reclient-metrics"
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.fyi",
-  "recipe": "chromium"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Win x64 Builder/properties.json b/infra/config/generated/builders/ci/Win x64 Builder/properties.json
index 658baf7..4d0b417 100644
--- a/infra/config/generated/builders/ci/Win x64 Builder/properties.json
+++ b/infra/config/generated/builders/ci/Win x64 Builder/properties.json
@@ -94,38 +94,6 @@
           {
             "builder_id": {
               "bucket": "ci",
-              "builder": "Win10 Tests x64 (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "win"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Win x64 Builder",
-                "project": "chromium"
-              }
-            }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
               "builder": "Win11 Tests x64",
               "project": "chromium"
             },
@@ -177,11 +145,6 @@
         },
         {
           "bucket": "ci",
-          "builder": "Win10 Tests x64 (py2 less)",
-          "project": "chromium"
-        },
-        {
-          "bucket": "ci",
           "builder": "Win11 Tests x64",
           "project": "chromium"
         }
diff --git "a/infra/config/generated/builders/ci/Win10 Tests x64 \050py2 less\051/properties.json" "b/infra/config/generated/builders/ci/Win10 Tests x64 \050py2 less\051/properties.json"
deleted file mode 100644
index 8d987d5..0000000
--- "a/infra/config/generated/builders/ci/Win10 Tests x64 \050py2 less\051/properties.json"
+++ /dev/null
@@ -1,91 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Win x64 Builder",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-win-archive",
-              "builder_group": "chromium.win",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "win"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              }
-            }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Win10 Tests x64 (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "win"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Win x64 Builder",
-                "project": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "Win10 Tests x64 (py2 less)",
-          "project": "chromium"
-        }
-      ]
-    }
-  },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.fyi",
-  "recipe": "chromium"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/linux-1mbu-compile-fyi-rel/properties.json b/infra/config/generated/builders/try/linux-1mbu-compile-fyi-rel/properties.json
index 523b706..fd1c29d 100644
--- a/infra/config/generated/builders/try/linux-1mbu-compile-fyi-rel/properties.json
+++ b/infra/config/generated/builders/try/linux-1mbu-compile-fyi-rel/properties.json
@@ -60,37 +60,6 @@
                 "project": "chromium"
               }
             }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Linux Builder",
-                "project": "chromium"
-              }
-            }
           }
         ]
       },
@@ -106,11 +75,6 @@
           "bucket": "ci",
           "builder": "Linux Tests",
           "project": "chromium"
-        },
-        {
-          "bucket": "ci",
-          "builder": "Linux Tests (py2 less)",
-          "project": "chromium"
         }
       ],
       "is_compile_only": true
diff --git a/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/properties.json b/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/properties.json
index ccba138..c056c7f 100644
--- a/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/linux_chromium_compile_rel_ng/properties.json
@@ -60,37 +60,6 @@
                 "project": "chromium"
               }
             }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Linux Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "use_clang_coverage"
-                ],
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Linux Builder",
-                "project": "chromium"
-              }
-            }
           }
         ]
       },
@@ -106,11 +75,6 @@
           "bucket": "ci",
           "builder": "Linux Tests",
           "project": "chromium"
-        },
-        {
-          "bucket": "ci",
-          "builder": "Linux Tests (py2 less)",
-          "project": "chromium"
         }
       ],
       "is_compile_only": true
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json
index b2697ec..f5bf2a3 100644
--- a/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/mac_chromium_compile_rel_ng/properties.json
@@ -181,36 +181,6 @@
                 "project": "chromium"
               }
             }
-          },
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "Mac12 Tests (py2 less)",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-fyi-archive",
-              "builder_group": "chromium.fyi",
-              "execution_mode": "TEST",
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "mb",
-                  "goma_use_local"
-                ],
-                "build_config": "Release",
-                "config": "chromium",
-                "target_bits": 64,
-                "target_platform": "mac"
-              },
-              "legacy_gclient_config": {
-                "config": "chromium"
-              },
-              "parent": {
-                "bucket": "ci",
-                "builder": "Mac Builder",
-                "project": "chromium"
-              }
-            }
           }
         ]
       },
@@ -246,11 +216,6 @@
           "bucket": "ci",
           "builder": "Mac12 Tests",
           "project": "chromium"
-        },
-        {
-          "bucket": "ci",
-          "builder": "Mac12 Tests (py2 less)",
-          "project": "chromium"
         }
       ],
       "is_compile_only": true
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index e296fad..0509de8 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -11612,92 +11612,6 @@
       }
     }
     builders {
-      name: "Linux Builder (py2 less)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.ci"
-      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/ci/Linux Builder (py2 less)/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium"'
-        '}'
-      priority: 35
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.buildbucket.omit_python2"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_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_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux%20Builder\">Linux Builder</a>, but runs on bots not having python2."
-    }
-    builders {
       name: "Linux Builder (reclient compare)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -13867,92 +13781,6 @@
       }
     }
     builders {
-      name: "Linux Tests (py2 less)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.ci"
-      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/ci/Linux Tests (py2 less)/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium"'
-        '}'
-      priority: 35
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.buildbucket.omit_python2"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_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_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux%20Tests\">Linux Tests</a>, but runs on bots not having python2."
-    }
-    builders {
       name: "Linux Viz"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -17137,90 +16965,6 @@
       }
     }
     builders {
-      name: "Mac12 Tests (py2 less)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:Mac12 Tests (py2 less)"
-      dimensions: "cores:4"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-12"
-      dimensions: "pool:luci.chromium.ci"
-      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/ci/Mac12 Tests (py2 less)/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium"'
-        '}'
-      priority: 35
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.buildbucket.omit_python2"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_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_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12%20Tests\">Mac12 Tests</a>, but runs on bots not having python2."
-    }
-    builders {
       name: "Marshmallow 64 bit Tester"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -22064,92 +21808,6 @@
       }
     }
     builders {
-      name: "Win x64 Builder (py2 less)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Windows-10"
-      dimensions: "pool:luci.chromium.ci"
-      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/ci/Win x64 Builder (py2 less)/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium"'
-        '}'
-      priority: 35
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.buildbucket.omit_python2"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_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_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win%20x64%20Builder\">Win x64 Builder</a>, but runs on bots not having python2."
-    }
-    builders {
       name: "Win x64 Builder (reclient compare)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -23391,92 +23049,6 @@
       }
     }
     builders {
-      name: "Win10 Tests x64 (py2 less)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Windows-10"
-      dimensions: "pool:luci.chromium.ci"
-      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/ci/Win10 Tests x64 (py2 less)/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium"'
-        '}'
-      priority: 35
-      execution_timeout_secs: 36000
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.buildbucket.omit_python2"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_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_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10%20Tests%20x64\">Win10 Tests x64</a>, but runs on bots not having python2."
-    }
-    builders {
       name: "Win10 x64 Debug (NVIDIA)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index c702120..49be736 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8223,11 +8223,6 @@
     short_name: "cmp"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Mac12 Tests (py2 less)"
-    category: "mac"
-    short_name: "py3"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Mac Builder (reclient)"
     category: "mac"
     short_name: "re"
@@ -8622,16 +8617,6 @@
     short_name: "cgc"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Linux Builder (py2 less)"
-    category: "lin"
-    short_name: "py3"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Linux Tests (py2 less)"
-    category: "lin"
-    short_name: "py3"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Linux ChromiumOS MSan Focal"
     category: "msan"
     short_name: "crs"
@@ -8674,16 +8659,6 @@
     category: "win"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win x64 Builder (py2 less)"
-    category: "win"
-    short_name: "py3"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Win10 Tests x64 (py2 less)"
-    category: "win"
-    short_name: "py3"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Comparison Windows (8 cores) (reclient)"
     category: "win"
     short_name: "re"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 9983e9d..42ac191 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -1871,16 +1871,6 @@
   }
 }
 job {
-  id: "Linux Builder (py2 less)"
-  realm: "ci"
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Linux Builder (py2 less)"
-  }
-}
-job {
   id: "Linux Builder (reclient compare)"
   realm: "ci"
   acl_sets: "ci"
@@ -2261,20 +2251,6 @@
   }
 }
 job {
-  id: "Linux Tests (py2 less)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Linux Tests (py2 less)"
-  }
-}
-job {
   id: "Linux Viz"
   realm: "ci"
   acl_sets: "ci"
@@ -2855,20 +2831,6 @@
   }
 }
 job {
-  id: "Mac12 Tests (py2 less)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Mac12 Tests (py2 less)"
-  }
-}
-job {
   id: "Marshmallow 64 bit Tester"
   realm: "ci"
   acls {
@@ -3913,16 +3875,6 @@
   }
 }
 job {
-  id: "Win x64 Builder (py2 less)"
-  realm: "ci"
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Win x64 Builder (py2 less)"
-  }
-}
-job {
   id: "Win x64 Builder (reclient compare)"
   realm: "ci"
   acl_sets: "ci"
@@ -4161,20 +4113,6 @@
   }
 }
 job {
-  id: "Win10 Tests x64 (py2 less)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Win10 Tests x64 (py2 less)"
-  }
-}
-job {
   id: "Win10 x64 Debug (NVIDIA)"
   realm: "ci"
   acls {
@@ -7492,7 +7430,6 @@
   triggers: "Linux Builder (Wayland)"
   triggers: "Linux Builder (dbg)"
   triggers: "Linux Builder (j-500) (reclient)"
-  triggers: "Linux Builder (py2 less)"
   triggers: "Linux Builder (reclient compare)"
   triggers: "Linux CFI"
   triggers: "Linux CFI (reclient shadow)"
@@ -7571,7 +7508,6 @@
   triggers: "Win Builder (dbg)"
   triggers: "Win x64 Builder"
   triggers: "Win x64 Builder (dbg)"
-  triggers: "Win x64 Builder (py2 less)"
   triggers: "Win x64 Builder (reclient compare)"
   triggers: "Win x64 Builder (reclient)"
   triggers: "Win x64 Builder (reclient)(cross)"
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index 24bb89a..c1671e5 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -137,7 +137,6 @@
         values: "Linux Tests"
         values: "Linux Tests (Wayland)"
         values: "Linux Tests (dbg)(1)"
-        values: "Linux Tests (py2 less)"
         values: "Mac ASan 64 Tests (1)"
         values: "Mac Debug (Intel)"
         values: "Mac Release (Intel)"
@@ -149,7 +148,6 @@
         values: "Mac11 Tests"
         values: "Mac12 Tests"
         values: "Mac12 Tests (dbg)"
-        values: "Mac12 Tests (py2 less)"
         values: "Marshmallow 64 bit Tester"
         values: "Marshmallow Tablet Tester"
         values: "Nougat Phone Tester"
@@ -158,7 +156,6 @@
         values: "Win 7 Tests x64 (1)"
         values: "Win10 Tests x64"
         values: "Win10 Tests x64 (dbg)"
-        values: "Win10 Tests x64 (py2 less)"
         values: "Win10 x64 Debug (NVIDIA)"
         values: "Win10 x64 Release (NVIDIA)"
         values: "Win11 Tests x64"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 64df94a..2c34d124 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1574,46 +1574,6 @@
     execution_timeout = 14 * time.hour,
 )
 
-ci.builder(
-    name = "Linux Builder (py2 less)",
-    description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux%20Builder\">Linux Builder</a>, but runs on bots not having python2.",
-    builder_spec = builder_config.copy_from("ci/Linux Builder", lambda spec: structs.evolve(
-        spec,
-        build_gs_bucket = "chromium-fyi-archive",
-    )),
-    builderless = True,
-    console_view_entry = consoles.console_view_entry(
-        category = "lin",
-        short_name = "py3",
-    ),
-    cores = 8,
-    goma_backend = None,
-    reclient_instance = reclient.instance.DEFAULT_TRUSTED,
-    os = os.LINUX_DEFAULT,
-    experiments = {
-        "luci.buildbucket.omit_python2": 100,
-    },
-)
-
-ci.builder(
-    name = "Linux Tests (py2 less)",
-    description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux%20Tests\">Linux Tests</a>, but runs on bots not having python2.",
-    builder_spec = builder_config.copy_from("ci/Linux Tests", lambda spec: structs.evolve(
-        spec,
-        build_gs_bucket = "chromium-fyi-archive",
-    )),
-    builderless = True,
-    console_view_entry = consoles.console_view_entry(
-        category = "lin",
-        short_name = "py3",
-    ),
-    os = os.LINUX_DEFAULT,
-    triggered_by = ["ci/Linux Builder"],
-    experiments = {
-        "luci.buildbucket.omit_python2": 100,
-    },
-)
-
 # Start - Reclient migration, phase 2, block 1 shadow builders
 ci.builder(
     name = "Linux CFI (reclient shadow)",
@@ -1687,46 +1647,6 @@
     os = os.WINDOWS_DEFAULT,
 )
 
-ci.builder(
-    name = "Win x64 Builder (py2 less)",
-    description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win%20x64%20Builder\">Win x64 Builder</a>, but runs on bots not having python2.",
-    builder_spec = builder_config.copy_from("ci/Win x64 Builder", lambda spec: structs.evolve(
-        spec,
-        build_gs_bucket = "chromium-fyi-archive",
-    )),
-    builderless = True,
-    console_view_entry = consoles.console_view_entry(
-        category = "win",
-        short_name = "py3",
-    ),
-    cores = 8,
-    goma_backend = None,
-    reclient_instance = reclient.instance.DEFAULT_TRUSTED,
-    os = os.WINDOWS_DEFAULT,
-    experiments = {
-        "luci.buildbucket.omit_python2": 100,
-    },
-)
-
-ci.builder(
-    name = "Win10 Tests x64 (py2 less)",
-    description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10%20Tests%20x64\">Win10 Tests x64</a>, but runs on bots not having python2.",
-    builder_spec = builder_config.copy_from("ci/Win10 Tests x64", lambda spec: structs.evolve(
-        spec,
-        build_gs_bucket = "chromium-fyi-archive",
-    )),
-    builderless = True,
-    console_view_entry = consoles.console_view_entry(
-        category = "win",
-        short_name = "py3",
-    ),
-    os = os.WINDOWS_DEFAULT,
-    triggered_by = ["ci/Win x64 Builder"],
-    experiments = {
-        "luci.buildbucket.omit_python2": 100,
-    },
-)
-
 fyi_mac_builder(
     name = "Mac Builder (reclient)",
     builderless = True,
@@ -1757,23 +1677,6 @@
 )
 
 fyi_mac_builder(
-    name = "Mac12 Tests (py2 less)",
-    builder_spec = builder_config.copy_from("ci/Mac12 Tests", lambda spec: structs.evolve(
-        spec,
-        build_gs_bucket = "chromium-fyi-archive",
-    )),
-    console_view_entry = consoles.console_view_entry(
-        category = "mac",
-        short_name = "py3",
-    ),
-    description_html = "This is mirror of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12%20Tests\">Mac12 Tests</a>, but runs on bots not having python2.",
-    experiments = {
-        "luci.buildbucket.omit_python2": 100,
-    },
-    triggered_by = ["ci/Mac Builder"],
-)
-
-fyi_mac_builder(
     name = "mac-arm64-on-arm64-rel-reclient",
 
     # same with mac-arm64-on-arm64-rel
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm b/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm
index a77e0ec2..71dbfdab 100644
--- a/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm
+++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm
@@ -11,6 +11,7 @@
 #import "base/time/time.h"
 #import "components/segmentation_platform/embedder/default_model/cross_device_user_segment.h"
 #import "components/segmentation_platform/embedder/default_model/feed_user_segment.h"
+#import "components/segmentation_platform/embedder/default_model/search_user_model.h"
 #import "components/segmentation_platform/internal/stats.h"
 #import "components/segmentation_platform/public/config.h"
 #import "components/segmentation_platform/public/features.h"
@@ -26,6 +27,8 @@
 
 namespace {
 
+constexpr char kDefaultModelEnabledParam[] = "enable_default_model";
+
 using ::segmentation_platform::proto::SegmentId;
 
 constexpr int kFeedUserSegmentSelectionTTLDays = 14;
@@ -34,6 +37,9 @@
 constexpr int kCrossDeviceUserSegmentSelectionTTLDays = 7;
 constexpr int kCrossDeviceUserSegmentUnknownSelectionTTLDays = 7;
 
+constexpr int kSearchUserSegmentSelectionTTLDays = 7;
+constexpr int kSearchUserSegmentUnknownSelectionTTLDays = 7;
+
 std::unique_ptr<Config> GetConfigForFeedSegments() {
   auto config = std::make_unique<Config>();
   config->segmentation_key = kFeedUserSegmentationKey;
@@ -64,6 +70,33 @@
   return config;
 }
 
+std::unique_ptr<ModelProvider> GetSearchUserDefaultModel() {
+  if (!base::GetFieldTrialParamByFeatureAsBool(
+          features::kSegmentationPlatformSearchUser, kDefaultModelEnabledParam,
+          true)) {
+    return nullptr;
+  }
+  return std::make_unique<SearchUserModel>();
+}
+
+std::unique_ptr<Config> GetConfigForSearchUserModel() {
+  auto config = std::make_unique<Config>();
+  config->segmentation_key = kSearchUserKey;
+  config->segmentation_uma_name = kSearchUserUmaName;
+  config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER,
+                       GetSearchUserDefaultModel());
+  config->segment_selection_ttl =
+      base::Days(base::GetFieldTrialParamByFeatureAsInt(
+          features::kSegmentationPlatformSearchUser,
+          "segment_selection_ttl_days", kSearchUserSegmentSelectionTTLDays));
+  config->unknown_selection_ttl =
+      base::Days(base::GetFieldTrialParamByFeatureAsInt(
+          features::kSegmentationPlatformSearchUser,
+          "unknown_selection_ttl_days",
+          kSearchUserSegmentUnknownSelectionTTLDays));
+  return config;
+}
+
 }  // namespace
 
 using proto::SegmentId;
@@ -74,6 +107,9 @@
           features::kSegmentationPlatformFeedSegmentFeature)) {
     configs.emplace_back(GetConfigForFeedSegments());
   }
+  if (base::FeatureList::IsEnabled(features::kSegmentationPlatformSearchUser)) {
+    configs.emplace_back(GetConfigForSearchUserModel());
+  }
 
   configs.emplace_back(GetConfigForCrossDeviceSegments());
 
@@ -105,6 +141,9 @@
   if (segment_id == SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER) {
     group_name = FeedUserSegment::GetSubsegmentName(subsegment_rank);
   }
+  if (segment_id == SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SEARCH_USER) {
+    group_name = SearchUserModel::GetSubsegmentName(subsegment_rank);
+  }
 
   if (segment_id == SegmentId::CROSS_DEVICE_USER_SEGMENT) {
     group_name = CrossDeviceUserSegment::GetSubsegmentName(subsegment_rank);
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 6655c506..8a53d68 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-42552410b74f13654f3de1900ba47c06a8851785
\ No newline at end of file
+46b99c88ec686a03bf37279cc97f9a2df43ac93e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 1f0500db..2ba27b6a 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-f11bdff4b867a0cccda0cac3c0ebb592db1c8342
\ No newline at end of file
+ed94655d34b6fb191a6782a85644d4144d9b819f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 7cdf8bb..382d1f8 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-f8f6ec879ea54c02d1c16c28239009e216dc73ef
\ No newline at end of file
+3cfa200ce7599127d347be7449a38cc4fb345a89
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 9106b83e..48235edd 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-2f46b744c773b707384b69e7603d2a94ca5ddebd
\ No newline at end of file
+6ce6aff78072e7acc5c40d681b60f0d21c683fe4
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 27f4410..5780f39c 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-f966c08630bcdaf74af64b660137a85c4202fbc2
\ No newline at end of file
+f4d5c99a29ecdc89e36efba8fd5b763348b18113
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 04d5ff7..e0c51f4 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-3875a0f2f4c717751b18c48799ad04c6a515cd63
\ No newline at end of file
+09b71dd4c7cbe67c2b1c026ea1b6891e7ba50b7b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 35adae7..5b34229 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-e221bac1c16360e0e0638ab2494beca26475497c
\ No newline at end of file
+2f98dcad5eece0183660eb566486bfa84740ceb5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index 5ad80c2..fb761c2 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-a9e6c1a07c1f065eb214263a59c18616df50b4e6
\ No newline at end of file
+20f934fe6cbdfad05839a4f67aa43f735687ed9b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index fdd3cd0c..b75e70bb 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d3acaf22f1922f4e1a0f342af0f2c4124644e5dc
\ No newline at end of file
+3f578ae7d5092da3577a7aaab3e0e0d72e71c63c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index be23ae4b..9cfcce7 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-85aefc3b8310e42040cab08bee53c9dfecd5634c
\ No newline at end of file
+ae8c95594ec1a811ec07b2e07c458c345965cb63
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 797aa937..0e6f54c3 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-d66d3eade305632183536d84ffd91de3a3de518b
\ No newline at end of file
+a902b51a47792a14fc09d82cd97833884467e54b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 2ae47e0..2566d6a 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-c7d7bf4afa22d9a69cdcacf44bc9bd36b948cbc1
\ No newline at end of file
+b44ff4cab5f22d8205403d13a777a7e60c77f5d7
\ No newline at end of file
diff --git a/media/capture/mojom/video_capture_types.mojom b/media/capture/mojom/video_capture_types.mojom
index bdc5a7d..d8814af6 100644
--- a/media/capture/mojom/video_capture_types.mojom
+++ b/media/capture/mojom/video_capture_types.mojom
@@ -274,7 +274,8 @@
   kResolutionAdapterFrameRateIsHigherThanRequested,
   kResolutionAdapterHasNoCallbacks,
   kVideoTrackFrameDelivererNotEnabledReplacingWithBlackFrame,
-  kRendererSinkFrameDelivererIsNotStarted
+  kRendererSinkFrameDelivererIsNotStarted,
+  [MinVersion=1] kCropVersionNotCurrent
 };
 
 [Stable]
diff --git a/media/capture/mojom/video_capture_types_mojom_traits.cc b/media/capture/mojom/video_capture_types_mojom_traits.cc
index cff74e65..2dd7014 100644
--- a/media/capture/mojom/video_capture_types_mojom_traits.cc
+++ b/media/capture/mojom/video_capture_types_mojom_traits.cc
@@ -1474,6 +1474,8 @@
         kRendererSinkFrameDelivererIsNotStarted:
       return media::mojom::VideoCaptureFrameDropReason::
           kRendererSinkFrameDelivererIsNotStarted;
+    case media::VideoCaptureFrameDropReason::kCropVersionNotCurrent:
+      return media::mojom::VideoCaptureFrameDropReason::kCropVersionNotCurrent;
   }
   NOTREACHED();
   return media::mojom::VideoCaptureFrameDropReason::kNone;
@@ -1609,6 +1611,9 @@
       *output = media::VideoCaptureFrameDropReason::
           kRendererSinkFrameDelivererIsNotStarted;
       return true;
+    case media::mojom::VideoCaptureFrameDropReason::kCropVersionNotCurrent:
+      *output = media::VideoCaptureFrameDropReason::kCropVersionNotCurrent;
+      return true;
   }
   NOTREACHED();
   return false;
diff --git a/media/capture/video_capture_types.h b/media/capture/video_capture_types.h
index 48f1049e..351b2c71 100644
--- a/media/capture/video_capture_types.h
+++ b/media/capture/video_capture_types.h
@@ -233,7 +233,8 @@
   kResolutionAdapterHasNoCallbacks = 24,
   kVideoTrackFrameDelivererNotEnabledReplacingWithBlackFrame = 25,
   kRendererSinkFrameDelivererIsNotStarted = 26,
-  kMaxValue = 26
+  kCropVersionNotCurrent = 27,
+  kMaxValue = 27
 };
 
 // Assert that the int:frequency mapping is correct.
diff --git a/media/gpu/v4l2/test/av1_decoder.cc b/media/gpu/v4l2/test/av1_decoder.cc
index a881be893..92ca739 100644
--- a/media/gpu/v4l2/test/av1_decoder.cc
+++ b/media/gpu/v4l2/test/av1_decoder.cc
@@ -993,8 +993,17 @@
   }
 
   if (current_frame_header.show_existing_frame) {
-    // TODO(stevecho): Verify and update the algorithm for
-    // refreshing reference frames pool if needed.
+    scoped_refptr<MmapedBuffer> repeated_frame_buffer =
+        ref_frames_[current_frame_header.frame_to_show];
+
+    size = CAPTURE_queue_->display_size();
+    ConvertMM21ToYUV(y_plane, u_plane, v_plane, size,
+                     static_cast<char*>(
+                         repeated_frame_buffer->mmaped_planes()[0].start_addr),
+                     static_cast<char*>(
+                         repeated_frame_buffer->mmaped_planes()[1].start_addr),
+                     CAPTURE_queue_->coded_size());
+
     return VideoDecoder::kOk;
   }
 
diff --git a/pdf/file_extension.cc b/pdf/file_extension.cc
index 365614ad..b364348 100644
--- a/pdf/file_extension.cc
+++ b/pdf/file_extension.cc
@@ -4,13 +4,13 @@
 
 #include "pdf/file_extension.h"
 
-#include <algorithm>
 #include <array>
 #include <iterator>
 #include <string>
 
 #include "base/check_op.h"
 #include "base/files/file_path.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 
 #if BUILDFLAG(IS_WIN)
@@ -74,8 +74,7 @@
   const std::string& extension = extension_str_lower;
 #endif
 
-  auto* const* it =
-      std::find(kFileExtensions.begin(), kFileExtensions.end(), extension);
+  auto* const* it = base::ranges::find(kFileExtensions, extension);
   if (it == kFileExtensions.end())
     return ExtensionIndex::kOtherExt;
 
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 8b31d77..bb48015 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -9405,8 +9405,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android30.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.blink_unittests.filter"
+          "--avd-config=../../tools/android/avd/proto/generic_android30.textpb"
         ],
         "merge": {
           "args": [
@@ -12524,8 +12523,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android30.textpb",
-          "--gtest_filter=-DownloadBrowserTest.OverrideDownloadDirectory"
+          "--avd-config=../../tools/android/avd/proto/generic_android30.textpb"
         ],
         "merge": {
           "args": [
@@ -13548,8 +13546,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.blink_unittests.filter"
+          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb"
         ],
         "merge": {
           "args": [
@@ -16728,8 +16725,7 @@
         "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb",
-          "--gtest_filter=-DownloadBrowserTest.OverrideDownloadDirectory"
+          "--avd-config=../../tools/android/avd/proto/generic_android31.textpb"
         ],
         "merge": {
           "args": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 96626b5f..037d7060 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -51,55 +51,6 @@
       "all"
     ]
   },
-  "Linux Builder (py2 less)": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "isolate_profile_data": true,
-        "name": "check_network_annotations",
-        "script": "check_network_annotations.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "check_static_initializers",
-        "script": "check_static_initializers.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "checkdeps",
-        "script": "checkdeps.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "checkperms",
-        "script": "checkperms.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "headless_python_unittests",
-        "script": "headless_python_unittests.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "metrics_python_tests",
-        "script": "metrics_python_tests.py",
-        "swarming": {}
-      },
-      {
-        "isolate_profile_data": true,
-        "name": "webkit_lint",
-        "script": "blink_lint_expectations.py",
-        "swarming": {}
-      }
-    ]
-  },
   "Linux CFI (reclient shadow)": {
     "gtest_tests": [
       {
@@ -5742,2271 +5693,6 @@
       }
     ]
   },
-  "Linux Tests (py2 less)": {
-    "gtest_tests": [
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "absl_hardening_tests",
-        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "accessibility_unittests",
-        "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "app_shell_unittests",
-        "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_common_unittests",
-        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_fuzzer_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_heap_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_platform_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "webkit_unit_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_app_unittests",
-        "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chromedriver_unittests",
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "color_unittests",
-        "test_id_prefix": "ninja://ui/color:color_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "compositor_unittests",
-        "test_id_prefix": "ninja://ui/compositor:compositor_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_tests",
-        "test_id_prefix": "ninja://components/cronet:cronet_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_unittests",
-        "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dbus_unittests",
-        "test_id_prefix": "ninja://dbus:dbus_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_browsertests",
-        "test_id_prefix": "ninja://extensions:extensions_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_unittests",
-        "test_id_prefix": "ninja://extensions:extensions_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "filesystem_service_unittests",
-        "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_browsertests",
-        "test_id_prefix": "ninja://headless:headless_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_unittests",
-        "test_id_prefix": "ninja://headless:headless_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "libjingle_xmpp_unittests",
-        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "message_center_unittests",
-        "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_core_unittests",
-        "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "nacl_loader_unittests",
-        "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "native_theme_unittests",
-        "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "openscreen_unittests",
-        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ozone_x11_unittests",
-        "test_id_prefix": "ninja://ui/ozone:ozone_x11_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "pdf_unittests",
-        "test_id_prefix": "ninja://pdf:pdf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ppapi_unittests",
-        "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "printing_unittests",
-        "test_id_prefix": "ninja://printing:printing_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "remoting_unittests",
-        "test_id_prefix": "ninja://remoting:remoting_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sandbox_linux_unittests",
-        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "service_manager_unittests",
-        "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "snapshot_unittests",
-        "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_touch_selection_unittests",
-        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "views_unittests",
-        "test_id_prefix": "ninja://ui/views:views_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "args": [
-          "--enable-features=EnableOverlayPrioritization"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "overlay_prioritization_viz_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vr_common_unittests",
-        "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vr_pixeltests",
-        "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "weblayer_browsertests",
-        "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "weblayer_unittests",
-        "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wm_unittests",
-        "test_id_prefix": "ninja://ui/wm:wm_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wtf_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "xr_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "xr_browser_tests",
-        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "isolate_name": "blink_python_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "blink_python_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_python_tests/"
-      },
-      {
-        "isolate_name": "blink_pytype",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "blink_pytype",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://third_party/blink/tools:blink_pytype/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_wpt_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 7
-        },
-        "test_id_prefix": "ninja://:blink_wpt_tests/"
-      },
-      {
-        "args": [
-          "--test-type=integration"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "chromedriver_py_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_py_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/"
-      },
-      {
-        "isolate_name": "chromedriver_replay_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_replay_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/"
-      },
-      {
-        "isolate_name": "content_shell_crash_test",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "content_shell_crash_test",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://content/shell:content_shell_crash_test/"
-      },
-      {
-        "isolate_name": "flatbuffers_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "flatbuffers_unittests",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/"
-      },
-      {
-        "isolate_name": "fuchsia_pytype",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "fuchsia_pytype",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://testing:fuchsia_pytype/"
-      },
-      {
-        "isolate_name": "gold_common_pytype",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gold_common_pytype",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://build:gold_common_pytype/"
-      },
-      {
-        "isolate_name": "gpu_pytype",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gpu_pytype",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://content/test:gpu_pytype/"
-      },
-      {
-        "isolate_name": "grit_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "grit_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://tools/grit:grit_python_unittests/"
-      },
-      {
-        "args": [
-          "--flag-specific=highdpi",
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "high_dpi_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=highdpi",
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "high_dpi_blink_wpt_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test_id_prefix": "ninja://:blink_wpt_tests/"
-      },
-      {
-        "isolate_name": "mojo_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mojo_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/"
-      },
-      {
-        "args": [
-          "--flag-specific=disable-site-isolation-trials",
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "not_site_per_process_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--flag-specific=disable-site-isolation-trials",
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "not_site_per_process_blink_wpt_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test_id_prefix": "ninja://:blink_wpt_tests/"
-      },
-      {
-        "isolate_name": "telemetry_gpu_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--extra-browser-args=--enable-crashpad",
-          "--xvfb",
-          "--jobs=1"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
-          "--jobs=1",
-          "--extra-browser-args=--disable-gpu"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "isolate_name": "unexpected_passes_common_pytype",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "unexpected_passes_common_pytype",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://testing:unexpected_passes_common_pytype/"
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=views_perftests"
-        ],
-        "isolate_name": "views_perftests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "views_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://ui/views:views_perftests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--skipped=always",
-          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
-          "--flag-specific=skia-vulkan-swiftshader",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "vulkan_swiftshader_blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "isolate_name": "webdriver_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "webdriver_tests_suite",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test_id_prefix": "ninja://:webdriver_wpt_tests/"
-      }
-    ]
-  },
   "Linux Viz": {
     "additional_compile_targets": [
       "all"
@@ -9914,1918 +7600,6 @@
       }
     ]
   },
-  "Mac12 Tests (py2 less)": {
-    "gtest_tests": [
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "absl_hardening_tests",
-        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "accessibility_unittests",
-        "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "app_shell_unittests",
-        "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_common_unittests",
-        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_fuzzer_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_heap_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_platform_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "webkit_unit_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_app_unittests",
-        "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chromedriver_unittests",
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "color_unittests",
-        "test_id_prefix": "ninja://ui/color:color_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_nocompile_tests",
-        "test_id_prefix": "ninja://content/test:content_nocompile_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_tests",
-        "test_id_prefix": "ninja://components/cronet:cronet_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_unittests",
-        "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_browsertests",
-        "test_id_prefix": "ninja://extensions:extensions_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_unittests",
-        "test_id_prefix": "ninja://extensions:extensions_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "filesystem_service_unittests",
-        "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_browsertests",
-        "test_id_prefix": "ninja://headless:headless_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_unittests",
-        "test_id_prefix": "ninja://headless:headless_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "libjingle_xmpp_unittests",
-        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "message_center_unittests",
-        "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "native_theme_unittests",
-        "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "openscreen_unittests",
-        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "pdf_unittests",
-        "test_id_prefix": "ninja://pdf:pdf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "power_sampler_unittests",
-        "test_id_prefix": "ninja://tools/mac/power:power_sampler_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ppapi_unittests",
-        "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "printing_unittests",
-        "test_id_prefix": "ninja://printing:printing_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "remoting_unittests",
-        "test_id_prefix": "ninja://remoting:remoting_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sandbox_unittests",
-        "test_id_prefix": "ninja://sandbox:sandbox_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "service_manager_unittests",
-        "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "snapshot_unittests",
-        "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_touch_selection_unittests",
-        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "args": [
-          "--test-launcher-timeout=90000",
-          "--ui-test-action-max-timeout=45000",
-          "--ui-test-action-timeout=40000"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "updater_tests",
-        "test_id_prefix": "ninja://chrome/updater:updater_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "views_unittests",
-        "test_id_prefix": "ninja://ui/views:views_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wtf_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "xr_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "xr_browser_tests",
-        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "isolate_name": "blink_python_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "blink_python_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_python_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_wpt_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 7
-        },
-        "test_id_prefix": "ninja://:blink_wpt_tests/"
-      },
-      {
-        "args": [
-          "--test-type=integration"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "chromedriver_py_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_py_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/"
-      },
-      {
-        "isolate_name": "chromedriver_replay_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_replay_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/"
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=components_perftests"
-        ],
-        "isolate_name": "components_perftests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "components_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://components:components_perftests/"
-      },
-      {
-        "isolate_name": "content_shell_crash_test",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "content_shell_crash_test",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://content/shell:content_shell_crash_test/"
-      },
-      {
-        "isolate_name": "flatbuffers_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "flatbuffers_unittests",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/"
-      },
-      {
-        "isolate_name": "grit_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "grit_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://tools/grit:grit_python_unittests/"
-      },
-      {
-        "isolate_name": "mac_signing_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mac_signing_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/installer/mac:mac_signing_tests/"
-      },
-      {
-        "isolate_name": "mojo_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mojo_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/"
-      },
-      {
-        "isolate_name": "telemetry_gpu_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--extra-browser-args=--enable-crashpad"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
-          "--jobs=1",
-          "--extra-browser-args=--disable-gpu"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=views_perftests"
-        ],
-        "isolate_name": "views_perftests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "views_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-12"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://ui/views:views_perftests/"
-      }
-    ]
-  },
   "Site Isolation Android": {
     "additional_compile_targets": [
       "content_browsertests",
@@ -13222,28 +8996,6 @@
       }
     ]
   },
-  "Win x64 Builder (py2 less)": {
-    "additional_compile_targets": [
-      "all"
-    ],
-    "scripts": [
-      {
-        "name": "check_network_annotations",
-        "script": "check_network_annotations.py",
-        "swarming": {}
-      },
-      {
-        "name": "metrics_python_tests",
-        "script": "metrics_python_tests.py",
-        "swarming": {}
-      },
-      {
-        "name": "webkit_lint",
-        "script": "blink_lint_expectations.py",
-        "swarming": {}
-      }
-    ]
-  },
   "Win x64 Builder (reclient compare)": {
     "additional_compile_targets": [
       "pdf_fuzzers"
@@ -13398,2433 +9150,6 @@
       }
     ]
   },
-  "Win10 Tests x64 (py2 less)": {
-    "gtest_tests": [
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "absl_hardening_tests",
-        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "accessibility_unittests",
-        "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "angle_unittests",
-        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "app_shell_unittests",
-        "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_common_unittests",
-        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_fuzzer_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_heap_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_platform_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "webkit_unit_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--browser-ui-tests-verify-pixels",
-          "--enable-pixel-output-in-tests",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/pixel_tests.filter",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "pixel_browser_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_app_unittests",
-        "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_cleaner_unittests",
-        "test_id_prefix": "ninja://chrome/chrome_cleaner:chrome_cleaner_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_elf_unittests",
-        "test_id_prefix": "ninja://chrome/chrome_elf:chrome_elf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chromedriver_unittests",
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "color_unittests",
-        "test_id_prefix": "ninja://ui/color:color_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "compositor_unittests",
-        "test_id_prefix": "ninja://ui/compositor:compositor_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "courgette_unittests",
-        "test_id_prefix": "ninja://courgette:courgette_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_tests",
-        "test_id_prefix": "ninja://components/cronet:cronet_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cronet_unittests",
-        "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "delayloads_unittests",
-        "test_id_prefix": "ninja://chrome/test:delayloads_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "elevation_service_unittests",
-        "test_id_prefix": "ninja://chrome/elevation_service:elevation_service_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_browsertests",
-        "test_id_prefix": "ninja://extensions:extensions_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "extensions_unittests",
-        "test_id_prefix": "ninja://extensions:extensions_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "filesystem_service_unittests",
-        "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcp_unittests",
-        "test_id_prefix": "ninja://chrome/credential_provider/test:gcp_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_browsertests",
-        "test_id_prefix": "ninja://headless:headless_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "headless_unittests",
-        "test_id_prefix": "ninja://headless:headless_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "install_static_unittests",
-        "test_id_prefix": "ninja://chrome/install_static:install_static_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "integrity": "high",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "installer_util_unittests",
-        "test_id_prefix": "ninja://chrome/installer/util:installer_util_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
-      },
-      {
-        "args": [
-          "--browser-ui-tests-verify-pixels",
-          "--enable-pixel-output-in-tests",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/pixel_tests.filter",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "pixel_interactive_ui_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "libjingle_xmpp_unittests",
-        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "message_center_unittests",
-        "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_core_unittests",
-        "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "nacl_loader_unittests",
-        "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "native_theme_unittests",
-        "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "notification_helper_unittests",
-        "test_id_prefix": "ninja://chrome/notification_helper:notification_helper_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "pdf_unittests",
-        "test_id_prefix": "ninja://pdf:pdf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ppapi_unittests",
-        "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "printing_unittests",
-        "test_id_prefix": "ninja://printing:printing_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "remoting_unittests",
-        "test_id_prefix": "ninja://remoting:remoting_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "integrity": "high",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sbox_integration_tests",
-        "test_id_prefix": "ninja://sandbox/win:sbox_integration_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sbox_unittests",
-        "test_id_prefix": "ninja://sandbox/win:sbox_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sbox_validation_tests",
-        "test_id_prefix": "ninja://sandbox/win:sbox_validation_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "service_manager_unittests",
-        "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "integrity": "high",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "setup_unittests",
-        "test_id_prefix": "ninja://chrome/installer/setup:setup_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "snapshot_unittests",
-        "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_touch_selection_unittests",
-        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "args": [
-          "--test-launcher-timeout=90000",
-          "--ui-test-action-max-timeout=45000",
-          "--ui-test-action-timeout=40000"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "updater_tests",
-        "test_id_prefix": "ninja://chrome/updater:updater_tests/"
-      },
-      {
-        "args": [
-          "--test-launcher-print-test-stdio=always",
-          "--test-launcher-timeout=90000",
-          "--ui-test-action-max-timeout=45000",
-          "--ui-test-action-timeout=40000",
-          "--ui-test-action-timeout=40000"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "updater_tests_system",
-        "test_id_prefix": "ninja://chrome/updater:updater_tests_system/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "args": [
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "views_examples_unittests",
-        "test_id_prefix": "ninja://ui/views/examples:views_examples_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "views_unittests",
-        "test_id_prefix": "ninja://ui/views:views_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vr_common_unittests",
-        "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vr_pixeltests",
-        "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "weblayer_browsertests",
-        "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "weblayer_unittests",
-        "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wm_unittests",
-        "test_id_prefix": "ninja://ui/wm:wm_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "wtf_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zucchini_unittests",
-        "test_id_prefix": "ninja://components/zucchini:zucchini_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "isolate_name": "blink_python_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "blink_python_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://:blink_python_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}",
-          "--target",
-          "Release_x64"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}",
-          "--target",
-          "Release_x64"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_wpt_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_wpt_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 18
-        },
-        "test_id_prefix": "ninja://:blink_wpt_tests/"
-      },
-      {
-        "args": [
-          "--test-type=integration"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "chromedriver_py_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_py_tests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/"
-      },
-      {
-        "isolate_name": "chromedriver_replay_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chromedriver_replay_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/"
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=components_perftests"
-        ],
-        "isolate_name": "components_perftests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "components_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://components:components_perftests/"
-      },
-      {
-        "isolate_name": "content_shell_crash_test",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "content_shell_crash_test",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://content/shell:content_shell_crash_test/"
-      },
-      {
-        "isolate_name": "flatbuffers_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "flatbuffers_unittests",
-        "resultdb": {
-          "enable": true,
-          "result_format": "single"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/"
-      },
-      {
-        "isolate_name": "grit_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "grit_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://tools/grit:grit_python_unittests/"
-      },
-      {
-        "isolate_name": "mini_installer_tests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mini_installer_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "integrity": "high",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test/mini_installer:mini_installer_tests/"
-      },
-      {
-        "isolate_name": "mojo_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "mojo_python_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/"
-      },
-      {
-        "experiment_percentage": 0,
-        "isolate_name": "polymer_tools_python_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "polymer_tools_python_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://tools/polymer:polymer_tools_python_unittests/"
-      },
-      {
-        "args": [
-          "BrowserMinidumpTest",
-          "-v",
-          "--passthrough",
-          "--retry-limit=2"
-        ],
-        "check_flakiness_for_new_tests": false,
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_desktop_minidump_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "isolate_name": "telemetry_gpu_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_gpu_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
-      },
-      {
-        "args": [
-          "--extra-browser-args=--enable-crashpad"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
-          "--jobs=1",
-          "--extra-browser-args=--disable-gpu"
-        ],
-        "isolate_name": "telemetry_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_unittests",
-        "resultdb": {
-          "enable": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 8
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=views_perftests"
-        ],
-        "isolate_name": "views_perftests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "views_perftests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Windows-10-19042"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://ui/views:views_perftests/"
-      }
-    ]
-  },
   "android-backuprefptr-arm-fyi-rel": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index eff2af1..7be9b16 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -42,13 +42,6 @@
   data = [ "//testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter" ]
 }
 
-source_set("blink_unittests_filters") {
-  testonly = true
-
-  data =
-      [ "//testing/buildbot/filters/android.emulator.blink_unittests.filter" ]
-}
-
 source_set("blink_web_tests_filter") {
   testonly = true
 
diff --git a/testing/buildbot/filters/android.emulator.blink_unittests.filter b/testing/buildbot/filters/android.emulator.blink_unittests.filter
deleted file mode 100644
index 1c8a7d3..0000000
--- a/testing/buildbot/filters/android.emulator.blink_unittests.filter
+++ /dev/null
@@ -1,2 +0,0 @@
-# crbug.com/1188310
--MediaStreamAudioProcessorTest.StartStopAecDump
diff --git a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
index cdf3862..d5a31dc0 100644
--- a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
@@ -20,9 +20,6 @@
 # crbug.com/1060724
 -org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorControllerTest.testDoNotShowOfflineIndicatorWhenTemporarilyPaused
 
-# crbug.com/1061177
--org.chromium.chrome.browser.payments.PaymentRequestPaymentAppsSortingTest.testPaymentAppsSortingByFrecency
-
 # crbug.com/1041822
 -org.chromium.chrome.browser.offlinepages.OfflinePageAutoFetchTest.testAutoFetchTriggersOnDNSErrorWhenOffline
 
diff --git a/testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter
index 140bf36..574f0a2 100644
--- a/testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter
@@ -40,9 +40,6 @@
 # crbug.com/1041822
 -org.chromium.chrome.browser.offlinepages.OfflinePageAutoFetchTest.testAutoFetchTriggersOnDNSErrorWhenOffline
 
-# crbug.com/1061177
--org.chromium.chrome.browser.payments.PaymentRequestPaymentAppsSortingTest.testPaymentAppsSortingByFrecency
-
 # crbug.com/1061178
 -org.chromium.chrome.browser.tasks.tab_management.TabGridDialogTest.testSwipeToDismiss_Dialog
 
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index dc43f34..67427f00 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -394,15 +394,6 @@
           'Debug_x64',
         ],
       },
-      'Win10 Tests x64 (py2 less)': {
-        'args': [
-          '--target',
-          'Release_x64',
-        ],
-        'swarming': {
-          "shards": 12
-        },
-      },
       'Win11 Tests x64': {
         'args': [
           '--target',
@@ -711,15 +702,6 @@
           'Debug_x64',
         ],
       },
-      'Win10 Tests x64 (py2 less)': {
-        'args': [
-          '--target',
-          'Release_x64',
-        ],
-        'swarming': {
-          "shards": 18
-        },
-      },
       'Win11 Tests x64': {
         'args': [
           '--target',
@@ -3442,12 +3424,6 @@
           '--jobs=1',
         ],
       },
-      'Linux Tests (py2 less)': {
-        'args': [
-          '--xvfb',
-          '--jobs=1',
-        ],
-      },
       'Mac11 Tests': {
         'ci_only': True,
       },
@@ -4053,36 +4029,12 @@
           'hard_timeout': 1200,
         },
       },
-      'android-11-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.blink_unittests.filter',
-        ],
-      },
-      'android-12-x64-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.blink_unittests.filter',
-        ],
-      },
     },
   },
   'weblayer_browsertests': {
     'remove_from': [
       'android-pie-arm64-rel', # crbug.com/1354867
     ],
-    'modifications': {
-      'android-11-x86-rel': {
-        'args': [
-          # TODO(crbug.com/1191784): Fix the test failure
-          '--gtest_filter=-DownloadBrowserTest.OverrideDownloadDirectory',
-        ],
-      },
-      'android-12-x64-rel': {
-        'args': [
-          # TODO(crbug.com/1191784): Fix the test failure
-          '--gtest_filter=-DownloadBrowserTest.OverrideDownloadDirectory',
-        ],
-      },
-    },
   },
   'weblayer_bundle_test': {
     'remove_from': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 740c8412..8a22d1e6 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2838,17 +2838,6 @@
           'all'
         ],
       },
-      'Linux Builder (py2 less)': {
-        'mixins': [
-          'isolate_profile_data',
-        ],
-        'additional_compile_targets': [
-          'all'
-        ],
-        'test_suites': {
-          'scripts': 'chromium_linux_scripts',
-        }
-      },
       'Linux CFI (reclient shadow)': {
         'mixins': [
           'linux-bionic',
@@ -2889,16 +2878,6 @@
           '--test-launcher-print-test-stdio=always',
         ],
       },
-      'Linux Tests (py2 less)': {
-        'mixins': [
-          'isolate_profile_data',
-          'linux-bionic',
-        ],
-        'test_suites': {
-          'gtest_tests': 'chromium_linux_gtests',
-          'isolated_scripts': 'chromium_linux_rel_isolated_scripts',
-        },
-      },
       'Linux Viz': {
         'mixins': [
           'linux-bionic',
@@ -2941,17 +2920,6 @@
           'isolated_scripts': 'chromium_mac_rel_isolated_scripts',
         }
       },
-      'Mac12 Tests (py2 less)': {
-        # Copied from 'Mac12 Tests'.
-        'mixins': [
-            'mac_12_x64',
-            'isolate_profile_data',
-        ],
-        'test_suites': {
-          'gtest_tests': 'chromium_mac_gtests_no_nacl',
-          'isolated_scripts': 'chromium_mac_rel_isolated_scripts',
-        },
-      },
       'Site Isolation Android': {
         'additional_compile_targets': [
           'content_browsertests',
@@ -2991,14 +2959,6 @@
         },
         'use_swarming': False,
       },
-      'Win x64 Builder (py2 less)': {
-        'additional_compile_targets': [
-          'all'
-        ],
-        'test_suites': {
-          'scripts': 'chromium_win_scripts',
-        },
-      },
       'Win x64 Builder (reclient compare)': {
         # Copied from
         # https://source.chromium.org/chromium/chromium/src/+/7b147a6777cb32d6a12e1716c61a0ed50dc1229a:testing/buildbot/waterfalls.pyl;l=6023-6030
@@ -3069,19 +3029,6 @@
           'scripts': 'chromium_win_scripts',
         },
       },
-      'Win10 Tests x64 (py2 less)': {
-        # Copied from
-        # https://source.chromium.org/chromium/chromium/src/+/main:testing/buildbot/waterfalls.pyl;l=6193;drc=e40c45d7cb85fa476e0946b56a0fdcbb7d764134
-        'mixins': [
-          'x86-64',
-          'win10',
-          'isolate_profile_data',
-        ],
-        'test_suites': {
-          'gtest_tests': 'chromium_win10_gtests',
-          'isolated_scripts': 'chromium_win_rel_isolated_scripts',
-        },
-      },
       'android-backuprefptr-arm-fyi-rel': {
         'test_suites': {
           'gtest_tests': 'backuprefptr_gtests',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 0bbac91..088ae6d 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3791,6 +3791,21 @@
             ]
         }
     ],
+    "DiacriticsOnPhysicalKeyboardLongpress": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "DiacriticsOnPhysicalKeyboardLongpress"
+                    ]
+                }
+            ]
+        }
+    ],
     "DifferentWorkQueueCapacities": [
         {
             "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index 529690af..6e44cd9 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -321,7 +321,7 @@
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
 java_prebuilt("org_checkerframework_checker_qual_java") {
-  jar_path = "libs/org_checkerframework_checker_qual/checker-qual-3.22.1.jar"
+  jar_path = "libs/org_checkerframework_checker_qual/checker-qual-3.25.0.jar"
   output_name = "org_checkerframework_checker_qual"
   supports_android = true
 
@@ -1366,6 +1366,14 @@
   }
 
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
+  java_prebuilt("org_checkerframework_checker_util_java") {
+    jar_path = "libs/org_checkerframework_checker_util/checker-util-3.25.0.jar"
+    output_name = "org_checkerframework_checker_util"
+    supports_android = true
+    deps = [ ":org_checkerframework_checker_qual_java" ]
+  }
+
+  # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("org_codehaus_mojo_animal_sniffer_annotations_java") {
     jar_path = "libs/org_codehaus_mojo_animal_sniffer_annotations/animal-sniffer-annotations-1.17.jar"
     output_name = "org_codehaus_mojo_animal_sniffer_annotations"
diff --git a/third_party/android_deps/build.gradle b/third_party/android_deps/build.gradle
index ff01b481..9393d51 100644
--- a/third_party/android_deps/build.gradle
+++ b/third_party/android_deps/build.gradle
@@ -145,7 +145,7 @@
     // Used by downstream targets.
     compile "com.google.errorprone:error_prone_annotations:${errorproneVersion}"
     compile 'org.checkerframework:checker-compat-qual:2.5.3'
-    compile 'org.checkerframework:checker-util:3.22.1'
+    compile 'org.checkerframework:checker-util:3.25.0'
     compile 'org.codehaus.mojo:animal-sniffer-annotations:1.17'
 
     // Dedicated configuration to avoid using higher version number. The 9999 version is empty.
@@ -186,7 +186,7 @@
 
     androidTestCompile "org.mockito:mockito-core:4.7.0"
     // Depended on by downstream guava_java rewrite.
-    androidTestCompile "org.checkerframework:checker-qual:3.22.1"
+    androidTestCompile "org.checkerframework:checker-qual:3.25.0"
 
     String robolectricVersion = '4.8.1'
     // Use testCompile to avoid having support_android = true set on
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_qual/README.chromium b/third_party/android_deps/libs/org_checkerframework_checker_qual/README.chromium
index d477bb7..f91d97d51 100644
--- a/third_party/android_deps/libs/org_checkerframework_checker_qual/README.chromium
+++ b/third_party/android_deps/libs/org_checkerframework_checker_qual/README.chromium
@@ -1,7 +1,7 @@
 Name: Checker Qual
 Short Name: checker-qual
 URL: https://checkerframework.org
-Version: 3.22.1
+Version: 3.25.0
 License: GPL v2 with the classpath exception
 License File: LICENSE
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_qual/cipd.yaml b/third_party/android_deps/libs/org_checkerframework_checker_qual/cipd.yaml
index 69ca115..d52744a 100644
--- a/third_party/android_deps/libs/org_checkerframework_checker_qual/cipd.yaml
+++ b/third_party/android_deps/libs/org_checkerframework_checker_qual/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@3.22.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@3.25.0.cr1
 package: chromium/third_party/android_deps/libs/org_checkerframework_checker_qual
 description: "Checker Qual"
 data:
-- file: checker-qual-3.22.1.jar
+- file: checker-qual-3.25.0.jar
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_util/README.chromium b/third_party/android_deps/libs/org_checkerframework_checker_util/README.chromium
index 4246ebdd..9c00f7d 100644
--- a/third_party/android_deps/libs/org_checkerframework_checker_util/README.chromium
+++ b/third_party/android_deps/libs/org_checkerframework_checker_util/README.chromium
@@ -1,7 +1,7 @@
 Name: Checker Util
 Short Name: checker-util
 URL: https://checkerframework.org
-Version: 3.22.1
+Version: 3.25.0
 License: MIT
 License File: LICENSE
 CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_checkerframework_checker_util/cipd.yaml b/third_party/android_deps/libs/org_checkerframework_checker_util/cipd.yaml
index 9fef30b..0d0a774 100644
--- a/third_party/android_deps/libs/org_checkerframework_checker_util/cipd.yaml
+++ b/third_party/android_deps/libs/org_checkerframework_checker_util/cipd.yaml
@@ -3,8 +3,8 @@
 # found in the LICENSE file.
 
 # To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:2@3.22.1.cr1
+# cipd create --pkg-def cipd.yaml -tag version:2@3.25.0.cr1
 package: chromium/third_party/android_deps/libs/org_checkerframework_checker_util
 description: "Checker Util"
 data:
-- file: checker-util-3.22.1.jar
+- file: checker-util-3.25.0.jar
diff --git a/third_party/blink/renderer/controller/BUILD.gn b/third_party/blink/renderer/controller/BUILD.gn
index 3a837f8..29ab4c42 100644
--- a/third_party/blink/renderer/controller/BUILD.gn
+++ b/third_party/blink/renderer/controller/BUILD.gn
@@ -132,7 +132,6 @@
   data_deps = [
     ":blink_unittests_data",
     "//content/shell:pak",
-    "//testing/buildbot/filters:blink_unittests_filters",
   ]
 
   if (is_android) {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
index 2faf0b02..1ef680bf 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
@@ -15,24 +15,24 @@
 struct CORE_EXPORT NGGridPlacementData {
   NGGridPlacementData() = default;
 
-  NGGridPlacementData(bool is_parent_grid_container,
+  NGGridPlacementData(bool is_subgridded_to_parent,
                       const ComputedStyle& grid_style)
       : line_resolver(grid_style),
-        is_parent_grid_container(is_parent_grid_container) {}
+        is_subgridded_to_parent(is_subgridded_to_parent) {}
 
   // Subgrids need to map named lines from every parent grid. This constructor
   // should be used exclusively by subgrids to differentiate such scenario.
-  NGGridPlacementData(bool is_parent_grid_container,
+  NGGridPlacementData(bool is_subgridded_to_parent,
                       const ComputedStyle& grid_style,
                       const NGGridLineResolver& parent_line_resolver)
       : line_resolver(grid_style, parent_line_resolver),
-        is_parent_grid_container(is_parent_grid_container) {}
+        is_subgridded_to_parent(is_subgridded_to_parent) {}
 
   // Do not check `line_resolver` for comparison, as it's used to generate
   // `grid_item_positions` and isn't shared between equivalent instances.
   bool operator==(const NGGridPlacementData& other) const {
     return grid_item_positions == other.grid_item_positions &&
-           is_parent_grid_container == other.is_parent_grid_container &&
+           is_subgridded_to_parent == other.is_subgridded_to_parent &&
            column_subgrid_span_size == other.column_subgrid_span_size &&
            row_subgrid_span_size == other.row_subgrid_span_size &&
            column_auto_repetitions == other.column_auto_repetitions &&
@@ -61,7 +61,7 @@
   NGGridLineResolver line_resolver;
   Vector<GridArea> grid_item_positions;
 
-  bool is_parent_grid_container : 1;
+  bool is_subgridded_to_parent : 1;
 
   wtf_size_t column_subgrid_span_size{kNotFound};
   wtf_size_t row_subgrid_span_size{kNotFound};
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
index a2b76aa..bd8ef77 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
@@ -346,7 +346,7 @@
     const GridPosition& position,
     GridPositionSide side,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container,
+    bool is_subgridded_to_parent,
     wtf_size_t subgrid_span_size) const {
   switch (position.GetType()) {
     case kExplicitPosition: {
@@ -397,7 +397,7 @@
       NGGridNamedLineCollection explicit_lines(
           named_grid_line, track_direction, implicit_grid_line_names,
           explicit_grid_line_names, track_list, last_line,
-          auto_repeat_tracks_count, is_parent_grid_container);
+          auto_repeat_tracks_count, is_subgridded_to_parent);
       if (explicit_lines.HasNamedLines())
         return explicit_lines.FirstPosition();
 
@@ -420,7 +420,7 @@
     const ComputedStyle& grid_item_style,
     GridTrackSizingDirection track_direction,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container,
+    bool is_subgridded_to_parent,
     wtf_size_t subgrid_span_size) const {
   GridPosition initial_position, final_position;
   InitialAndFinalPositionsFromStyle(grid_item_style, track_direction,
@@ -449,7 +449,7 @@
     // 2 / 3' case).
     int end_line = ResolveGridPositionFromStyle(
         final_position, final_side, auto_repeat_tracks_count,
-        is_parent_grid_container, subgrid_span_size);
+        is_subgridded_to_parent, subgrid_span_size);
     return ResolveGridPositionAgainstOppositePosition(
         end_line, initial_position, initial_side, auto_repeat_tracks_count,
         subgrid_span_size);
@@ -460,7 +460,7 @@
     // span 2' case).
     int start_line = ResolveGridPositionFromStyle(
         initial_position, initial_side, auto_repeat_tracks_count,
-        is_parent_grid_container, subgrid_span_size);
+        is_subgridded_to_parent, subgrid_span_size);
     return ResolveGridPositionAgainstOppositePosition(
         start_line, final_position, final_side, auto_repeat_tracks_count,
         subgrid_span_size);
@@ -468,10 +468,10 @@
 
   int start_line = ResolveGridPositionFromStyle(
       initial_position, initial_side, auto_repeat_tracks_count,
-      is_parent_grid_container, subgrid_span_size);
+      is_subgridded_to_parent, subgrid_span_size);
   int end_line = ResolveGridPositionFromStyle(
       final_position, final_side, auto_repeat_tracks_count,
-      is_parent_grid_container, subgrid_span_size);
+      is_subgridded_to_parent, subgrid_span_size);
 
   if (end_line < start_line)
     std::swap(end_line, start_line);
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
index 91245d5..5e2fcb9f 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
@@ -49,7 +49,7 @@
       const ComputedStyle&,
       GridTrackSizingDirection,
       wtf_size_t auto_repeat_tracks_count,
-      bool is_parent_grid_container = false,
+      bool is_subgridded_to_parent = false,
       wtf_size_t subgrid_span_size = kNotFound) const;
 
  private:
@@ -79,7 +79,7 @@
   int ResolveGridPositionFromStyle(const GridPosition& position,
                                    GridPositionSide side,
                                    wtf_size_t auto_repeat_tracks_count,
-                                   bool is_parent_grid_container,
+                                   bool is_subgridded_to_parent,
                                    wtf_size_t subgrid_span_size) const;
 
   wtf_size_t ExplicitGridSizeForSide(GridPositionSide side,
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
index 484af6b..6289de8 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
@@ -20,7 +20,7 @@
     const ComputedGridTrackList& computed_grid_track_list,
     wtf_size_t last_line,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container)
+    bool is_subgridded_to_parent)
     : last_line_(last_line),
       auto_repeat_total_tracks_(auto_repeat_tracks_count) {
   is_standalone_grid_ =
@@ -31,7 +31,7 @@
   // https://www.w3.org/TR/css-grid-2/#subgrid-listing
   bool are_named_lines_valid = true;
   if (RuntimeEnabledFeatures::LayoutNGSubgridEnabled())
-    are_named_lines_valid = is_parent_grid_container || is_standalone_grid_;
+    are_named_lines_valid = is_subgridded_to_parent || is_standalone_grid_;
 
   const NamedGridLinesMap& auto_repeat_grid_line_names =
       computed_grid_track_list.auto_repeat_named_grid_lines;
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h
index b886625..7e07f15 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h
@@ -23,7 +23,7 @@
       const ComputedGridTrackList& computed_grid_track_list,
       wtf_size_t last_line,
       wtf_size_t auto_repeat_tracks_count,
-      bool is_parent_grid_container = false);
+      bool is_subgridded_to_parent = false);
 
   NGGridNamedLineCollection(const NGGridNamedLineCollection&) = delete;
   NGGridNamedLineCollection& operator=(const NGGridNamedLineCollection&) =
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
index 7d96bde..781eb68 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
@@ -123,7 +123,7 @@
 
     const auto subgrid = To<NGGridNode>(current_item.node);
     NGGridPlacementData subgrid_placement_data(
-        /* is_parent_grid_container */ true, subgrid.Style(),
+        /* is_subgridded_to_parent */ true, subgrid.Style(),
         CachedPlacementData().line_resolver);
 
     const bool is_parallel_subgrid = IsParallelWritingMode(
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc
index 3ad9eb7..7f8fe10 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc
@@ -139,13 +139,13 @@
     position.columns =
         placement_data_.line_resolver.ResolveGridPositionsFromStyle(
             item_style, kForColumns, column_auto_repeat_track_count_,
-            placement_data_.is_parent_grid_container,
+            placement_data_.is_subgridded_to_parent,
             placement_data_.column_subgrid_span_size);
     DCHECK(!position.columns.IsTranslatedDefinite());
 
     position.rows = placement_data_.line_resolver.ResolveGridPositionsFromStyle(
         item_style, kForRows, row_auto_repeat_track_count_,
-        placement_data_.is_parent_grid_container,
+        placement_data_.is_subgridded_to_parent,
         placement_data_.row_subgrid_span_size);
     DCHECK(!position.rows.IsTranslatedDefinite());
 
@@ -683,7 +683,7 @@
   GridSpan span = placement_data_.line_resolver.ResolveGridPositionsFromStyle(
       out_of_flow_item_style, track_direction,
       AutoRepeatTrackCount(track_direction),
-      placement_data_.is_parent_grid_container,
+      placement_data_.is_subgridded_to_parent,
       SubgridSpanSize(track_direction));
 
   if (span.IsIndefinite()) {
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.cc b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
index ed4c802c..c5e0345 100644
--- a/third_party/blink/renderer/core/style/grid_positions_resolver.cc
+++ b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
@@ -29,7 +29,7 @@
     GridTrackSizingDirection track_direction,
     wtf_size_t last_line,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container)
+    bool is_subgridded_to_parent)
     : last_line_(last_line),
       auto_repeat_total_tracks_(auto_repeat_tracks_count) {
   const bool is_for_columns = track_direction == kForColumns;
@@ -44,7 +44,7 @@
   // https://www.w3.org/TR/css-grid-2/#subgrid-listing
   bool are_named_lines_valid = true;
   if (RuntimeEnabledFeatures::LayoutNGSubgridEnabled())
-    are_named_lines_valid = is_parent_grid_container || is_standalone_grid_;
+    are_named_lines_valid = is_subgridded_to_parent || is_standalone_grid_;
 
   const NamedGridLinesMap& grid_line_names =
       computed_grid_track_list.named_grid_lines;
@@ -425,7 +425,7 @@
     const GridPosition& position,
     GridPositionSide side,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container,
+    bool is_subgridded_to_parent,
     wtf_size_t subgrid_span_size) {
   switch (position.GetType()) {
     case kExplicitPosition: {
@@ -470,7 +470,7 @@
       // contributes the first such line to the grid item's placement.
       NamedLineCollection explicit_lines(
           grid_container_style, named_grid_line, DirectionFromSide(side),
-          last_line, auto_repeat_tracks_count, is_parent_grid_container);
+          last_line, auto_repeat_tracks_count, is_subgridded_to_parent);
       if (explicit_lines.HasNamedLines())
         return explicit_lines.FirstPosition();
 
@@ -494,7 +494,7 @@
     const ComputedStyle& grid_item_style,
     GridTrackSizingDirection track_direction,
     wtf_size_t auto_repeat_tracks_count,
-    bool is_parent_grid_container,
+    bool is_subgridded_to_parent,
     wtf_size_t subgrid_span_size) {
   GridPosition initial_position, final_position;
   InitialAndFinalPositionsFromStyle(grid_item_style, track_direction,
@@ -523,7 +523,7 @@
     // 2 / 3' case).
     int end_line = ResolveGridPositionFromStyle(
         grid_container_style, final_position, final_side,
-        auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size);
+        auto_repeat_tracks_count, is_subgridded_to_parent, subgrid_span_size);
     return ResolveGridPositionAgainstOppositePosition(
         grid_container_style, end_line, initial_position, initial_side,
         auto_repeat_tracks_count, subgrid_span_size);
@@ -534,7 +534,7 @@
     // span 2' case).
     int start_line = ResolveGridPositionFromStyle(
         grid_container_style, initial_position, initial_side,
-        auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size);
+        auto_repeat_tracks_count, is_subgridded_to_parent, subgrid_span_size);
     return ResolveGridPositionAgainstOppositePosition(
         grid_container_style, start_line, final_position, final_side,
         auto_repeat_tracks_count, subgrid_span_size);
@@ -542,10 +542,10 @@
 
   int start_line = ResolveGridPositionFromStyle(
       grid_container_style, initial_position, initial_side,
-      auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size);
+      auto_repeat_tracks_count, is_subgridded_to_parent, subgrid_span_size);
   int end_line = ResolveGridPositionFromStyle(
       grid_container_style, final_position, final_side,
-      auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size);
+      auto_repeat_tracks_count, is_subgridded_to_parent, subgrid_span_size);
 
   if (end_line < start_line)
     std::swap(end_line, start_line);
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.h b/third_party/blink/renderer/core/style/grid_positions_resolver.h
index b88f41b4..3774d87 100644
--- a/third_party/blink/renderer/core/style/grid_positions_resolver.h
+++ b/third_party/blink/renderer/core/style/grid_positions_resolver.h
@@ -22,7 +22,7 @@
                       GridTrackSizingDirection,
                       wtf_size_t last_line,
                       wtf_size_t auto_repeat_tracks_count,
-                      bool is_parent_grid_container = false);
+                      bool is_subgridded_to_parent = false);
 
   bool HasNamedLines();
   wtf_size_t FirstPosition();
@@ -70,7 +70,7 @@
       const ComputedStyle&,
       GridTrackSizingDirection,
       wtf_size_t auto_repeat_tracks_count,
-      bool is_parent_grid_container = false,
+      bool is_subgridded_to_parent = false,
       wtf_size_t subgrid_span_size = kNotFound);
 };
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index cb92d304..f321ec6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1824,8 +1824,6 @@
   if (!object)
     return;
 
-  fixed_or_sticky_node_ids_.clear();
-
   if (active_aria_modal_dialog_ == object)
     active_aria_modal_dialog_ = nullptr;
 
@@ -1837,6 +1835,7 @@
   object->SetAXObjectID(0);
   ids_in_use_.erase(obj_id);
   autofill_state_map_.erase(obj_id);
+  fixed_or_sticky_node_ids_.erase(obj_id);
 
   relation_cache_->RemoveAXID(obj_id);
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index e9daa31..d356a6c 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -865,6 +865,7 @@
   Deque<ui::AXEvent> pending_events_;
 
   FRIEND_TEST_ALL_PREFIXES(AccessibilityTest, PauseUpdatesAfterMaxNumberQueued);
+  FRIEND_TEST_ALL_PREFIXES(AccessibilityTest, RemoveAXID);
 };
 
 // This is the only subclass of AXObjectCache.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
index 2e91bfd..292928c3 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
@@ -67,6 +67,21 @@
       *root->getElementById("focusable-parent")));
 }
 
+TEST_F(AccessibilityTest, RemoveAXID) {
+  auto& cache = GetAXObjectCache();
+  SetBodyInnerHTML(R"HTML(
+      <div id="f" style="position:fixed">aaa</div>
+      <h2 id="h">Heading</h2>)HTML");
+  AXObject* fixed = GetAXObjectByElementId("f");
+  // GetBoundsInFrameCoordinates() updates fixed_or_sticky_node_ids_.
+  fixed->GetBoundsInFrameCoordinates();
+  EXPECT_EQ(1u, cache.fixed_or_sticky_node_ids_.size());
+
+  // RemoveAXID() should not clear fixed_or_sticky_node_ids_.
+  cache.RemoveAXID(GetAXObjectByElementId("h"));
+  EXPECT_EQ(1u, cache.fixed_or_sticky_node_ids_.size());
+}
+
 class MockAXObject : public AXObject {
  public:
   explicit MockAXObject(AXObjectCacheImpl& ax_object_cache)
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
index f43ee51e..2c4c4931 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -235,6 +235,7 @@
       await_next_key_frame_(false),
       crop_version_(crop_version) {
   DCHECK(io_task_runner_.get());
+  DCHECK(main_render_task_runner_);
 }
 
 MediaStreamVideoTrack::FrameDeliverer::~FrameDeliverer() {
@@ -450,9 +451,21 @@
     std::vector<scoped_refptr<media::VideoFrame>> scaled_video_frames,
     base::TimeTicks estimated_capture_time) {
   DCHECK(io_task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(frame->metadata().crop_version, crop_version_);
 
-  if (!enabled_ && main_render_task_runner_ && emit_frame_drop_events_) {
+  // TODO(crbug.com/1369085): Understand why we sometimes see old crop versions.
+  if (frame->metadata().crop_version != crop_version_) {
+    // TODO(crbug.com/964947): A weak ptr instance of MediaStreamVideoTrack is
+    // passed to FrameDeliverer in order to avoid the re-binding the instance of
+    // a WTF::CrossThreadFunction.
+    PostCrossThreadTask(
+        *main_render_task_runner_, FROM_HERE,
+        CrossThreadBindOnce(
+            &MediaStreamVideoTrack::OnFrameDropped, media_stream_video_track_,
+            media::VideoCaptureFrameDropReason::kCropVersionNotCurrent));
+    return;
+  }
+
+  if (!enabled_ && emit_frame_drop_events_) {
     emit_frame_drop_events_ = false;
 
     // TODO(crbug.com/964947): A weak ptr instance of MediaStreamVideoTrack is
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
index fb8bf30..613d3de 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
@@ -423,6 +423,98 @@
   sink.DisconnectFromTrack();
 }
 
+TEST_F(MediaStreamVideoTrackTest, DeliversFramesWithCurrentCropVersion) {
+  InitializeSource();
+  MockMediaStreamVideoSink sink;
+
+  // Track is initialized with crop version 5.
+  EXPECT_CALL(*mock_source(), GetCropVersion).WillOnce(Return(5));
+  WebMediaStreamTrack track = CreateTrack();
+  sink.ConnectToTrack(track);
+
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateBlackFrame(gfx::Size(600, 400));
+  // Frame with current crop version should be delivered.
+  frame->metadata().crop_version = 5;
+  EXPECT_CALL(*mock_source(), OnFrameDropped).Times(0);
+  DeliverVideoFrameAndWaitForRenderer(std::move(frame), &sink);
+
+  sink.DisconnectFromTrack();
+}
+
+TEST_F(MediaStreamVideoTrackTest,
+       DropsOldFramesWhenInitializedWithNewerCropVersion) {
+  InitializeSource();
+  MockMediaStreamVideoSink sink;
+
+  // Track is initialized with crop version 5.
+  EXPECT_CALL(*mock_source(), GetCropVersion).WillOnce(Return(5));
+  WebMediaStreamTrack track = CreateTrack();
+  sink.ConnectToTrack(track);
+
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateBlackFrame(gfx::Size(600, 400));
+  // Old crop version delivered after construction.
+  frame->metadata().crop_version = 4;
+  base::RunLoop run_loop;
+  EXPECT_CALL(*mock_source(),
+              OnFrameDropped(
+                  media::VideoCaptureFrameDropReason::kCropVersionNotCurrent))
+      .WillOnce(RunOnceClosure(run_loop.QuitClosure()));
+  mock_source()->DeliverVideoFrame(std::move(frame));
+  run_loop.Run();
+
+  sink.DisconnectFromTrack();
+}
+
+TEST_F(MediaStreamVideoTrackTest, DropsOldFramesAfterCropVersionChanges) {
+  InitializeSource();
+  MockMediaStreamVideoSink sink;
+
+  // Track is initialized with crop version 5.
+  EXPECT_CALL(*mock_source(), GetCropVersion).WillOnce(Return(5));
+  WebMediaStreamTrack track = CreateTrack();
+  sink.ConnectToTrack(track);
+
+  // Crop version updated to 6.
+  mock_source()->DeliverNewCropVersion(6);
+
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateBlackFrame(gfx::Size(600, 400));
+  frame->metadata().crop_version = 5;  // No longer current version.
+  base::RunLoop run_loop;
+  EXPECT_CALL(*mock_source(),
+              OnFrameDropped(
+                  media::VideoCaptureFrameDropReason::kCropVersionNotCurrent))
+      .WillOnce(RunOnceClosure(run_loop.QuitClosure()));
+  mock_source()->DeliverVideoFrame(std::move(frame));
+  run_loop.Run();
+
+  sink.DisconnectFromTrack();
+}
+
+TEST_F(MediaStreamVideoTrackTest, DeliversNewFramesAfterCropVersionChanges) {
+  InitializeSource();
+  MockMediaStreamVideoSink sink;
+
+  // Track is initialized with crop version 5.
+  EXPECT_CALL(*mock_source(), GetCropVersion).WillOnce(Return(5));
+  WebMediaStreamTrack track = CreateTrack();
+  sink.ConnectToTrack(track);
+
+  // Crop version updated to 6.
+  mock_source()->DeliverNewCropVersion(6);
+
+  scoped_refptr<media::VideoFrame> frame =
+      media::VideoFrame::CreateBlackFrame(gfx::Size(600, 400));
+  // Frame with current crop version should be delivered.
+  frame->metadata().crop_version = 6;
+  EXPECT_CALL(*mock_source(), OnFrameDropped).Times(0);
+  DeliverVideoFrameAndWaitForRenderer(std::move(frame), &sink);
+
+  sink.DisconnectFromTrack();
+}
+
 class MediaStreamVideoTrackEncodedTest : public MediaStreamVideoTrackTest {
  public:
   void InitializeSource() override {
diff --git a/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.cc b/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.cc
index 10198c0..63f24cd 100644
--- a/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.cc
+++ b/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.cc
@@ -88,9 +88,11 @@
     VideoCaptureCropVersionCB crop_version_callback) {
   DCHECK(frame_callback_.is_null());
   DCHECK(encoded_frame_callback_.is_null());
+  DCHECK(crop_version_callback_.is_null());
   attempted_to_start_ = true;
   frame_callback_ = std::move(frame_callback);
   encoded_frame_callback_ = std::move(encoded_frame_callback);
+  crop_version_callback_ = std::move(crop_version_callback);
 }
 
 void MockMediaStreamVideoSource::StopSourceImpl() {}
@@ -121,6 +123,13 @@
                                           std::move(frame), base::TimeTicks()));
 }
 
+void MockMediaStreamVideoSource::DeliverNewCropVersion(uint32_t crop_version) {
+  DCHECK(!crop_version_callback_.is_null());
+  PostCrossThreadTask(
+      *io_task_runner(), FROM_HERE,
+      CrossThreadBindOnce(crop_version_callback_, crop_version));
+}
+
 void MockMediaStreamVideoSource::StopSourceForRestartImpl() {
   if (can_stop_for_restart_)
     is_stopped_for_restart_ = true;
diff --git a/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h b/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h
index ad53f37..3998710 100644
--- a/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h
+++ b/third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h
@@ -37,6 +37,7 @@
                     uint32_t,
                     base::OnceCallback<void(media::mojom::CropRequestResult)>));
   MOCK_METHOD0(GetNextCropVersion, absl::optional<uint32_t>());
+  MOCK_METHOD(uint32_t, GetCropVersion, (), (const, override));
 
   // Simulate that the underlying source start successfully.
   void StartMockedSource();
@@ -48,16 +49,22 @@
   // or FailToStartMockedSource has not been called.
   bool SourceHasAttemptedToStart() { return attempted_to_start_; }
 
-  // Delivers |frame| to all registered tracks on the IO thread. Its up to the
+  // Delivers |frame| to all registered tracks on the IO thread. It's up to the
   // caller to make sure MockMediaStreamVideoSource is not destroyed before the
   // frame has been delivered.
   void DeliverVideoFrame(scoped_refptr<media::VideoFrame> frame);
 
-  // Delivers |frame| to all registered encoded sinks on the IO thread. Its up
+  // Delivers |frame| to all registered encoded sinks on the IO thread. It's up
   // to the caller to make sure MockMediaStreamVideoSource is not destroyed
   // before the frame has been delivered.
   void DeliverEncodedVideoFrame(scoped_refptr<EncodedVideoFrame> frame);
 
+  // Send |crop_version| to all registered tracks on the IO thread. It's up to
+  // the caller to keep MockMediaStreamVideoSource alive until the
+  // crop_version_callback (registered with MediaStreamVideoSource::AddTrack)
+  // has completed.
+  void DeliverNewCropVersion(uint32_t crop_version);
+
   const media::VideoCaptureFormat& start_format() const { return format_; }
   int max_requested_height() const { return max_requested_height_; }
   int max_requested_width() const { return max_requested_width_; }
@@ -108,6 +115,7 @@
   bool is_suspended_ = false;
   blink::VideoCaptureDeliverFrameCB frame_callback_;
   EncodedVideoFrameCB encoded_frame_callback_;
+  VideoCaptureCropVersionCB crop_version_callback_;
 
   base::WeakPtrFactory<MediaStreamVideoSource> weak_factory_{this};
 };
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index a549bbd..11dbc4b7 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -547,7 +547,7 @@
     },
     {
       name: "ContentVisibilityAutoStateChangedEvent",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "ContextMenu",
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window-expected.txt
new file mode 100644
index 0000000..cae3f93
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Using document.open() against a document from a different window must not mutate the other window's sandbox flags assert_equals: expected "not sandboxed" but got "sandboxed"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window.js
new file mode 100644
index 0000000..713ca61
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/sandboxing/sandbox-document-open-mutation.window.js
@@ -0,0 +1,37 @@
+// Return whether the current context is sandboxed or not. The implementation do
+// not matter much, but might have to change over time depending on what side
+// effect sandbox flag have. Feel free to update as needed.
+const is_sandboxed = () => {
+  try {
+    document.domain = document.domain;
+    return "not sandboxed";
+  } catch (error) {
+    return "sandboxed";
+  }
+};
+
+promise_test(async test => {
+  const message = new Promise(r => window.addEventListener("message", r));
+
+  const iframe_unsandboxed = document.createElement("iframe");
+  document.body.appendChild(iframe_unsandboxed);
+
+  const iframe_sandboxed = document.createElement("iframe");
+  iframe_sandboxed.sandbox = "allow-same-origin allow-scripts";
+  document.body.appendChild(iframe_sandboxed);
+
+  iframe_sandboxed.srcdoc = `
+    <script>
+      parent.frames[0].document.write(\`
+        <script>
+          const is_sandboxed = ${is_sandboxed};
+          window.parent.postMessage(is_sandboxed(), '*');
+        </scr\`+\`ipt>
+      \`);
+      parent.frames[0].document.close();
+    </scr`+`ipt>
+  `;
+  assert_equals((await message).data, "not sandboxed");
+
+}, "Using document.open() against a document from a different window must not" +
+   " mutate the other window's sandbox flags");
diff --git a/third_party/blink/web_tests/external/wpt/webstorage/localstorage-cross-origin-iframe.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/webstorage/localstorage-cross-origin-iframe.tentative.https.window.js
new file mode 100644
index 0000000..39812f2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webstorage/localstorage-cross-origin-iframe.tentative.https.window.js
@@ -0,0 +1,27 @@
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/html/cross-origin-embedder-policy/credentialless/resources/common.js
+// META: script=/html/anonymous-iframe/resources/common.js
+
+promise_test(async test => {
+    const same_origin= get_host_info().HTTPS_ORIGIN;
+    const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN;
+    const reply_token = token();
+
+    for(iframe of [
+      newIframe(same_origin),
+      newIframe(cross_origin),
+    ]) {
+      send(iframe, `
+        try {
+          let c = window.localStorage;
+          send("${reply_token}","OK");
+        } catch (exception) {
+          send("${reply_token}","ERROR");
+        }
+      `);
+    }
+    assert_equals(await receive(reply_token), "OK");
+    assert_equals(await receive(reply_token), "OK");
+  }, "LocalStorage should be accessible on both same_origin and cross_origin iframes");
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed-expected.txt b/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed-expected.txt
deleted file mode 100644
index 3861c09..0000000
--- a/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This iframe should not return any errors:
-
-This iframe should not return any errors:
-
---------
-Frame: '<!--framePath //<!--frame0-->-->'
---------
-No exception
-
---------
-Frame: '<!--framePath //<!--frame1-->-->'
---------
-No exception
diff --git a/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed.html b/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed.html
deleted file mode 100644
index 76fc468..0000000
--- a/third_party/blink/web_tests/http/tests/security/cross-origin-local-storage-allowed.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<html>
-<head>
-<script>
-if (window.testRunner) {
-	testRunner.dumpAsText();
-	testRunner.dumpChildFrames();
-}
-</script>
-</head>
-<body>
-<p>This iframe should not return any errors:</p>
-<iframe src="http://localhost:8000/security/resources/cross-origin-iframe-for-local-storage.html"></iframe>
-<p>This iframe should not return any errors:</p>
-<iframe src="http://127.0.0.1:8000/security/resources/cross-origin-iframe-for-local-storage.html"></iframe>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-backgrounds/hidpi/README.txt b/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-backgrounds/hidpi/README.txt
index d8604f70..4770cd4b 100644
--- a/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-backgrounds/hidpi/README.txt
+++ b/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-backgrounds/hidpi/README.txt
@@ -1,3 +1,2 @@
 # This suite runs the test in external/wpt/css/css-backgrounds/hidpi
-# with --force-device-scale-factor=2, --enable-use-zoom-for-dsf=false and
-# --enable-threaded-compositing
+# with --force-device-scale-factor=2 and --enable-threaded-compositing
diff --git a/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-paint-api/hidpi/README.txt b/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-paint-api/hidpi/README.txt
index a708817..86a3321 100644
--- a/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-paint-api/hidpi/README.txt
+++ b/third_party/blink/web_tests/virtual/highdpi-threaded/external/wpt/css/css-paint-api/hidpi/README.txt
@@ -1,3 +1,2 @@
 # This suite runs the tests in external/wpt/css/css-paint-api/hidpi with
-# --force-device-scale-factor=2, --enable-use-zoom-for-dsf=false and
-# --enable-threaded-compositing
+# --force-device-scale-factor=2 and --enable-threaded-compositing
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index b0a484323..0890e1b 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -110,6 +110,7 @@
 PASS oldChildWindow.onchange is newChildWindow.onchange
 PASS oldChildWindow.onclick is newChildWindow.onclick
 PASS oldChildWindow.onclose is newChildWindow.onclose
+PASS oldChildWindow.oncontentvisibilityautostatechanged is newChildWindow.oncontentvisibilityautostatechanged
 PASS oldChildWindow.oncontextlost is newChildWindow.oncontextlost
 PASS oldChildWindow.oncontextmenu is newChildWindow.oncontextmenu
 PASS oldChildWindow.oncontextrestored is newChildWindow.oncontextrestored
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index 9218d2a..31f0329e 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -62,6 +62,7 @@
 PASS childWindow.onchange is null
 PASS childWindow.onclick is null
 PASS childWindow.onclose is null
+PASS childWindow.oncontentvisibilityautostatechanged is null
 PASS childWindow.oncontextlost is null
 PASS childWindow.oncontextmenu is null
 PASS childWindow.oncontextrestored is null
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 98822b4..d36b656 100644
--- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -62,6 +62,7 @@
 PASS childWindow.onchange is null
 PASS childWindow.onclick is null
 PASS childWindow.onclose is null
+PASS childWindow.oncontentvisibilityautostatechanged is null
 PASS childWindow.oncontextlost is null
 PASS childWindow.oncontextmenu is null
 PASS childWindow.oncontextrestored is null
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
index b84c53e7..f0e5a6f 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -177,6 +177,7 @@
     property onchange
     property onclick
     property onclose
+    property oncontentvisibilityautostatechanged
     property oncontextlost
     property oncontextmenu
     property oncontextrestored
@@ -1349,6 +1350,7 @@
     property onchange
     property onclick
     property onclose
+    property oncontentvisibilityautostatechanged
     property oncontextlost
     property oncontextmenu
     property oncontextrestored
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 9f93103..59ddf371 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -976,6 +976,10 @@
     attribute @@toStringTag
     getter offset
     method constructor
+interface ContentVisibilityAutoStateChangedEvent : Event
+    attribute @@toStringTag
+    getter skipped
+    method constructor
 interface ConvolverNode : AudioNode
     attribute @@toStringTag
     getter buffer
@@ -1443,6 +1447,7 @@
     getter onchange
     getter onclick
     getter onclose
+    getter oncontentvisibilityautostatechanged
     getter oncontextlost
     getter oncontextmenu
     getter oncontextrestored
@@ -1646,6 +1651,7 @@
     setter onchange
     setter onclick
     setter onclose
+    setter oncontentvisibilityautostatechanged
     setter oncontextlost
     setter oncontextmenu
     setter oncontextrestored
@@ -2739,6 +2745,7 @@
     getter onchange
     getter onclick
     getter onclose
+    getter oncontentvisibilityautostatechanged
     getter oncontextlost
     getter oncontextmenu
     getter oncontextrestored
@@ -2863,6 +2870,7 @@
     setter onchange
     setter onclick
     setter onclose
+    setter oncontentvisibilityautostatechanged
     setter oncontextlost
     setter oncontextmenu
     setter oncontextrestored
@@ -6422,6 +6430,7 @@
     getter onchange
     getter onclick
     getter onclose
+    getter oncontentvisibilityautostatechanged
     getter oncontextlost
     getter oncontextmenu
     getter oncontextrestored
@@ -6530,6 +6539,7 @@
     setter onchange
     setter onclick
     setter onclose
+    setter oncontentvisibilityautostatechanged
     setter oncontextlost
     setter oncontextmenu
     setter oncontextrestored
@@ -10426,6 +10436,7 @@
     getter onchange
     getter onclick
     getter onclose
+    getter oncontentvisibilityautostatechanged
     getter oncontextlost
     getter oncontextmenu
     getter oncontextrestored
@@ -10641,6 +10652,7 @@
     setter onchange
     setter onclick
     setter onclose
+    setter oncontentvisibilityautostatechanged
     setter oncontextlost
     setter oncontextmenu
     setter oncontextrestored
diff --git a/third_party/blink/web_tests/wpt_internal/lazyembed/automatic-lazy-frame-loading.sub.html b/third_party/blink/web_tests/wpt_internal/lazyembed/automatic-lazy-frame-loading.sub.html
index aa35dba..2826f8fd 100644
--- a/third_party/blink/web_tests/wpt_internal/lazyembed/automatic-lazy-frame-loading.sub.html
+++ b/third_party/blink/web_tests/wpt_internal/lazyembed/automatic-lazy-frame-loading.sub.html
@@ -10,7 +10,23 @@
   <div style="height:9000px;"></div>
   <div id="btf_div"></div>
   <script>
+    const FRAME_IDS = {
+      ATF: 'atf_default',
+      ATF_LAZY: 'atf_lazy',
+      BTF: 'btf_default',
+      BTF_LAZY: 'btf_lazy'
+    };
+
+    const EMBED_URL = "http://{{host}}:{{ports[http][0]}}/" +
+      "/wpt_internal/lazyembed/resources/embed.html";
+    const EMBED_URL_LAZY = "http://bad3p.test:{{ports[http][0]}}" +
+      "/wpt_internal/lazyembed/resources/embed.html";
+
+    const atf = document.querySelector('#atf_div');
+    const btf = document.querySelector('#btf_div');
+
     let loaded_ids = [];
+
     const _createSimpleFrame = () => {
       const iframe = document.createElement('iframe');
       iframe.witdh = "100";
@@ -41,6 +57,18 @@
       _setAttributes(iframe, id, src);
     };
 
+    const appendFrameToAboveTheFold = ({ isLazy }) => {
+      const id = isLazy ? "atf_lazy" : "atf_default";
+      const src = isLazy ? EMBED_URL_LAZY : EMBED_URL;
+      appendFrame(id, src, atf);
+    };
+
+    const appendFrameToBelowTheFold = ({ isLazy }) => {
+      const id = isLazy ? "btf_lazy" : "btf_default";
+      const src = isLazy ? EMBED_URL_LAZY : EMBED_URL;
+      appendFrame(id, src, btf);
+    };
+
     const isElementLoaded = (id) => loaded_ids.includes(id);
 
     const waitForElementLoad = (id) => {
@@ -56,21 +84,6 @@
       });
     };
 
-    const defaultEmbedUrl = "http://{{host}}:{{ports[http][0]}}/" +
-                            "/wpt_internal/lazyembed/resources/embed.html";
-    const lazyEmbedUrl = "http://bad3p.test:{{ports[http][0]}}" +
-                         "/wpt_internal/lazyembed/resources/embed.html";
-
-    const atf = document.querySelector('#atf_div');
-    const btf = document.querySelector('#btf_div');
-
-    const appendFrames = () => {
-      appendFrame("atf_default", defaultEmbedUrl, atf);
-      appendFrame("atf_lazy", lazyEmbedUrl, atf);
-      appendFrame("btf_default", defaultEmbedUrl, btf);
-      appendFrame("btf_lazy", lazyEmbedUrl, btf);
-    }
-
     const removeIframes = () => {
       document.querySelectorAll('iframe').forEach(e => e.remove());
     };
@@ -99,23 +112,31 @@
 
     promise_test(async t => {
       t.add_cleanup(cleanup);
-      appendFrames();
 
       let result;
-      // Test above the fold iframes.
-      result = await waitForElementLoad("atf_default");
+      appendFrameToAboveTheFold({ isLazy: false });
+      result = await waitForElementLoad(FRAME_IDS.ATF);
       assert_true(result, "iframe above the fold is successfully loaded");
-      result = await waitForElementLoad("atf_lazy");
-      assert_true(result, "iframe with lazy loadable url above the fold is successfully loaded");
 
+      appendFrameToAboveTheFold({ isLazy: true });
+      result = await waitForElementLoad(FRAME_IDS.ATF_LAZY);
+      assert_true(result, "iframe with lazy loadable url above the fold is successfully loaded");
+    }, "LazyEmbeds for above the fold");
+
+    promise_test(async t => {
+      t.add_cleanup(cleanup);
+
+      let result;
       // Normally iframe loads src url even in out of viewport.
-      result = await waitForElementLoad("btf_default");
+      appendFrameToBelowTheFold({ isLazy: false });
+      result = await waitForElementLoad(FRAME_IDS.BTF);
       assert_true(result, "iframe below the fold is successfully loaded");
 
       // Test config passes 1000ms as a test param, but this test want to check
       // if the frame is loaded via scrolling. To detect the frame src is still
       // not loaded, just wait for 500ms.
-      result = await wait(t, 500, "btf_lazy");
+      appendFrameToBelowTheFold({ isLazy: true });
+      result = await wait(t, 500, FRAME_IDS.BTF_LAZY);
       assert_false(result, "iframe with lazy loadable url below the fold is not loaded on navigation");
 
       // Then scroll to below the fold.
@@ -124,22 +145,20 @@
       // If viewport is close to the frame, then start loading.
       result = await waitForElementLoad("btf_lazy");
       assert_true(result, "iframe with lazy loadable url below the fold is loaded when close to the element");
-    }, "Automatic lazy frame loading");
+    }, "LazyEmbeds for below the fold");
 
     promise_test(async t => {
       t.add_cleanup(cleanup);
 
-      const id = "btf_lazy"
-      appendFrame(id, lazyEmbedUrl, btf);
-
+      appendFrameToBelowTheFold({ isLazy: true });
       const timeoutMs = 1000;
       let result;
       // To detect the frame src is not loaded, wait until the timeout.
-      result = await wait(t, timeoutMs, id);
+      result = await wait(t, timeoutMs, FRAME_IDS.BTF_LAZY);
       assert_false(result, "iframe is not loaded yet right after the timeout");
 
       await waitUntilIdle();
-      result = await waitForElementLoad(id);
+      result = await waitForElementLoad(FRAME_IDS.BTF_LAZY);
       assert_true(result, "iframe with lazy loadable url below the fold is " +
                           "loaded when after the timeout and idle");
     }, "Automatic lazy frame loading with timeout");
@@ -147,19 +166,18 @@
     promise_test(async t => {
       t.add_cleanup(cleanup);
 
-      const id = "btf_lazy"
-      appendAdFrame(id, lazyEmbedUrl, btf);
+      appendFrameToBelowTheFold({ isLazy: true });
 
       // The timeout setting of LazyEmbeds.
       // LazyAds timeout is set as 5000ms in VirtualTestSuites.
       const timeoutMs = 1000;
       let result;
       // To detect the frame src is not loaded, wait until the timeout.
-      result = await wait(t, timeoutMs, id);
+      result = await wait(t, timeoutMs, FRAME_IDS.BTF_LAZY);
       assert_false(result, "iframe is not loaded yet right after the timeout");
 
       await waitUntilIdle();
-      result = await waitForElementLoad(id);
+      result = await waitForElementLoad(FRAME_IDS.BTF_LAZY);
       assert_true(
         result, "iframe is loaded after passing the LazyEmbeds timeout");
     }, "LazyEmbeds timeout is prioritized than LazyAds whtn the frame is " +
diff --git a/third_party/ruy/BUILD.gn b/third_party/ruy/BUILD.gn
index d1c8476..b8affa8 100644
--- a/third_party/ruy/BUILD.gn
+++ b/third_party/ruy/BUILD.gn
@@ -14,7 +14,8 @@
     # especially amongst ChromeOS devices.
     # See //third_party/cpuinfo/src/src/arm/linux/cp.h.
     (!defined(arm_arch) ||
-     (arm_arch != "armv7-a+crc" && arm_arch != "armv8-a+crc"))
+     (arm_arch != "armv7-a+crc" && arm_arch != "armv8-a+crc" &&
+      arm_arch != "armv8-a+crc+crypto"))
 
 config("ruy_include") {
   include_dirs = [ "src" ]
diff --git a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
index 129cece..1d71573d 100644
--- a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
+++ b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
@@ -4,6 +4,7 @@
 
 #include "BadPatternFinder.h"
 #include <clang/AST/Decl.h>
+#include <clang/AST/RecordLayout.h>
 #include "BlinkGCPluginOptions.h"
 #include "Config.h"
 #include "DiagnosticsReporter.h"
@@ -29,6 +30,13 @@
                hasCanonicalType(arrayType(hasElementType(has_gc_base))));
 }
 
+auto MemberType() {
+  auto has_member_name = hasAnyName("::blink::Member", "::blink::WeakMember",
+                                    "::cppgc::internal::BasicMember");
+  return anyOf(hasType(recordDecl(has_member_name)),
+               hasType(typeAliasTemplateDecl(has_member_name)));
+}
+
 class UniquePtrGarbageCollectedMatcher : public MatchFinder::MatchCallback {
  public:
   explicit UniquePtrGarbageCollectedMatcher(DiagnosticsReporter& diagnostics)
@@ -155,12 +163,7 @@
       : diagnostics_(diagnostics) {}
 
   void Register(MatchFinder& match_finder) {
-    auto has_member_name = hasAnyName("::blink::Member", "::blink::WeakMember",
-                                      "::cppgc::internal::BasicMember");
-    auto class_member_variable_matcher =
-        varDecl(anyOf(hasType(recordDecl(has_member_name)),
-                      hasType(typeAliasTemplateDecl(has_member_name))))
-            .bind("member");
+    auto class_member_variable_matcher = varDecl(MemberType()).bind("member");
     match_finder.addDynamicMatcher(class_member_variable_matcher, this);
   }
 
@@ -175,6 +178,138 @@
   DiagnosticsReporter& diagnostics_;
 };
 
+AST_MATCHER(clang::CXXRecordDecl, isDisallowedNewClass) {
+  auto& context = Finder->getASTContext();
+
+  auto gc_matcher = GarbageCollectedType();
+  if (gc_matcher.matches(context.getTypeDeclType(&Node), Finder, Builder)) {
+    // This is a normal GCed class, bail out.
+    return false;
+  }
+
+  // First, look for methods in this class.
+  auto method = std::find_if(
+      Node.method_begin(), Node.method_end(), [](const auto& method) {
+        return method->getNameAsString() == kNewOperatorName &&
+               method->getNumParams() == 1;
+      });
+  if (method != Node.method_end()) {
+    // We found the 'operator new'. Check if it's deleted.
+    return method->isDeleted();
+  }
+
+  // Otherwise, lookup in the base classes.
+  for (auto& base_spec : Node.bases()) {
+    if (auto* base = base_spec.getType()->getAsCXXRecordDecl())
+      if (matches(*base, Finder, Builder))
+        return true;
+  }
+
+  return false;
+}
+
+size_t RoundUp(size_t value, size_t align) {
+  assert((align & (align - 1)) == 0);
+  return (value + align - 1) & ~(align - 1);
+}
+
+// Very approximate way of calculating size of a record based on fields. Doesn't
+// take into account alignment of base subobjects, but only its own fields.
+size_t RequiredSizeForFields(const clang::ASTContext& context,
+                             size_t current_size,
+                             const std::vector<clang::QualType>& field_types) {
+  size_t largest_field_alignment = 0;
+
+  for (clang::QualType type : field_types) {
+    assert(!type->isDependentType());
+    const size_t current_field_alignment = context.getTypeAlign(type);
+    current_size = RoundUp(current_size, current_field_alignment);
+    current_size += context.getTypeSize(type);
+    largest_field_alignment =
+        std::max(largest_field_alignment, current_field_alignment);
+  }
+
+  current_size = RoundUp(current_size, largest_field_alignment);
+  return current_size;
+}
+
+class PaddingInGCedMatcher : public MatchFinder::MatchCallback {
+ public:
+  PaddingInGCedMatcher(clang::ASTContext& context,
+                       DiagnosticsReporter& diagnostics)
+      : context_(context), diagnostics_(diagnostics) {}
+
+  void Register(MatchFinder& match_finder) {
+    auto member_field_matcher =
+        cxxRecordDecl(has(fieldDecl(MemberType()).bind("member")),
+                      isDisallowedNewClass())
+            .bind("record");
+    match_finder.addMatcher(member_field_matcher, this);
+  }
+
+  void run(const MatchFinder::MatchResult& result) override {
+    auto* class_decl = result.Nodes.getNodeAs<clang::RecordDecl>("record");
+    if (class_decl->isDependentType() || class_decl->isUnion())
+      return;
+
+    if (auto* member_decl = result.Nodes.getNodeAs<clang::FieldDecl>("member");
+        member_decl && Config::IsIgnoreAnnotated(member_decl))
+      return;
+
+    if (auto* cxx_record_decl =
+            clang::dyn_cast<clang::CXXRecordDecl>(class_decl)) {
+      if (cxx_record_decl->getNumVBases()) {
+        // Don't process class with virtual bases.
+        return;
+      }
+    }
+
+    std::vector<clang::QualType> fields;
+    for (auto* field : class_decl->fields()) {
+      if (field->isBitField()) {
+        // Don't process types with bitfields yet.
+        return;
+      }
+      if (field->isZeroSize(context_)) {
+        // Don't process types with [[no_unique_address]] on the fields.
+        return;
+      }
+      if (field->hasAttr<clang::AlignedAttr>()) {
+        // Ignore classes containing alignas on the fields.
+        return;
+      }
+
+      fields.push_back(field->getType());
+    }
+    assert(fields.size() > 0);
+
+    const clang::ASTRecordLayout& layout =
+        context_.getASTRecordLayout(class_decl);
+    const size_t base_size = layout.getFieldOffset(0);
+
+    const size_t size_before =
+        RequiredSizeForFields(context_, base_size, fields);
+
+    std::sort(fields.begin(), fields.end(),
+              [this](clang::QualType t1, clang::QualType t2) {
+                // Try simply sort by sizes, ignoring alignment.
+                return context_.getTypeSize(t1) > context_.getTypeSize(t2);
+              });
+
+    const size_t size_after =
+        RequiredSizeForFields(context_, base_size, fields);
+
+    if (size_after < size_before) {
+      diagnostics_.AdditionalPadding(
+          class_decl, (size_before - size_after) / context_.getCharWidth());
+    }
+  }
+
+ private:
+  clang::ASTContext& context_;
+  DiagnosticsReporter& diagnostics_;
+};
+
 }  // namespace
 
 void FindBadPatterns(clang::ASTContext& ast_context,
@@ -196,5 +331,10 @@
     member_on_stack.Register(match_finder);
   }
 
+  PaddingInGCedMatcher padding_in_gced(ast_context, diagnostics);
+  if (options.enable_extra_padding_check) {
+    padding_in_gced.Register(match_finder);
+  }
+
   match_finder.matchAST(ast_context);
 }
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
index 7501043..60684e9 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
@@ -43,6 +43,8 @@
         options_.enable_persistent_in_unique_ptr_check = true;
       } else if (arg == "enable-members-on-stack-check") {
         options_.enable_members_on_stack_check = true;
+      } else if (arg == "enable-extra-padding-check") {
+        options_.enable_extra_padding_check = true;
       } else if (arg == "fix-bugs-of-is-considered-abstract") {
         // This flag is now always enabled. TODO(wangxianzhu): Remove this flag.
       } else {
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
index 089ce37..3a22b19 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
@@ -49,6 +49,11 @@
   // TODO(chromium:1283720): Enable this checks once all violations are handled.
   bool enable_members_on_stack_check = false;
 
+  // Checks that any inlined classes (ones that could be a value-type of heap
+  // containers) don't have extra padding potentially introduced by Member (e.g
+  // due to pointer compression).
+  bool enable_extra_padding_check = false;
+
   std::set<std::string> ignored_classes;
   std::set<std::string> checked_namespaces;
   std::vector<std::string> ignored_directories;
diff --git a/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp b/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
index 00c4257..f7cfa28 100644
--- a/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
+++ b/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
@@ -141,6 +141,10 @@
     "[blink-gc] Member variable %0 declared on stack here (use raw pointer or "
     "reference instead):";
 
+const char kAdditionalPadding[] =
+    "[blink-gc] Additional padding causes the sizeof(%0) to grow by %1. "
+    "Consider reordering fields.";
+
 const char kUniquePtrUsedWithGC[] =
     "[blink-gc] Disallowed use of %0 found; %1 is a garbage-collected type. "
     "std::unique_ptr cannot hold garbage-collected objects.";
@@ -221,6 +225,8 @@
       diagnostic_.getCustomDiagID(getErrorLevel(), kMemberInStackAllocated);
   diag_member_on_stack_ =
       diagnostic_.getCustomDiagID(getErrorLevel(), kMemberOnStack);
+  diag_additional_padding_ =
+      diagnostic_.getCustomDiagID(getErrorLevel(), kAdditionalPadding);
 
   // Register note messages.
   diag_base_requires_tracing_note_ = diagnostic_.getCustomDiagID(
@@ -582,3 +588,9 @@
   ReportDiagnostic(var->getBeginLoc(), diag_member_on_stack_)
       << var->getName() << var->getSourceRange();
 }
+
+void DiagnosticsReporter::AdditionalPadding(const clang::RecordDecl* record,
+                                            size_t padding_size) {
+  ReportDiagnostic(record->getBeginLoc(), diag_additional_padding_)
+      << record->getName() << padding_size << record->getSourceRange();
+}
diff --git a/tools/clang/blink_gc_plugin/DiagnosticsReporter.h b/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
index b3f31c0..60299229 100644
--- a/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
+++ b/tools/clang/blink_gc_plugin/DiagnosticsReporter.h
@@ -89,6 +89,7 @@
                          const clang::CXXRecordDecl* variant,
                          const clang::CXXRecordDecl* gc_type);
   void MemberOnStack(const clang::VarDecl* var);
+  void AdditionalPadding(const clang::RecordDecl* var, size_t padding);
 
  private:
   clang::DiagnosticBuilder ReportDiagnostic(
@@ -145,6 +146,7 @@
   unsigned diag_trace_method_of_stack_allocated_parent_;
   unsigned diag_member_in_stack_allocated_class_;
   unsigned diag_member_on_stack_;
+  unsigned diag_additional_padding_;
 
   unsigned diag_unique_ptr_used_with_gc_;
   unsigned diag_optional_field_used_with_gc_;
diff --git a/tools/clang/blink_gc_plugin/tests/extra_padding.cpp b/tools/clang/blink_gc_plugin/tests/extra_padding.cpp
new file mode 100644
index 0000000..56c81f93
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/extra_padding.cpp
@@ -0,0 +1,127 @@
+// 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.
+
+// The test relies on a 64bit target (test.py sets the triple explicitly).
+
+#include "heap/stubs.h"
+
+namespace blink {
+
+class Object : public GarbageCollected<Object> {
+  void Trace(Visitor*) const {}
+};
+
+namespace {
+
+struct DisallowNewWithPadding {
+  DISALLOW_NEW();
+
+ public:
+  virtual void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  // The plugin should warn that reordering would make sense here.
+  Member<Object> a;
+  void* raw;
+  Member<Object> b;
+};
+
+struct DisallowNewWithoutPadding {
+  DISALLOW_NEW();
+
+ public:
+  virtual void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  // The plugin shouldn't warn, e.g. reordering wouldn't eliminate padding.
+  Member<Object> a;
+  Member<Object> b;
+  void* raw;
+};
+
+// Don't warn for templates until instantiated.
+template <class T>
+struct DisallowNewWithPaddingTemplate {
+  DISALLOW_NEW();
+
+ public:
+  virtual void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  Member<Object> a;
+  void* raw;
+  Member<Object> b;
+};
+
+template struct DisallowNewWithPaddingTemplate<int>;
+
+// A GarbageCollected class shall not be checked.
+class GCed : GarbageCollected<GCed> {
+  void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  Member<Object> a;
+  void* raw;
+  Member<Object> b;
+};
+
+// Explicitly setting the alignment requirement on fields should disable the
+// check.
+struct DisallowNewWithExplicitAlignment {
+  DISALLOW_NEW();
+
+  void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  Member<Object> a;
+  void* raw;
+  alignas(32) Member<Object> b;
+};
+
+// Disable the check with classes containing bitfields.
+struct DisallowNewWithBitfield {
+  DISALLOW_NEW();
+
+  void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  Member<Object> a;
+  void* raw;
+  int b1 : 1;
+  int b2 : 2;
+  Member<Object> b;
+};
+
+// Disable the check with classes containing [[no_unique_address]].
+struct DisallowNewWithNoUniqueAddress {
+  DISALLOW_NEW();
+
+  class Empty {};
+
+  void Trace(Visitor* v) const {
+    v->Trace(a);
+    v->Trace(b);
+  }
+
+  Member<Object> a;
+  void* raw;
+  [[no_unique_address]] Empty empty;
+  Member<Object> b;
+};
+
+}  // namespace
+
+}  // namespace blink
diff --git a/tools/clang/blink_gc_plugin/tests/extra_padding.flags b/tools/clang/blink_gc_plugin/tests/extra_padding.flags
new file mode 100644
index 0000000..ff123e6
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/extra_padding.flags
@@ -0,0 +1 @@
+-Xclang -plugin-arg-blink-gc-plugin -Xclang enable-extra-padding-check --target=x86_64-unknown-linux-gnu
diff --git a/tools/clang/blink_gc_plugin/tests/extra_padding.txt b/tools/clang/blink_gc_plugin/tests/extra_padding.txt
new file mode 100644
index 0000000..609a45f
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/extra_padding.txt
@@ -0,0 +1,7 @@
+extra_padding.cpp:17:1: warning: [blink-gc] Additional padding causes the sizeof(DisallowNewWithPadding) to grow by 8. Consider reordering fields.
+struct DisallowNewWithPadding {
+^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+extra_padding.cpp:63:10: warning: [blink-gc] Additional padding causes the sizeof(DisallowNewWithPaddingTemplate) to grow by 8. Consider reordering fields.
+template struct DisallowNewWithPaddingTemplate<int>;
+~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+2 warnings generated.
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
index 0ee3b3b..2e4c473 100644
--- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h
+++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -6,6 +6,7 @@
 #define HEAP_STUBS_H_
 
 #include <stddef.h>
+#include <stdint.h>
 
 namespace WTF {
 
@@ -325,6 +326,9 @@
     operator T*() const { return 0; }
     T* operator->() const { return 0; }
     bool operator!() const { return false; }
+
+   private:
+    uint32_t compressed;
 };
 
 template<typename T> class WeakMember {
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 06c7e47..16d62b6 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -35,7 +35,7 @@
 # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
-CLANG_REVISION = 'llvmorg-16-init-5189-gbfcd536a'
+CLANG_REVISION = 'llvmorg-16-init-6084-g2f3d7c2c'
 CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index cd0b90d..d86e4e8 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -372,7 +372,6 @@
       'Libfuzzer Upload Mac ASan': 'libfuzzer_mac_asan_shared_release_bot',
       'Libfuzzer Upload Windows ASan': 'libfuzzer_windows_asan_release_bot',
       'Linux Builder (j-500) (reclient)': 'gpu_tests_release_bot_reclient',
-      'Linux Builder (py2 less)': 'gpu_tests_release_bot_reclient',
       'Linux Builder (reclient compare)': 'gpu_tests_release_bot_reclient',
       'Linux CFI (reclient shadow)': 'cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on_reclient',
       'Linux ChromiumOS MSan Focal': 'chromeos_msan_release_bot',
@@ -389,7 +388,6 @@
       'Site Isolation Android': 'android_release_bot_minimal_symbols_arm64_reclient',
       'VR Linux': 'vr_release_bot_reclient',
       'Win 10 Fast Ring': 'release_trybot_minimal_symbols_reclient',
-      'Win x64 Builder (py2 less)': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'Win x64 Builder (reclient compare)': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'Win x64 Builder (reclient)': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'Win x64 Builder (reclient)(cross)': 'gpu_tests_release_bot_minimal_symbols_reclient_win_cross',
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 4d039cb..44209322 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -398,16 +398,6 @@
       "use_remoteexec": true
     }
   },
-  "Linux Builder (py2 less)": {
-    "gn_args": {
-      "dcheck_always_on": false,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "use_remoteexec": true
-    }
-  },
   "Linux Builder (reclient compare)": {
     "gn_args": {
       "dcheck_always_on": false,
@@ -558,17 +548,6 @@
       "use_remoteexec": true
     }
   },
-  "Win x64 Builder (py2 less)": {
-    "gn_args": {
-      "dcheck_always_on": false,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "symbol_level": 1,
-      "use_remoteexec": true
-    }
-  },
   "Win x64 Builder (reclient compare)": {
     "gn_args": {
       "dcheck_always_on": false,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 2a56642..de1a5f4 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -20166,6 +20166,15 @@
   </description>
 </action>
 
+<action name="MobileToolbarCloseAllTabs">
+  <owner>clank-app-team@google.com</owner>
+  <owner>twellington@chromium.org</owner>
+  <description>
+    User clicked close all tabs button by long pressing close button on any tab
+    in the tablet tab strip. Android Only.
+  </description>
+</action>
+
 <action name="MobileToolbarCloseTab">
   <owner>clank-app-team@google.com</owner>
   <owner>twellington@chromium.org</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7049944..408fcd7 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -61411,6 +61411,7 @@
   <int value="861351290" label="FontManagerEarlyInit:enabled"/>
   <int value="862453793" label="TranslateUI2016Q2:enabled"/>
   <int value="863493664" label="LacrosMoveProfileMigration:disabled"/>
+  <int value="863584992" label="ExtensionsFSPInServiceWorkers:enabled"/>
   <int value="864024033" label="IsolatePrerendersMustProbeOrigin:enabled"/>
   <int value="866536801" label="PDFViewerUpdate:disabled"/>
   <int value="867512869" label="mark-non-secure-as"/>
@@ -63318,6 +63319,7 @@
   <int value="2047695652" label="DelegateOverscrollSwipes:enabled"/>
   <int value="2049432745" label="VaapiWebPImageDecodeAcceleration:enabled"/>
   <int value="2049674680" label="EnableAutomaticSnooze:enabled"/>
+  <int value="2050597948" label="ExtensionsFSPInServiceWorkers:disabled"/>
   <int value="2050985807" label="AllowPopupsDuringPageUnload:enabled"/>
   <int value="2051403297" label="ShowBluetoothDeviceBattery:disabled"/>
   <int value="2051886966" label="PwaInstallUseBottomSheet:enabled"/>
@@ -88162,6 +88164,7 @@
   <int value="16" label="ChromeLowUserEngagement"/>
   <int value="17" label="FeedUserSegment"/>
   <int value="18" label="ContextualPageActions"/>
+  <int value="23" label="SearchUserSegment"/>
 </enum>
 
 <enum name="SegmentationPlatformTrainingDataCollectionEvent">
@@ -96977,6 +96980,11 @@
   <int value="2" label="ECDSA"/>
 </enum>
 
+<enum name="TPMTakeOwnershipResult">
+  <int value="0" label="TPM Take Ownership Success"/>
+  <int value="1" label="TPM Take Ownership Failed"/>
+</enum>
+
 <enum name="TPMVersionFingerprint">
 <!--
 Full version information for the fingerprint enum values:
@@ -100364,6 +100372,7 @@
   <int value="25"
       label="kVideoTrackFrameDelivererNotEnabledReplacingWithBlackFrame"/>
   <int value="26" label="kRendererSinkFrameDelivererIsNotStarted"/>
+  <int value="27" label="kCropVersionNotCurrent"/>
 </enum>
 
 <enum name="VideoCaptureServiceEvent">
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 775c697..f597aaa 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -53,6 +53,7 @@
       summary="Segmentation: Feed usage in Chrome"/>
   <variant name="SegmentationNewTab" summary="Segmentation: New tab page user"/>
   <variant name="SegmentationQueryTiles" summary="Query tiles"/>
+  <variant name="SegmentationSearchUser" summary="Segmentation: Search user"/>
   <variant name="SegmentationShare" summary="Segmentation: Share user"/>
   <variant name="SegmentationShoppingUser"
       summary="Segmentation: Shopping user"/>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 1704f61..87e0cdb 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -1483,6 +1483,16 @@
   </summary>
 </histogram>
 
+<histogram name="Platform.TPM.TakeOwnershipResult"
+    enum="TPMTakeOwnershipResult" expires_after="2023-03-29">
+  <owner>yich@google.com</owner>
+  <owner>cros-hwsec-userland-eng+uma@google.com</owner>
+  <summary>
+    Report the TPM ownership can be take or not for each TPM initialization
+    process. The process usually happen at the first boot of device.
+  </summary>
+</histogram>
+
 <histogram name="Platform.TPM.TimeToTakeOwnership" units="ms"
     expires_after="2023-02-12">
   <owner>yich@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
index 017bd36..48e5acf 100644
--- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -33,6 +33,7 @@
   <variant name="PowerUser"/>
   <variant name="QueryTiles"/>
   <variant name="ResumeHeavyUser"/>
+  <variant name="SearchUser"/>
   <variant name="ShoppingUser"/>
 </variants>
 
@@ -55,6 +56,7 @@
   <variant name="PowerUser"/>
   <variant name="QueryTiles"/>
   <variant name="ResumeHeavyUser"/>
+  <variant name="SearchUser"/>
   <variant name="ShoppingUser"/>
 </variants>
 
@@ -72,6 +74,7 @@
   <variant name="PowerUserSegment"/>
   <variant name="QueryTiles"/>
   <variant name="ResumeHeavyUserSegment"/>
+  <variant name="SearchUserSegment"/>
   <variant name="Share"/>
   <variant name="ShoppingUser"/>
   <variant name="Unknown"/>
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 504cb88b..624415e 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -395,4 +395,8 @@
  <item id="cryptohome_recovery_fetch_epoch" added_in_milestone="108" content_hash_code="06e195ad" os_list="chromeos" file_path="chromeos/ash/components/login/auth/recovery/cryptohome_recovery_service_client.cc" />
  <item id="cryptohome_recovery_fetch_recovery_response" added_in_milestone="108" content_hash_code="01b13324" os_list="chromeos" file_path="chromeos/ash/components/login/auth/recovery/cryptohome_recovery_service_client.cc" />
  <item id="supervised_user_favicon_request" added_in_milestone="108" content_hash_code="06636c2a" os_list="chromeos,android" file_path="chrome/browser/supervised_user/supervised_user_favicon_request_handler.cc" />
+ <item id="nearby_share_update_device" added_in_milestone="108" type="partial" second_id="oauth2_api_call_flow" content_hash_code="01d34a5a" os_list="chromeos" semantics_fields="1,2,3,4,5" policy_fields="3,4" file_path="chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc" />
+ <item id="nearby_share_contacts" added_in_milestone="108" type="partial" second_id="oauth2_api_call_flow" content_hash_code="0473989a" os_list="chromeos" semantics_fields="1,2,3,4,5" policy_fields="3,4" file_path="chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc" />
+ <item id="nearby_share_list_public_certificates" added_in_milestone="108" type="partial" second_id="oauth2_api_call_flow" content_hash_code="01706e8a" os_list="chromeos" semantics_fields="1,2,3,4,5" policy_fields="3,4" file_path="chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc" />
+ <item id="app_preload_service" added_in_milestone="108" content_hash_code="00720713" os_list="chromeos" file_path="chrome/browser/apps/app_preload_service/app_preload_server_connector.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index c781d74..fef774a 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -262,6 +262,10 @@
       <annotation id="cryptohome_recovery_fetch_epoch"/>
       <annotation id="cryptohome_recovery_fetch_recovery_response"/>
       <annotation id="supervised_user_favicon_request"/>
+      <annotation id="nearby_share_update_device"/>
+      <annotation id="nearby_share_contacts"/>
+      <annotation id="nearby_share_list_public_certificates"/>
+      <annotation id="app_preload_service"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/tools/typescript/definitions/developer_private.d.ts b/tools/typescript/definitions/developer_private.d.ts
index 14c4921..644aae3 100644
--- a/tools/typescript/definitions/developer_private.d.ts
+++ b/tools/typescript/definitions/developer_private.d.ts
@@ -406,6 +406,11 @@
         sites: SiteInfo[],
       };
 
+      export type MatchingExtensionInfo = {
+        id: string,
+        siteAccess: HostAccess,
+      };
+
       type VoidCallback = () => void;
       type StringCallback = (s: string) => void;
 
@@ -465,6 +470,8 @@
           options: UserSiteSettingsOptions, callback?: VoidCallback): void;
       export function getUserAndExtensionSitesByEtld(
           callback: (result: SiteGroup[]) => void): void;
+      export function getMatchingExtensionsForSite(site: string):
+          Promise<MatchingExtensionInfo[]>;
 
       export const onItemStateChanged: ChromeEvent<(data: EventData) => void>;
       export const onProfileStateChanged:
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index 020cf4a..2c46bc8 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -1613,6 +1613,10 @@
     if (util.isNonModifiable(fileManager.volumeManager, entry)) {
       return;
     }
+    const currentRootType = fileManager.directoryModel.getCurrentRootType();
+    if (currentRootType === VolumeManagerCommon.RootType.TRASH) {
+      return;
+    }
     let isRemovableRoot = false;
     let volumeInfo = null;
     if (entry) {
@@ -1653,6 +1657,16 @@
       }
     }
 
+    // Items in Trash are a fake representation of a file + it's metadata. These
+    // items can't be renamed whilst in Trash and should be restored to enable
+    // renaming.
+    const currentRootType = fileManager.directoryModel.getCurrentRootType();
+    if (currentRootType === VolumeManagerCommon.RootType.TRASH) {
+      event.canExecute = false;
+      event.command.setHidden(true);
+      return;
+    }
+
     // Check if it is removable drive
     if ((() => {
           const root = CommandUtil.getCommandEntry(fileManager, event.target);
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
index 1906583..5a18c47 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
@@ -414,6 +414,7 @@
     directoryModel: {
       isOnNative: () => true,
       isReadOnly: () => false,
+      getCurrentRootType: () => null,
     },
     getCurrentDirectoryEntry: () => recentEntry,
     getSelection: () => currentSelection,
diff --git a/ui/file_manager/integration_tests/file_manager/trash.js b/ui/file_manager/integration_tests/file_manager/trash.js
index c46980c1..fff22710 100644
--- a/ui/file_manager/integration_tests/file_manager/trash.js
+++ b/ui/file_manager/integration_tests/file_manager/trash.js
@@ -957,7 +957,6 @@
   await remoteCall.waitUntilCurrentDirectoryIsChanged(appId, '/My files');
 };
 
-
 /**
  * Verify that files that have their parents trashed show an alert dialog to
  * indicate that restoration is not possible.
@@ -1001,3 +1000,31 @@
   await remoteCall.waitAndClickElement(appId, '#restore-from-trash-button');
   await remoteCall.waitForElement(appId, '.files-alert-dialog');
 };
+
+/**
+ * Verify that files within Trash root can't be renamed.
+ */
+testcase.trashCantRenameFilesInTrashRoot = async () => {
+  const appId = await setupAndWaitUntilReady(
+      RootPath.DOWNLOADS, BASIC_LOCAL_ENTRY_SET, []);
+
+  const fileSelector = '#file-list [file-name="hello.txt"]';
+
+  // Select hello.txt and send it to the Trash.
+  await remoteCall.waitAndClickElement(appId, fileSelector);
+  await clickTrashButton(appId);
+  await remoteCall.waitForElementLost(appId, fileSelector);
+
+  // Navigate to the Trash root.
+  await navigateWithDirectoryTree(appId, '/Trash');
+
+  // Wait for the element to appear in the Trash and right click it to get
+  // access to the context menu.
+  await remoteCall.waitAndRightClick(appId, fileSelector);
+
+  // Ensure the rename command is disabled.
+  const contextMenuSelector = '#file-context-menu:not([hidden])';
+  await remoteCall.waitForElement(appId, contextMenuSelector);
+  await remoteCall.waitForElement(
+      appId, contextMenuSelector + ' [command="#rename"][disabled][hidden]');
+};
diff --git a/ui/gl/swap_chain_presenter.cc b/ui/gl/swap_chain_presenter.cc
index edf05d4..4b71ee4 100644
--- a/ui/gl/swap_chain_presenter.cc
+++ b/ui/gl/swap_chain_presenter.cc
@@ -606,15 +606,23 @@
 
   // Adjust the onscreen rect to touch two screen borders, and also make sure
   // the onscreen rect be right in the center.
+  // At the same time, make sure the origin position for clipped_onscreen_rect
+  // with round-up integer so that no extra blank bar shows up.
   if (IsWithinMargin(clipped_onscreen_rect.x(), 0)) {
     clipped_onscreen_rect.set_x(0);
     clipped_onscreen_rect.set_width(monitor_size.width());
+    // Make clipped_onscreen_rect height even.
+    if (clipped_onscreen_rect.height() % 2 == 1)
+      clipped_onscreen_rect.set_height(clipped_onscreen_rect.height() + 1);
     clipped_onscreen_rect.set_y(
         (monitor_size.height() - clipped_onscreen_rect.height()) / 2);
   }
   if (IsWithinMargin(clipped_onscreen_rect.y(), 0)) {
     clipped_onscreen_rect.set_y(0);
     clipped_onscreen_rect.set_height(monitor_size.height());
+    // Make clipped_onscreen_rect width even.
+    if (clipped_onscreen_rect.width() % 2 == 1)
+      clipped_onscreen_rect.set_width(clipped_onscreen_rect.width() + 1);
     clipped_onscreen_rect.set_x(
         (monitor_size.width() - clipped_onscreen_rect.width()) / 2);
   }
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
index 02bfc27..b028943 100644
--- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -228,7 +228,17 @@
     return;
   }
 
-  SetWindowState(PlatformWindowState::kNormal);
+  // Unset needs to be used instead of SetWindowState in order to prevent
+  // flickering on restore. This is because exo will emit a configure event
+  // on restore. If exo and ozone have different window states, a flicker
+  // will occur from the rapid switching of states.
+  if (state_ == PlatformWindowState::kFullScreen) {
+    shell_toplevel_->UnSetFullscreen();
+  } else if (state_ == PlatformWindowState::kMaximized) {
+    shell_toplevel_->UnSetMaximized();
+  } else {
+    SetWindowState(PlatformWindowState::kNormal);
+  }
 }
 
 PlatformWindowState WaylandToplevelWindow::GetPlatformWindowState() const {
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
index 15eb581..7a245e3 100644
--- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -782,6 +782,8 @@
 }
 
 TEST_P(WaylandWindowTest, SetFullscreenAndRestore) {
+  uint32_t serial = 0;
+
   // Make sure the window is initialized to normal state from the beginning.
   EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
 
@@ -804,7 +806,12 @@
   EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen());
   EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
   window_->Restore();
+  states = InitializeWlArrayWithActivatedState();
+  SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, states.get());
+  Sync();
   EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal);
+  VerifyAndClearExpectations();
+
   // Reinitialize wl_array, which removes previous old states.
   states = InitializeWlArrayWithActivatedState();
   SendConfigureEvent(xdg_surface_, {0, 0}, 3, states.get());
@@ -1023,7 +1030,7 @@
   SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, empty_state.get());
   Sync();
 
-  auto active_maximized = MakeStateArray(
+  auto states = MakeStateArray(
       {XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
   EXPECT_CALL(*GetXdgToplevel(), SetMaximized());
   EXPECT_CALL(*xdg_surface_,
@@ -1035,7 +1042,7 @@
   // State changes are synchronous.
   EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
   SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
-                     active_maximized.get());
+                     states.get());
   Sync();
   // Verify that the state has not been changed.
   EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
@@ -1050,22 +1057,27 @@
   // State changes are synchronous.
   EXPECT_EQ(PlatformWindowState::kFullScreen,
             window_->GetPlatformWindowState());
-  AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, active_maximized.get());
+  AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get());
   SendConfigureEvent(xdg_surface_, kMaximizedBounds.size(), ++serial,
-                     active_maximized.get());
+                     states.get());
   Sync();
   // Verify that the state has not been changed.
   EXPECT_EQ(PlatformWindowState::kFullScreen,
             window_->GetPlatformWindowState());
   VerifyAndClearExpectations();
 
-  EXPECT_CALL(*xdg_surface_,
-              SetWindowGeometry(gfx::Rect(kNormalBounds.size())));
   EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen());
-  EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kDefaultBoundsChange)));
   EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1);
   window_->Restore();
-  EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState());
+  auto active_maximized = MakeStateArray(
+      {XDG_TOPLEVEL_STATE_ACTIVATED, XDG_TOPLEVEL_STATE_MAXIMIZED});
+  SendConfigureEvent(xdg_surface_,
+                     {kMaximizedBounds.width(), kMaximizedBounds.height()},
+                     ++serial, active_maximized.get());
+  Sync();
+  EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState());
+  VerifyAndClearExpectations();
+
   // Reinitialize wl_array, which removes previous old states.
   auto active = InitializeWlArrayWithActivatedState();
   SendConfigureEvent(xdg_surface_, {0, 0}, ++serial, active.get());